Pregunta

Intel Bloques de construcción de subprocesamiento (TBB) La biblioteca de código abierto parece realmente interesante.Aunque incluso hay un Libro de O'Reilly Sobre el tema, no escucho que mucha gente lo use.Estoy interesado en usarlo para algunas aplicaciones paralelas multinivel (subprocesos MPI +) en entornos Unix (Mac, Linux, etc.).Por si sirve de algo, estoy interesado en tipos de aplicaciones de métodos numéricos/cómputo de alto rendimiento.

¿Alguien tiene experiencias con TBB?¿Funciona bien?¿Es bastante portátil (incluidos GCC y otros compiladores)?¿El paradigma funciona bien para los programas que ha escrito?¿Hay otras bibliotecas que debería consultar?

¿Fue útil?

Solución

Lo introduje en nuestra base de código porque necesitábamos un malloc de apostador para usar cuando nos mudamos a una máquina de 16 núcleos.Con 8 años o menos no fue un problema importante.Nos ha funcionado bien.Planeamos utilizar los contenedores concurrentes de grano fino a continuación.Idealmente podemos hacer uso de la esencia real del producto, pero eso requiere repensar cómo construimos nuestro código.Realmente me gustan las ideas de 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 asienta sobre los hilos y los abstrae.Aprende a pensar en tareas, en paralelo para operaciones de tipo y canalizaciones.Si tuviera que construir un nuevo proyecto, probablemente intentaría modelarlo de esta manera.

Trabajamos en Visual Studio y funciona bien.Fue escrito originalmente para Linux/pthreads, por lo que también funciona bien allí.

Otros consejos

No hago computación numérica, pero trabajo con minería de datos (piense en agrupación y clasificación), y nuestras cargas de trabajo probablemente sean similares:todos los datos son estáticos y los tienes al inicio del programa.Investigué brevemente el TBB de Intel y encontré que era excesivo para mis necesidades.Después de comenzar con código sin formato basado en pthread, cambié a OPENMP y obtuve la combinación adecuada entre legibilidad y rendimiento.

Portabilidad

TBB es portátil.Es compatible con Intel y AMD (es decir,x86), procesadores IBM PowerPC y POWER, procesadores ARM y posiblemente otros.Si miras en el directorio de construcción, puede ver todas las configuraciones que admite 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étera).No he probado TBB con el compilador PGI C++ y sé que no funciona con el compilador Cray C++ (a partir de 2017).

Hace unos años, formé parte del esfuerzo por trasladar TBB a los sistemas IBM Blue Gene.La vinculación estática fue un desafío, pero ahora lo aborda el big_iron.inc Ayudante del sistema de construcción.Los otros problemas fueron admitir versiones relativamente antiguas de GCC (4.1 y 4.4) y garantizar que los componentes atómicos de PowerPC funcionaran.Espero que la migración a cualquier arquitectura actualmente no compatible sea relativamente sencilla en plataformas que proporcionen o sean compatibles con GCC y POSIX.

Uso en códigos comunitarios

Conozco al menos dos marcos de aplicaciones HPC que utilizan TBB:

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

Rendimiento frente a otros modelos de subprocesos

Personalmente he usado TBB en el Núcleos de investigación paralelos proyecto, dentro del cual he comparado TBB con OpenMP, OpenCL, Kokkos, RAJA, C++17 Parallel STL y otros modelos.Ver el subdirectorio C++ para detalles.

La siguiente figura muestra el rendimiento relativo de los modelos antes mencionados en un procesador Intel Xeon Phi 7250 (los detalles no son importantes: todos los modelos usaban la misma configuración).Como puede ver, TBB funciona bastante bien, excepto en problemas de menor tamaño, donde la sobrecarga de la programación adaptativa es más relevante.TBB tiene perillas de sintonización que afectarán estos resultados.

PRK stencil

La divulgación completa:Trabajo para Intel en una capacidad de investigación/búsqueda de caminos.

He usado TBB brevemente y probablemente lo usaré más en el futuro.Me gustó usarlo, lo más importante porque no tienes que lidiar con macros/extensiones de C++, sino que permaneces dentro del lenguaje.También es bastante portátil.Lo he usado tanto en Windows como en Linux.Pero una cosa:Es difícil trabajar con subprocesos usando TBB, habría que pensar en términos de tareas (lo cual en realidad es algo bueno).Intel TBB no admitirá el uso de cerraduras desnudas (lo hará tedioso).Pero en general, esta es mi experiencia preliminar.

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

