Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/05/2010, à 23: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, à 08: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, à 09: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, à 10: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, à 10: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, à 10: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, à 18: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, à 18: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, à 00:08)

Hors ligne

#9 Le 14/05/2010, à 18:54

Nezix

Re : Programmation Openmp (simple)

Pas d'idée?

Hors ligne

#10 Le 15/05/2010, à 12: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, à 20:02

telliam

Re : Programmation Openmp (simple)

désolé, moi ça date de trop loin smile
je sèche smile


"- 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, à 20:47

Nezix

Re : Programmation Openmp (simple)

Tu es excusé, merci quand même !
Ce sujet reste ouvert à toute proposition smile

Hors ligne

#13 Le 19/05/2010, à 21: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, à 21:47

telliam

Re : Programmation Openmp (simple)

je me disais bien aussi que ca avait un impact wink


"- 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, à 19: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