/ / Gibt es eine Beschränkung für den lokalen OpenCL-Speicher? - opencl, gpgpu, gpu-shared-memory

Ist der lokale OpenCL-Speicher begrenzt? - Opencl, GPGPU, GPU-Shared-Speicher

Heute habe ich vier weitere hinzugefügt __local Variablen in meinen Kernel, um Zwischenablage zu sichernresult in. Durch das Hinzufügen der vier weiteren Variablen zur Kernel-Signatur und das Hinzufügen der entsprechenden Kernel-Argumente wird die gesamte Ausgabe des Kernels mit "0" dargestellt. Keine der cl-Funktionen gibt einen Fehlercode zurück.

Ich habe weiter nur versucht, eine der beiden kleineren Variablen hinzuzufügen. Wenn ich nur einen von ihnen hinzufüge, funktioniert es, aber wenn ich beide hinzufüge, bricht es zusammen.

Könnte dieses Verhalten von OpenCL bedeuten, dass ich viel zugeteilt habe __local Erinnerung? Wie finde ich heraus, wie viel __local Speicher ist für mich nutzbar?

Antworten:

19 für die Antwort № 1

Die Menge an lokalem Speicher, die ein Gerät für jede seiner Recheneinheiten bietet, kann mit dem Befehl abgefragt werden CL_DEVICE_LOCAL_MEM_SIZE Flagge mit der clGetDeviceInfo Funktion:

cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);

Die zurückgegebene Größe ist in Byte. Jede Arbeitsgruppe kann so viel Speicher für sich selbst reservieren. Wenn Sie jedoch ein Maximum zuweisen, kann dies das gleichzeitige Planen anderer Workgrups auf derselben Recheneinheit verhindern.


6 für die Antwort № 2

Natürlich gibt es da lokale Speicher physisch eher, als virtuell.

Wir sind es gewohnt, mit einer virtuellen Adresse zu arbeitenSpeicherplatz auf CPUs, um theoretisch so viel Speicher zu haben, wie wir wollen - bei sehr großen Ausmaßen möglicherweise ein Fehler, weil die Auslagerungsdatei / Auslagerungspartition ausgeht oder vielleicht nicht einmal das, bis wir tatsächlich versuchen, zu viel Speicher zu verwenden, damit dies möglich ist Sie werden dem physischen RAM und der Festplatte zugeordnet.

Dies ist nicht der Fall für Dinge wie der Betriebssystemkern eines Computers (oder untergeordnete Teile davon), die auf bestimmte Bereiche im eigentlichen RAM zugreifen müssen.

Dies gilt auch nicht für den globalen und lokalen Speicher der GPU. Es gibt kein* Memory Paging (Remapping des wahrgenommenen ThreadsAdressen an physische Speicheradressen); und kein tauschen. Speziell in Bezug auf den lokalen Speicher verfügt jede Recheneinheit (= jeder symmetrische Multiprozessor auf einer GPU) über ein Bündel RAM, das als lokaler Speicher verwendet wird. die grünen Platten hier:

Bildbeschreibung hier eingeben

Die Größe jeder solchen Platte ist das, was Sie bekommen

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).

Zur Veranschaulichung weiter NVIDIA Kepler Bei GPUs beträgt die Größe des lokalen Speichers entweder 16 KByte oder 48 KByte (und das Komplement zu 64 KByte wird für das Caching von Zugriffen auf den globalen Speicher verwendet). Also von heute an Der lokale GPU-Speicher ist relativ zum globalen Gerätespeicher sehr klein.


1 - Auf nVIDIA-GPUs, die mit der Pascal-Architektur beginnen, wird das Paging unterstützt. aber das ist nicht die übliche Art, Gerätespeicher zu verwenden.


4 für die Antwort № 3

Ich bin nicht sicher, aber ich hatte das Gefühl, dass dies gesehen werden muss.

Gehen Sie einfach die folgenden Links durch. Lies es.

Eine großartige Lektüre: OpenCL - Speicherplätze.

Ein bisschen verwandte Sachen "s: