web-dev-qa-db-fra.com

omp parallel vs. omp parallel pour

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)
{
   ...
}
95
Hyunjik Bae

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:

https://openmp.org/specifications/

60
Ade Miller

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.

60
Krzysztof Kosiński

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
}
25
NtsDK

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.

8
phadjido

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

5
parcompute

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.

https://bisqwit.iki.fi/story/howto/openmp/

4
fogx