Pages : 1
#1 Le 13/05/2010, à 00:23
- Nezix
Programmation Openmp (simple)
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?
Hors ligne
#2 Le 13/05/2010, à 09:45
- telliam
Re : Programmation Openmp (simple)
est ce que ca serait pas plutot l'appel a printf qui te ralentit ? etant donné que tu n'as qu'une sortie d'affichage cela créer forcément un goulot d'étranglement.
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#3 Le 13/05/2010, à 10:49
- Nezix
Re : Programmation Openmp (simple)
C'est possible sur cet exemple mais j'en ai essayé d'autres avec additions de nombre dans une matrice et le resultat est le meme.
Hors ligne
#4 Le 13/05/2010, à 11:01
- telliam
Re : Programmation Openmp (simple)
es tu sur que dans ton code, il n'y a pas access sur les 2 CPUs a la meme donnée au meme moment?
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#5 Le 13/05/2010, à 11:26
- Nezix
Re : Programmation Openmp (simple)
J'ai utilisé uniquement la directive openmp des programmes du premier post. J'ai changé les valeurs privées en testant toutes les combinaisons possibles au mieux j'atteinds la vitesse d'un monocore car il n'utilise qu'un coeur. Je vais joindre mes autres essais dans mon prochain post.
Hors ligne
#6 Le 13/05/2010, à 11:39
- Nezix
Re : Programmation Openmp (simple)
Voilà le premier programme que j'ai écrit pour tester le tout en pensant de façon optimiste que l'implémentation d'openmp dans mon petit programme se déroulerait à merveille: (je vous passe les allocations ...)
for(i=0;i<lentab;i++){
//printf("thread %d \n",omp_get_thread_num());
for(j=0;j<lentab;j++){
tab1[i][j]=rand()%50;
}
}
#pragma omp parallel for private(i,j,tmp)
for(i=0;i<lentab;i++){
//printf("thread %d \n",omp_get_thread_num());
//printf("l'essai du i %d sur thread %d \n",i,omp_get_thread_num());
for(j=0;j<lentab;j++){
for(tmp=0;tmp<lentab;tmp++){
truc1 +=((tab1[i][j]*5000)/74 *tmp)%10;
truc2 +=((tab2[i][j]*5000)/73 *tmp)%10;
}
}
}
Je me suis basé la dessus pour mesurer le temps d'exection.
Hors ligne
#7 Le 13/05/2010, à 19:23
- telliam
Re : Programmation Openmp (simple)
il te manque pas un for shared(tab1,tab2)
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#8 Le 13/05/2010, à 19:54
- Nezix
Re : Programmation Openmp (simple)
Dans la fonction de reference que j'ai pris (cf premier post dernier bout de code) il n'y a pas besoin de partager le tableau sur lequel le travail est fait.
Dernière modification par Nezix (Le 14/05/2010, à 01:08)
Hors ligne
#9 Le 14/05/2010, à 19:54
- Nezix
Re : Programmation Openmp (simple)
Pas d'idée?
Hors ligne
#10 Le 15/05/2010, à 13:18
- Nezix
Re : Programmation Openmp (simple)
Il n'y a pas de cadors en programmation parallèle et Openmp?
Hors ligne
#11 Le 16/05/2010, à 21:02
- telliam
Re : Programmation Openmp (simple)
désolé, moi ça date de trop loin
je sèche
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#12 Le 16/05/2010, à 21:47
- Nezix
Re : Programmation Openmp (simple)
Tu es excusé, merci quand même !
Ce sujet reste ouvert à toute proposition
Hors ligne
#13 Le 19/05/2010, à 22:30
- Nezix
Re : Programmation Openmp (simple)
Merci telliam, j'ai testé le même programme en commentant ou en décommentant un printf et il va bien plus vite sur 2 threads.
Je vais tester des choses plus complexes maintenant.
Hors ligne
#14 Le 19/05/2010, à 22:47
- telliam
Re : Programmation Openmp (simple)
je me disais bien aussi que ca avait un impact
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#15 Le 21/05/2010, à 20:20
- Plokta
Re : Programmation Openmp (simple)
Tu devrais essayer aussi d'enlever le malloc qui n'est pas une fonction parallélisable.
En règle générale, les allocations et les initialisations sont toujours mieux en dehors des boucles parallélisées.
Hervé ADAM
http://www.tvpaint.fr
Hors ligne
Pages : 1