Intel Core i7-4770K et i5-4670K : Haswell en test

Publié le 01/06/2013 par et
Imprimer
Si le marketing parle souvent de "nouvelle architecture", dans la pratique les constructeurs capitalisent sur leurs acquis et font évoluer au fur et à mesure leurs architectures existantes. Dans le cas d'Haswell, on ne s'étonnera donc pas de retrouver un grand nombre de similarités, mais aussi des différences avec l'architecture de Sandy Bridge. Vous pouvez retrouver notre présentation de Sandy Bridge dans cet article pour rappel.

Jeu d'instruction : TSX

Avant d'entrer dans les détails sur les changements effectués au niveau de l'architecture, il faut noter qu'Intel a effectué deux additions assez importantes au jeu d'instruction d'Haswell. La première est baptisée TSX, une série d'instructions qui permettent d'accéder de manière différente à la mémoire et que nous avions détaillées l'année dernière.

L'idée est d'ajouter un concept de transaction, qui sera peut être familier à ceux qui connaissent les bases de données : les instructions TSX permettent de marquer un bloc d'instruction comme atomique, c'est-à-dire dont l'exécution doit être réalisé en intégralité avant que quiconque d'autre touche à la mémoire utilisée par le bloc.

Le problème que résout TSX est complexe, en effet les architectures processeurs modernes partagent un espace mémoire commun. Cela permet à tous les cœurs de travailler sur des données identiques, mais n'est pas sans inconvénient. Des problèmes de synchronisation, assez pénibles à débuguer pour les développeurs, arrivent assez vite. Imaginez deux cœurs qui lisent une donnée dans le but de la réécrire quelques secondes après : l'un va écraser le résultat de l'autre.


Des mécanismes de sémaphores ou d'exclusion mutelles (mutex ) ont donc été mis au point côté algorithmique, ce sont les développeurs qui doivent les implémenter dans leur code avec tous les problèmes que cela peut poser.

TSX apporte deux réponses, avec tout d'abord le mode Hardware Lock Elision (HLE). Il s'agit de deux nouvelles instructions (XACQUIRE et XRELEASE) que l'on doit placer autour de blocs que l'on souhaite considérer comme atomiques. Attention cependant : le programmeur devra toujours implémenter manuellement son système de "lock", il sera cependant désormais accéléré et surveillé par le processeur.


Quel intérêt ? La réalité est que tous les locks ne sont pas utiles, ils sont juste là pour éviter les cas de collisions. En indiquant au processeur quels sont les blocs qui peuvent poser problème, Haswell pourra décider d'effectuer les opérations non mutuellement bloquantes en simultanée, le lock inutile étant alors omis ("elision" en anglais) sur Haswell. On notera que dans le cas ou une transaction est impossible (par exemple, le programmeur a oublié d'utiliser le lock a un endroit de son programme avant d'utiliser une ressource partagée, créant un conflit), Haswell exécutera le code atomique de manière non transactionnelle. HLE n'apporte donc pas de bénéfice direct côté sécurité ou facilité de programmation, mais permet d'améliorer les performances dans certains cas (les programmeurs tendant très souvent à abuser des locks lorsque cela n'est pas nécessaire) sur Haswell tout en laissant le code fonctionnel sur d'autres plateformes.

L'autre mode de fonctionnement proposé par Intel est baptisé Restricted Transactional Memory (RTM). Il s'agit cette fois ci d'une implémentation complète de mémoire transactionnelle. Trois instructions sont disponibles, XBEGIN, XEND et XABORT.


Contrairement au mode HLE où le programmeur devait toujours créer ses propres locks, RTM permet de s'en passer et d'entourer simplement les blocs que l'on souhaite devenir atomiques : ils seront alors exécutés comme des transactions. Cependant, dans le cas où une transaction est impossible, le programmeur doit impérativement proposer un plan de secours. L'implémentation du plan de secours (une adresse où l'on reroute le programme) n'est pas optionnelle car de nombreuses choses peuvent faire rater une transaction. La première est le programmeur lui-même qui peut utiliser l'instruction XABORT pour l'arrêter. La seconde concerne des opérations à l'intérieur du bloc qui ne sont pas compatibles. Dans certains cas, mixer des instructions SSE et AVX (qui utilisent les registres XMM et YMM du processeur) peut causer un arrêt de la transaction. D'autres instructions sont définies dans la documentation d'Intel comme dépendant de l'implémentation, mais la question de la cohérence de la mémoire cache (seule la ligne est vérifiée et non la donnée précise) risque de générer un certain nombre d'arrêts également.

Bien entendu si ces instructions supportées par le processeur sont disponibles manuellement en assembleur, dans la majorité des cas c'est le compilateur qui devra implémenter les instructions. Intel, en collaboration avec IBM et Sun avait définit un modèle mémoire transactionnel pour la norme C++11 qui sera implémenté entre autre par GCC (à partir de la version 4.7). Intel proposera également dans son compilateur C/C++ des intrinsèques (des fonctions C qui indiquent au compilateur d'utiliser une instruction assembleur donnée).

En soit le mécanisme HLE pourrait être implémenté assez rapidement et de manière bénéfique pour les performances sur Haswell. Cependant en ce qui concerne RTM, il faut plus y voir un travail préparatoire. En attendant la standardisation, côté langages de programmation, d'extensions transactionnelles, l'utilisation de TSX se fera au cas par cas et il ne faudra pas espérer voir une généralisation rapide. D'autant plus qu'Intel est pour l'instant le seul à proposer une telle accélération, AMD ne s'étant pas encore prononcé sur le sujet. Ce travail préparatoire, qui résout un vrai problème concret se doit cependant d'être salué, même si l'on en observera pas forcément les résultats de suite.

Attention, à l'instar de VT-d, Intel a eu la "bonne" idée de pas activer ces instructions TSX sur une partie de la gamme, notamment les processeurs K.

Jeu d'instruction : AVX2

Si TSX est l'extension la plus originale du jeu d'instruction, AVX2 est la plus pragmatique. Annoncée dès 2011 par Intel, AVX2 ajoute un grand nombre d'instructions vectorielles, c'est-à-dire capables de s'appliquer à plusieurs données en simultanées (on parle d'instructions SIMD : Single Instruction, Multiple Data).


Une grande nouveauté d'AVX2 est l'arrivée d'instructions entières vectorielles 256 bits, Intel offre ainsi un pendant vectoriel aux instructions x86 classiques, ce qui peut être intéressant.


Un autre changement concerne l'ajout d'instructions dites FMA (Fused Multiply Add). Plutôt issues du monde GPU, ces opérations fusionnent une multiplication et une addition, c'est-à-dire une opération de la forme A = A x B + C. Celles utilisées par Intel sont de type FMA3 (trois opérandes) quand AMD avait lancé avec Bulldozer une implémentation FMA4 (D = A x B + C), avant de proposer également un FMA3 via Piledriver. Notez enfin que ces instructions sont accompagnées d'autres instructions essentielles permettant de charger dans des registres des données mémoires non adjacentes (instructions type gather).
Vos réactions

Top articles