Forum Clubic

Programmation simple Openmp

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?

Bonjour,

Quelle est la fonction que vous avez utilisé pour mesurer le temps d’exécution?

Merci

La commande Unix time mesure le temps d’exécution.
J’ai aussi posté ce sujet à cette adresse: forum.ubuntu-fr.org…

Bonjour

Essayez de mesurer le temps d’exécution de votre code par la fonction “clock_gettime” comme suit :

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc, char * argv[])
{ int lentab=atoi(argv[1]);
int i;
double nsec;
struct timespec start, end;
clock_gettime(CLOCK_THREAD_CPUTIME_ID,&start);
#pragma omp parallel for private(i)
for(i=0;i<lentab;i++)
{ printf("%d\n",i);
}
clock_gettime(CLOCK_THREAD_CPUTIME_ID,&end);
nsec =(end.tv_sec * 1000000000.0 + end.tv_nsec) - (start.tv_sec * 1000000000.0 + start.tv_nsec) ;
printf("%f",nsec);
return 0;
}

Pour compiler :
gcc -fopenmp sec_simple.c -o test.exe