ZThread es LGPL, está limitado a usar la biblioteca en enlace dinámico si no trabaja en un proyecto de código abierto.

Threading Building Blocks (TBB) en la versión de código abierto (hay una nueva versión comercial, $299, aún no conozco las diferencias) es la Licencia Pública General GNU versión 2 con la llamada “Excepción de tiempo de ejecución” (eso es específico para su uso únicamente en la creación de software gratuito).He visto otras excepciones de tiempo de ejecución que intentan acercarse a LGPL pero permiten el uso comercial y la vinculación estática. no es es ahora el caso.

Sólo escribo esto porque aproveché la oportunidad para examinar las licencias de las bibliotecas y esas también deben considerarse para la selección según el uso que se pretende darles.


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

Investigué TBB pero nunca lo usé en un proyecto.No vi ninguna ventaja (para mis propósitos) sobre hilo Z.Se puede encontrar una descripción general breve y algo anticuada. aquí.

Es bastante completo con varias opciones de distribución de subprocesos, todas las clases de sincronización habituales y un mecanismo de "interrupción" de subprocesos basado en excepciones muy útil.Es fácilmente ampliable, está bien escrito y documentado.Lo he usado en más de 20 proyectos.
También funciona bien con cualquier *NIX que admita subprocesos POSIX y con Windows.

Digno de una mirada.

Utilizo TBB en un proyecto.Parecía más fácil usarlo 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.Por eso la acepto como una biblioteca de paralelización de nivel superior.Logré una velocidad 2,5 veces mayor sin mucho trabajo en un procesador Intel de 4 núcleos.Hay ejemplos, responden preguntas en foros y se mantiene y es gratis.

Vale la pena tener claro para qué sirve TBB (Threading Building Blocks) para contrastarlo con otras alternativas (p. ej.Funciones de concurrencia de C++ 11x).TBB es una biblioteca portátil y escalable (no una extensión del compilador) que le permite escribir su código en forma de tareas livianas que TBB programará para que se ejecuten lo más rápido posible con los recursos de CPU disponibles.No está diseñado para admitir subprocesos para otros fines (p. ej.derecho preferente de compra).

He usado TBB para acelerar el procesamiento de imágenes existentes de bucles for sobre líneas de escaneo de imágenes en bucles paralelos_for (un mínimo de 2 a 4 líneas de escaneo como tamaño de "grano").Esto ha tenido mucho éxito.Requiere que el cuerpo del bucle esté (re)escrito para procesar un índice arbitrario en lugar de asumir que cada cuerpo del bucle se procesa secuencialmente (p. ej.punteros que se incrementan entre cada iteración del bucle).

Este fue un caso bastante trivial ya que no había ningún almacenamiento compartido para actualizar.Utilizar las funciones más potentes (p. ej.pipeline) requerirá una importante reinvención y/o reescritura del código existente, por lo que quizás se adapte mejor al código nuevo.

Es una poderosa ventaja que este código basado en TBB sigue siendo portátil, no parece interferir con otro código en otras partes del mismo proceso utilizando simultáneamente otras estrategias de subprocesamiento y luego puede combinarse con estrategias de multiprocesamiento en niveles superiores o inferiores (por ejemplo,el código TBB paralelo_for podría llamarse desde un filtro en una tubería de multiprocesamiento TBB).

¿Has mirado aumentar biblioteca con su API de hilo?

Los bloques de construcción de subprocesos (TBB) en la versión de código abierto (hay una nueva versión comercial, $ 299, aún no saben las diferencias) es la versión 2 de la Licencia Pública General 2 de GNU con una llamada "excepción de tiempo de ejecución" (es decir, Específico para el uso solo en la creación de software gratuito). He visto otras excepciones de tiempo de ejecución que intentan acercarse a LGPL, pero habilitando el uso Comercial y la vinculación estática, este no es el caso.

De acuerdo a esto pregunta El subprocesamiento de bloques de construcción se puede utilizar sin restricciones de copy-left en uso comercial.

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