Bonjour,
Je me mets doucement à la programmation parallèle notamment avec Openmp. Avec mon core2duo et ma distribution linux je charge ma valeur d’environnement
export OMP_NUM_THREADS=2
puis je lance mon programme C précédemment compilé par
gcc -Wall -fopenmp sec_simple.c -o test.exe
Voici mon code C tout simple:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc, char * argv[]){
int lentab=atoi(argv[1]);
int i;
#pragma omp parallel for private(i)
for(i=0;i<lentab;i++){
printf("%d\n",i);
}
return 0;
}
En mesurant le temps d’execution de mon programme sur une boucle 5 millions d’itérations je me rends compte que le programme met environ 3 fois plus de temps lorsque ma variable d’environnement définissant le nombre de coeur à utiliser est définie à 2 que lorsqu’elle est à 1.
Une autre fonction en partie trouvée sur un tuto me permet de gagner la moitié de temps attendue :
float ** produit(int **A,int **B, int N){
float **C = (float **)malloc(sizeof(float *)*N);
int i,j,k;
float temp;
#pragma omp parallel for private(i,j,k,temp)
for (i=0; i<N; i++) {
C[i]=(float *)malloc(sizeof(float)*N);
for (j = 0; j<N; j++) {
temp = 0.0;
for (k=0; k<N; k++)
temp += A[i][k+0] * B[k+0][j];
C[i][j] += temp;
}
}
return C;
}
Pourquoi ma directive Openmp ne me permet pas de gagner du temps (m’en fait perdre) alors qu’elle est superposable à une directive qui fonctionne dans les mêmes conditions ou presque?