Nouveautés Composant de threading Intel® 4.2

Les composants de threading Intel®, l'une des bibliothèques de threading C++ les plus connues, ont récemment été mis à jour en version 4.2. La nouvelle version contient plusieurs fonctionnalités clés nouvelles par rapport à la version 4.1. Certaines de ces nouvelles fonctionnalités ont été également publiées dans les mises à jour des composants de threading Intel 4.1.

La nouvelle primitive de synchronisation speculative_spin_mutex introduit la prise en charge du verrouillage spéculatif. Cela est rendu possible par l'exploitation de la fonctionnalité matérielle Intel® Transactional Synchronization Extensions disponible sur les processeurs Intel® Core™ de 4e génération. Sur les processeurs qui prennent en charge la mémoire matérielle transactionnelle (comme Intel® Transactional Synchronization Extensions), les mutex spéculatifs opèrent en permettant à plusieurs threads d'acquérir le même verrou, dès lors qu'il n'y a pas de conflits susceptibles de générer des résultats différents du verrouillage non spéculatif. De ce fait, il ne se produit aucune sérialisation dans les cas où il n'y a pas de conflits. Cela peut augmenter considérablement les performances et l'extensibilité pour les sections critiques « courtes ». S'il n'y a pas de prise en charge matérielle de la synchronisation transactionnelle, les mutex spéculatifs se comportent comme leurs contreparties non spéculatives, mais avec un risque de moindres performances.

Les composants de threading Intel prennent en charge à présent la fonctionnalité de propagation exacte des exceptions (basée sur exception_ptr de C++ 11). Grâce à exception_ptr, les objets exception peuvent être copiés en toute sécurité entre plusieurs threads. Cela apporte de la flexibilité dans la gestion des exceptions en environnement multithreadé. Désormais, la propagation exacte des exceptions est disponible dans les fichiers binaires préintégrés pour toutes les plates-formes : OS X*, Windows* et Linux*. Pour OS X, il existe deux jeux de fichiers binaires : le premier est lié à la bibliothèque gcc standard – il est utilisé par défaut et ne prend pas en charge la propagation exacte des exceptions. Pour pouvoir utiliser cette fonctionnalité, vous devez prendre le second jeu de fichiers binaires, qui est lié à la bibliothèque libc++, la bibliothèque C++ standard dans Clang. Pour les utiliser, configurez l'environnement des composants de threading Intel et créez votre application de la manière suivante :

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

En plus des conteneurs concurrent_unordered_set et concurrent_unordered_map, nous fournissons désormais concurrent_unordered_multiset et concurrent_unordered_multimap basés sur le prototype Microsoft* PPL. concurrent_unordered_multiset permet d'insérer un élément plusieurs fois, ce qui n'est pas possible dans concurrent_unordered_set. De la même manière, concurrent_unordered_multimap permet d'insérer plus d'une paire <key,value> ayant la même valeur de clé. Pour les deux conteneurs « multi », un find retournera le premier élément (ou la première paire <key,value>) de la table correspondant à la clé de recherche.

Les conteneurs des composants de threading Intel peuvent désormais être initialisés avec des listes de valeurs selon les spécifications de C++ 11 (listes d'initialisation) :

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

Actuellement, les listes d'initialisation sont prises en charge par les conteneurs suivants :

concurrent_vector
concurrent_hash_map
concurrent_unordered_set
concurrent_unordered_multiset
concurrent_unordered_map
concurrent_unordered_multimap
concurrent_priority_queue

L'allocateur de mémoire extensible dispose de caches pour la mémoire allouée dans chaque thread. Le but est d'optimiser les performances, mais souvent au prix d'une utilisation accrue de la mémoire. Bien que l'allocateur de mémoire fasse tout son possible pour éviter de consommer de la mémoire de manière excessive, dans les cas complexes, les composants de threading Intel 4.2 accorde davantage de contrôle au programmeur : il est désormais possible de réduire la consommation de mémoire en nettoyant les caches des threads grâce à la fonction scalable_allocation_command(). Plusieurs autres améliorations ont été apportées aux performances globales de l'allocateur.

La bibliothèque de composants de threading Intel connaît une large utilisation sur différentes plates-formes. Les développeurs pour mobiles peuvent désormais trouver des fichiers binaires préconstruits pour Android dans le package Linux OS. Des fichiers binaires pour les applications Windows Store ont été ajoutés au package Windows OS.

Les variables atomiques tbb::atomic<T> ont désormais des constructeurs lorsqu'on les utilise dans C++ 11. Cela permet aux programmeurs d'initialiser leurs valeurs sur déclaration, avec des expressions const correctement prises en charge. Actuellement, cela fonctionne pour les compilateurs gcc et Clang :

tbb::atomic<int> v=5;

La nouvelle fonctionnalité community preview permet d'attendre que tous les threads worker soient terminés. Cela peut s'avérer nécessaire si une application divise des processus ou si la bibliothèque dynamique des composants de threading Intel peut être déchargée au moment de l'exécution (par exemple, si les composants de threading Intel font partie d'un plug-in). Pour permettre d'attendre les workers, initialisez l'objet the task_scheduler_init de cette manière :

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

Trouvez les nouveaux composants de threading Intel 4.2 sur des sites commerciaux et code source libre. Téléchargez-les et jouez avec leurs nouvelles fonctionnalités !

Étiquettes:
Reportez-vous à notre Notice d'optimisation pour plus d'informations sur les choix et l'optimisation des performances dans les produits logiciels Intel.