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 pour l'autre. Bien que votre implémentation exacte puisse les traiter différemment.
Les constructions de partage de travaux parallèles combinées constituent un raccourci pour spécifier une construction parallèle contenant une construction de partage de travail et aucune autre instruction. Les clauses autorisées sont l'union des clauses autorisées pour les structures de partage et de travail en parallèle.
Tiré de http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf
Les spécifications pour OpenMP sont ici:
Ce sont équivalents.
#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 le fusionné #pragma omp parallel for
directive.
Voici un exemple d'utilisation de parallel
et for
séparés ici . En bref, il peut être utilisé pour l'allocation dynamique de matrices privées de threads OpenMP avant d'exécuter le cycle for
dans plusieurs threads. Il est impossible de faire la même initialisation dans parallel for
Cas.
UPD: Dans l'exemple de question, il n'y a pas de différence entre un pragma simple et deux pragmas. Mais dans la pratique, vous pouvez créer un comportement plus sensible aux threads avec des directives parallèles et séparées séparées. Quelques codes par exemple:
#pragma omp parallel
{
double *data = (double*)malloc(...); // this data is thread private
#pragma omp for
for(1...100) // first parallelized cycle
{
}
#pragma omp single
{} // make some single thread processing
#pragma omp for // second parallelized cycle
for(1...100)
{
}
#pragma omp single
{} // make some single thread processing again
free(data); // free thread private data
}
Bien que les deux versions de l'exemple spécifique soient équivalentes, comme cela a déjà été mentionné dans les autres réponses, il existe encore une petite différence entre elles. La première version inclut une barrière implicite inutile, rencontrée à la fin du "omp pour". L'autre barrière implicite peut être trouvée à la fin de la région parallèle. Ajouter "nowait" à "omp for" rendrait les deux codes équivalents, du moins du point de vue d'OpenMP. Je le mentionne car un compilateur OpenMP pourrait générer un code légèrement différent pour les deux cas.
Je vois des exécutions très différentes quand je prends une boucle for en g ++ 4.7.0 et que j'utilise
std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;
for (int i = 0; i < 5000000; i++)
{
double r1 = ((double)Rand() / double(Rand_MAX)) * 5;
double r2 = ((double)Rand() / double(Rand_MAX)) * 5;
x.Push_back(r1);
y.Push_back(r2);
}
int sz = x.size();
#pragma omp parallel for
for (int i = 0; i< sz; i++)
prod[i] = x[i] * y[i];
le code de série (no openmp
) s'exécute en 79 ms. le code "parallèle pour" s'exécute en 29 ms. Si j'omets le for
et utilise #pragma omp parallel
, le temps d'exécution atteint 179 ms, ce qui est plus lent que le code série. (la machine a un accès simultané hw de 8)
le code est lié à libgomp
Il y a évidemment beaucoup de réponses, mais celle-ci y répond très bien (avec la source)
#pragma omp for
ne délègue que des parties de la boucle pour différents threads de l’équipe actuelle . Une équipe est le groupe de threads exécutant le programme. Au début du programme, l’équipe se compose uniquement d’un seul membre : le thread principal qui exécute le programme.Pour créer une nouvelle équipe de threads, vous devez spécifier le mot clé parallel. Il peut être spécifié dans le contexte environnant:
#pragma omp parallel { #pragma omp for for(int n = 0; n < 10; ++n) printf(" %d", n); }
et:
Quels sont: parallèle, pour et une équipe
La différence entre parallèle, parallèle pour et pour est la suivante:
Une équipe est le groupe de threads qui s'exécutent actuellement. Au début du programme, l’équipe est constituée d’un seul fil. Une construction parallèle divise le thread actuel en une nouvelle équipe de threads pour la durée du prochain bloc/instruction, après quoi l'équipe est fusionnée en un seul. for divise le travail de la boucle for entre les threads de l'équipe actuelle.
Il ne crée pas de threads, il divise simplement le travail entre les threads de l'équipe en cours d'exécution. parallel pour est un raccourci pour deux commandes à la fois: parallel et pour. Parallèle crée une nouvelle équipe et, pour les divisions, cette équipe gère différentes parties de la boucle. Si votre programme ne contient jamais de construction parallèle, il n'y a jamais plus d'un thread; le thread principal qui démarre le programme et l'exécute, comme dans les programmes sans thread.