OpenCL 2.0 è pronto: CPU e GPU in rapporti sempre migliori

Seconda versione per lo standard aperto per la programmazione parallela di GPU e CPU multi-core. OpenCL 2.0 porta diverse novità integrate grazie ai suggerimenti degli sviluppatori.

Avatar di Manolo De Agostini

a cura di Manolo De Agostini

Le specifiche OpenCL 2.0 sono finalmente pronte. Il Khronos Group ha annunciato la ratifica e il rilascio al pubblico dello standard royalty-free - cioè libero da oboli di qualsiasi tipo - nato per semplificare la programmazione parallela "cross-platform", ovvero non legata a una singola piattaforma. OpenCL è cruciale per tutte quelle aziende che stanno lavorando per far sì che i chip diventino un prodotto eterogeneo, con GPU e CPU che lavorano in armonia sullo stesso tipo di dati, velocizzando operazioni che oggi richiedono molto tempo.

Si può dire quindi che OpenCL 2.0 è una lieta novella per aziende come AMD che stanno lavorando su chip basati su architettura HSA (come la futura APU Kaveri). "Khronos ha ricevuto il feedback dagli sviluppatori dopo la distribuzione della versione provvisoria di OpenCL 2.0. Gran parte dei suggerimenti sono stati adottati o saranno integrati con l'arrivo di capacità hardware che permetteranno alla programmazione parallela di continuare a evolversi", ha dichiarato Neil Trevett, a capo dell'OpenCL working group, presidente del Khronos Group e vicepresidente per i contenuti mobili di Nvidia.

"OpenCL continua a raccogliere consensi su PC desktop, dispositivi mobili ed embedded. Offre inoltre un ambiente di programmazione unificato per bilanciare dinamicamente diverse CPU, GPU, DSP e risorse hardware nei SOC mobile per svolgere compiti che vanno dalla realtà aumentata alla simulazione della fisica per il gaming".

Sono tante le novità integrate in OpenCL 2.0, a partire dalla memoria virtuale condivisa. Kernel host e device possono condividere direttamente strutture di dati complessi con puntatori come alberi e liste collegate, in modo da offrire una flessibilità di programmazione decisamente maggiore ed eliminando costosi trasferimenti di dati tra l'host e i dispositivi.

Sotto la voce Nested Parallelism si nasconde una caratteristiche che consente ai kernel dei dispositivi di mettere in coda kernel allo stesso dispositivo senza alcuna interazione host, consentendo uno scheduling flessibile ed evitando il trasferimento del controllo dell'esecuzione e dei dati tra dispositivo e host, spesso incappando nei colli di bottiglia creati dal processore. In parole più "povere" la GPU è in grado di programmare le proprie operazioni e ridurre le chiamate non necessarie verso la CPU.

Lo spazio d'indirizzamento generico permette a funzioni di essere scritte senza specificare un address space named per gli argomenti e questo è utile in particolare per quegli argomenti che sono stati dichiarati essere un puntatore di un determinato tipo, eliminando la necessità di scrivere funzioni multiple per ogni address space named usato in un'applicazione.

Il nuovo standard migliora anche il supporto alle immagini sRGB e 3D, permette ai kernel di leggere e scrivere dalla stessa immagine e consente la creazione di immagini OpenCL da texture OpenGL mip-mapped o multi-sampled per migliorare l'interoperabilità OpenGL. Per quanto concerne le Atomic operations library, troviamo un sottoinsieme di C11 e operazioni di sincronizzazione per far sì che le assegnazioni in un elemento di lavoro (work item) siano visibili agli altri elementi di un gruppo di lavoro, lungo gruppi in funzione su un dispositivo o per la condivisione dei dati tra il dispositivo OpenCL e l'host.

Nvidia spinge CUDA ma tiene il piede in due scarpe

A tutto questo si aggiungono le cosiddette "Pipes", memory objects che aiuteranno a immagazzinare dati organizzati nel metodo FIFO e con OpenCL 2.0 offriranno funzioni che consentiranno ottimizzazioni usando le funzioni integrate per far sì che i kernel possano leggere e scrivere direttamente nelle pipes. Infine ecco una migliore compatibilità con Android grazie a un'estensione che permette alle implementazioni OpenCL di essere rintracciate e caricate come oggetti condivisi su sistemi dotati del sistema operativo mobile di Google. Questa caratteristica dovrebbe facilitare il caricamento dei driver OpenCL di secondo e terze parti.