Pregunta

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

Me parece que OpenMP e Intel Thread Building Blocks son muy adecuados para el trabajo. Además, ambos son compatibles con el compilador C ++ de Visual Studio y la mayoría de los otros compiladores populares. Y ambas bibliotecas parecen bastante sencillas de usar.

Entonces, ¿cuál debo elegir? ¿Alguien ha probado ambas bibliotecas y puede darme algunas desventajas y ventajas de usar cualquiera de las bibliotecas? Además, ¿con qué elegiste trabajar al final?

Gracias,

Adrian

¿Fue útil?

Solución

No he usado TBB ampliamente, pero mi impresión es que se complementan más que competir. TBB proporciona contenedores seguros para subprocesos y algunos algoritmos paralelos, mientras que OpenMP es más una forma de paralelizar el código existente.

Personalmente, he encontrado que OpenMP es muy fácil de colocar en el código existente donde tiene un bucle en paralelo o un montón de secciones que se pueden ejecutar en paralelo. Sin embargo, no lo ayuda particularmente en un caso en el que necesita modificar algunos datos compartidos, donde los contenedores concurrentes de TBB podrían ser exactamente lo que desea.

Si todo lo que quieres es paralelizar bucles donde las iteraciones son independientes (o se pueden hacer fácilmente), optaría por OpenMP. Si va a necesitar más interacción entre los hilos, creo que TBB puede ofrecer un poco más en ese sentido.

Otros consejos

Del blog de software de Intel: Comparar subprocesos de Windows *, OpenMP *, Intel & # 174; Enhebrar bloques de construcción para programación paralela

También es cuestión de estilo: para mí, TBB es muy parecido a C ++, aunque no me gustan mucho los pragmas de 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 subprocesos / concurrencia) lleva algún 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 teniendo en cuenta las plataformas más comunes, probablemente no es un problema, la portabilidad. Pero la licencia puede ser un problema.

  • TBB incorpora algunas de las buenas investigaciones que se originan en la investigación académica, por ejemplo enfoque paralelo de datos recursivos .
  • Hay algo de trabajo sobre la compatibilidad con caché, para ejemplo .
  • La lectura del blog de Intel parece realmente interesante.

En general, descubrí que el uso de TBB requiere cambios mucho más largos en la base del código con una alta recompensa, mientras que OpenMP ofrece una recompensa rápida pero moderada. Si está viendo un nuevo módulo desde cero y piensa a largo plazo, vaya con TBB. Si quieres ganancias pequeñas pero inmediatas, ve con OpenMP.

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

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

TBB le brinda más estructuras de datos por adelantado, pero definitivamente requiere más por adelantado. Como ventaja adicional, podría ser mejor para informarle sobre errores en las condiciones de carrera. Lo que quiero decir con esto es que es bastante fácil en OpenMP 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 es menos probable que esto ocurra con TBB.

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

Enlaces Viva64: Programación en paralelo .

Sí, TBB es mucho más amigable con C ++, mientras que OpenMP es más apropiado para el código C de 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 la función en C ++ 0x pueden hacer que TBB sea más fácil de usar.

En Visual Studio 2008, puede agregar la siguiente línea para paralelizar cualquier " para " lazo. Incluso funciona con múltiples anidados para bucles. 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 agregar el paralelo #pragma omp, ambos núcleos en mi Core 2 Duo se utilizaron a su capacidad máxima, por lo que el uso total de la CPU pasó del 50% al 100%.

Hasta donde yo sé, TBB (hay una versión de código abierto bajo GPLv2 disponible) aborda más el C ++ que el Área C. En estos momentos es difícil encontrar información específica de paralelismo general de C ++ y OOP. La mayoría de las cosas funcionales se dirigen como c (lo mismo en CUDA o OpenCL). Si necesita soporte de C ++ para la paralelización, ¡vaya a TBB!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top