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)
{
   ...
}
Était-ce utile?

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:

https://openmp.org/specifications/

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 programme

     

Pour 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.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top