Durante l'impostazione del numero di gruppi di lavoro per essere uguale a CL_DEVICE_MAX_COMPUTE_UNITS
potrebbe essere un buon consiglio su alcuni componenti hardware, di certo non è sulle GPU NVIDIA.
Sull'architettura CUDA, un'unità di calcolo OpenCL è l'equivalente di un multiprocessore (che può avere 8, 32 o 48 core) e questi sono progettati per essere in grado di eseguire simultaneamente fino a 8 gruppi di lavoro (blocchi in CUDA) ogni. A dimensioni di dati di input più grandi, è possibile scegliere di eseguire migliaia di gruppi di lavoro e la GPU in uso può gestire fino a 65535 x 65535 gruppi di lavoro per l'avvio del kernel.
OpenCL ha un altro attributo dispositivo CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
. Se lo si interroga su un dispositivo NVIDIA, restituirà 32 (questo è il "curvatura" o la larghezza naturale dell'hardware SIMD). Quel valore è il multiplo del gruppo di lavoro che dovresti usare; le dimensioni del gruppo di lavoro possono essere fino a 512 voci ciascuna, a seconda delle risorse utilizzate da ciascun elemento di lavoro. La regola empirica standard per la tua GPU specifica è che sono necessari almeno 192 elementi di lavoro attivi per unità di calcolo (thread per multiprocessore in termini CUDA) per coprire tutta la latenza dell'architettura e potenzialmente ottenere larghezza di banda di memoria completa o velocità aritmetica completa, a seconda sulla natura del tuo codice.
NVIDIA fornisce un documento valido chiamato "Guida alla programmazione di OpenCL per l'architettura CUDA" nel toolkit CUDA. Dovresti prenderti del tempo per leggerlo, perché contiene tutte le specifiche di come l'implementazione di NVIDIA OpenCL si basa sulle funzionalità del loro hardware e risponderà alle domande che hai sollevato qui.
Lo leggerò, grazie. – rdoubleui