2010-01-31 4 views
1

Je veux paralléliser une boucle dans une fonction de membre de classe. Cependant, il y a deux erreurs dans le code:Questions OpenMP

class myclass 
{ 
public: 

int _k; 

void f(int nb_examples, int nb_try) 
{ 
     int i; 
     int ks[nb_try]; 
     // assignment to elements in ks 
     omp_set_num_threads(_nb_threads); 
    #pragma omp parallel shared(ks) private(i, _k) // error: ‘myclass::_k’ is not a variable in clause ‘private’ 
     { 
    #pragma omp for schedule(dynamic) nowait 
     for(i=0; i < nb_try; i ++){ 
      _k = ks[i]; 
      if (_k > nb_examples) break;// error: break statement used with OpenMP for loop 
      // operations on _k 
     } 
     } 
} 
} 

Comment expliquer ces erreurs et résoudre les problèmes? Merci et salutations!

Répondre

6

Pour la deuxième erreur, la spécification OpenMP ne vous permet pas de sortir d'une boucle for parallèle ou de lancer des exceptions, en raison de la nature parallèle. Au lieu de cela, voir la solution de contournement sur ce blog: http://www.thinkingparallel.com/2007/06/29/breaking-out-of-loops-in-openmp/

Pour la première erreur, m'a pris un certain temps pour déterrer ce qui se passe réellement - Je pense que cela explique:

Les variables privées ne doivent pas avoir type de référence, car il provoquera accès simultané à la mémoire partagée. Bien que les variables seront privé, les variables seront toujours adresse le même fragment de mémoire. Les instances de classe déclarées comme privées doivent avoir un constructeur de copie explicite, car une instance contenant des références sera copiée incorrectement sinon.

de http://www.viva64.com/content/articles/parallel-programming/?f=32_OpenMP_traps.html&lang=en&content=parallel-programming

Fondamentalement, je ne pense pas vous pouvez utiliser des variables de niveau de classe privée sans en faire des copies. Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser une variable dans le cadre de votre fonction?

+0

Merci! J'ai vu que les varialbles définis en dehors de la région parallèle peuvent être déclarés privés, mais pourquoi pas ici? Y a-t-il une solution de contournement pour la première erreur? – Tim

+0

J'ai modifié mon message. Y at-il une raison pour laquelle vous ne pouvez pas insérer int dans la méthode? Cela fonctionne-t-il si vous le faites? –