# Intel Threading Building Blocks

Intel Threading Building Blocks (Intel TBB) es una biblioteca basada en plantillas para C++ desarrollada por Intel para facilitar la escritura de programas que exploten las capacidades de paralelismo de los procesadores con arquitectura multinúcleo.
Esta biblioteca proporciona algoritmos y estructuras de datos que permiten al programador evitar en parte las complicaciones derivadas del uso de los paquetes nativos de gestión de hilos de ejecución en los que la creación, sincronización y destrucción de los hilos es explícita y dependiente del sistema. En lugar de esto, la biblioteca abstrae el acceso a los múltiples procesadores permitiendo que las operaciones sean tratadas como tareas que se reparten automática y dinámicamente entre los procesadores disponibles mediante un gestor en tiempo de ejecución.
Esta aproximación hace que Intel TBB se incluya en la familia de soluciones para la programación paralela que permiten desacoplar la programación de las características particulares de la máquina.

## Historia

La primera versión de esta biblioteca (versión 1.0) fue publicada por Intel el 29 de agosto de 2006, un año después del lanzamiento del primer procesador multinúcleo de arquitectura x86 de Intel, el Pentium D. La versión 1.1 se publicó el 10 de abril de 2007. Ésta nueva versión introdujo el auto_partitioner ofreciendo una alternativa automática a la especificación manual del tamaño de grano idóneo para la paralelización de tareas. Ese mismo año fue incluida en la versión 10.0 de la edición profesional del Intel C++ Compiler.
La versión 2.0 fue publicada el 24 de julio de 2007. Esta versión incluyó la liberación del código fuente y la creación de un proyecto colaborativo de código abierto. El código se distribuye bajo la licencia GPLv2 with an "runtime exception", la misma que utiliza la implementación de la biblioteca estándar de C++ de GCC. Sin embargo, Intel TBB se sigue distribuyendo bajo una versión comercial sin código fuente que proporciona soporte pero que no aporta funcionalidad extra.
La versión 2.1 se publicó el 22 de julio de 2008 aunque ha sido actualizada en diversas ocasiones. Aporta novedades como afinidad tarea-hilo, soporte de cancelación, manejo de excepciones y adaptadores portables para hilos. La última actualización publicada de esta versión ha sido la update 4 con fecha 22 de abril de 2009.

## Implementación

Intel TBB implenta task stealing (robo de tareas) para balancear la carga de trabajo sobre los núcleos de procesamiento disponibles con el fin de incrementar el aprovechamiento de los núcleos y la escalabilidad de los programas. Inicialmente la carga de trabajo se divide uniformemente entre los núcleos de procesamiento disponibles. Si alguno de ellos termina su trabajo mientras otro todavía tiene una carga significativa en su cola de tareas, el gestor de tareas reasigna parte de este trabajo al núcleo inactivo. Esta capacidad de reasignación dinámica desacopla la programación de la máquina, permitiendo que las aplicaciones escritas usando esta biblioteca se escalen para usar todos los núcleos de procesamiento disponibles si ningún cambio en el código fuente o los ejecutables.
Intel TBB, siguiendo el ejemplo de la STL, está basada en el uso de plantillas ya que se espera que el polimorfismo en tiempo de compilación sea más eficiente que el tradicional polimorfismo en tiempo de ejecución.

## Contenidos

Intel TBB aporta, entre otros, la siguiente colección de componentes para la programación paralela:
* Algoritmos básicos: parallel_for, parallel_reduce, parallel_scan.
* Algoritmos avanzados: parallel_while, parallel_do, pipeline, parallel_sort.
* Contenedores: concurrent_queue, concurrent_vector, concurrent_hash_map.
* Reserva de memoria: scalable_allocator, cache_aligned_allocator.
* Exclusión mutua: mutex, spin_mutex, queuing_mutex, spin_rw_mutex, queuing_rw_mutex, recursive mutex.
* Operaciones atómicas: fetch_and_increment, fetch_and_decrement, fetch_and_add, compare_and_swap, fetch_and_store.
* Toma de tiempos: tick_count.
* Gestor de tareas: task.

## Sistemas soportados

Intel TBB 2.1 en su versión comercial está soportada en Microsoft Windows (XP o posterior), Mac OS X (versión 10.4.4 o superior) y Linux, soportando varios compiladores: Visual C++ (versión 7.1 o superior, sólo en Windows), Intel C++ Compiler (versión 9.0 o superior) o GCC. Adiccionalmente, la implementación libre de Intel TBB está soportada en Sun Solaris, PowerPC, XBOX 360, QNX Neutrino, y FreeBSD.
En septiembre de 2008, Intel TBB estaba disponible en forma de paquete para las siguientes distribuciones Linux:
* Red Hat Fedora
* Novell openSUSE
* Canonical Ubuntu
* Red Flag Asianux
* Turbolinux
* Debian