Kernel e Work-item

Premessa

Questo articolo introduce la relazione fra gli oggetti Kernel, work-item e work-group dell’ambiente OpenCL utilizzati in Colibri.

Colibrì dalla versione 7.0 contiene un namespace, OPCL, che fornisce un’interfaccia c++ per l’ambiente OpenCL usato per il calcolo eterogeneo. Le classi contenute in OPCL permettono una gestione delle CPU/GPU semplificato rispetto all’uso diretto delle funzioni OpenCL, poichè molti dei processi di inizializzazione, dalla scelta delle piattaforme, device, contesti ecc. necessari  all’esecuzione di un kernel sono risolti automaticamente dalle classi, in particolare la classe GPU; Per l’approfondimento dei concetti di questo articolo fare riferimento anche all’articolo Terminologia OpenCL di questo blog.

kernel e work-item

un kernel è una funzione in C-OpenCL (entry point di un programma) che è eseguito su una compute-unit in più istanze parallele. Ogni istanza del kernel è definita work-item.

spazio degli indici NDRange

I work-item vengono mappati su uno spazio di indici  n-dimensionale, denominato NDRange: ciò è equivalente ad affermare che vengono eseguiti un numero di work-item (istanza della funzione kernel) pari al numero di indici definito in NDRange.

Work-group

la GPU schedula intervalli di work-item in gruppi di elementi di elaborazione, i work-group , fino a quando tutti i work-item non sono stati elaborati. I kernel successivi possono essere eseguiti, fino al completamento di tutta l’applicazione. Lo schema che segue è un modello semplificato del mapping dei work-item in work-group (l’esempio è riferito ad un hardware GPU AMD generica)

opencl-001
Ogni work-group viene assegnato ad una compute-unit (CU), quindi ogni work-item è eseguito da un processing-element della CU
Tutti i work-item di un Work-Group possono essere processati soltanto dagli elementi di elaborazione (PE) di una singola CU, e un PE può elaborare un solo work-item alla volta; Tuttavia, un CU può elaborare più gruppi di lavoro.

OpenCL mappa il numero totale di work-item da eseguire in una griglia n-dimensionale (NDRange). Lo sviluppatore può specificare come dividere questi elementi in work-group. Vedremo in seguito che in Colibrì è presente una procedura atta a semplificare la definizione dell’NDRange, ottimizzandone la separazione in work-group, in funzione delle caratteristiche rilevate del device assegnato al kernel.

Per le GPU AMD le esecuzioni dei work-group su una CU sono definite wavefronts  (cioè insieme di work-item di un work-group eseguiti in lock-step mode in un’unità di calcolo);  esiste un numero intero di wavefronts  in ogni work-group.

Come illustrato nella figura che segue, l’hardware che pianifica i work-item  in esecuzione su gpu  AMD esegue un passaggio intermedio che definisce il numero di wavefronts  all’interno di un work-group.

opencl-002.png

 

 

 

 

 

Leave a Reply

Skip to toolbar