180 likes | 308 Views
Realizarea Panoramelor. George Pasatoiu Zafiu Andrei 343C1. Cuprins. Informatii generale panorame Notiuni teoretice Algoritmi folositi Exemple Concluzii Intrebari. Informatii generale panorame. Panorama:
E N D
Realizarea Panoramelor George Pasatoiu Zafiu Andrei 343C1
Cuprins • Informatii generale panorame • Notiuni teoretice • Algoritmi folositi • Exemple • Concluzii • Intrebari
Informatii generale panorame • Panorama: • Imagine de dimensiuni mari , de obicei o priveliste din natura cu orizont larg , vazuta de departe • Termen format din 2 cuvinte grecesti (πᾶν "all" + ὅραμα "sight" ) • Notiunea a fost folosita prima oara de pictorul Robert Barker, pentru a-si descrie describe picturile panoramice aleEdinburghului.
Notiuni teoretice 1 • Imaginile panoramice se pot obtine : • folosind lentile de distanta focala foarte mica,eventual in conjunctie cu oglinzi • alta abordare - realizarea unui set de poze si alipirea lor ulterioara in vederea realizarii unei imagini mari
Notiuni teoretice 2 • Pasi de urmat : • Inlaturarea eventualelor aberatii geometrice • Identificarea modului in care fotografiile se potrivesc cel mai bine • Alipirea propriu-zisa a imaginilor
Complexitate 2 CalculCoefLatice AlocareMemLatice “FOR” principal Pas 1 Pas 2 ……………. Pas N_LOOPS Calcule Calcule ……………. Calcule
Paralelizare OPENMP1 • Rezultate Obtinute: • Abordare: • S-au paralelizatsectunile de alocarememorie date initiale • S-au folositoperatiipebiti in structurile de decizie
Paralelizare OPENMP2 #pragma omp parallel for shared (adjLoops,N_LOOPS,alr) private(i,j) for(i=0;i<N_LOOPS;i++) { alr = (int*)calloc(4, sizeof(int)); for(j=0;j<4;j++) alr[j] = 0; adjLoops[i] = alr; } #pragma omp parallel for shared(adjLoops,N_LOOPS) private(i) for(i=0;i<N_LOOPS;i++) { adjLoops[I][0] = 1; }
Paralelizare PTHREADS1 • Rezultate Obtinute: • Abordare: • S-a ales o variantasimpla de paralelizare (nu a fostnevoie de sincronizari) • S-au creatthreadurisi s-a alocatfiecaruia un numaregal de iteratii din totalul de N_LOOPS
Paralelizare PTHREADS2 void* algoritm(void *params) //functie executata de fiecare thread { struct parametri* p = (struct parametri*) params; for(i=p->start;i<=p->stop;i++) … calcule intensive… } for (i = 0; i < nrThreads; i++) //creare threaduri { param[i].start=i*N_LOOPS/nrThreads; if (i!=nrThreads-1) param[i].stop=(i+1)*N_LOOPS/nrThreads-1; else param[i].stop=N_LOOPS-1; pthread_create(&t[i], NULL, &algoritm, ¶m[i]); }
Performante1 • S-au obtinut rezultate mai bune fata de codul initial (solutia MPI nu s-a dovedit viabila) • Din cele 2 tabele se observa faptul ca threadurile POSIX obtin rezultate semnificativ mai bune decat threadurile OPENMP • Prin metoda de paralelizare cu POSIX s-a obtinut o imbunatatire de aproximativ 10% fata de varianta paralela cu OPENMP
Performante2 • Grafic Latice 5x5
Performante3 • Grafic Latice 6x5
Observatii • Rezultatele indica faptul ca timpul obtinut depinde si de compilatorul folosit (gcc e mai eficient decat SunCC) • Tentativele de a elimina/inlocui structurile de decizie din cadrul “for-ului” intensiv s-au dovedit a fi neviabile (inlocuirea cu o formula matematica consuma mai multe resurse) • Formula matematica substitut: p1m=p1m+(m-p1m)*(1/abs2(2*p1n+1))*(int)(1.5*p1n*p1n/(p1n*p1n+0.1)); p2n=p2n+(n-p2n)*(int)(abs2(p1n+1)/(abs2(p1n+1)-0.001)); p2m=p2m+(m-p2m)*(int)(abs2(p1n+1)/(abs2(p1n+1)-0.001)); p1n=p1n+(n-p1n)*(1/abs2(2*p1n+1))*(int)(1.5*p1n*p1n/(p1n*p1n+0.1));
Concluzii • Metoda POSIX s-a dovedit a fi cea mai eficienta deoarece exista o repartizare egala pentru fiecare thread (load balancing eficient) • Se mai pot incerca diverse variante de paralelizare cu OPENMP prin folosirea unor directive alternative (#pragma omp section, #pragma omp atomic)
BIBLIOGRAFIE • http://ku1k.sourceforge.net/index.html • http://people.unt.edu/ov0006/ • http://numod.ins.uni-bonn.de/people/vantzos/index.html • Investigation of the Evolution and Breakup of Electrically Charged Drops (S. I. Betel , M. A. Fontelos , U. Kindelán and O. Vantzos)
Multumim • Dimitris Skipis Orestis Vantzos