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

Threads & Processus C++ Discussion :

OpenMP et boucles


Sujet :

Threads & Processus C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut OpenMP et boucles
    bonjour tous,

    -> je dois m'initier à OpenMP, je n'y connais pas grand chose dans ce domaine auriez vous des exemples simples d'utilisation s'il vous plait ?

    -> ou connaitriez vous un tutoriel intéressant sur OpenMP (enC++ par contre pas en fortran) ?

    j'ai entendu dire qu'avec OpenMP on peut soit paralléliser des boucles "for" soit paralléliser des "while" et apparemment la seconde solution

    est la meilleur et de loin.

    Auriez vous des choses à me dire là dessus car je ne vois pas trop en fait la différence de programmation entre ces deux méthodes

    vu que je n'y connais pas grand chose en OpenMP...


    je vous remercie, toute information pourra m'être utile
    bonne journée

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Wikipedia (en) permet d'avoir quelques explications et exemples
    http://en.wikipedia.org/wiki/OpenMP

    Sinon, grosso modo, il y a deux utilisations d'OpenMP.

    Le plus simple est de demander à OpenMP de partager les itérations d'une boucle for.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma omp parallel for
    Il suffit de placer cette ligne au dessus de la boucle for que l'on veut paralléliser.

    On peut aussi déclare une section parallèle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #pragma omp parallel
    {
        // Code exécuté une fois par thread créé par OpenMP
    }
    C'est beaucoup plus compliqué à utiliser.

    Exemples sur l'autre sujet.
    http://www.developpez.net/forums/d12...ilite-tableaux

    On ne peut pas paralléliser des boucles while (sauf erreur de ma part).

    ---

    Pour paralléliser une boucle for, il y a des limitations : par exemple l'indice de parcours doit être un entier.

    Il existe un ensemble d'options, on peut demander à faire des réductions (sur des types de bases uniquement :/)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma omp parallel for reduction(+:sum)
    Si les variables sont déclarés avant, elles sont partagées (sauf les itérateurs je crois). On peut expliciter si les variables doivent être partagées ou pas.
    On peut aussi choisir comment sont partager les itérations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    schedule(dynamic, CHUNKSIZE)
    ---

    Une fois que l'on est dans la zone parallèle :

    On peut utiliser des sections critiques (à éviter pour des question de performances).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #pragma omp critical
    {
        // Section critique
    }
    Seul le thread 0 exécute ces instructions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #pragma omp master
    {
        // Code
    }
    On peut demande une barrière de synchronisation entre les threads (pratique pour faire des affichages, à éviter pour des questions de performances)
    ---

    Dans le code, on peut utiliser des fonctions d'OpenMP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if defined(_OPENMP)
    #include <omp.h>
    #endif
    Nombre de threads dans cette section (attention ça retourne 1 si on n'est pas dans une section OpenMP)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const nb_thread = omp_get_num_threads();
    Id du thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const id = omp_get_thread_num();
    Il existe aussi
    ---

    On peut aussi faire de la parallélisation de tâche basique (f0, f1, f2 sont les fonctions qui contiennent notre code, on peut aussi faire un nouveau bloc { })
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #pragma omp parallel
    {
    	#pragma omp sections
    	{
    		#pragma omp section
    		f0();
    		#pragma omp section
    		f1();
    		#pragma omp section
    		f2();
    	}
    }
    ---

    Malgré cette syntaxe facile, si on demande à OpenMP de paralléliser, il parallélise, même si le code n'est pas parallélisable (changement de résultat entre la version séquentielle et parallèle).

    Pour les débutants il peut être intéressant d'utiliser un compilateur source à source qui permet de paralléliser (entre autres, tiling, déroulage de boucle, ...) automatiquement comme PLUTO Compiler ou PoCC.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    je te remercie pour toutes ces informations!!!!
    c'est vraiment gentil
    - je pense que j'ai tous les éléments pour faire plein de petits test.
    - je vais essayer de me faire des programmes à complexité croissante,
    pourras tu me donner ton avis sur ce que j'aurais fais stp? (sur forum ou MP?)

    pour la boucle "while" j'ai entendu parlé de ceci mais je n'ai pas vraiment compris (car je n'y connais rien en parallélisation mais aussi car je suis nul en anglais).
    j'ai vu par exemple ce genre de lien :
    http://openmp.org/forum/viewtopic.php?f=7&t=530
    http://openmp.org/forum/viewtopic.php?f=3&t=323

    en fait je t'ai parlé de ceci car j'ai eu l'occasion de discuter avec "une référence
    en parallélisation" dans une entreprise où j'etais il y a peu. Il m'avait dit qu'il n'utilisais pratiquement que des boucles while car il arrivait à optimiser au mieux de cette façon les temps d'attente entre processeur. Comme à l'époque je ne connaissais pas du tout la parallélisation (encore moins que maintenant, tu vois un peu le désastre ) du coup je n'ai pas vraiment cherché à comprendre mais maintenant ça m'intéresse de comprendre car je vais avoir à faire ceci dans le cadre d'un stage (en tout cas se serait un vrai plus pour moi si j'arriverai à paralléliser mon code)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Performances OpenMP : parallélisation boucles
    Par ant12oine dans le forum Fortran
    Réponses: 11
    Dernier message: 03/12/2010, 13h09
  2. Pb OpenMP avec fonction + boucles
    Par Syens dans le forum Threads & Processus
    Réponses: 14
    Dernier message: 16/09/2010, 14h57
  3. Boucles dépendantes et OpenMP
    Par nanath02 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 26/03/2010, 14h49
  4. Boucle Do parallele OpenMP
    Par zerbault dans le forum Fortran
    Réponses: 4
    Dernier message: 13/01/2010, 21h49
  5. parallélisation openmp boucles imbriquées
    Par black.scratch dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 13/07/2009, 12h52

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