|
Intel Core i7 "Nehalem" Nehalem : l'architecture en détail Sur cette page, nous mettrons de côté toutes les fonctionnalités « Uncore » pour nous intéresser uniquement aux cœurs. Pour les Core i7, Intel a choisi d’optimiser au maximum l’architecture introduite avec les derniers Core 2 « Penryn » sans toutefois la bouleverser radicalement. Le but : augmenter au maximum l’efficacité des unités d’exécutions en organisant mieux les instructions et en accélérant la récupération des données par le biais des mémoires caches. Ainsi, on constate très vite que les unités d’exécutions de Nehalem sont quasi-identiques à celles déjà présentes sur les anciens Core 2. Au contraire, la majorité des améliorations touchent le front-end, c'est-à-dire les étapes chargées de la récupération (fetch) et du décodage (decode) des instructions.
Tout ceci est très compliqué et pour améliorer la compréhension de l’architecture, nous avons commenté grossièrement (chez Canard PC, on aime être grossier) le schéma classique fourni par Intel :
Le Front end est donc un élément primordial pour augmenter le débit des instructions et « nourrir » au mieux les unités d’exécutions. Pour cela, Intel a apporté trois améliorations principales au Front-End de Nehalem.
Voici donc pour le front-end. Comme nous l’avons vu, celui-ci est constitué de déclinaisons améliorées des mécanismes d’optimisation déjà mis en place dans le Core 2. Avant de passer aux unités d’exécutions, parlons du moteur OOO (Out-Of-Order) qui permet d’exécuter dans le désordre les instructions qui arrivent du front-end afin de gagner en efficacité. A ce point de vue, Nehalem apporte deux améliorations. La première concerne le buffer de ré-ordonnancement (ROB) qui passe de 96 entrées sur Core 2 à 128 sur Nehalem, ce qui permettra au moteur OOO de travailler sur 33% de données supplémentaires et donc, d’avoir des occasions supplémentaires de trouver de meilleurs optimisations dans les µops. La seconde, de loin la plus importante, est le retour du SMT (Simultaneous Multithreading), technologie introduite avec les Pentium 4 et connue sous le nom commercial d’Hyperthreading (HT). Le but est toujours de pouvoir gérer simultanément deux threads (tâches) au sein du cœur pour « boucher les trous » du pipeline et optimiser, ici encore, les performances des unités d’exécutions. Voyons cela :
En théorie, l’apport de l’Hyperthreading sur une architecture dotée d’un pipeline court (donc moins sujet aux chutes d’efficacité qu’un pipeline long comme le Pentium 4) est assez réduite. Toutefois, Intel a probablement choisi de rajouter le SMT sur Nehalem à cause des multiples optimisations effectuées sur le front end et sur les caches. Nous verrons un peu plus loin ce qu’il en est des gains obtenus avec l’Hyperthreading. Reste maintenant à parler des unités d’exécutions en elles-mêmes. Voyons leur schéma :
Sans surprise, les execs de Nehalem sont strictement identiques à celles des derniers Core 2. On retrouve ainsi les 3 unités chargés des accès mémoires et les 3 unités de calculs responsables des mêmes opérations. La seule différence provient de la « Unified Reservation Station », chargée de dispatcher les µops sur les différentes unités, dont la capacité augmente légèrement suite à la croissance du moteur OOO. Bien sûr, on trouve aussi dans ces unités le support du SSE 4.2, qui vient compléter le SSE 4.1 des Penryn et apporte 7 nouvelles instructions. Intéressons nous-y un instant :
Les cinq premières instructions sont regroupées sous le nom STTNI pour « String & Text New Instructions ». Il s’agit des instructions PCMPESTRI (Packed Compare Explicit Length Strings, Return Index), PCMPESTRM (Packed Compare Explicit Length Strings, Return Mask), PCMPISTRI (Packed Compare Implicit Length Strings, Return Index), PCMPISTRM (Packed Compare Implicit Length String, Return Mask) et PCMPGTQ (Compare Packed Data For Greater Than). Celle-ci sont dédiés à traiter des chaine de textes et donc à accélérer le traitement de flux de données composés de chaines de caractères comme le XML. On trouve ensuite l’instruction CRC32, exclusivement destinée à calculer de manière hardware les checksums des protocoles iSCSI et InfiniBand, utilisés dans les serveurs et l’instruction POPCNT qui compte le nombre de bit à « 1 » dans un registre. POPCNT sera utilisée principalement dans la recherche scientifique, voir dans la reconnaissance vocale. A noter que bien qu’étant présentée par Intel comme faisant partie de SSE 4.2, l’instruction POPCNT est déjà présente dans les Core 2 basé sur le cœur « Penryn ».
Voilà donc pour la théorie. Pour en savoir plus sur les modifications apportées par Nehalem sur les cœurs, nous nous sommes livrés à deux tests pratiques afin de savoir si la latence et le débit des instructions ont été modifiés depuis Penryn, et aussi pour mesurer les gains de performances apportés par le retour de l’Hyperthreading. Commençons donc par comparer la façon dont sont traitées les instructions x86 sur ces deux générations :
Et le résultat est très instructif. Comme on le constate au premier coup d’œil, Intel a du faire des choix pour Nehalem et visiblement, le beau diviseur ultra-performant qui équipait Penryn s’est retrouvé sérieusement limité. Tout ce qui ressemble de prés ou de loin à une division ou qui utilise le diviseur (racine carrée, fonctions trigonométriques, …etc.) est systématiquement plus lent sur Nehalem que sur Penryn. Toutefois, les résultats obtenus sont tout de même nettement meilleurs que sur Conroe. Ceci peut s’expliquer de cette façon : le développement de Nehalem, nouvelle architecture, a débuté bien avant celui de Penryn, simple die-shrink. Il est donc probable que lorsque le diviseur de Penryn a été finalisé, celui de Nehalem était déjà terminé. Ce qui expliquerait que Nehalem se retrouve avec un diviseur à mi-chemin entre Conroe et Penryn.
Globalement, Intel semble donc avoir optimisé les instructions les plus utilisées, principalement liées aux accès cache et mémoire. Parlons maintenant de l’Hyperthreading. Nous avons effectués quelques benchmarks avec et sans l’HT actif pour comparer le gain apporté par cette technologie sur Nehalem :
Les résultats sont impressionnants ! Certes, nous n’avons utilisé ici que des applications massivement multi-threadées afin de bien mettre en évidence l’apport du SMT sur l’architecture Nehalem, mais même ainsi, les résultats montrent un gain très important, compris entre 10% et 40% selon l’application, avec l’utilisation de 8 threads. Ce surcroit de performances, ramené à un seul cœur, est comparable à celui obtenu avec les premiers Pentium 4 HT. Intel a donc fait un excellent travail d’optimisation sur le moteur OOO et la gestion des contextes inhérente à l’utilisation du SMT. Bien sûr, inutile d’attendre ce genre de gain dans les applications qui tirent encore peu parti des processeurs multi-cœur comme les jeux, mais l’Hyperthreading représente, dans le cas de Nehalem, une technologie mature dont les gains escomptés sont remarquables.
| ||||||||||||||