Pentium 4 'Prescott' 2.8-3.4 Ghz
By Samuel D. - 02/02/2004
Sommaire:

 

Prescott VS Northwood :
Micro-Architecture

 

Comme nous l'avons déjà dit, les principales différences entre le Prescott et le Northwood sont la taille et l'organisation des caches, le SSE3 et les améliorations apportées à la technologie Hyper-Threading. Nous traiterons ces trois évolutions principales dans une section dédiée à chacune. Cette partie est une comparaison globales des points de différentiations entre Prescott et Northwood et nous servira a mettre en valeur certaines évolutions qu'on pourrait qualifier à tord de mineures. La plus évidente étant bien sûr la taille du pipeline qui passe de 20 à 30 étages. Une énorme augmentation qui va jouer énormément sur les performances globales et sur le fonctionnement de tout le processeur. Plus que le cache, cette donnée est une des informations les plus importantes dans la compréhension de se processeur.

  • Evolution des cores

L'Architecture NetBurst du Pentium 4 a connu quatre déclinaisons majeures. Le premier core disponible fût le core Willamette, gravé en 0.18 µm et équipé d'un cache de 256 Ko. Disposant d'un pipeline à 20 étages face au Pentium III de l'époque à 10 étages, il était moins performant à fréquence égale. Assez rapidement, il fût remplacé par le core Northwood, gravé en 0.13 µm et équipé de 512 Ko de cache. Récupérant par la même occasion les faveurs du public, Intel se décida enfin à activer les fonctionnalités HyperThreading dans le modèle 3.06 Ghz et tous les modèles FSB800. Plus récemment arriva la troisième déclinaison du core Northwood, l'anecdotique core Northwood/2M qui équipe le Pentium 4 EE. Enfin, c'est le core Prescott que nous étudions aujourd'hui qui apparaît sur le marché. Intel fournis un tableau récapitulatif de ces différents processeurs :

 

Comme on le voit, les "améliorations" de la micro-architecture sont au nombre de 7. Voyons chaque blocs avec une petite explication sur le pourquoi du comment :

  • Improved Pre-Fetcher :

Introduit avec le Pentium 4 sous sa forme "Hardware", le prefetcher Hardware permet de détecter les données qui sont susceptible d'être utilisée dans un futur proche, de les récupérer de la mémoire principale, et enfin de les traiter afin qu'elles soient prête à entrer dans le pipeline si besoin est. Le prefetcher Hardware permet de précharger des données par anticipation de la mémoire centrale vers le cache L2. C'est une sorte de prédiction des données qui vont être utilisée un peu plus tard dans le temps et que le prefetcher transfére de la mémoire vers le L2 afin de pouvoir y accéder plus rapidement lorsqu'elles seront nécessaires. Intel a donc améliorer cet algorithme afin de tirer mieux parti des applications multi-threads utilisées conjointement avec l'Hyper-threading.

  • Improved Branch Prediction :

Comme nous l'avons dit, le pipeline du Pentium 4 Prescott est dorénavant de 30 étages. Dans ces circonstances, une prédiction de branchement qui échoue entraîne une obligation de vider le pipeline. Remise à zéro d'autant plus longue que le pipeline contient d'étages. Il est donc vital d'améliorer la prédiction de branchement et c'est ce qui a été fait dans le prescott. Rentrons un peu dans les détails.

Comme on le sait, il existe deux type de prédiction de branchement dans le cœur NetBurst des Pentium 4. La première est une prédiction de branchement dynamique qui s'appuie sur le comportement des branches précédentes. Ainsi, le résultats des branchements précédents est stocké dans un buffer appelé "Trace Cache Branch Prediction Buffer (BTB)" et, par le biais d'un algorithme complexe, une prédiction fiable de la branche future, basée sur les précédentes, peut être effectuée. Cependant, il arrive souvent que lorsqu'une branche se présente, le BTB n'ait pas de prédiction pour cette branche. On utilise donc la prédiction statique. Voyons un peu comment fonctionne la prédiction statique.

Une branche est comparable à un choix. Dans un programme, on trouve beaucoup de choix. Voyons par exemple et a titre didactique un exemple de programme très simple, vu en assembleur :

 

Nous sommes donc à l'adresse 38D4 quand survient une branche. Après le test des registres cx et ax, le programme (et donc le processeur), va rencontrer une instruction "je" qui signifie "jump if equal". En clair, deux possibilités existent :

  • Possibilité 1 : cx et ax sont égaux => le programme passe donc à l'offset 38F3
  • Possibilité 2 : cx et ax sont différents => le programme continue normalement vers l'offset suivant (38D6)

Ceci est ce qu'on appelle une branche. Et le but de la prédiction de branchement est donc de prédire cette branche.

Mais revenons au Pentium 4. Lorsque le BTB ne contient pas d'informations sur une branche, c'est la prédiction statique qui s'exécute. Celle-ci prédit la branche (le fait que le programme va continuer son court ou "sauter" vers un autre offset) en fonction d'une règle très simple :

  • Possibilité 1 : La branche saute vers l'avant
                         => Prédiction : La branche ne sera pas prise
  • Possibilité 2 : La branche saute vers l'arrière
                          => Prédiction : La branche sera prise

Considérant qu'un programme emploie énormément de boucle, la prédiction considère que toute branche régressive sera prise jusqu'a la fin de la boucle. Voyons donc un exemple de code :

 

 

Dans cet exemple, la prédiction de branchement statique prédira donc que les trois premiers branchements (en rouge) ne seront pas pris et que le dernier (en rouge) sera pris. Ce n'est pas plus compliqué que ça.

Voici donc le fonctionnement dans le Northwood. En effet, la prédiction statique du prescott a maintenant évolué. Voyons ça :

 

Comme on le voit, le Prescott améliore la prédiction de branchement statique en considérant qu'une branche est prise si elle est régressive *ET* si elle pointe vers une source peu lointaine. Intel considère en effet qu'une branche regressive lointaine est rarement dans une boucle et a donc modifié la prédiction dans ce sens. Sur une suite de benchmarks effectués avec SpecCPU 2000, Intel fournis ces chiffres de prediction de branchements (exemple global incluant de la prédiction dynamique et statique) :

Northwood Prédiction % :
Prescott Prédiction % :
99.141%
99.246%

Soit un gain d'environ 0.1% de la prédiction de branchement, qui peut paraitre faible, mais qui represente tout de meme un gain non négligeable.

  • Improvements to Hyper-Threading & SSE3 :

Ces deux améliorations sont en partie liées puisque le SSE3 apporte deux nouvelles instructions permettant de mieux gérer l'HyperThreading. Cependant, nous avons décidé de dédier une section complète à ces deux améliorations. Nous verrons donc ceci dans les pages suivantes.

  • Improved Shift/Rotate Latency :

Deux instructions trés souvent utilisées par les programme sont les instructions Shift (Décalage) et Rotate (Rotation). Ces deux instrictions permettent des manipulations sur les bits de façon interessante pour un grand nombre d'opération.

Opération de décalage à droite
(Shift - SHR)

  1010000 SHR
= 0101000 SHR
= 0010100 SHR
= 0001010 SHR
= 0000101 SHR
= 0000010 SHR
= 0000001 SHR
= 0000000    

Opération de rotation à droite
(Rotate - ROR)

  1010000 ROR
= 0101000 ROR
= 0010100 ROR
= 0001010 ROR
= 0000101 ROR
= 1000010 ROR
= 0100001 ROR
= 1010000
     

Comme nous l'avons déjà vu dans de précédents articles, le Pentium 4 comporte trois unités d'exécution dites "ALU". Deux de ces ALUs sont des unités double vitesses, c'est à dire qu'elles fonctionnent à une vitesse double que celle du processeur (6 Ghz pour un Pentium 4 3 Ghz). Ceci permet de traiter deux instructions simples par cycle. Outre ces deux unités double vitesse dédiées aux instructions relativement simples (add, sub, ...etc), on trouve également une troisième ALU, dite complexe, qui traite les instructions plus compliquées (en plus longtemps). Dans le Prescott, Intel à transféré le traitement des l'instructions Shift et Rotate de l'ALU simple vitesse à l'ALU double vitesse. Ce qui entraîne un gain en rapidité théorique sur ces instructions de 100% ! Pour le vérifier, nous avons, avec l'équipe d'Onversity, pensé à un benchmark. Celui-ci se contenterait d'exécuter le code C suivant :

Afin de mesurer la rapidité des shifts (les rotates sont plus compliqués à mesurer en C, mais sont identiques sur un plan structurel que les shifts), nous avons comparé un Pentium 4 Prescott 3.2 Ghz et un Pentium 4 Northwood 3.2 Ghz sur ces instructions. Voici, en millisecondes, le temps necessaire pour traiter cette boucle :

 

 

A fréquence égale, l'architecture prescott est quasiment 50% plus rapide que l'architecture Northwood pour executer des shifts et autre rotate. Certes, ce n'est qu'une instruction parmis beaucoup, mais utilisée relativement frequemment.

  • Improved imul Latency :

Après les shift et autres rotate, c'est maintenant les opérations de multiplications sur les entiers qui ont été améliorées dans le Prescott. Autrefois traitée par l'unité FPU, ceci entraînait des latences dues aux déplacements des données entre l'unité d'entier et la FPU. Ceci est donc maintenant réglé puisque les imul sont maintenant traitée directement par une unité de multiplication d'entier dédiées. Ce même, nous avons pensé à un petit test définis par le code C suivant :

Ces multiplications sont effectuées sur des tables de plusieurs mégaoctets afin de ne pas avoir une dépendance au cache trop importante. Voyons les résultats :

Les résultats sont ici plus qu'impressionnants puisque les instructions de multiplications d'entiers sont exécutées 2x plus rapidement sur Prescott que Northwood, et ce, à fréquence égale ! D'excellentes performances sur cet instructions, tout comme sur les shift et rotate donc.

  • Additionnal WC Buffers :

Les WC Buffers, située entre le cache L2 et la mémoire, permettent de faire tampon entre ces deux mémoires lors des opérations d'écriture (WC = Write-Combined). D'un nombre de 6 sur le Northwood et d'une taille d'une ligne de cache (64 octets), ces buffers servent principalement a combiner plusieurs opérations d'écriture d'une mémoire n vers une mémoire n+2 (L2 -> RAM dans notre cas). Dans le prescott, ces buffers sont maintenant au nombre de 8. Toujours d'une taille de 512 bits, ceci permet à 32 (8*512/128) instructions "store" d'être en suspens simultanément en sortie du processeur. Le Northwood ne comportait que 6 WC Buffer, ce qui donnait 24 (6*512/128) instructions maximum simultanément. Ceci a clairement pour but d'améliorer les performances lorsque deux threads s'executent en même temps (HT).

  • Diagramme de blocks

Terminons par le diagramme de blocks du Pentium 4 Prescott :

 

Outre les caches, le SSE3 et les améliorations due à l'Hyper-Threading que nous verrons plus tard, nous avons donc vu en détails les autres modifications de la micro-architecture 90nm d'Intel. Axée principalement sur l'amélioration de l'Hyper-Threading et sur quelques autres instructions, il reste maintenant à voir l'efficacité de ces modifications.

 

Suite ( Le SSE3 détaillé )

Fermer