IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation parallèle, calcul scientifique et de haute performance (HPC) Discussion :

Performances et OpenMP


Sujet :

Programmation parallèle, calcul scientifique et de haute performance (HPC)

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    xwz
    xwz est déconnecté
    Membre averti
    Profil pro
    Analyste programmeur
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Par défaut Performances et OpenMP
    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 :
    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);
    Voici les temps que j'obtiens sans fixer le nombre de threads :
    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
    Et en fixant le nombre de thread :
    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
    Pour info, je suis sur une plateforme linux x86 avec un processeur X2 5400+ et mon compilateur est gcc.
    Et surtout, voici ma fonction qui récupère les temps en microsecondes :
    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;
    }
    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
     
    gcc -O4 -fopenmp -o exec main.c
    Donc voila, si vous pouviez me donner des indices sur le pourquoi du comment, ça serait sympa de votre part.

    Merci d'avance.

    XwZ

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2009
    Messages : 38
    Par défaut
    Bonjour,

    ce code ne devrait même pas fonctionner: certaines variables de ta boucle ne sont pas labélisées comme étant shared ou private... Au pire, mets default(shared), même si c'est déconseillé généralement ça t'évitera d'en oublier.
    De plus, dans le cas de boucles imbriquées, la parallélisation se fait toujours sur la boucle extérieure, pour des raisons évidentes de performance: dans ton cas, à chaque itération l'équipe de threads est recréée... avec de lourdes conséquences en terme de performance.

    A+

Discussions similaires

  1. Performances OpenMP : parallélisation boucles
    Par ant12oine dans le forum Fortran
    Réponses: 11
    Dernier message: 03/12/2010, 13h09
  2. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo