Intel TBB vs Boost

I ma nouvelle application j'ai la flexibilité de décider de l'utilisation de la bibliothèque pour le multi-threading. Jusqu'à présent, j'utilisais pthread. Maintenant, vous voulez explorer la bibliothèque multi-plateforme. Je zéro sur TBB et Boost. Je n'ai pas compris quel est l'avantage de TBB sur Boost. J'essaie de trouver l'avantage de TBB sur Boost: TBB Excerpts for wiki "au lieu de cela, la bibliothèque résume l'accès aux multiples processeurs en permettant aux opérations d'être traitées comme des "tâches", qui sont allouées à des cœurs individuels dynamiquement par le moteur d'exécution de la bibliothèque, et en automatisant l'utilisation efficace du cache. Un programme TBB crée, synchronise et détruit des graphiques de tâches dépendantes selon des algorithmes, "

Mais la bibliothèque de threads a-t-elle même besoin de s'inquiéter de l'allocation des threads aux cœurs. N'est-ce pas un travail de système d'exploitation? Alors, quel est le vrai avantage d'utiliser TBB sur Boost?

28
demandé sur Vertexwahn 2011-08-20 10:00:08

2 réponses

Mais la bibliothèque de threads a-t-elle même besoin de s'inquiéter de l'allocation des threads aux cœurs. n'est-ce pas un travail de système d'exploitation? Alors, quel est le vrai avantage d'utiliser TBB sur Boost?

Vous avez raison, une bibliothèque de threads ne devrait généralement pas se soucier du mappage des threads aux cœurs. Et TBB ne le fait pas. TBB fonctionne avec des tâches, pas des threads. Le planificateur de TBB utilise tous les cœurs en allouant un pool de threads et en le laissant sélectionner dynamiquement les tâches à exécuter. C'est le principal avantage sur Boost, avec lequel vous devrez mapper le travail disponible aux threads manuellement. Et puis TBB propose des constructions de haut niveau telles que parallel_for, parallel_pipeline, etc. cela peut être utilisé pour exprimer les motifs parallèles les plus courants et masquer toute manipulation avec des tâches.

Par exemple, prenons un morceau de code qui calcule les points de Mandelbrot fractal (tiré de http://warp.povusers.org/Mandelbrot / , initialisation de variable omise):

for(unsigned y=0; y<ImageHeight; ++y)
{
    double c_im = MaxIm - y*Im_factor;
    for(unsigned x=0; x<ImageWidth; ++x)
    {
        double c_re = MinRe + x*Re_factor;

        double Z_re = c_re, Z_im = c_im;
        bool isInside = true;
        for(unsigned n=0; n<MaxIterations; ++n)
        {
            double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
            if(Z_re2 + Z_im2 > 4)
            {
                isInside = false;
                break;
            }
            Z_im = 2*Z_re*Z_im + c_im;
            Z_re = Z_re2 - Z_im2 + c_re;
        }
        if(isInside) { putpixel(x, y); }
    }
}

Maintenant pour le faire parallèlement à TBB, tout ce dont vous avez besoin est de convertir la boucle la plus externe en tbb:: parallel_for (j'utilise un lambda C++11 pour plus de concision):

tbb::parallel_for(0, ImageHeight, [=](unsigned y)
{
    // the rest of code is exactly the same
    double c_im = MaxIm - y*Im_factor;
    for(unsigned x=0; x<ImageWidth; ++x)
    {
        ...
        // if putpixel() is not thread safe, a lock might be needed
        if(isInside) { putpixel(x, y); }
    }
});

TBB distribuera automatiquement toutes les itérations de boucle sur les cœurs disponibles (et vous ne dérangerez pas combien) et équilibrera dynamiquement la charge de sorte que si un thread a plus de travail à faire, d'autres threads ne l'attendent pas mais aident, maximisant l'utilisation du processeur. Essayez de l'implémenter avec des threads bruts, et vous sentirez la différence:)

31
répondu Alexey Kukanov 2011-08-21 06:33:45

Intel TBB apporte son propre pool de threads / planificateur et modèle d'exécution (y compris des choses comme parallel_for constructions) tandis que Boost n'a que des fonctions de gestion de threads de base (créer des threads et des primitives de synchronisation, c'est tout.) Écrire un bon pool de threads en utilisant Boost est possible, mais difficile - le TBB est déjà livré avec un pool de threads hautement optimisé. Donc, cela dépend totalement de vos besoins: si tout ce dont vous avez besoin est "pthreads portables", utilisez Boost, si vous avez besoin de plus, utilisez Intel TBB.

8
répondu Anteru 2011-08-20 07:59:31