J'ai un morceau de code avec deux boucles imbriquées. Quand le premier a peu d'étapes, le second a beaucoup, et l'inverse. Je peux exécuter les deux pour les boucles avec omp pour les directives indépendamment et j'ai des résultats cohérents (et une accélération). Cependant, je voudrais:Planification OpenMP
- Exécutez le premier en parallèle si elle a 16 étapes ou plus
- courir un autre le second en parallèle (mais pas le premier, même si elle a 8 étapes)
Ce parallélisme n'est pas imbriqué, car une boucle est parallèle ou l'autre. Si je les exécute de manière indépendante et exécute top -H pour voir les threads, j'observe parfois seulement un thread, parfois plus (dans chaque cas) alors ce que je veux faire aurait du sens et améliorerait réellement la performance?
Jusqu'à présent, je l'ai fait quelque chose comme ceci:
#pragma omp parallel
{
#pragma omp for schedule(static,16)
for(...){
/* some declarations */
#pragma omp for schedule(static,16) nowait
for(...){
/* ... */
}
}
}
qui ne compile pas (à l'intérieur du partage du travail région partage du travail ne peut pas être étroitement imbriquées, critique, commandé, maître ou d'une région de tâche explicite) et qui ne se comporterait pas comme je l'ai décrit de toute façon. J'ai également essayé de réduire mais j'ai eu des problèmes avec les "/ * quelques déclarations * /", et je voudrais l'éviter puisque c'est openmp3.0 et je ne suis pas sûr que le compilateur du matériel cible supportera cela.
Des idées?
Salut et merci. En fait, j'ai fini par écrire deux régions parallèles différentes dans un if() {} else {} comme vous l'avez dit. C'est moche mais c'est assez efficace. Je vais essayer votre solution quand je chercherai quelque chose d'élégant. – Emilien