2012-02-17 5 views
10

Ho bisogno di qualche chiarimento. Sto sviluppando OpenCL sul mio portatile con una piccola GPU nvidia (310M). Quando interrogo il dispositivo per CL_DEVICE_MAX_COMPUTE_UNITS, il risultato è 2. Ho letto il numero di gruppi di lavoro per l'esecuzione di un kernel che dovrebbe corrispondere al numero di unità di calcolo (Heterogenous Computing with OpenCL, Capitolo 9, pagina 186), altrimenti perderebbe troppo memory bandwitdh.Numero di unità di calcolo corrispondenti al numero di gruppi di lavoro

Anche il chip è specificato per avere 16 core di cuda (che corrispondono a PE credo). Ciò significa in teoria, il setup più performante per questa gpu, riguardante la banda di memoria globale, è di avere due gruppi di lavoro con 16 elementi di lavoro ciascuno?

risposta

16

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.

+0

Lo leggerò, grazie. – rdoubleui

2

Non penso nemmeno che la corrispondenza tra il numero di gruppi di lavoro e le unità di calcolo sia una buona idea per una CPU. È meglio sottoscrivere in eccesso i nuclei di più volte. Ciò consente al carico di lavoro di spostarsi dinamicamente (nei quanti di un gruppo di lavoro) mentre vari processori si mettono in linea o si distraggono con altri lavori. Workgroup count = CL_DEVICE_MAX_COMPUTE_UNITS funziona davvero bene su una macchina che non fa assolutamente nient'altro e spreca molta energia mantenendo attivi i nuclei inutilizzati.