FOSS-Inside: usiamo OpenCL su schede grafiche ATI

post_090818_1.jpg

Lo standrd OpenCL definisce da un lato l’API da usare nell’Host Program pe il controllo dei Kernel Program e delle risorse di calcolo, e dall’altro le regole di estensione del linguaggio C per i Kernel Program. Oltre a questo viene definita anche l’API da usare nel Kernel Program per la gestione delle risorse OpenCL e la comunicazione con le altre entità (con l’Host Program e gli altri Kernel Program).

All’attacco! Usiamo ATI Stream Software Development Kit (SDK). ATI Stream SDK è uno strumento per lo sviluppo di applicazioni OpenCL su sistemi x86 dotati di scheda grafica ATI. In effetti, uno degli ambiti in cui l’OpenCL sta rapidamente decollando è quello della ripartizione di attività computazionali tra CPU e GPU. La GPU viene utilizzata come supporto per la computazione di task circoscritti e di ausilio all’applicazione principale eseguita sulla CPU. Anche su questo fronte dunque ATI e nVidia si stanno dando battaglia.

Per poter utilizzare ATI Stream SDK bisogna rispettare due prerequisiti, avere una scheda grafica ATI e una CPU x86 con supporto al set di istruzioni SSSE 3.x.

Per capire se effettivamente avete una scheda grafica ATI potete usare uno dei seguenti tre metodi.

gianluca@gianluca-desktop:~$ lspci | grep VGA
04:00.0 VGA compatible controller: ATI Technologies Inc Mobility Radeon HD 3450

gianluca@gianluca-desktop:~$ glxinfo | grep renderer
OpenGL renderer string: ATI Radeon HD 3450

gianluca@gianluca-desktop:~$ cat /var/log/Xorg.0.log | grep ATI

Per capire se avete una CPU con supporto SSSE 3.x potete analizzare l’output del seguente comando:

gianluca@gianluca-desktop:~$ cat /proc/cpuinfo

Bene, se tutto è in ordine allora scaricate il pacchetto ATI Stream SDK dal sito ufficiale. Decomprimete il pacchetto e rendete utilizzabili le librerie precompilate fornite da ATI. Ecco una semplice procedura da adattare ovviamente al vostro sistema (ndr in questo caso è stato utilizzata una Ubuntu 9.04):

gianluca@gianluca-desktop:~$ ls ati-stream-sdk-v2.0-beta2-lnx32.tgz
ati-stream-sdk-v2.0-beta2-lnx32.tgz
gianluca@gianluca-desktop:~$ tar xzf ati-stream-sdk-v2.0-beta2-lnx32.tgz
gianluca@gianluca-desktop:~$ CD ati-stream-sdk-v2.0-beta2-lnx32/
gianluca@gianluca-desktop:~/ati-stream-sdk-v2.0-beta2-lnx32$ export LD_LIBRARY_PATH=`pwd`/lib/x86/
gianluca@gianluca-desktop:~/ati-stream-sdk-v2.0-beta2-lnx32$ echo $LD_LIBRARY_PATH
/home/gianluca/ati-stream-sdk-v2.0-beta2-lnx32/lib/x86/
gianluca@gianluca-desktop:~/ati-stream-sdk-v2.0-beta2-lnx32$ ls $LD_LIBRARY_PATH
amdrt_x86.o builtins_x86-32.bc libGLEW.so libglut.so libOpenCL.so libSDKUtil.a

Se volete compilare le applicazioni di esempio incluse in questo SDK è sufficiente impartire il classico comando make:

gianluca@gianluca-desktop:~/ati-stream-sdk-v2.0-beta2-lnx32$ make

Infine, se volete provare ad eseguire uno degli applicativi di esempio, come quello per la ricerca binaria, è necessario impartire i seguenti comandi:

