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.