Intel TBB vs Boost


En mi nueva aplicación tengo flexibilidad para decidir el uso de la biblioteca para multi-threading. Hasta ahora estaba usando pthread. Ahora queremos explorar la biblioteca multiplataforma. Me concentré en TBB y Boost. No entendía cuál es el beneficio de TBB sobre Boost. Estoy tratando de averiguar la ventaja de TBB sobre Boost: TBB Excerpts for wiki "En su lugar, la biblioteca abstrae el acceso a los múltiples procesadores al permitir que las operaciones se traten como "tareas", que se asignan a núcleos individuales dinámicamente por el motor de tiempo de ejecución de la biblioteca, y automatizando el uso eficiente de la caché. Un programa TBB crea, sincroniza y destruye gráficos de tareas dependientes según algoritmos, "

Pero la biblioteca de subprocesos incluso necesita preocuparse por la asignación de subprocesos a núcleos. ¿No es esto un trabajo de sistema operativo? Entonces, ¿cuál es el beneficio real de usar TBB sobre Boost?

Author: Vertexwahn, 2011-08-20

2 answers

Pero la biblioteca de subprocesos incluso necesita preocuparse por la asignación de subprocesos a núcleos. ¿no es esto un trabajo de sistema operativo? Entonces, ¿cuál es el beneficio real de usar TBB sobre Boost?

Tiene razón, una biblioteca de subprocesos generalmente no debería preocuparse por asignar subprocesos a núcleos. Y TBB no. TBB opera con tareas, no con hilos. El programador de TBB utiliza todos los núcleos asignando un grupo de subprocesos y permitiéndole seleccionar dinámicamente qué tareas ejecutar. Esta es la principal ventaja sobre Boost, con el que tendrá que mapear el trabajo disponible a los hilos manualmente. Y luego TBB ofrece construcciones de alto nivel como parallel_for, parallel_pipeline, etc. que se puede utilizar para expresar los patrones paralelos más comunes, y ocultar toda la manipulación con tareas.

Por ejemplo, tomemos un fragmento de código que calcula los puntos de Mandelbrot fractal (tomado de http://warp.povusers.org/Mandelbrot / , se omite la inicialización de la variable):

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); }
    }
}

Ahora para hacerlo en paralelo con TBB, todo lo que necesita es convertir el bucle más externo en tbb:: parallel_for (uso un lambda de C++11 para brevedad):

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 distribuirá automáticamente todas las iteraciones de bucle sobre los núcleos disponibles (y no te molestes en cuántos) y equilibrará dinámicamente la carga de modo que si algún subproceso tiene más trabajo que hacer, otros subprocesos no solo lo esperan sino que ayudan, maximizando la utilización de la CPU. Intenta implementarlo con hilos raw, y sentirás la diferencia:)

 31
Author: Alexey Kukanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-21 06:33:45

Intel TBB trae su propio grupo de subprocesos/planificador y modelo de ejecución (incluyendo cosas como construcciones parallel_for) mientras que Boost solo tiene funciones básicas de administración de subprocesos (crear subprocesos y primitivas de sincronización, eso es todo.) Escribir un buen grupo de subprocesos usando Boost es posible, pero difícil the el TBB ya viene con un grupo de subprocesos altamente optimizado. Por lo tanto, depende totalmente de sus requisitos: Si todo lo que necesita es "pthreads portátiles", use Boost, si necesita más, use Intel TBB.

 8
Author: Anteru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-20 07:59:31