Question

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

Il me semble que les blocs de construction de threads OpenMP et d’Intel conviennent très bien à cette tâche. De plus, les deux sont pris en charge par le compilateur C ++ de Visual Studio et la plupart des compilateurs populaires. Et les deux bibliothèques semblent assez simples à utiliser.

Alors, lequel devrais-je choisir? Quelqu'un a-t-il essayé les deux bibliothèques et peut-il me donner quelques inconvénients et avantages d'utiliser l'une ou l'autre? Aussi, avec quoi avez-vous choisi de travailler à la fin?

Merci,

Adrian

Était-ce utile?

La solution

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

Personnellement, j’ai trouvé qu’OpenMP était très facile à insérer dans du code existant dans lequel vous avez une boucle parallélisable ou un groupe de sections pouvant être exécutées en parallèle. Toutefois, cela ne vous aide pas particulièrement dans le cas où vous devez modifier certaines données partagées, où les conteneurs simultanés de TBB pourraient être exactement ce que vous voulez.

Si tout ce que vous voulez, c'est de paralléliser des boucles où les itérations sont indépendantes (ou que vous pouvez le faire assez facilement), je choisirais OpenMP. Si vous avez besoin de plus d’interactions entre les fils, je pense que TBB peut en offrir un peu plus à cet égard.

Autres conseils

Sur le blog du logiciel Intel: Comparez les threads Windows *, OpenMP *, Intel & # 174; Filtrer les blocs de construction pour la programmation parallèle

C’est aussi une question de style - pour moi, TBB est très semblable à C ++, alors que je n’aime pas trop les pragmas OpenMP (un peu de poire de C, je l’utiliserais si je devais écrire en C).

Je prendrais également en compte les connaissances et l'expérience existantes de l'équipe. L’apprentissage d’une nouvelle bibliothèque (particulièrement en matière de threading / concurrence) prend un certain temps. Je pense que pour le moment, OpenMP est plus largement connu et déployé que TBB (mais ce n’est que mon opinion).

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

  • TBB intègre certaines recherches intéressantes issues de recherches universitaires, par exemple approche parallèle des données récursives .
  • Certains travaux ont été réalisés sur la convivialité du cache, car exemple .
  • La lecture du blog Intel semble vraiment intéressante.

En général, j'ai constaté que l'utilisation de TBB nécessitait beaucoup plus de modifications de la base de code avec un gain élevé, tandis qu'OpenMP rapportait un gain rapide mais modéré. Si vous regardez un nouveau module à partir de zéro et que vous pensez à long terme, utilisez TBB. Si vous voulez des gains modestes mais immédiats, optez pour OpenMP.

De plus, TBB et OpenMP ne s’excluent pas mutuellement.

En fait, j’ai utilisé les deux, et j’ai l’impression générale que si votre algorithme est assez facile à créer en parallèle (par exemple, des boucles de taille égale, pas trop d’interdépendance des données), OpenMP est plus facile et agréable à utiliser. En fait, si vous savez que vous pouvez utiliser OpenMP, c'est probablement la meilleure solution, si vous savez que votre plate-forme le supportera. 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 en exige certainement davantage. En plus, il pourrait être plus efficace pour vous informer des bugs liés aux conditions de concurrence. Ce que je veux dire par là, c'est qu'il est assez facile avec OpenMP de permettre des conditions de concurrence en ne faisant pas quelque chose de commun (ou autre) qui devrait l'être. Vous ne le voyez que lorsque vous obtenez de mauvais résultats. Je pense que cela est un peu moins susceptible de se produire avec TBB.

De manière générale, ma préférence personnelle était pour OpenMP, en particulier pour son expressivité accrue avec les tâches.

Oui, TBB est beaucoup plus convivial en C ++ alors que OpenMP convient mieux au code C de style FORTRAN, compte tenu de sa conception. La nouvelle fonctionnalité de tâche dans OpenMP semble très intéressante, alors qu’en même temps, l’objet Lambda et la fonction en C ++ 0x pourraient faciliter l’utilisation de TBB.

Dans Visual Studio 2008, vous pouvez ajouter la ligne suivante pour mettre en parallèle les "& for" et les " boucle. Il 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 l’ajout du #pragma omp parallel, les deux cœurs de mon Core 2 Duo ont été utilisés à leur capacité maximale. L’utilisation totale du processeur est ainsi passée de 50% à 100%.

Autant que je sache, TBB (il existe une version OpenSource disponible sous GPLv2 disponible) s’adresse plus à la zone C ++ qu’à la zone C. Ces temps-ci, il est difficile de trouver des informations spécifiques sur la parallélisation COP et générale sous C ++. Si vous avez besoin du support C ++ pour la parallélisation, optez pour TBB!

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