Novedades Módulos Intel® para subprocesos 4.2

Los Módulos Intel® para subprocesos son una de las bibliotecas de subprocesos C++ más conocidas y fue actualizada recientemente a una nueva versión: 4.2. La versión actualizada contiene varias características clave nuevas en comparación con la anterior versión 4.1. Algunas de ellas ya se habían implementado en las actualizaciones de la versión 4.1.

La nueva primitiva de sincronización speculative_spin_mutex presenta la compatibilidad con el bloqueo especulativo. Esto es posible gracias a la característica del hardware de las Intel® Transactional Synchronization Extensions (Intel® TSX) disponibles en la cuarta generación de los procesadores Intel® Core™. En los procesadores que son compatibles con la memoria de las transacciones del hardware (tales como Intel® Transactional Synchronization Extensions), las exclusiones mutuas especulativas funcionan al permitir que varios subprocesos adquieran el mismo bloqueo, siempre y cuando no existan "conflictos" que podrían generar distintos resultados a los generados por el bloqueo que no es especulativo. De manera que no ocurre ninguna serialización en casos que no entran en conflicto. Esto puede mejorar notoriamente el rendimiento y la capacidad de escala en las secciones críticas "cortas". Si no existe compatibilidad de hardware para la sincronización de transacciones, entonces las exclusiones mutuas se comportan como sus homólogos no especulativos, pero muy posiblemente con un rendimiento inferior.

Ahora los Módulos Intel® para subprocesos son compatibles con la característica de propagación de excepciones exacta (basada en exception_ptr de C++11). Con exception_ptr, los objetos de excepciones pueden copiarse de manera segura entre los subprocesos. Esto ofrece flexibilidad en el manejo de excepciones en un entorno multisubprocesado. Ahora la propagación de excepciones exacta está disponible en binarios pregenerados para todas las plataformas: OS X*, Windows* y Linux*. En OS X existen dos conjuntos de binarios: el primero está vinculado con la biblioteca gcc estándar, se utiliza de manera predeterminada y no es compatible con la propagación de excepciones exacta. Para utilizar esta característica, debe utilizar el segundo conjunto de binarios vinculados con libc++, la biblioteca C++ estándar en Clang. Para utilizarlos, configure el entorno de los Módulos Intel® para subprocesos y construya su aplicación de la siguiente manera:

     # tbbvars.sh libc++
     # clang++ -stdlib=libc++ -std=c++11 concurrent_code.cpp -ltbb

Además de los contenedores concurrent_unordered_set y concurrent_unordered_map, ahora proporcionamos concurrent_unordered_multiset y concurrent_unordered_multimap en base al prototipo Microsoft* PPL. concurrent_unordered_multiset proporciona la habilidad de insertar un elemento más de una vez, lo cual no es posible en concurrent_unordered_set. De manera similar, concurrent_unordered_multimap permite la inserción de más de un par de <key,value≶ con el mismo valor clave. Para los dos contenedores “multi” la búsqueda devolverá el primer elemento (o el par <key,value>) en la tabla con una clave de búsqueda que coincide.

Los contenedores de los Módulos Intel® para subprocesos ahora pueden ser inicializados, de manera muy conveniente, con listas de valores especificadas por C++ 11 (listas de inicializador):

tbb::concurrent_vector<int> v ({1,2,3,4,5} );

En la actualidad las listas para inicializar son compatibles con los siguientes contenedores:

concurrent_vector
concurrent_hash_map
concurrent_unordered_set
concurrent_unordered_multiset
concurrent_unordered_map
concurrent_unordered_multimap
concurrent_priority_queue

El asignador de memoria escalable tiene memorias caché para la memoria asignada en cada subproceso. Esto se hace para mejorar el rendimiento pero, a menudo, incrementa el uso de memoria. Aunque el asignador de memoria intenta evitar el uso excesivo de la memoria, para casos complejos los Módulos Intel® para subprocesos 4.2 ofrecen al programador más control: ahora es posible reducir el consumo de memoria al eliminar las memorias caché de subprocesos con la función scalable_allocation_command(). También existen varias mejoras en el rendimiento general del asignador.

La biblioteca de los Módulos Intel® para subprocesos se utiliza ampliamente en varias plataformas. Los desarrolladores para dispositivos móviles ahora encuentran archivos binarios pregenerados para Android en el paquete del sistema operativo Linux. Los archivos binarios para las aplicaciones de la Tienda Windows se agregaron al paquete del sistema operativo Windows.

Ahora las variables atómicas tbb::atomic<T> tienen constructores cuando se utilizan en C++11. Esto permite que los programadores inicialicen los valores en la declaración, con expresiones const compatibles de manera adecuada. En la actualidad esto funciona para los compiladores gcc y Clang:

tbb::atomic<int> v=5;

La nueva característica de vista previa de la comunidad permite esperar hasta que terminen todos los subprocesos de trabajo. Esto puede ser necesario si una aplicación bifurca los procesos o si la biblioteca dinámica de los Módulos Intel® para subprocesos se puede descargar en el tiempo de ejecución (por ej. si los Módulos Intel® para subprocesos son parte de un complemento). Para habilitar la espera a que terminen los subprocesos de trabajo, inicialice el objeto task_scheduler_init de esta manera:

#define TBB_PREVIEW_WAITING_FOR_WORKERS 1
tbb::task_scheduler_init scheduler_obj (threads, 0, /*wait_workers=*/true);

Busque los nuevos Módulos Intel® para subprocesos 4.2 en los sitios comercial y de código abierto. ¡Descargue y disfrute la nueva funcionalidad!

Para obtener información más completa sobre las optimizaciones del compilador, consulte nuestro Aviso de optimización.