2008-09-20 17 views
24

La biblioteca de fuente abierta de Intel Threading Building Blocks (TBB) parece realmente interesante. Aunque hay incluso un O'Reilly Book sobre el tema, no sé de mucha gente que lo usa. Estoy interesado en usarlo para algunas aplicaciones paralelas de varios niveles (hilos MPI +) en entornos Unix (Mac, Linux, etc.). Por lo que vale, me interesan los tipos de aplicaciones de computación/métodos numéricos de alto rendimiento.¿Alguna experiencia con los bloques de construcción Threading de Intel?

¿Alguien tiene experiencia con TBB? Funciona bien? ¿Es bastante portátil (incluyendo GCC y otros compiladores)? ¿El paradigma funciona bien para los programas que has escrito? ¿Hay otras bibliotecas en las que debería investigar?

+0

Ojalá tuviera algo de tiempo para jugar con esto por mi cuenta, pero hasta entonces estaría realmente interesado en conocer las experiencias con TBB también. – tgamblin

Respuesta

12

Lo he introducido en nuestra base de códigos porque necesitábamos un bettor malloc para usar cuando nos movíamos a una máquina de 16 núcleos. Con 8 y menos no era un problema significativo. Nos ha funcionado bien Planeamos usar los contenedores concurrentes de grano fino a continuación. Idealmente, podemos hacer uso de la carne real del producto, pero eso requiere volver a pensar cómo construimos nuestro código.Realmente me gustan las ideas en TBB, pero no es fácil adaptarlas a una base de código.

No se puede pensar en TBB como otra biblioteca de subprocesos. Tienen un modelo completamente nuevo que realmente se sienta encima de los hilos y abstrae los hilos de distancia. Aprende a pensar en tareas, parallel_for tipo operaciones y tuberías. Si tuviera que construir un nuevo proyecto, probablemente intentaría modelarlo de esta manera.

Trabajamos en Visual Studio y funciona muy bien. Originalmente fue escrito para linux/pthreads, por lo que funciona bien allí también.

2

He investigado TBB pero nunca lo he usado en un proyecto. No vi ninguna ventaja (para mis propósitos) sobre ZThread. Se puede encontrar una descripción general breve y algo anticuada here.

Es bastante completo con varias opciones de envío de subprocesos, todas las clases de sincronización habituales y un mecanismo muy útil de "interrupción" de subprocesos basado en la excepción. Es fácilmente extensible, bien escrito y documentado. Lo he usado en más de 20 proyectos.
También funciona bien con cualquier * NIX que sea compatible con los hilos POSIX y Windows.

Vale la pena mirar.

3

ZThread es LGPL, está limitado a utilizar la biblioteca en vinculación dinámica si no está trabajando en un proyecto de código abierto.

El Threading Building Blocks (TBB) en la versión de código abierto, (hay una nueva versión comercial, $ 299, no conoce las diferencias) es GNU General Public License versión 2 con una llamada "Runtime Exception" ” (que es específica para el uso sólo en la creación de software libre.) que he visto otras excepciones de tiempo de ejecución que intentan acercarse LGPL, pero que permiten el uso comercial y estática que une este noiS es ahora el caso.

Solo estoy escribiendo esto porque aproveché la oportunidad para examinar las licencias de las bibliotecas y esas también deben ser una consideración para la selección en función del uso que se pretenda darles.


Txs, Jihn por señalar esta actualización ...

+0

