Realizarea PanoramelorRealizarea Panoramelor
George Pasatoiu
Zafiu Andrei
343C1
CuprinsCuprinsInformatii generale panorameNotiuni teoreticeAlgoritmi folositiExempleConcluziiIntrebari
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 ale Edinburghului.
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 2Pasi de urmat :
Inlaturarea eventualelor aberatii geometrice
Identificarea modului in care fotografiile se potrivesc cel mai bine
Alipirea propriu-zisa a imaginilor
Complexitate 2Complexitate 2
Paralelizare OPENMP1 Paralelizare OPENMP1 Rezultate Obtinute:
Abordare:• S-au paralelizat sectunile de alocare
memorie date initiale• S-au folosit operatii pe biti in
structurile de decizie
Paralelizare OPENMP2Paralelizare 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 Paralelizare PTHREADS1 Rezultate Obtinute:
Abordare:• S-a ales o varianta simpla de paralelizare (nu
a fost nevoie de sincronizari)• S-au creat threaduri si s-a alocat fiecaruia un
numar egal de iteratii din totalul de N_LOOPS
Paralelizare PTHREADS2 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]);
}
Performante1Performante1S-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
Performante2Performante2 Grafic Latice 5x5
Performante3Performante3 Grafic Latice 6x5
ObservatiiObservatiiRezultatele 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));
ConcluziiConcluziiMetoda 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)
BIBLIOGRAFIEBIBLIOGRAFIEhttp://ku1k.sourceforge.net/index.htmlhttp://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)
IntrebariIntrebari
MultumimMultumimDimitris Skipis Orestis
Vantzos