tutorial c++ multithreading multicore openmp tbb

c++ - tutorial - download tbb



Bibliotecas de paralelización C++: OpenMP vs. Thread Building Blocks (8)

Desde el blog de software de Intel: Compare los hilos de Windows *, OpenMP *, Intel® Threading Building Blocks para programación paralela

También es cuestión de estilo: para mí, TBB es muy parecido a C ++, mientras que no me gustan los pragmas OpenMP (apesta a C un poco, lo usaría si tuviera que escribir en C).

También consideraría el conocimiento y la experiencia existentes del equipo. Aprender una nueva biblioteca (especialmente cuando se trata de subprocesamiento / concurrencia) lleva algo de tiempo. Creo que, por ahora, OpenMP es más conocido e implementado que TBB (pero esta es solo mi opinión).

Otro factor más, pero considerando las plataformas más comunes, probablemente no un problema, la portabilidad. Pero la licencia podría ser un problema.

  • TBB incorpora algunas de las buenas investigaciones que se originan en la investigación académica, por ejemplo, el enfoque recursivo de datos paralelos .
  • Hay algo de trabajo en la conservación de caché, por example .
  • La conferencia del blog de Intel parece realmente interesante.

Voy a actualizar mi motor de gráficos personalizado para que aproveche las CPU multinúcleo. Más exactamente, estoy buscando una biblioteca para paralelizar bucles.

Me parece que tanto OpenMP como los bloques de construcción de subprocesos de Intel son muy adecuados para el trabajo. Además, ambos son compatibles con el compilador C ++ de Visual Studio y la mayoría de otros compiladores populares. Y ambas bibliotecas parecen bastante sencillas de usar.

Entonces, ¿cuál debería elegir? ¿Alguien ha probado ambas bibliotecas y puede darme algunos inconvenientes y ventajas de usar cualquiera de las bibliotecas? Además, ¿con qué elegiste trabajar al final?

Gracias,

Adrian


En Visual Studio 2008, puede agregar la siguiente línea para paralelizar cualquier ciclo "for". Incluso funciona con múltiples bucles anidados. Aquí hay un ejemplo:

#pragma omp parallel for private(i,j) for (i=0; i<num_particles; i++) { p[i].fitness = fitnessFunction(p[i].present); if (p[i].fitness > p[i].pbestFitness) { p[i].pbestFitness = p[i].fitness; for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j]; } } gbest = pso_get_best(num_particles, p);

Después de que agregamos el #pragma omp paralelo, ambos núcleos en mi Core 2 Duo se usaron a su capacidad máxima, por lo que el uso total de CPU pasó del 50% al 100%.


En general, he descubierto que usar TBB requiere mucho más tiempo de cambios en la base del código con un alto rendimiento, mientras que OpenMP ofrece un pago rápido pero moderado. Si está mirando un nuevo módulo desde cero y pensando a largo plazo, vaya con TBB. Si desea ganancias pequeñas pero inmediatas, vaya con OpenMP.

Además, TBB y OpenMP no son mutuamente excluyentes.


En realidad, he usado ambos, y mi impresión general es que si tu algoritmo es bastante fácil de hacer en paralelo (por ejemplo, bucles de tamaño par, no demasiada interdependencia de datos) OpenMP es más fácil y bastante agradable de usar. De hecho, si encuentra que puede usar OpenMP, probablemente sea la mejor forma de hacerlo, si sabe que su plataforma lo soportará. No he utilizado las nuevas estructuras de tareas de OpenMP, que son mucho más generales que las opciones de bucle y sección originales.

TBB le brinda más estructuras de datos por adelantado, pero definitivamente requiere más por adelantado. Como una ventaja, podría ser mejor avisarle sobre los errores de condición racial. Lo que quiero decir con esto es que es bastante fácil en OpenMP para habilitar las condiciones de carrera al no hacer algo compartido (o lo que sea) que debería ser. Solo ves esto cuando obtienes malos resultados. Creo que esto es menos probable que ocurra con TBB.

En general, mi preferencia personal fue para OpenMP, especialmente dada su mayor expresividad con las tareas.



No he usado TBB extensivamente, pero mi impresión es que se complementan entre sí más que competir. TBB proporciona contenedores de rosca y algunos algoritmos paralelos, mientras que OpenMP es una manera más de paralelizar el código existente.

Personalmente, descubrí que OpenMP es muy fácil de incluir en el código existente, donde tienes un bucle paralelo o varias secciones que se pueden ejecutar en paralelo. Sin embargo, no lo ayuda especialmente en un caso en el que necesite modificar algunos datos compartidos, donde los contenedores concurrentes de TBB pueden ser exactamente lo que usted desea.

Si todo lo que quiere es paralelizar bucles en los que las iteraciones son independientes (o se pueden hacer con bastante facilidad), elegiría OpenMP. Si vas a necesitar más interacción entre los hilos, creo que TBB puede ofrecer un poco más en ese sentido.


Por lo que sé, TBB (hay una versión de OpenSource bajo GPLv2 disponible) se refiere más a C ++ que a C Area. En estos tiempos es difícil encontrar C ++ y la generalización específica de OOP. Informaciones específicas. La mayoría de las direcciones son funcionales como c (lo mismo en CUDA o OpenCL). Si necesita C ++ Soporte para paralelización, vaya por TBB.


Sí, TBB es mucho más compatible con C ++, mientras que OpenMP es más apropiado para el código C estilo FORTRAN dado su diseño. La nueva función de tarea en OpenMP parece muy interesante, mientras que al mismo tiempo, el objeto Lambda y función en C ++ 0x puede hacer que TBB sea más fácil de usar.