web-dev-qa-db-fra.com

C ++ Bibliothèques de parallélisation: OpenMP vs. Bloc de construction de fil

Je vais installer mon moteur graphique personnalisé afin qu'il tire parti des processeurs multicœurs. Plus précisément, je cherche une bibliothèque à paralléliser des boucles.

Il me semble que les blocs de construction de fil OpenMP et Intel sont très bien adaptés au travail. En outre, les deux sont pris en charge par le compilateur C++ de Visual Studio et la plupart des autres compilateurs populaires. Et les deux bibliothèques semblent assez droites à utiliser.

Alors, lequel devrais-je choisir? Quelqu'un a-t-il essayé à la fois des bibliothèques et peut me donner des inconvénients et des avantages d'utiliser une seule bibliothèque? Aussi, qu'avez-vous choisi de travailler à la fin?

Merci,

Adrian

44
Adrian Grigore

Je n'ai pas beaucoup utilisé TBB, mais mon impression est qu'elles se complètent plus que la concurrence. TBB fournit des conteneurs de threadsafe et des algorithmes parallèles, alors que OpenMP est plus un moyen de parallercer le code existant.

Personnellement, j'ai trouvé OpenMP très facile à tomber dans le code existant où vous avez une boucle ou une bande de sections parallèle qui peut être exécutée en parallèle. Cependant, cela ne vous aide pas particulièrement pour un cas où vous devez modifier certaines données partagées - dans lesquelles les conteneurs simultanés de TBB pourraient être exactement ce que vous voulez.

Si tout ce que vous voulez, c'est de paraller des boucles où les itérations sont indépendantes (ou peuvent être assez facilement réalisées afin), j'irais pour OpenMP. Si vous avez besoin d'une plus grande interaction entre les threads, je pense que TBB peut offrir un peu plus à cet égard.

48
Peter

Du blog de logiciels d'Intel: comparer Windows * Threads, OpenMP *, blocs de construction Intel® pour la programmation parallèle

C'est aussi la question du style - pour moi TBB est très c ++ comme, tandis que je n'aime pas beaucoup les pragmas OpenMP (Requeux de C un peu, l'utiliserait si je devais écrire en C).

Je tiens également à considérer les connaissances et l'expérience existantes de l'équipe. Apprendre une nouvelle bibliothèque (surtout en matière de filetage/concurrence) prend du temps. Je pense que pour l'instant, OpenMP est plus largement connu et déployé que TBB (mais ce n'est que la mine d'opinion).

Encore un autre facteur - mais compte tenu des plates-formes les plus courantes, probablement pas un problème - portabilité. Mais la licence pourrait être un problème.

  • TBB intègre certaines des recherches agréables provenant de la recherche académique, par exemple approche parallèle de données récursive .
  • Il y a quelques travaux sur la convivialité de la cache, pour exemple .
  • La conférence du blog Intel semble vraiment intéressante.
25
Anonymous

En général, j'ai constaté que l'utilisation de TBB nécessite beaucoup plus de changements de consommation de temps à la base de code avec un gain élevé, tandis que OpenMP donne un gain rapide mais modéré. Si vous regardez un nouveau module à partir de zéro et que vous pensez à long terme avec TBB. Si vous voulez de petits mais des gains immédiats, optez avec OpenMP.

De plus, TBB et OpenMP ne sont pas mutuellement exclusifs.

16
Nikhil

J'ai effectivement utilisé les deux, et mon impression générale est que si votre algorithme est assez facile à faire parallèlement (parallèle de taille pair, pas trop d'interdépendance de données) OpenMP est plus facile et assez agréable à travailler. En fait, si vous trouvez que vous pouvez utiliser OpenMP, c'est probablement le meilleur moyen d'y aller, si vous connaissez votre plate-forme la soutiendra. Je n'ai pas utilisé les nouvelles structures de tâches d'OpenMP, qui sont beaucoup plus générales que les options de boucle et de section d'origine.

TBB vous donne plus de structures de données à l'avant, mais nécessite définitivement plus à l'avance. En plus, il pourrait Soyez mieux à vous faire prendre conscience des bugs de condition de course. Ce que je veux dire par ceci, c'est que cela est assez facile dans OpenMP d'activer les conditions de race en ne faisant pas quelque chose de partage (ou autre) qui devrait être. Vous ne voyez cela que lorsque vous obtenez de mauvais résultats. Je pense que cela est un peu moins susceptible de se produire avec TBB.

Globalement, ma préférence personnelle était pour OpenMP, en particulier compte tenu de son expressivité accrue avec des tâches.

6
Ben

Oui, TBB est beaucoup plus amical de C++ pendant que OpenMP est plus approprié pour le code C de style Fortran étant donné sa conception. La nouvelle fonctionnalité de tâche dans OpenMP a l'air très intéressante, tout en même temps, l'objet Lambda et fonction en C++ 0x peut rendre la TBB plus facile à utiliser.

2
Richard

Dans Visual Studio 2008, vous pouvez ajouter la ligne suivante à parallementer n'importe quelle boucle "pour". Cela fonctionne même avec plusieurs boucles imbriquées. Voici un exemple:

#pragma omp parallel for private(i,j)
for (i=0; i<num_particles; i++)
{
  p[i].fitness = fitnessFunction(p[i].present);
  if (p[i].fitness > p[i].pbestFitness)
  { 
     p[i].pbestFitness = p[i].fitness;
     for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j];
  }
}  
gbest = pso_get_best(num_particles, p);

Après avoir ajouté le #pragma oomp parallel, les deux noyaux de mon duo Core 2 ont été utilisés à leur capacité maximale. L'utilisation totale du processeur est donc passée de 50% à 100%.

1
Contango

VIVA64 Liens: Programmation parallèle .

1
Andrey