Quelle est la différence entre ces deux?
[UNE]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
Je ne pense pas qu'il y ait de différence, l'un est un raccourci vers l'autre. Bien que votre implémentation exacte puisse les traiter différemment.
Les constructions de partage de projet parallèles combinées sont un raccourci pour spécifier une construction parallèle contenant une construction de partage de projet et aucune autre instruction. Les clauses autorisées sont l'union des clauses autorisées pour les contrats parallèles et partagés.
Tiré de http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf
Les spécifications d'OpenMP sont ici:
Celles-ci sont équivalentes.
#pragma omp parallel
génère un groupe de threads, tandis que #pragma omp for
divise les itérations de boucle entre les threads générés. Vous pouvez faire les deux choses à la fois avec la #pragma omp parallel for
directive fusionnée .
schedule(static, chunk)
clause dans pour directive, j'obtiens un problème. Le code fonctionne bien, mais lorsque j'invoque ce code à partir d'un programme MPI, il s'exécute dans une boucle infinie. Le compteur de boucle est nul dans toutes les itérations de cette boucle. J'ai le compteur de boucle défini comme privé dans la#pragma omp parallel
directive. Je ne sais pas pourquoi il échoue uniquement lorsque MPI appelle le code. Je suis un peu sûr que chaque processus MPI fonctionne sur un processeur différent du cluster si cela compte. Aucune idée si le calendrier est à l'origine du problème.#pragma omp parallel for
directive. Il devrait y avoir une différence.Voici un exemple d'utilisation de séparés
parallel
etfor
ici . En bref, il peut être utilisé pour l'allocation dynamique de tableaux privés de threads OpenMP avant d'exécuter lefor
cycle dans plusieurs threads. Il est impossible de faire la même initialisation enparallel for
cas.UPD: Dans l'exemple de question, il n'y a pas de différence entre un pragma unique et deux pragmas. Mais en pratique, vous pouvez créer un comportement plus sensible aux threads avec des directives parallèles et for séparées. Un peu de code par exemple:
la source
Bien que les deux versions de l'exemple spécifique soient équivalentes, comme déjà mentionné dans les autres réponses, il y a encore une petite différence entre elles. La première version inclut une barrière implicite inutile, rencontrée à la fin du "omp for". L'autre barrière implicite se trouve à l'extrémité de la région parallèle. Ajouter "nowait" à "omp for" rendrait les deux codes équivalents, au moins du point de vue d'OpenMP. Je mentionne cela car un compilateur OpenMP pourrait générer un code légèrement différent pour les deux cas.
la source
Je vois des temps d'exécution très différents lorsque je prends une boucle for dans g ++ 4.7.0 et que j'utilise
le code de série (non
openmp
) s'exécute en 79 ms. le code "parallèle pour" s'exécute en 29 ms. Si j'ometsfor
et utilise#pragma omp parallel
, le runtime atteint 179 ms, ce qui est plus lent que le code de série. (la machine a une concurrence hw de 8)le code renvoie à
libgomp
la source
#pragma omp for
il n'y a pas du tout de partage multi-thread de la boucle. Mais ce n'était pas le cas de toute façon, essayez à nouveau avec un#pragma omp for
élément supplémentaire à l'intérieur du#pragm omp parallel
et il devrait fonctionner de manière similaire (sinon identique) à la#pragma omp parallel for
version.Il y a évidemment plein de réponses, mais celle-ci y répond très bien (avec source)
et:
https://bisqwit.iki.fi/story/howto/openmp/
la source