Aplicare Filtre pe Imagini
-
Upload
vlad-petre -
Category
Technology
-
view
795 -
download
2
description
Transcript of Aplicare Filtre pe Imagini
1 12.01.2011
Aplicarea filtrelor de imagine POSTERIZE + GREYSCALE + PIXELIZE
asupra unui Bitmap.
Vlad-Ştefan PETRE
341C1
http://twitter.com/vladpetre88
http://www.linkedin.com/in/vladpetre88
2 12.01.2011
Efectul Filtrelor
3 12.01.2011
Implementarea Serială• Citirea header-ului bmp din fişierul de intrare într-o
structură de date.• Citirea informaţiilor despre pixeli (secvenţe de
[R,G,B]) din fişierul de intrare într-un vector.• Aplicarea filtrelor pixel cu pixel asupra secvenţelor
de [R,G,B].• Scrierea header-ului bmp într-un fişier de ieşire.• Scrierea noii secvenţe de [R,G,B] în fişierul de ieşire.
4 12.01.2011
Implementarea OpenMP
• Paralelizarea for-ului care aplică filtrele pixel cu pixel prin inserarea directivei: #pragma omp parallel for
• Vectorul care stochează informaţiile despre pixeli rămâne global (deci partajat) între firele de execuţie.
5 12.01.2011
Implementarea Pthreads• Vectorul care stochează informaţiile despre pixeli
rămâne global (deci partajat) între firele de execuţie.
• Codul care aplică filtrele asupra imaginii este scris într-o rutină pthreads.
• Fiecare thread, în funcţie de id-ul său, va aplica filtrul asupra unei fâşii din imagine.
6 12.01.2011
Implementarea MPI• Vectorul care stochează informaţiile despre pixeli nu mai poate să fie
partajat între firele de execuţie.• Threadul 0 (master) se va ocupa doar de citirea/scrierea în fişiere, de
împărţirea imaginii în bucăţi şi de comunicarea/transferurile cu thread-urile slave.
• Imaginea se împarte într-un număr de bucăţi egal cu numărul de thread-uri. Fiecare bucată trebuie să aibă un număr par de linii de pixeli (exceptând ultima), aceasta fiind o constrângere a filtrului pixelize.
• Fiecare thread primeşte o astfel de bucată împreună cu dimensiunile ei.• Fiecare thread va aplica filtrele asupra bucăţii lui de imagine, după care
va trimite noua bucată de imagine thread-ului master.
7 12.01.2011
Rezultate
Serial OpenMP Pthreads MPI
Test 1 0m1.470s 0m1.346s 0m1.425s 0m2.859s
Test 2 0m1.482s 0m1.405s 0m1.384s 0m2.961s
Test 3 0m1.481s 0m1.390s 0m1.395s 0m3.137s
Notă: • Toate testele au fost rulate pe un procesor AMD Turion TL-58 X2 Dual-Core 1900MHz, având ca sistem de operare Ubuntu 10.04 32bit.• Toate binarele au fost compilate cu optiunea –g (exemplu: gcc –g). • Fişierul de intrare este un bitmap cu dimensiunea 5616x3744 pixeli (60 MB).• Pentru paralelizarea OpenMP am folosit schedule guided.
8 12.01.2011
Concluzii• Aplicarea efectivă a acestor 3 filtre nu este o operaţie computaţional
intensivă.• Viteza nu poate fi îmbunătăţită cu mult datorită acceselor la memorie
(se observă foarte bine în acest caz cum memoria este mai lentă decât procesorul).
• Varianta MPI este cea mai ineficientă datorită faptului că trebuiesc transferate bucăţile de imagine către şi de la thread-urile slave.
• Variantele OpenMP şi Pthreads se dovedesc a fi cele mai potrivite pentru implementarea de faţă datorită faptului că imaginea este partajată între thread-uri (nu se pierde astfel timp cu transferuri de date între thread-uri), doar calculele în sine fiind paralelizate.
9 12.01.2011
Mulţumesc!
Întrebări?