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.)