MPI_Parallel_Image_Processing
所属分类:图形图像处理
开发工具:C
文件大小:20114KB
下载次数:0
上传日期:2017-02-28 09:24:56
上 传 者:
sh-1993
说明: 使用OpenMPI用ANSI C编写的应用程序,使用心跳和波形算法对pmg图像应用过滤器
(An app written in ANSI C using OpenMPI, that uses heartbeat and wave algorithms for applying filter on pmg images)
文件列表:
filters.c (2939, 2017-02-28)
filters.h (246, 2017-02-28)
makefile (97, 2017-02-28)
pgm.c (1542, 2017-02-28)
pgm.h (319, 2017-02-28)
pic1-sharpen.pgm (25951801, 2017-02-28)
pic1.pgm (25987595, 2017-02-28)
pic2-smooth.pgm (7207422, 2017-02-28)
pic2.pgm (7206793, 2017-02-28)
pic3-m_removal.pgm (7292140, 2017-02-28)
pic3.pgm (7378582, 2017-02-28)
pic4-blur.pgm (1735208, 2017-02-28)
pic4.pgm (1734455, 2017-02-28)
tema3.c (13659, 2017-02-28)
/*
Theodor STOICAN
333CA
Tema3-APD
*/
Tema3 a fost, de departe, cea mai interesanta tema de la APD. Am invatat mult mai
bine cum sa lucrez cu MPI (d.p.d.v. al implementarii), dar si conceptual, intrucat
am avut ocazia sa implementez efectiv ceea ce am invatat la curs. O sa redau, in
cele de mai jos, cateva detalii de implementare:
*Ca algoritm unda, am folosit algoritmul ecou pentru determinarea topologiei.
In cadrul algoritmului am nevoie sa primesc si un token si rank-ul sursei,
asa incat, in loc sa trimit 2 mesaje, unul cu token-ul si unul cu rank-ul,
ma folosesc de statusul de la MPI_Recv : folosesc o variabila de tip MPI_Status
(in loc de MPI_STATUS_IGNORE) si imi extrag sursa din variabila stat(stat.MPI_SOURCE).
Dupa aplicarea algoritmului ecou (atat pentru procesul cu rank-ul 0, cat si pentru
celelalte), voi obtine, in cadrul fiecarui proces, atat rank-ul procesului parinte,
cat si rank-urile proceselor copii (am creat 2 functii aferente algoritmului:
echoAlgorithmInitiator si echoAlgorithmOther). De la acest punct incolo, voi implementa
efectiv algoritmul Heartbeat pentru impartirea liniilor unei imagini in mod egal intre
copii.
*Am implementat logica aferenta algoritmului Heartbeat in main, cu cazuri separate
pentru nod intern, radacina si frunza. De asemenea, mi-am creat o structura auxiliara,
pgm, in care retin imaginea, respectiv imaginea dupa aplicarea filtrelor. De asemenea,
pastrez in filters.c implementarea efectiva a filtrelor. Cand realizez trimiterea
catre procesele copii, am grija sa trimit blocul respectiv de pixeli, cele 2 granite,
dar si tipul de filtru, care se va propaga pana la nodurile frunza. Pastrez, la
nivelul proceselor frunza cate o variabila (num_processed_lines), pe care, dupa
primirea tagului de terminare (mesaje normale se trimit cu tag 1, cele de anuntare
a terminarii cu tag 2), le trimit inapoi, catre procesele de tip parinte.
*Una dintre problemele cele mai mari pe care le-am intampinat a fost citirea si scrierea
intr-un fisier de tip pgm. Dupa ce am citit cateva tutoriale pe internet, am incercat
sa scriu cu fputc() pixelii in fisier si sa nu mai scriu comentariile. Bad idea !
Cand am rulat diff intre imaginea din ref-ul testului si imaginea rezultata de pe
urma rularii programului meu, existau diferente(foarte multe). Prin urmare, am deschis
fisierul ref in gedit sa vad cum sunt asezati pixelii pentru a-i printa in aceeasi mod
si in cadrul programului meu. De asemenea, antetul fisierului (dimensiuni, comentarii
et al.) sunt citite cu fread, dupa care stocate in campul comments al structurii pgm.
De acolo, dupa realizarea filtrarii, le printez asa cum sunt in fisierul aferent, pentru
a nu mai avea probleme.
Pe scurt, cam astea sunt cele mai relevante detalii si potentialele probleme de care
m-am lovit. Per total, a fost o tema foarte faina.
Theodor
近期下载者:
相关文件:
收藏者: