| 
         
  
      L'Architecture NetBurst 
       
       
      Le Pentium 4 est un processeur résolument tourné vers le multimédia, 
        c'est-à-dire qu'il doit être en mesure de traiter rapidement de grosses 
        quantités d'informations (flux audio, vidéo). Comme nous le verrons en 
        étudiant son architecture, celle-ci a été pensée pour limiter au maximum 
        les goulets d'étranglements, tant au niveau de la capacité de calcul que 
        du transfert des données dans le processeur et entre le processeur et 
        le reste du système. L'objectif principal du Pentium 4 est donc le débit. 
       
       NetBurst a ainsi été créée avec deux lignes directrices : 
       
        - Permettre technologiquement l'utilisation de fréquences élevées (avec 
          les moyens actuels).
 
        - Exploiter cette fréquence, en limitant au maximum les goulets d'étranglements.
 
       
      
       La contrainte technologique 
        pour les hautes fréquences réside dans le découpage du pipeline. Le principe 
        est le suivant : plus le pipeline comprend d'étapes, plus simples sont 
        les étapes, et d'un point de vue physique du transistor, plus vite elles 
        s'effectuent, permettant ainsi une fréquence de fonctionnement élevée. 
         
        L'architecture NetBurst repose sur une technologie de pipeline à 20 niveaux 
        de profondeurs (à comparer avec les pipelines à 5 niveaux du Pentium et 
        à 10 niveaux des Pentium Pro/II/ !!!) et qui lui vaut le nom Hyper 
        Pipelined.  
       Les 20 étapes du pipeline couvrent les quatre grandes étapes du traitement 
        des instructions : 
       
        - Le « in-order front end » charge les instructions et les décode. Elle 
          nécessite 5 étages du pipeline (1 à 5).
 
        - Le « out-of-order (OOO) execution logic » réordonne les instructions 
          et les répartit vers les unités de calcul. Il occupe 7 étapes du pipeline 
          (6 à 12).
 
        - La phase d'exécution fait intervenir les unités de calcul proprement 
          dites : 5 étapes (13 à 17).
 
        - La phase de « retirement » réordonne les résultats du calcul de façon 
          cohérente : 3 étapes
 
        (18 à 20). 
       
      
       
         
       
       
       Le principal défaut d'un pipeline 
        est qu'il fournit un débit optimal s'il est constamment alimenté en instructions 
        et jamais interrompu.  
        Or, en pratique, le pipeline est régulièrement soumis à des conflits qui 
        interrompent son fonctionnement. Parmi ces conflits, on distingue : 
       
        - Les conflits de ressources matérielles. Une instruction nécessite 
          une ressource du pipeline déjà occupée par une autre instruction.
 
        - Les conflits de dépendances. Une instruction attend le résultat d'une 
          autre pour poursuivre son exécution.
 
        - Les conflits de branchements.
 
       
       Les deux premiers types de conflits engendrent des états d'attente dans 
        le pipeline (ou « bulles »). La méthode utilisée pour pallier à ces conflits 
        réside dans l'exécution dans le désordre, ou Out-Of-Order 
        Execution (OOO). Cette solution existe déjà sur le noyau P6. 
       
       Le conflit de branchement est en revanche beaucoup plus pénalisant car 
        en cas d'échec cas il nécessite de vider complètement le pipeline, opération 
        d'autant plus pénalisante que le pipeline est long, et de le remplir à 
        nouveau. Afin de limiter les effets néfastes des conflits de branchement, 
        le Pentium 4 utilise deux mécanismes de prédiction de branchement, tout 
        comme sur le Pentium !!! : 
       
        - un mécanisme dynamique, qui 
          stocke un historique des branches prises, et dont la capacité de stockage 
          de branches est passée de 512 entrées sur Pentium !!! à 4096 entrées 
          sur Pentium 4.
 
           
         
        - Un mécanisme statique, utilisé 
          en cas d'échec du précédent ; il est dit « statique » car il n'utilise 
          pas un historique de branchement mais fonctionne selon un algorithme 
          constant.
 
           
         
       
       La prédiction de branchement 
        est un facteur de performances important, car le remplissage du pipeline 
        est une opération très coûteuse en cycles processeur ; en effet, le pipeline 
        n'est capable de traiter que des micro-opérations (µops), elles-mêmes 
        étant le résultat du décodage des instructions plus complexes arrivant 
        dans le bus du processeur.  
         
        Afin d'accélérer cette phase de décodage, les processeurs modernes multiplient 
        les unités de décodage. Ainsi le Pentium !!! et l'Athlon sont capables 
        de décoder jusqu'à trois instructions IA-32 par cycle. Le Pentium 4 quant 
        à lui utilise une technique différente : il n'est capable de décoder qu'une 
        seule instruction IA-32 par cycle, mais en revanche il dispose d'une mémoire 
        tampon permettant de stocker le résultat des décodages ; il s'agit du 
        Trace Cache. 
        A la différence d'un cache code classique qui contient des instructions 
        non décodées, le Trace Cache est inséré dans les premières étapes du pipeline, 
        il contient donc des µops directement utilisables par les étapes suivantes 
        du pipeline.  
       Ce système présente deux intérêts majeurs : 
       
        - Réduire les cycles de pénalités 
          en cas d'échec de branchement. En effet, dans une telle situation, le 
          pipeline doit être vidé puis remplit à nouveau avec les bonnes instructions, 
          qui avec un peu de chance sont contenues dans le cache code. Un cache 
          code classique contient des instructions IA-32 qui doivent alors être 
          à nouveau décodées pour être utilisables par le pipeline. Le Trace Cache, 
          contenant des µops déjà décodées, permet d'éviter cette phase de décodage.
 
           
         
        - Par rapport à un cache code 
          classique, le Trace Cache se situe après l'unité de prédiction 
          de branchement (BPU) ; cela implique que les µops contenues dans le 
          Trace Cache sont celles prévues par la prédiction de branchement, alors 
          qu'un cache code classique contient les instructions des deux branches, 
          dont une seule sera prise. 
 
           
         
       
      
       Cependant le Trace Cache présente 
        quelques désagréments, liés au fait qu'il est une mémoire insérée dans 
        le pipeline. En effet, rechercher une information dans une mémoire n'est 
        pas immédiat, et la latence engendrée dépend directement de sa taille 
        et de son organisation. Afin de ne pas insérer trop de latences au sein 
        même du pipeline, le Trace Cache se doit d'avoir une taille limitée. Et 
        plus la taille est faible, moins les chances d'y trouver l'information 
        sont grandes, c'est là l'éternel dilemme des mémoires caches. 
        L'autre désavantage est lié à l'architecture physique de la mémoire qui 
        occupe une surface assez importante dans la puce. Le fonctionnement optimal 
        du pipeline nécessite que les unités impliquées dans les étapes successives 
        soient le plus rapprochées possible d'un point de vue physique, afin de 
        réduire la distance de parcourt des signaux. A ce titre, le Trace Cache 
        représente une importante quantité de transistors, et propager une donnée 
        jusqu'à l'étape suivante du pipeline peut s'avérer problématique en terme 
        de distance. Le résultat est que le pipeline possède une étape dédiée 
        à la propagation du signal depuis le Trace Cache vers l'étape suivante, 
        justement nommée étape Drive. Le pipeline du Pentium 4 possède en tout 
        deux étapes Drive dédiées à la propagation du signal.  
       Au final, le Trace Cache s'avère plus efficace qu'un cache code classique, 
        et Intel prétend qu'un Trace Cache de 12K µops équivaut à un cache code 
        L1 de 16 à 18Ko.  
       Les µops fournies par le Trace Cache continuent leur chemin dans le 
        pipeline du P4 pour arriver dans l'unité de réordonnancement, ou « Out-of-Oder 
        execution logic ». Le rôle de cette unité, déjà présente dans l'architecture 
        P6, est d'optimiser l'ordre d'exécution des µops afin d'éviter les conflits 
        de ressources et de dépendances, nuisibles au pipeline. Les µops sont 
        alors réparties vers les unités de calcul.  
  
      Suite ( Les unités 
        de calculs ) 
      |