18 iunie 2011

OpenCL Programming

Cateva idei din cartea "OpenCL Programming" de la FixStars:

* arhitecturi hardware care folosesc mai multe procesoare pentru implinirea unei singure sarcini:
- Grid computing - o combinatie de resurse din mai multe domenii administrative care realizeaza un singur task
- MPP = Massively Parallel Processor - "arhitectura super computer"
- Cluster server system - retea de calculatoare cu scop general
- SMP = Symmetric Multiprocessing system - un numar de 2^n procesoare identice conectate
- Multi-core processor - un chip cu mai multe nuclee de calcul

* Flynn
- pana in 2004 - SISD
- SIMD - instructiunea este difuzata la mai multe unitati de calcul - procesare vectoriala.
Recent, mai multe microprocesoare suporta instructiuni SIMD: SSE pe Intel CPU, si SPE pe un Cell BE.
- MISD - mai putine exemple, sistemele tolerante la defecte intra in categorie
- MIMD - clustere, sistem SMP

* Acceleratori:
GPU, Cell Broadband Engine - core-uri simple, care nu ocupa mult spatiu pe chip, deci pot fi incorporate mai multe
ex. GPU: Nvidia GPU chip (Tesla T10) = 30 de seturi de Streaming Processors (a cate 8 core-uri fiecare), in total 240 core-uri pe un chip
GPU-urile sunt superioare CPU-urilor pentru ca pot realiza intre 100 GFLOPS-1 TFLOPS, pe cand CPU-urile sunt limitate la 10 GFLOPS (giga floating operations per second)

OpenCL = framework pt scrierea de aplicatii in sisteme eterogene / hibride
"open computing language"

Implementarea unui program paralel:
* folosind apelurile de sistem ale SO : Posix threads
* folosind un framework: MPI pentru cluster servers, OpenMP pentru SMP, NUMA (sistemele cu memorie partajata), API-uri de paralelizare in Boost C++.
OpenMP - suportat de cele mai importante compilatoare: gcc, Intel C, Microsoft C
* prin compilare automata: Intel C/C++ , prin specificarea unor parametri de paralelizare in linia de comanda. Desi este mai comod asa, cu cat codul devine mai complex performanta are de suferit, compilatorul nestiind sa paralelizeze corespunzator.

OpenCL - pentru sisteme eterogene, dar si omogene (multi core: un core pentru control, restul pentru executii)
- scopul: un singur limbaj pentru a programa atat pe CPU-uri cat si pe GPU-uri, Cell BE, DSP-uri, .....

* Comparatie CUDA-Cell-lumea embedded
CPU = "host" - rol de management si control ---- "Host program"
GPU = "device" - rol de procesare data parallel -- "Kernel"
Kernelul trebuie scris in limbaj CUDA (extensie a lui C)
CUDA este asemanator cu Cell BE, CPU-ul fiind analog PPE, GPU-urile analoage SPU-urilor.
In domeniul embedded systems, modelul este asemanator: CPU dirijeaza DSP-urile (care au o functie primitiva - "digital signal processing")

Problema: toate cele 3 situatii (CUDA, Cell, sistemele embedded) cer folosirea unui API diferit. Solutia propusa este OpenCL.

Software de OpenCL = {compilator OpenCL, biblioteca runtime OpenCL}
Procesoarele implicate trebuie sa suporte insa OpenCL (vezi placa video)
Avantaje OpenCL:
- API pentru paralelizare standard
- optimizare: operatii vectoriale SIMD, copiere asincrona de memorie folosind DMA, transfer de memorie intre procesoare. OpenCL nu va limita niciodata performanta (in cazul unor functii nesuportate, se va folosi API-ul specific al procesorului)

Platforme: Host + Device
- Host: mediul in care se afla programul care controleaza device-urile, de obicei CPU-ul + memoria aferenta
- Device: GPU, DSP, Cell BE, alte CPU-uri + memoriile aferente
Un GPU este descris astfel: Device (GPU) + unitate de calcul (SM=streaming processor) + element de procesare (SP=scalar processor)
Programul care ruleaza pe device = kernel.

API-urile oferite de OpenCL se incadreaza pt urmatoarele modele de programare paralela:
* data parallel - un singur kernel este executat simultan in unitatile de calcul sau elementele de procesare, cu seturi diferite de date
* task parallel - mai multe kernel-uri....

Daca pe fiecare unitate de calcul ruleaza un grup kernel-uri , grupul primeste un ID unic (Work group ID). Fiecare kernel din grup primeste si el un ID (Work item ID). Utilizatorul specifica numarul total de work items si numarul de work items care sa ruleze pe fiecare unitate de calcul.
ID-ul poate avea pana la 3 dimensiuni.

* Modelul de memorie, contine memorie:
- globala: poate fi citita de toti work items, fizic rezidua in memoria principala a device-ului
- constanta: idem cea globala, doar ca poate fi folosita mai eficient dar unitatile de calcul contin hardware ce suporta constant memory cache
- locala: poate fi citita de toti work items din work group-ul respectiv. Fizic este memoria partajata de pe fiecare unitate de calcul
- privata: accesata doar de un singur work item. Fizic, corespunde registrilor fiecarui element de procesare.

Host : poate manipula memoria globala, constanta si memoria proprie
Device : memoria sa este accesata exclusiv de catre kernel


Continuarea acestei carti arata modul de instalare , exemple de utilizare si alte detalii utile.

Niciun comentariu: