C++ Parallélisation des Bibliothèques: OpenMP vs Fil de Blocs de Construction
Je vais rénover ma coutume moteur graphique afin qu'il tire parti des Processeurs multicœurs. Plus exactement, je suis à la recherche d'une bibliothèque à la parallélisation des boucles.
Il me semble que les deux OpenMP et Intel Fil Blocs de Construction sont très bien adaptés pour le travail. Aussi, les deux sont pris en charge par Visual Studio C++ compilateur et les plus populaires de compilateurs. Et les deux bibliothèques semblent relativement simple à utiliser.
Alors, qui dois-je choisir? Quelqu'un a essayé les deux bibliothèques et peut me donner quelques inconvénients et les avantages de l'utilisation de la bibliothèque? Aussi, qu'avez-vous choisi de travailler, en fin de compte?
Merci,
Adrian
- Question similaire: stackoverflow.com/questions/326487/... (j'ai ajouté une référence à cette question dans ma question.)
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas utilisé TBB largement, mais mon impression est qu'ils se complètent les uns les autres plus que les concurrents. TBB fournit des threads de conteneurs et de certains algorithmes parallèles, alors que OpenMP est une façon de paralléliser le code existant.
Personnellement, j'ai trouvé OpenMP très facile de tomber dans le code existant où vous avez une parallelisable boucle ou d'un tas de sections qui peuvent être exécutées en parallèle. Toutefois, il ne faut pas vous aider en particulier pour les cas où vous avez besoin de modifier des données partagées - où TBB simultanées de conteneurs pourrait être exactement ce que vous voulez.
Si tout ce que vous voulez, c'est de paralléliser les boucles où les itérations sont indépendants (ou peut être assez facilement, donc), j'irais pour OpenMP. Si vous avez besoin de plus d'interaction entre les threads, je pense que TBB peut offrir un peu plus à cet égard.
De Intel logiciel blog: Comparer Windows* threads OpenMP*, Intel® Threading Building Blocks pour la programmation parallèle
Il est aussi question de style - pour moi TBB est très C++, tandis que je n'aime pas OpenMP pragmas que beaucoup (pue C un peu, serait de l'utiliser si j'avais à écrire en C).
Je voudrais également envisager les connaissances et l'expérience de l'équipe. L'apprentissage d'une nouvelle bibliothèque (surtout quand il s'agit de filetage/simultanéité) ne prendre un certain temps. Je pense que pour l'instant, OpenMP est plus largement connue et déployé que TBB (mais c'est juste mon avis).
Pourtant, un autre facteur - mais considérant que la plupart des plates-formes communes, probablement pas un problème de portabilité. Mais la licence peut être un problème.
En général, j'ai trouvé que l'utilisation de TBB nécessite beaucoup plus de temps de modifier le code de base avec une rentabilité élevée tout en OpenMP donne un rapide mais modérée de paiement. Si vous regardez fixement un nouveau module à partir de zéro et d'une réflexion à long terme aller avec TBB. Si vous voulez petit mais gains immédiats aller avec OpenMP.
Aussi, TBB et OpenMP ne sont pas mutuellement exclusives.
En fait, j'ai utilisé les deux, et mon impression générale est que si votre algorithme est assez facile à prendre en parallèle (par exemple, les boucles de la même taille, pas trop de données interdépendance) OpenMP est plus facile, et très agréable de travailler avec. En fait, si vous trouvez que vous pouvez utiliser OpenMP, c'est probablement la meilleure façon d'aller, si vous savez que votre plate-forme prend en charge. Je n'ai pas utilisé OpenMP nouvelles structures de travail, qui sont beaucoup plus générale que la boucle d'origine et la section options.
TBB vous donne plus de structures de données à l'avant, mais certainement plus à l'avant. En plus, il pourrait être plus à même de vous faire connaître de la race, de condition de bugs. Ce que je veux dire par là, c'est qu'il est assez facile d'en OpenMP pour permettre des conditions de course en ne faisant pas quelque chose de partagé (ou autre) qui devrait être. Vous ne voyez lorsque vous obtenez de mauvais résultats. Je pense que c'est un peu moins susceptible de se produire avec TBB.
Globalement j'ai une préférence personnelle pour OpenMP, compte tenu notamment de l'augmentation de son expressivité avec des tâches.
Viva64 liens: La Programmation Parallèle.
Oui, TBB est beaucoup plus C++ convivial tout en OpenMP est plus approprié pour le FORTRAN style code C, compte tenu de sa conception. La nouvelle fonctionnalité de tâche en OpenMP a l'air très intéressant, alors que dans le même temps, le Lambda et la fonction de l'objet en C++0x peut faire TBB plus facile à utiliser.
Dans Visual Studio 2008, vous pouvez ajouter la ligne suivante à paralléliser toute la boucle "for". Il fonctionne même avec de multiples boucles for imbriquées. Voici un exemple:
Après, nous avons ajouté la directive #pragma omp parallel, les deux coeurs sur mon Core 2 Duo ont été utilisées au maximum de leur capacité, de sorte que l'utilisation totale du CPU est passé de 50% à 100%.
omp parallel for
pour paralléliser tout parallélisables pour la boucle. Par exemple, vous ne pourriez pas utiliseromp parallel for
si le corps contient du code comme ceci:p[j] = p[j] - p[j-1]
Autant que je sache, TBB (il existe une Version OpenSource sous GPLv2 disponibles) adresses plus le C++ puis C Zone. Ces moments, il est difficile de trouver le C++ et la programmation orientée objet générales de parallélisation Informations spécifiques.La plupart des adresses fonctionnelles des trucs comme c (le même sur CUDA ou OpenCL). Si vous avez besoin de Support du C++ pour la parallélisation aller pour TBB!