Arriviamo quindi ai sistemi classificati come “Heterogeneous Parallel Computing”! Una CPU, una GPU, un DSP, un Cell alla fine dei conti sono tutti di processori pensati ciascuno per svolgere un ben determinato compito. Un sistema di calcolo composto da un mix di queste unità è un sistema di calcolo parallelo eterogeneo. Una attività complessa viene divisa in tanti task poi “sparsi” sulle singole unità di calcolo. Ciascuna unità farà il suo dovere e lavorerà secondo le proprie potenzialità. Quindi, ad esempio, la potente CPU sarà aiutata dalla altrettanto potente GPU o dal meno performante ma più preciso DSP.
Chi rende possibile ciò? Lo sviluppatore! Come fa lo sviluppatore a fare questo? Grazie a tecnologie come OpenCL.
Alla scoperta di OpenCL. OpenCL è la tecnologia che rende possibile la realizzazione di sistemi di computazione paralleli eterogenei (Heterogeneous Parallel Computing). Grazie ad OpenCL è possibile dividere una attività in più task, decidere quali eseguire sulla CPU e quali sulle altre unità di calcolo (GPU, DSP, Cell,…). Usando OpenCL i task vengono caricati sulle unità di “calcolo secondarie”, lanciati, controllati e raccolti, ovvero si attende il loro completamento e se ne “raccolgono” i risultati.
OpenCL è uno standard del consorzio “Khronos Group”, lo stesso consorzio che da anni si occupa di standardizzare un’altra tecnologia apparentemente simile: OpenGL.
Un po’ di termini. Paese che vai usanze che trovi! Questo è vero anche e soprattutto in ambito informatico. Ciascuno standard, ciascuna tecnologia ha una propria nomenclatura e un proprio insieme di regole.
Il modello di calcolo di OpenCL prevede due tipi di dispositivi: Host Device e Compute Device. Il dispositivo Host è tipicamente la CPU centrale, quindi il processore Intel o AMD. Il “Compute Device” è l’unità di calcolo accessoria, quindi la GPU, il DSP, il Cell, e così via. A sua volta il Compute Device è composto al suo interno da più Compute Unit, e ciascuna di queste include più Processing Element.
Perché questa classificazione? OpenCL intende essere uno standard General Purporse. Sebbene si stia affermando molto velocemente in relazione ai mondi CPU e GPU, esso intende riferirsi a tutte le possibili architetture eterogenee. Non potendo classificare a priori tutte le architetture dei Compute Device preferisce farne una classificazione generale e poi di volta in volta interpretare i singoli casi. Quindi nel caso delle GPU, le Compute Unit sono le singole Pipeline Grafiche, mentre i Processing Element sono i singoli stadi della Pipeline.
Ora, accanto a questa classificazione dei dispositivi, lo standard OpenCL ne fa anche un’altra, quella dei componenti software.
In OpenCL esistono due tipi di programmi: Host Program e Kernel Program. L’Host Program è quello eseguito sull’Host, quindi sulla CPU e ha anche il compito di avviare, controllare, terminare e raccogliere i Kernel Program. I Kernel Program sono invece i singoli task eseguiti sul Compute Device, quindi sulla GPU. Poiché un Compute Device può contenere più Compute Unit allora è ragionevole attendersi che esso possa eseguire più Kernel Program. I Kernel Program hanno ciascuno un Identificativo, e possono essere raccolti a formare gruppi, in base a criteri dipendenti dalla logica del programma.
Sia l’Host Program che il Kernel Program sono dei programmi C. In più però il Kernel Program viene scritto adoperando delle convenzioni extra aggiunte dallo standard OpenCL al linguaggio C, e proprio per rendere il sistema più adattabile a tutte le diverse configurazioni hardware.
L’Host Program viene compilato usando la toolchain nativa del sistema, quindi quella Linux standard (gcc, glibc, make, autotools, libtools). Il Kernel Program viene compilato usando gli strumenti di cross-toolchain specificati nello standard OpenCL.

Io ho fatto la tesi su CUDA con linux.
Leggerò meglio l’articolo appena avrò tempo ma sono contento ne abbiate parlato
Penso che molte applicazioni potrebbero giovare da architetture di questo tipo.. è da vedere come, perché non tutto è facilmente parallelizzabile e programmare in parallelo non è facile come farlo in modo sequenziale su una sola cpu.
I vantaggi in termini di tempi sono enormi.
Mi aspetto che programmi di grafica (gimp) o per l’editing video o ripping sfruttino sempre più queste possibilità.
O anche motori di ricerca delle informazioni.
Si riuscirebbe a diminuire i tempi di elaborazione anche di 25-30 volte.
Chissà che ne verrà fuori..
di noct - 6 novembre 2009 - 16:06
#1 : ok che ne sai ma tanto, ma i motori di ricerca già da anni sfruttano la parallelizzazione, eh.
di Fabio - 6 novembre 2009 - 17:40
“che ne sai ma tanto”
non volevo sembrare saccente.. anche perché non lo sono.
Scusami mi son spiegato male ma intendevo a livello di desktop la ricerca non a livello di motore di ricerca tradizionale alla google per intenderci.
Parlavo di beagle , strigi o sistemi simili..
di noct - 6 novembre 2009 - 17:52
Perché non mi pubblicate il post?!!!
Carlo
di Pizzuco - 7 novembre 2009 - 22:50