2012-01-23 6 views
10

So che gli elementi di lavoro sono raggruppati nei gruppi di lavoro e non è possibile eseguire la sincronizzazione all'esterno di un gruppo di lavoro.Gli elementi di lavoro OpenCL sono eseguiti in parallelo?

Significa che gli elementi di lavoro sono eseguiti in parallelo?

In tal caso, è possibile/efficiente effettuare 1 gruppo di lavoro con 128 elementi di lavoro?

risposta

10

Gli elementi di lavoro all'interno di un gruppo verranno pianificati insieme e potrebbero essere eseguiti insieme. Spetta all'hardware e/o ai driver scegliere la parallela esecuzione effettiva. Ci sono diversi motivi per questo, ma uno molto buono è quello di nascondere la latenza della memoria.

Sulla mia scheda AMD, le 'unità di calcolo' sono divise in 16 unità SIMD da 4 ampiezze. Ciò significa che 16 elementi di lavoro possono essere eseguiti tecnicamente nello stesso momento nel gruppo. Si consiglia di utilizzare multipli di 64 elementi di lavoro in un gruppo per nascondere la latenza della memoria. Chiaramente non possono essere tutti eseguiti all'ora esatta. Questo non è un problema, perché la maggior parte dei kernel sono, infatti, legati alla memoria, quindi lo scheduler (hardware) scambierà gli elementi di lavoro in attesa sul controller di memoria, mentre gli elementi "pronti" ottengono il tempo di elaborazione. Il numero effettivo di elementi di lavoro nel gruppo è impostato dal programma host e limitato da CL_DEVICE_MAX_WORK_GROUP_SIZE. Dovrai sperimentare la dimensione ottimale del gruppo di lavoro per il tuo kernel.

L'implementazione della cpu è "peggiore" quando si tratta di elementi di lavoro simultanei. Ci sono sempre più oggetti di lavoro in esecuzione come i core disponibili per eseguirli. Si comportano in modo più sequenziale nella CPU.

Così gli articoli di lavoro funzionano esattamente alla stessa ora? Quasi mai davvero.Questo è il motivo per cui abbiamo bisogno di usare barriere quando vogliamo essere sicuri che si fermino in un dato momento.

+0

Sei sicuro che ci siano sempre più oggetti di lavoro in esecuzione come i tuoi core disponibili? Secondo [questa pagina] (http://software.intel.com/sites/products/documentation/ioclsdk/2013/OG/Basic_Concepts.htm), i core separati sono unità di calcolo, il che significherebbe che un core non corrisponde qualsiasi modo per un oggetto di lavoro. – HelloGoodbye

+0

Sono sicuro di questo. È vero che potrebbero esserci più elementi di lavoro "in volo" di quanti siano i core della CPU - questo è in realtà il gruppo di lavoro. In termini di calcolo simultaneo, un core CPU può eseguire solo una coda di istruzioni in un dato momento. Anche nelle applicazioni non opencl, il threading è falso tramite il cambio di contesto, oppure è realizzato tramite hardware core multiplo (e talvolta con funzionalità SIMD limitata). – mfa

0

Sì, gli elementi di lavoro vengono eseguiti in parallelo.

Per ottenere il numero massimo possibile di elementi di lavoro, utilizzare clGetDeviceInfo con CL_DEVICE_MAX_WORK_GROUP_SIZE. Dipende dall'hardware.

Se è efficiente o meno, dipende principalmente dall'attività che si desidera implementare. Se hai bisogno di molta sincronizzazione, potrebbe essere che OpenCL non si adatti al tuo compito. Non posso dire molto di più senza sapere cosa vuoi veramente fare.

1

L'idea è che siano possibile essere eseguiti in parallelo se possibile (indipendentemente dal fatto che verranno eseguiti in parallelo dipende).

5

Nel modello di esecuzione OpenCL (astratto), sì, tutte le voci di lavoro vengono eseguite in parallelo e possono essere milioni di esse.

All'interno di una GPU, tutti gli elementi di lavoro dello stesso gruppo di lavoro devono essere eseguiti su un singolo "core". Ciò pone una restrizione fisica al numero di elementi di lavoro per gruppo di lavoro (256 o 512 è il massimo, ma può essere più piccolo per grossi kernel usando molti registri). Tutti i gruppi di lavoro vengono quindi pianificati sui (solitamente da 2 a 16) core della GPU.

È possibile sincronizzare i thread (elementi di lavoro) all'interno di un gruppo di lavoro, poiché sono tutti residenti nello stesso core, ma non è possibile sincronizzare i thread da gruppi di lavoro diversi, poiché potrebbero non essere pianificati contemporaneamente, e potrebbe essere eseguito su diversi core.

Sì, è possibile avere 128 elementi di lavoro all'interno di un gruppo di lavoro, a meno che non utilizzi troppe risorse. Per ottenere le massime prestazioni, in genere si desidera avere il maggior numero possibile di thread in un gruppo di lavoro (almeno 64 sono necessari per nascondere la latenza della memoria, vedere Vasily Volkov's presentations su questo argomento).

0

Gli elementi di lavoro in un determinato gruppo di lavoro vengono eseguiti contemporaneamente sugli elementi di elaborazione di un'unità di elaborazione del sigle.

Problemi correlati