Bonsoir,
Je suis en train de me mettre à OpenMP car c'est une librairie qui me semble plutot utile lorsque l'on veut faire des calcul en C/C++, je me suis donc lancé dans un petit script en C pour tester l'avantage de OpenMP sur du traitement d'image de base, la conversion RGB -> gray scale, j'ai donc pris une de mes photos que j'ai mit en ppm pour la convertir en pgm. Je fait la conversion 20fois et je fais une moyenne et je trouve que sans OpenMP, le temps de conversion est inférieur à celui qu'il faut pour convertir avec l'utilisation de OpenMP, pour ça j'ai quelques ypothèses, par exemple : la mise en place des mutex et autre accès protégé sur les objet spécifié en shared consomme plus que si je faisait le calcul en séquentiel ou encore le nombre de thread est trop important, je l'ai fixé à 2 mais c'est pareil ... sinon je ne vois pas trop la raison. Je suis donc ici pour avoir un indice, voici mon bout de code :
Voici les temps que j'obtiens sans fixer le nombre de threads :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 for(w=0; w<NB_IT; w++) { y = SIZE_HEADER; start = mtime(); #pragma omp parallel for shared(sum, imgDest, y) private(imgOrig) for(i=0; i < SIZE_OUT; i++){ imgDest[i] = (11*imgOrig[y]+16*imgOrig[y+1]+5*imgOrig[y+2])/32; y += 3; } end = mtime(); if(end-start>0) sum += end-start; } printf("Avec OpenMP : %li us\n", sum/NB_IT); sum = 0; for(w=0; w<NB_IT; w++) { y = SIZE_HEADER; start = mtime(); for(i=0; i < SIZE_OUT; i++){ imgDest[i] = (11*imgOrig[y]+16*imgOrig[y+1]+5*imgOrig[y+2])/32; y += 3; } end = mtime(); if(end-start>0) sum += end-start; } printf("Sans OpenMP : %li us\n", sum/NB_IT);
Et en fixant le nombre de thread :xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 6651 us
Sans OpenMP : 2187 us
xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 7750 us
Sans OpenMP : 2726 us
xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 6604 us
Sans OpenMP : 2485 us
xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 7571 us
Sans OpenMP : 2229 us
Pour info, je suis sur une plateforme linux x86 avec un processeur X2 5400+ et mon compilateur est gcc.xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 6736 us
Sans OpenMP : 2185 us
xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 6020 us
Sans OpenMP : 2192 us
xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 6496 us
Sans OpenMP : 1942 us
xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 7379 us
Sans OpenMP : 2999 us
xwz@desktux ~/projet/test $ ./exec
Avec OpenMP : 10922 us
Sans OpenMP : 3350 us
Et surtout, voici ma fonction qui récupère les temps en microsecondes :
Et pour finir, ma ligne de compilation, meme si je ne suis par persuadé que cela serve vraiment :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 long int mtime(){ struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_usec; }
Donc voila, si vous pouviez me donner des indices sur le pourquoi du comment, ça serait sympa de votre part.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gcc -O4 -fopenmp -o exec main.c
Merci d'avance.
XwZ
Partager