3. 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.
3 12.01.2011
4. 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.
4 12.01.2011
5. 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.
5 12.01.2011
6. 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.
6 12.01.2011
7. 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.
7 12.01.2011
8. 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.
8 12.01.2011