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
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.
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.
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.
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.
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.
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%.
VIVA64 Liens: Programmation parallèle .