Workflow Heterogeneous Computing
GL, VS, GT
API pentru dezvoltarea programelor ce se executa pe multiple platforme eterogene
__kernel ()
Initializare
Executie efectiva
Terminare
CPU
CPU GPU
CPU
Filtre Gauss Idee: • Pixelul rezultat este o medie ponderata a pixelilor vecini, cu ponderile: 1 2 1 2 4 2 1 2 1 • S-a folosit o singura functie de kernel, executata de catre toate unitatile de calcul
Un usor efect de blur
in.pgm
out.pgm
Filtre Sobel Idee: • S-au folosit doua functii de kernel, aplicate succesiv • Se folosesc doua filtre, cu ponderile: 1 2 1
-1 0 1
0 0 0
-2 0 2
-1 -2 -1
-1 0 1
•Prima functie kernel aplica primul filtru asupra setului de date (afland Dx) • A doua functie aplica al doilea filtru (afland Dy) si calculeaza valoarea unui pixel dupa formula:
Observatii: - este avantajoasa executia pe GPU in cazul setului mare de date (imagini cu rezolutie mare)
Histogram Equalization • transformare prin care se obtine o imagine cu o histograma distribuita uniform • utilizata pentru a creste vizibilitatea detaliilor • rezultatul maximizeaza contrastul unei imagini fara a pierde informatii de tip structural
Histogram Equalization (implementare) â&#x20AC;˘ Functii kernel: 1. calculeaza numarul de pixeli din imagine cu intensitatea <= I [0..255]; 2. calculeaza noua valoare a fiecarui pixel T: T = (n[valoare_pixel] - n[0]) * 255 / (nr_total_pixeli - n[0]);
â&#x20AC;˘ Rezultate obtinute:
Fractali • o figura geometrica care poate fi divizata in parti, astfel incat fiecare din acestea sa fie o copie in miniatura a intregului • dimensiune fractala – un exponent care indica cat de complet ocupa un fractal spatiul • metode de determinare a Df: • • •
Box Counting method; Mass-Radius method; the Cluster Growing method;
Dimensiune fractala • • • •
impartirea imaginii per thread-uri binarizarea imaginii; numararea box-urilor de diferite dimensiuni: • E.g.: latura = 2, 4, 8, 11(pixeli); calcularea pantei regresiei logaritmice
Aflarea celui de-al k-lea element dintr-un vector - idee • •
S-a pornit de la varianta recursiva a aflarii celui de-al k-lea element, paralelizandu-se un pas al acestui algoritm Exemplu: N = 12, K = 5 (aflarea celui de-a 5-lea element) V = {2, 15, 0, 9, 40, 11, 7, 3, 14, 6, 21, 5} Presupunem ca avem Q = 3 unitati de calcul => impart pe V in 3 subsecvente de dimensiune N/Q => V = {2, 15, 0, 9, 40, 11, 7, 3, 14, 6, 21, 5} In paralel, fiecare unitate de calcul afla mediana subsecventei aferente folosind sortare => M = {9, 7, 5} O unitate de calcul afla mediana medianelor => m = 7 si creeaza 3 subsecvente cu elemente <, = respectiv > m, din v: s1 = {2, 0, 3, 6, 5} , s2 = {7} , s3 = {15, 9, 40, 11, 14, 21} Se alege prin anumite criterii una din aceste subsecvente ca fiind noul vector V (in cazul in care subsecventa aleasa este s2, se poate furniza rezultatul). In cazul de fata, se alege s1, V = s1 ………. Procedeul este repetitiv.
Aflarea celui de-al k-lea element dintr-un vector - implementare •
• • • •
2 functii de kernel: – Kelem • executata in paralel de mai multe unitati de calcul • input: V, output: M (vectorul de mediane) – o unitate de calcul modifica doar un element din M – Median • Executata de o singura unitate de calcul • input: M, output: V (si alte flag-uri care spun daca s-a gasit elementul si valoarea acestuia) Functiile se apeleaza alternativ, rezultatul uneia devine intrarea celeilalte Am evitat recursivitatea Am facut o singura data mutarea datelor din RAM in VRAM (enqueue in buffere), restul modificarilor petrecandu-se pe placa video (pentru economie de timp) Din cand in cand, scot din anumite buffere flag-uri pentru a afla starea executiei
Aflarea celui de-al k-lea element dintr-un vector - statistici -
n = 443
n = 1000
n = 2000
n = 2400
k = 89
k = 333
k = 1282
k = 2000
In cazul de fata, datorita memoriei locale limitate de pe GPU si a structurii algoritmului, valoarea lui n nu poate trece de un prag (aici, 2500) â&#x20AC;&#x201C; posibil ca programul sa dea rezultate foarte bune in favoarea GPU pentru valori mult mai mari ale lui n
Concluzii • • • •
• •
Doar anumite probleme pot fi executate mai rapid pe placa grafica si anume cele pe seturi mari de date cu aplicarea unor operatii repetitive Latenta mare de transfer pentru GPU a datelor din RAM catre VRAM, acoperita prin executia rapida si repetata a unor task-uri Evitarea branch-urilor (if, while, for) intr-un kernel pe GPU Anumiti algoritmi paraleli trebuie adaptati pentru a da rezultate cat mai bune atat pe CPU cat si pe GPU – programarea in OpenCL cere totusi cunoasterea arhitecturii platformelor Algoritmi mai eficienti pe GPU (testati) : filtre simple ( Sobel/Gauss/Bitsplicing ), analiza fractala, procesare de imagini in general Algoritmi mai eficienti pe CPU (testati) : aflarea al K-lea element dintr-un sir