Intel TBB vs Boost
J'ai ma nouvelle application j'ai flexibilité pour décider de l'utilisation de la bibliothèque pour le multi-threading. Jusqu'à présent j'ai été en utilisant pthread. Maintenant, voulez explorer la croix-plate-forme de bibliothèque. J'ai zéro dans sur TBB et Boost. Je ne comprends pas quel est l'avantage de TBB plus de Boost.
Je suis en train d'en savoir d'avantage de TBB plus de Boost:
TBB Extraits de wiki "à la Place de la bibliothèque résumés accès à plusieurs processeurs en permettant les opérations à être traités comme des "tâches", qui sont répartis entre les différents cœurs de manière dynamique par la bibliothèque run-time engine, et par l'automatisation de l'utilisation efficace de la mémoire cache. Un TBB programme crée, synchronise et détruit les graphes de tâches dépendantes selon des algorithmes,"
mais ne le filetage de la bibliothèque même besoin de s'inquiéter à propos de la répartition des threads noyaux. N'est-ce pas un travail de système d'exploitation?
Alors, quel est le réel Avantage de l'utilisation de la TBB plus de Boost?
- Vous pouvez définir fil des affinités à l'aide de pthread ainsi (par exemple, en utilisant la pthread_setaffinity_np appel)
- oui sont à droite. mon point est de savoir comment une grande partie de l'utilisation pratique est de faire que la. En tant que programmeur, vous pourriez voulez pas d'avoir un thread planification des tâches à réaliser à votre demande. Alors pourquoi TBB le montre comme une différenciation sur les autres de la bibliothèque?
- il est un fait observable avantage de bien choisir les cœurs pour les applications. Prenons l'exemple simple d'une tige de bûcheron. Un thread reçoit des données à partir d'un réseau d'interfaces et le met sur un anneau; l'autre thread lit à partir de l'anneau et les écrit dans un fichier (ce qui aide à soulager la congestion que vous voyez si vous utilisez l'outil tcpdump). Dans ce cas, sur un système biprocesseur, réglage des affinités sur le même PROCESSEUR est observable plus efficace. Si vous avez l'hyperthreading est activé, le cœur virtuel paire est beaucoup plus rapide. Cependant, cela nécessite beaucoup de microgestion, qui TBB ne l'exige pas.
- merci pour l'explication agréable. Je suis d'accord il y a certains cas dans lesquels vous souhaitez définir l'affinité de votre fil. Mais comment fait-TBB permettra de faire la gestion de votre(programmeurs) nom? En d'autres termes programmeur consacrer la TBB. La même chose peut être fait sur un coup de pouce/pthread aussi! Grande question est de savoir quelles sont les scénario lors de la TBB fait mieux thread planification de système d'Exploitation?
- Même si vous utilisez pthread_setaffinity_np() pour correctement définir l'affinité du fil, il n'y a aucune garantie que le fil va s'exécuter dans l'entrelacement de la manière, surtout dans multiprogramming environnement.. je vais encore dire qu'il peut vous donner certains avantages, mais muni d'un capuchon.
- Vous devez représenter le problème à l'aide de leurs primitives. Il faudra gérer la charge de travail (si un thread est sauvegardé, un thread libre de voler des tâches à partir du retard de thread).
- laissez-nous continuer cette discussion dans le chat
Vous devez vous connecter pour publier un commentaire.
Vous avez raison, un enfilage de la bibliothèque il ne doit généralement pas de soins sur le mappage des threads noyaux. Et TBB ne le fait pas. TBB fonctionne avec des tâches, pas de fils. TBB planificateur utilise tous les cœurs par l'attribution d'un pool de threads et de le laisser dynamiquement sélectionnez les tâches à exécuter. C'est le principal avantage de plus de Boost, avec qui vous aurez besoin d'une carte de travail disponibles pour les threads manuellement. Et puis TBB offre de haut niveau des constructions telles que parallel_for, parallel_pipeline, etc. qui peut être utilisé pour exprimer la plupart des communes de modèles parallèles, et de cacher toutes les manipulations avec des tâches.
Par exemple, prenons un morceau de code qui calcule les points d'image fractale de Mandelbrot (prises de http://warp.povusers.org/Mandelbrot/, l'initialisation d'une variable omise):
Maintenant pour le rendre parallèle avec TBB, vous n'avez besoin que de convertir l'extérieur de la boucle en tbb::parallel_for (j'utilise C++11 lambda pour des raisons de concision):
TBB va distribuer automatiquement toutes les itérations de boucle sur les cœurs disponibles (et vous ne vous souciez pas combien) et de l'équilibre dynamique de la charge, de sorte que si un thread a plus de travail à faire, les autres threads ne vous contentez pas d'attendre, mais de les aider, de maximiser l'utilisation de l'UC. Essayez de la mettre en œuvre avec des fils, et vous sentirez la différence 🙂
[=]
ce qu'il capte?MaxIm
,Im_factor
,MinRe
,Re_factor
,ImageWidth
, etMaxIterations
, sauf si l'un de ces variables globales.*this
, je me sens obligé de le faire remarquer. Se référant à la classe membre seules causes de lathis
pointeur d'être capturé. Probablement pas un problème avecparallel_for
et un accès en lecture seule, bien sûr.Intel TBB apporte dans son propre thread pool/planificateur et le modèle d'exécution (y compris des trucs comme
parallel_for
constructions), tandis que Boost est uniquement de base de la gestion des threads fonctions (créer des threads et des primitives de synchronisation, c'est tout.) La rédaction d'un bon pool de threads à l'aide de Boost est possible, mais difficile-la TBB est livré avec un très optimisé pool de threads déjà. Donc, cela dépend vraiment de vos besoins: Si vous avez besoin d' "portable pthreads", utilisez le Boost, si vous avez besoin de plus, l'utilisation d'Intel TBB.boost::thread_group
, mais vous avez raison -- du coup de pouce de la classe est juste un fil de conteneur, et n'offre pas intégré dans la planification comme TBB n'.