84 votes

Utilisation d'OpenMP avec des boucles for basées sur des intervalles en C++11 ?

Y a-t-il des contre-indications à cela ? Ou le comportement est-il bien spécifié ?

#pragma omp parallel for
for(auto x : stl_container)
{
   ...
}

Parce qu'il semble que la spécification OpenMP ne soit valable que pour c++98, mais je suppose qu'il pourrait y avoir d'autres incompatibilités dues aux threads C++11, qui ne sont pas utilisés ici. Je voulais quand même être sûr.

54voto

Hristo Iliev Points 29262

La spécification OpenMP 4.0 a été finalisée et publiée il y a quelques jours. aquí . Elle impose toujours que les boucles parallèles soient de forme canonique (§2.6, p.51) :

for ( init-expr ; test-expr ; incr-expr ) bloc structuré

La norme permet d'utiliser dans toutes les expressions les conteneurs qui fournissent des itérateurs à accès aléatoire, par exemple :

#pragma omp parallel for
for (it = v.begin(); it < v.end(); it++)
{
   ...
}

Si vous persistez à vouloir utiliser le sucre syntaxique de C++11, et si le traitement de chaque élément de stl_container vous pouvez alors utiliser le modèle de tâches à producteur unique :

#pragma omp parallel
{
   #pragma omp single
   {
      for (auto x : stl_container)
      {
         #pragma omp task
         {
            // Do something with x, e.g.
            compute(x);
         }
      }
   }
}

L'attribution de tâches induit certains frais généraux, il serait donc absurde d'utiliser ce modèle si compute(x); prend très peu de temps.

27voto

OpenMP 5.0 ajoute la ligne suivante à la page 99, ce qui rend beaucoup de boucles for basées sur l'intervalle OK !

2.12.1.3 Une boucle for basée sur une plage avec un itérateur à accès aléatoire a une forme de boucle canonique.

Source : https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X