121 votes

OpenMP: omp parallel vs omp parallel?

Je suis un newbie pour OpenMP (j'ai commencé à l'utiliser aujourd'hui)

Quelle est la différence entre ces deux?

[A]

#pragma omp parallel
{ 
#pragma omp for
    for(1...100)
    {
    }
}

[B]

#pragma omp parallel for
for(1..100)
{
}

Merci à l'avance!

76voto

Les deux sont équivalents.

#pragma omp parallel engendre un groupe de threads, tout en #pragma omp for divise les itérations de boucle entre le donné naissance à des fils. Vous pouvez faire les deux choses à la fois avec la fondue #pragma omp parallel for directive.

74voto

Ade Miller Points 7750

Je ne pense pas qu'il y a une différence, l'un est un raccourci pour l'autre. Bien que les dates exactes de votre mise en œuvre pourrait les traiter différemment.

"La combinaison parallèle le partage du travail constructions sont un raccourci pour la spécification d'une structure parallèle contenant un partage des tâches construire et pas d'autres déclarations. Permis des clauses de l'union des clauses autorisé pour le parallèle et le partage du travail contructs."

Prises de http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf

Les spécifications pour OpenMP sont ici:

http://openmp.org/wp/openmp-specifications/

31voto

NtsDK Points 18

Ici est un exemple de l'aide séparés parallel et for ici. En bref, il peut être utilisé pour l'allocation dynamique de de threads OpenMP-privé tableaux avant l'exécution d' for cycle de plusieurs threads. Il est impossible de faire la même initialisation en parallel for des cas.

7voto

parcompute Points 19

Je vois radicalement différentes exécutions quand je prends une boucle for dans g++ 4.7.0 et à l'aide de

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 ) se déroule en 79 ms. le "parallèle" le code est exécuté dans 29 mme. Si je omettre l' for et l'utilisation #pragma omp parallel, le moteur d'exécution pousses jusqu'à 179ms, ce qui est plus lent que le code de série. (la machine a hw simultanéité de 8)

le code des liens vers d' libgomp

0voto

Mallo Points 6

[A] et [B] doit être la même selon:

http://openmp.org/mp-documents/omp-hands-on-SC08.pdf

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X