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 & threadprivate


Sujet :

Threads & Processus C++

  1. #1
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut OpenMp & threadprivate
    Bonjour,

    J'ai un message d'erreur concernant cette directive dans l'example simplifié ci-dessous.
    Le message est "r declared 'threadprivate' after first use"
    Ca vient du fait que ma classe a un constructeur mais ca je n'y peut rien.
    Cet operator est appelé dans une boucle parallélisée et qui merde parce va variable stratic 'r' est commune aux threads, d'ou la tentaative d'utilisation de la directive "threadprivate"

    Je ne sais pas comment faire autrement.

    Merci de vos suggestions
    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
     
     
    class  my_class
    {
     public :
      double x,y;
      my_class() { x=y=0; }
    };
     
     
    my_class&  my_class::operator*(const my_calss &p)
    {
    // déclaré en static parce que son constructeur prend trop de temps
      static my_class r; 
      #pragma omp threadprivate(r)
     
      r.x=r.y=0.;
      // differents calculs
     
       return(r);
    }

  2. #2
    screetch
    Invité(e)
    Par défaut
    avec un pointeur ?

    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
     
    class  my_class
    {
     public :
      double x,y;
      my_class() { x=y=0; }
    };
     
     
    my_class&  my_class::operator*(const my_calss &p)
    {
    // déclaré en static parce que son constructeur prend trop de temps
      static my_class *r = new my_class(); 
      #pragma omp threadprivate(r)
     
      *r.x=*r.y=0.;
      // differents calculs
     
       return(*r);
    }
    il se peut que tu doives faire un if pour l'initialisation
    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
     
    class  my_class
    {
     public :
      double x,y;
      my_class() { x=y=0; }
    };
     
     
    my_class&  my_class::operator*(const my_calss &p)
    {
    // déclaré en static parce que son constructeur prend trop de temps
      static my_class *r;
      #pragma omp threadprivate(r)
      if(!r) r = new my_class(); 
     
      *r.x=*r.y=0.;
      // differents calculs
     
       return(*r);
    }

  3. #3
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui évidemment,j 'aurais du y penser, merci beaucoup.

    Une autre question au passage:
    Quelle est la différence entre omp_set_num_thread(0) & omp_set_num_thread(1), en d'autre termes si je veux iniber le mode //, quelle est la facon la plus éfficace ?

  4. #4
    screetch
    Invité(e)
    Par défaut
    alors la aucune idée, j'avais jamais utilisé openmp avant ta question hier ou avant-hier, donc je sèche :p

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

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