2016-07-11 24 views
2

Entschuldigung für meine Naivität, wenn diese Frage albern ist, bin ich neu in GPGPU Programmierung.In OpenCL, wie kann __local Speicher schneller sein, wenn Arbeitsgruppengrößen nicht Teil der Architektur sind?

Meine Frage ist, da die Architektur des Geräts nicht ändern kann, wie kann __local Speicher für den Zugriff von Elementen nur in der lokalen Arbeitsgruppe optimiert werden, wenn es der Benutzer ist, der die Arbeitsgruppe auswählt Größe (vorbehaltlich Teilbarkeit)?

Antwort

4

Der lokale Speicher ist normalerweise an einen bestimmten Cluster von Ausführungseinheiten in der GPU-Hardware angeschlossen. Die Größe der Arbeitsgruppe wird zwar von der Client-Anwendung gewählt, aber die OpenCL-Implementierung wird eine Begrenzung auferlegen. Ihre Anwendung muss dies über clGetKernelWorkGroupInfo() mit dem Parameternamen CL_KERNEL_WORK_GROUP_SIZE abfragen.

Es gibt einige Flexibilität in der Arbeitsgruppengröße, da die meisten GPUs so konzipiert sind, dass mehrere Ausführungsthreads für die Ausführung auf einer einzelnen Ausführungseinheit geplant werden können. (Eine Form von SMT.) Beachten Sie auch, dass die geplanten Threads nicht einmal in derselben Arbeitsgruppe sein müssen. Wenn also zum Beispiel eine GPU 64 Prozessoren in einem Cluster hat und 4-Wege-SMT auf jedem Prozessor unterstützt, dann diese Je nach Hardware- und Compiler-Fähigkeiten können 256 Threads aus 1, 2 oder 4 oder möglicherweise sogar 8 oder 16 Arbeitsgruppen bestehen.

Einige Prozessoren von GPUs verwenden intern auch Vektorregister und -anweisungen, sodass Threads den OpenCL-Workitems nicht 1: 1 zugeordnet werden - ein Prozessor kann beispielsweise 4 Arbeitsaufgaben gleichzeitig verarbeiten.

Letztendlich muss jedoch eine Arbeitsgruppe auf den Cluster von Prozessoren passen, der an einen Teil des lokalen Speichers angeschlossen ist; Sie haben also lokale Speichergröße und maximale Anzahl von Threads, die in einem Cluster geplant werden können, was die maximale Arbeitsgruppengröße beeinflusst.

Versuchen Sie im Allgemeinen, die Menge an lokalem Speicher zu minimieren, den Ihre Arbeitsgruppe verwendet, damit die OpenCL-Implementierung die maximale Flexibilität für die Planung von Arbeitsgruppen hat. (Aber verwenden Sie auf jeden Fall lokalen Speicher, wenn es Leistung hilft! Verwenden Sie so wenig wie möglich.)