Intel TBB vs Boost
boost-thread (2)
En mi nueva aplicación, tengo flexibilidad para decidir el uso de la biblioteca para multihebras. Hasta ahora estaba usando pthread. Ahora quiero explorar la biblioteca multiplataforma. Me concentro en TBB y Boost. No entendí cuál es el beneficio de TBB sobre Boost. Estoy tratando de descubrir la ventaja de TBB sobre Boost: Extractos TBB para wiki "En cambio, la biblioteca abstrae el acceso a múltiples procesadores al permitir que las operaciones sean tratadas como" tareas ", que se asignan a núcleos individuales dinámicamente por la ejecución de la biblioteca. motor de tiempo, y al automatizar el uso eficiente de la memoria caché. Un programa TBB crea, sincroniza y destruye gráficos de tareas dependientes según algoritmos ".
pero la biblioteca de threading incluso necesita preocuparse por la asignación de hilos a núcleos. ¿No es este un trabajo del sistema operativo? Entonces, ¿cuál es la verdadera ventaja de usar TBB sobre Boost?
pero la biblioteca de threading incluso necesita preocuparse por la asignación de hilos a núcleos. ¿No es este un trabajo del sistema operativo? Entonces, ¿cuál es la verdadera ventaja de usar TBB sobre Boost?
Tiene razón, una biblioteca de threading generalmente no debería preocuparse por asignar hilos a núcleos. Y TBB no. TBB opera con tareas, no con hilos. El planificador de TBB utiliza todos los núcleos asignando un grupo de subprocesos y permitiendo que seleccione dinámicamente las tareas que se ejecutarán. Esta es la principal ventaja sobre Boost, con la que deberá asignar el trabajo disponible a los hilos manualmente. Y luego TBB ofrece construcciones de alto nivel como parallel_for, parallel_pipeline, etc. que se pueden usar 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 puntos de fractal de Mandelbrot (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 externo en tbb :: parallel_for (utilizo una lambda C ++ 11 para abreviar):
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 núcleos disponibles (y no se preocupe por cuántos) y equilibrará dinámicamente la carga para que si algún hilo tiene más trabajo por hacer, otros hilos no solo lo esperen sino que ayuden, maximizando la CPU utilización. Intenta implementarlo con hilos crudos, y sentirás la diferencia :)
Intel TBB trae su propio grupo de subprocesos / planificador y modelo de ejecución (incluyendo cosas como parallel_for
constructs) 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: el TBB 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.