gianluca@gianluca-desktop:~/ati-stream-sdk-v2.0-beta2-lnx32$ CD samples/opencl/bin/x86/
gianluca@gianluca-desktop:~/ati-stream-sdk-v2.0-beta2-lnx32/samples/opencl/bin/x86$ ./BinarySearch

Quale percorso? Come partiamo? Sebbene questo post sia solo introduttivo e fornisce delle semplici indicazioni per usare OpenCL su schede grafiche ATI, si preferisce dare anche qualche ulteriore dritta su come muoversi con lo sviluppo di applicazioni OpenCL.

L’ATI Stream SDK sembra davvero ben fatto, e contiene già diverse applicazioni di esempio. La cartella ati-stream-sdk-v2.0-beta2-lnx32/samples/opencl contiene numerosi esempi di calcolo matematico. Si tratta di classiche applicazioni tipo quelle per il calcolo del prodotto di due matrici, o il calcolo della DCT (Discrete Cosine Transform), o addirittura la costruzione di un frattale di Mandelbrot. Applicazioni scientifiche già ampiamente discusse anche nell’ambito delle computazione parallela distribuita (qualcuno di voi conosce OpenMPI?).

Certamente il punto di partenza ottimale per capire come programmare una applicazione OpenCL sono i due esempi Template e HelloCL. Tra questi due è preferibile studiarsi il primo, anche perché la documentazione ufficiale fornita da AMD/ATI ne parla abbondantemente.

La prima cosa da notare è che ogni esempio incluso nell’SDK contiene sempre due file, quello di estensione cpp e quello di estensione cl. Il primo è l’Host Program, compilato ed eseguito sulla CPU. Il secondo è il Kernel Program, compilato al volo dalle librerie AMD/ATI (vedi funzione clCreateProgramWithSource), caricato sulla scheda grafica e ivi eseguito.

Dando una occhiata alla funzione main dell’applicativo di esempio Template è possibile capire lo schema di un classico programma OpenCL:


int main(int argc, char * argv[])
{
// Initialize Host application
initializeHost();

// Initialize OpenCL resources
initializeCL();

// Run the CL program
runCLKernels();

// Print output array
print1DArray(std::string("Output"), output, width);

// Releases OpenCL resources
cleanupCL();

// Release host resources
cleanupHost();

return 0;
}

I commenti dovrebbero parlare da se. Ovviamente, ciascuna delle funzioni invocate nel main ha una sua complessità, ma si tratta di una complessità abbastanza controllata e dovuta per lo più ai concetti che OpenCL ha creato, e al fatto che quasi tutte le API dello standard hanno molti parametri che ne modificano il comportamento. È solo una questione di pratica.

Oltre ad imparare ad utilizzare l’API OpenCL, che tra l’altro è anche ben documentata sia nello standard che con dei prospetti riassuntivi, è importante capire i concetti principali della programmazione OpenCL. Quello forse più critico è l’allocazione e gestione della memoria. Nell’esempio appena indicato la memoria viene allocata nell’Host Program usando l’ormai classica funzione malloc, poi viene condivisa col Kernel Program usando una specifica funzione OpenCL, la clCreateBuffer. Non su tutte le architetture OpenCL e non i tutti casi sarà sempre possibile usare questo schema così semplice, e le cose andranno meditate di volta in volta.

Le idee sono il motore dell’Open Source. Credete sia possibile realizzare una estensione per D-BUS che faccia comunicare un Kernel Program con gli applicativi del Desktop Gnome? È utile? È fattibile? Pensateci e fateci sapere. Resta il fatto che nuovi mondi si intravedono all’orizzonte.

Tag: , ,

Commenti

  1. [1]

    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..

  2. [2]

    #1 : ok che ne sai ma tanto, ma i motori di ricerca già da anni sfruttano la parallelizzazione, eh.

  3. [3]

    “che ne sai ma tanto” :D 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..

  4. [4]

    Perché non mi pubblicate il post?!!!

    Carlo

Inserisci il tuo commento