2010-03-25 7 views
18

J'essaie d'utiliser openmp pour multithread une boucle à travers std :: set. Quand j'écris le code suivant -Itération par conteneurs std dans openmp

#pragma omp parallel for 
    for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) { 
      const A a = *i; 
      operate(a); 
    } 

Je reçois cette erreur:

error: invalid type for iteration variable 'i' 
error: invalid controlling predicate 
error: invalid increment expression. 

Y at-il une autre bonne façon de itérer conteneurs std en utilisant OpenMP? Je sais que je peux utiliser int i et itérer de 0 à s.size() et un itérateur ou operator[] dans le corps de la boucle, mais cela semble beaucoup moins propre.

+1

Quel compilateur? GCC a une implémentation parallèle (http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html) de 'std :: for_each' qui devrait faire l'affaire pour vous. Peut-être que vous pouvez également regarder la source là-bas? Voir aussi http://algo2.iti.kit.edu/singler/mcstl/. – stephan

Répondre

21

La parallélisation de boucle pour les itérateurs ne fonctionne que depuis OpenMP 3.0, et uniquement pour les itérateurs à accès aléatoire (par exemple vector et deque). Vous devriez être en mesure de faire quelque chose comme ceci:

#pragma omp parallel { 
    for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) { 
     #pragma omp single nowait { 
     operate(*i); 
     } 
    } 
} 

frais généraux est assez grand mais parce que chaque fil parcourt la séquence complète (mais seulement sur certains operate exécute de celui-ci). Votre méthode utilisant un int i est plus efficace.

En guise d'alternative, jetez un oeil à la mise en œuvre parallèle de GCC de std::for_each. Voir mon commentaire Le STL Parallism TS, qui fera très probablement partie de C++ 17, pourrait être une bonne option dans l'avenir pour l'itération sur les conteneurs standards.

+0

Merci! MCSTL est ce que j'ai besoin. –

+0

'std :: set' n'a pas le' operator [] 'et msvc ne supporte que openmp 2.0:/ – quimnuss

+1

@quimnuss: le [STL parallèle] (https://parallelstl.codeplex.com/) pour msvc pourrait être utile . [Parallelism TS] (https://isocpp.org/files/papers/P0024R2.html) fera très probablement partie de C++ 17, donc cela devrait raisonnablement être à l'épreuve du futur (mais peut-être encore avoir des bugs et ne pas être caractéristique complet, je n'ai pas suivi de trop près l'implémentation MS). – stephan