2009-03-05 20 views
41

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.Bibliotecas de paralelización C++: OpenMP vs. Thread Building Blocks

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 debo 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

+0

Pregunta similar: http://stackoverflow.com/questions/326487/multithreaded-image-processing-in-c (Agregué una referencia a esta pregunta en mi pregunta.) – strager

Respuesta

43

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, he encontrado que OpenMP es muy fácil de colocar en el código existente donde tiene 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.

+2

Buen punto sobre el código existente. Es más fácil conectar algunos pragmas aquí y allá. Conectar TBB puede ser más difícil (depende mucho del estilo de código existente) – Anonymous

25

Desde el blog de software de Intel: Compare Windows* threads, OpenMP*, Intel® Threading Building Blocks for parallel programming

Es también la cuestión de estilo - para mí TBB es muy C++ como, aunque no me gusta pragmas OpenMP que mucho (huele a C un poco, lo usaría si tuviera que escribir en C).

También consideraría el conocimiento existente y la experiencia 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 buenas investigaciones provenientes de la investigación académica, por ejemplo recursive data parallel approach.
  • Hay algo de trabajo en la conservación de la memoria caché, para example.
  • La conferencia del blog Intel parece realmente interesante.
+0

Gracias por el enlace, pero dado que es alojado en el sitio web de Intel, realmente no confío en que brinde una opinión completamente imparcial. Claramente escribieron el artículo para promover el uso de su propia biblioteca. –

+2

Sí, olvidé el emoticón en algún lugar de la primera línea;) – Anonymous

15

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.

5

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 par, no demasiada interdependencia de datos) OpenMP es más fácil y agradable de trabajar. 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 ofrece más estructuras de datos por adelantado, pero definitivamente requiere más por adelantado. Como una ventaja, es podría ser mejor al hacerte consciente de los errores de condición de carrera. 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 era para OpenMP, especialmente dada su mayor expresividad con las tareas.

1

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

+1

Una nota: los bucles anidados funcionan solo si el compilador lo admite – Nav

+2

Otra nota: puede usar 'omp parallel for' para paralelizar cualquier ** parallelizable * * en bucle. Por ejemplo, no podría usar 'omp parallel for' si el cuerpo contiene algún código como este:' p [j] = p [j] - p [j-1] ' – chus

1

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.

+0

TBB ahora usa licencia Apache ... – Jeff

2

Sí, TBB es mucho más compatible 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 función en C++ 0x puede hacer que TBB sea más fácil de usar.