omp omp parallèle par rapport parallèle pour
-
11-09-2019 - |
Question
Quelle est la différence entre ces deux?
[A]
#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)
{
...
}
La solution
Je ne pense pas qu'il y ait une différence, on est un raccourci pour l'autre. Bien que votre implémentation exacte pourrait traiter différemment avec eux.
Les constructions de partage du travail parallèles sont combinées pour un raccourci spécifiant une construction parallèle contenant une construction worksharing et aucune autre déclaration. clauses autorisées sont l'union des clauses autorisé pour les contructs parallèles et partage du travail.
http://www.openmp.org/mp- documents / OpenMP3.0-SummarySpec.pdf
Les spécifications pour OpenMP sont ici:
Autres conseils
Ce sont équivalents.
#pragma omp parallel
engendre un groupe de fils, tandis que #pragma omp for
divise itérations de boucle entre les fils engendré. Vous pouvez faire les deux choses à la fois avec la directive #pragma omp parallel for
fusionnée.
Je vois runtimes crûment différentes quand je prends une boucle en g ++ 4.7.0 et en utilisant
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 (pas de openmp
) fonctionne dans 79 ms.
le code « parallèle » fonctionne dans 29 ms.
Si j'omettez le for
de #pragma omp parallel
et d'utilisation, le moteur d'exécution tire jusqu'à 179ms,
qui est plus lent que le code série. (La machine a concurrence de 8 hw)
les liens de code à libgomp
Il y a évidemment beaucoup de réponses, mais celui-ci il répond très bien (avec source)
#pragma omp for
seuls les délégués des parties de la boucle pour différents fils dans le club courant . Une équipe est le groupe de fils l'exécution du programme. Au début du programme, l'équipe ne se compose que d'un seul membre:. Le fil maître qui exécute le programmePour créer une nouvelle équipe de threads, vous devez spécifier le parallèle mot-clé. 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
Qu'est-ce que sont: parallèles, et une équipe
La différence entre parallèle, parallèle et se présente comme suit:
Une équipe est le groupe de fils qui exécutent actuellement. Au début du programme, l'équipe est composée de un seul fil. Une construction parallèle divise le courant en un fil nouvelle équipe de fils pour la durée du prochain bloc / déclaration, après quoi l'équipe se confond en arrière en un seul. pour le travail divise la pour en boucle entre les filets de l'équipe actuelle.
Il ne crée pas threads, il ne divise le travail entre les fils du moment l'équipe d'exécution. parallèle est un raccourci pour deux commandes à la fois: parallèles et pour. Parallèle crée une nouvelle équipe, et pour les divisions qui équipe pour traiter différentes parties de la boucle. Si votre programme ne contient une construction parallèle, il n'y a jamais plus d'un fil; le fil maître qui démarre le programme et l'exécute, comme dans programmes non-thread.