TBB ahora usa Apache 2.0 como su licencia de código abierto (https://www.threadingbuildingblocks.org/faq/10). – Jeff

3

he utilizado TBB brevemente, y probablemente voy a utilizar más en el futuro. Me gustó usarlo, lo más importante es que no tiene que lidiar con macros/extensiones de C++, sino que permanece dentro del lenguaje. También es bastante portátil. Lo he usado tanto en Windows como en Linux. Sin embargo, una cosa: es difícil trabajar con hilos utilizando TBB, habría que pensar en términos de tareas (lo que en realidad es algo bueno). Intel TBB no admitiría su uso de bloqueos desnudos (hará que esto sea tedioso). Pero, en general, esta es mi experiencia preliminar.

También recomendaría echar un vistazo a openMP 3 también.

5

No estoy haciendo computación numérica pero trabajo con data mining (piense en clustering y clasificación), y nuestras cargas de trabajo son probablemente similares: todos los datos son estáticos y lo tienen al principio del programa. Investigué brevemente TBB de Intel y los encontré excesivos para mis necesidades. Después de comenzar con el código basado en pthread sin procesar, cambié a OPENMP y obtuve la combinación correcta entre legibilidad y rendimiento.

1

Los Threading Building Blocks (TBB) en la versión de código abierto, (hay un nueva versión comercial, $ 299, no conocer las diferencias aún) es GNU Licencia Pública General de la versión 2 con el llamado “tiempo de ejecución de Excepción” (que es específico para el uso solamente en la creación de software libre.) he visto otros excepciones de tiempo de ejecución que intentan acercarse a LGPL pero permitiendo uso comercial y estática que une este no es el caso.

De acuerdo con este question bloques de roscar se puede utilizar sin restricciones de copia-izquierda con uso comercial.

2

Uso TBB en un proyecto. Parecía ser más fácil de usar que los hilos. Hay tareas que se pueden ejecutar en paralelo. Una tarea es solo una llamada a su subrutina paralelizada. El equilibrio de carga se realiza automáticamente. Es por eso que lo acepto como una biblioteca de paralelización de nivel superior. Logré una velocidad de 2.5x sin mucho trabajo en un procesador Intel de 4 núcleos. Hay ejemplos, responden preguntas en foros y se mantiene y es gratis.

2

Portabilidad

TBB es portátil. Es compatible con procesadores Intel y AMD (es decir, x86), procesadores IBM PowerPC y POWER, procesadores ARM y posiblemente otros. Si busca en el build directory, puede ver todas las configuraciones compatibles con el sistema de compilación, que incluyen una amplia gama de sistemas operativos (Linux, Windows, Android, MacOS, iOS, FreeBSD, AIX, etc.) y compiladores (GCC, Intel , Clang/LLVM, IBM XL, etc.). No he probado TBB con el compilador PGI C++ y sé que no funciona con el compilador Cray C++ (a partir de 2017).

Hace algunos años, formé parte del esfuerzo por transferir TBB a los sistemas IBM Blue Gene. La vinculación estática fue un desafío, pero ahora se aborda mediante el asistente de sistema de compilación big_iron.inc. Los otros problemas apoyaban versiones relativamente antiguas de GCC (4.1 y 4.4) y aseguraban que los atómicos de PowerPC funcionaban. Espero que la migración a cualquier arquitectura que actualmente no sea compatible sea relativamente sencilla en plataformas que ofrecen o son compatibles con GCC y POSIX.

uso de códigos comunitarios

Soy consciente de por lo menos dos marcos de aplicaciones HPC que utiliza TBB:

No sé usos cómo ALCES TBB, pero MADNESS usa TBB para su cola de tareas y su asignador de memoria.

rendimiento frente a otros modelos de roscado

he utilizado personalmente TBB en el proyecto Parallel Research Kernels, dentro de la cual he comparado TBB a OpenMP, OpenCL, Kokkos, raja, C++ 17 STL paralelo, y otros modelos. Vea el C++ subdirectory para más detalles.

La figura siguiente muestra el rendimiento relativo de los modelos antes mencionados en un procesador Intel Xeon Phi 7250 (los detalles no son importantes, todos los modelos utilizan la misma configuración). Como puede ver, TBB lo hace bastante bien, excepto en el caso de tamaños de problema más pequeños, donde la sobrecarga de la programación adaptable es más relevante. TBB tiene perillas de ajuste que afectarán estos resultados.

PRK stencil

La revelación completa: Yo trabajo para Intel en una capacidad de investigación/búsqueda de caminos.

1

Vale la pena aclarar lo que TBB (Threading Building Blocks) es para contrastar con otras alternativas (por ejemplo, características de concurrencia C++ 11x). TBB es una biblioteca portátil y escalable (no una extensión de compilación) que le permite escribir su código en forma de tareas livianas que TBB programará para ejecutarse lo más rápido posible en los recursos de CPU disponibles. No se ha diseñado el uso de subprocesos para otros fines (por ejemplo, preferencia).

He utilizado TBB para acelerar el procesamiento de imágenes existente de bucles for sobre líneas de exploración de imagen en bucles parallel_for (un mínimo de 2-4 líneas de exploración como tamaño 'granulado'). Esto ha sido muy exitoso. Requiere que su cuerpo de bucle sea (re) escrito para procesar un índice arbitrario en lugar de suponer que cada cuerpo de bucle se procesa secuencialmente (por ejemplo, apuntadores que se incrementan entre cada iteración de bucle).

Esto era un caso bastante trivial ya que no había ningún almacenamiento compartido para actualizar. El uso de las características más potentes (por ejemplo, la interconexión) requerirá una importante reinvención y/o reescritura del código existente, por lo que tal vez sea más adecuado para el nuevo código. Es una ventaja poderosa que este código basado en TBB permanezca portátil, no parezca interferir con otro código en el mismo proceso al mismo tiempo que otras estrategias de enhebrado y luego puede combinarse con estrategias de multiprocesamiento en niveles superiores o inferiores (por ejemplo, el código TBB parallel_for podría invocarse desde un filtro en una tubería de multiprocesamiento TBB).

Cuestiones relacionadas