Microprocesseurs
Transcription
Microprocesseurs
Chapitre 2 Microprocesseurs 2.1 Introduction Le microprocesseur est à l’ordinateur ce que le cerveau est à l’être humain. C’est à dire un mécanisme régulateur chargé de réaliser la coopération entre les différents éléments (RAM, ROM, PIO) qui lui sont associés dans le but de réaliser des opérations. Un microprocesseur est donc avant tout un calculateur. Il est intéressant de noter que la discipline qui traite de l’étude des ordinateurs est définie par deux termes différents en fonction des cultures mais qui expriment deux aspects complémentaires des machines : ce qu’elles font et ce à quoi elles peuvent servir. – certains utilisent le terme computer science ou science des calculateurs et expriment ainsi qu’un ordinateur est une machine axée sur le calcul, – d’autres parlent d’informatique contraction des mots information et automatique pour exprimer qu’un ordinateur est aussi utilisé comme outil de traitement automatique de l’information. On comprendra aisément que la différence entre calcul et traitement de l’information est tenue dès lors que l’on sait qu’un ordinateur n’a pas conscience de la différence entre un chiffre et une lettre puisque pour lui toute information se résume à des interrupteurs allumés ou éteints. 2.1.1 Architecture de Von Neumann Les premiers calculateurs virent le jour durant la seconde guerre mondiale. Cependant jusqu’en 1945 leur utilisation se révélait plutôt fastidieuse en raison de leur architecture. Par exemple, l’ENIAC (Electronic Numerical Integrator And Calculator) conçu en 1945 par John Eckert et John Mauchly à l’université de Pennsylvanie était composé de 18000 tubes à vide et 6000 commutateurs interconnectés par un enchevêtrement de câbles, le tout pesant 30 tonnes. Il était capable de multiplier deux nombres de 10 chiffres décimaux en 3 ms. Les programmes de l’ENIAC étaient écrits sur des cartes perforées et il fallait brancher et débrancher des dizaines de câbles pour lancer un calcul. John Von Neuman mathématicien d’origine hongroise avait participé à la construction de l’ENIAC. Il travailla ensuite à Princeton à la construction d’une nouvelle machine : l’EDVAC (Electronic Discrete Variable Automatic Computer) qui préfigure l’architecture des ordinateurs modernes. Mémoire Entrée Unité de Commande UAL ACC Sortie F IG . 2.1 – Architecture de Von Neumann La machine de Von Neumann était formée de 5 composantes (cf. figure 2.1) : mémoire, unité arithmétique 23 22 octobre 2005 Couche physique et logique, représentation ... et logique, unité de contrôle, dispositifs d’entrées et sorties. Von Neumann montra que pour être efficace son architecture devait fonctionner électroniquement selon la numérotation binaire. Paradoxalement, en raison de querelles intestines entre les concepteurs de l’ENIAC concernant la paternité de certains brevet la conception de l’EDVAC pris du retard et c’est le britannique Maurice Wilkes qui à Cambridge en 1949 acheva la conception du premier ordinateur basé sur l’architecture de Von Neumann : l’EDSAC (Electronic Delay Storage Automatic Calculator). Aujourd’hui tous nos ordinateurs fonctionnent suivant le modèle de Von Neumann. 2.2 Organisation fonctionnelle Un microprocesseur ou CPU pour Central Processing Unit (ou unité centrale de traitement UCT) se compose de deux unités fonctionnelles : l’UAL qualifée de partie opérative et l’UC qualifiée de partie contrôle. – l’UAL ou Unité Arithmétique et Logique compose la partie opérative du microprocesseur, c’est à dire qu’elle effectue les calculs et les transferts de données nécessaires à la réalisation des opérations arithmétiques, – l’UC ou Unité de Contrôle se charge de décoder les commandes et de les exécuter en envoyant à l’UAL les calculs à effectuer. 2.2.1 Registres Le CPU se compose également de registres qui sont des mots mémoires propres au processeur et qui mémorisent l’état dans lequel se trouve le processeur. Les registres de base sont les suivants : • le Compteur Ordinal CO contient l’adresse en mémoire de la prochaine instruction à exécuter. Il est mis à jour après chaque exéction d’une instruction • le registre d’instruction RI contient l’instruction à exécuter. Il se compose de deux parties : – une zone opération qui représente le code de l’opération – une zone qui contient une donnée ou une adresse • l’accumulateur ACC est un registre important de l’UAL puisque c’est avec lui que sont réalisées la plupart des opérations arithmétiques. • le registre d’état PSW (Program Status Word) est un indicateur du résultat d’une opération réalisée par l’UAL. Il indique entre autres choses si le résultat est égal à zéro ou un dépassement de capacité. • le pointeur de pile SP (Stack Pointer) indique le sommet de la pile des appels de procédures. • les registres généraux qui sont des registres utilisés dans certaines instructions particulières. 2.2.2 L’unité arithmétique et Logique Accumulateur Registre d’état C Z V S P U.A.L A B Commande Mémoire F IG . 2.2 – Schḿa d’une UAL L’UAL se compose de registres et de circuits arithmétiques (additionneur, soustracteur, comparateur, décaleur) permettant de réaliser des opérations entre registres. 24 22 octobre 2005 Couche physique et logique, représentation ... On peut par exemple imaginer une UAL de base composée de 2 registres A et B et réalisant 8 opérations différentes entre A et B : ADD SUB MUL DIV AND OR XOR CMP A+B →A A−B →A A×B →A A/B → A A and B → A A or B, → A A xor B → A A =, >, < B → f lags addition soustraction multiplication division et logique ou logique ou exclusif comparaison En sortie de l’UAL se trouve le registre d’état comprenant des flags (indicateurs) qui informent l’utilisateur quant au résultat de l’opération effectuée : Flags C Z V S P Rôle indicateur de retenue indicateur de valeur nulle indicateur de débordement indicateur de signe indicateur de parité Ainsi, si l’on compare le contenu des registres A et B, on pourrait choisir la convention d’état des flags suivante pour indiquer le résultat de la comparaison : Z 1 0 1 0 1 Condition A=B A>B A≥B A<B A≤B C 0 1 1 0 0 S 0 0 0 1 1 2.2.3 L’unité de contrôle Elle coordonne l’exécution des commandes et se compose de deux circuits : – le décodeur qui à partir de la commande contenue dans le registre d’instruction détermine quelle commande devra être exécutée, – le séquenceur réalise l’exécution de la commande en envoyant des microcommandes à d’autres circuits du système dans un ordre précis 2.2.4 Description d’un langage machine L’ordinateur ne comprend qu’une série d’instructions codées de manière bien définie et que l’on nomme langage machine. Un programme en langage machine est décrit par une série de nombres exprimés généralement en hexadécimal. Pour faciliter l’utilisation du langage machine on a conçu un langage d’usage plus intuitif pour l’être humain et baptisé langage d’assemblage ou plus brièvement assembleur. Nous allons procéder de manière inverse en décrivant un langage d’assemblage et en montrant comment on peut le coder au niveau de la machine (cf. TD 6). Maurice Wilkes de l’université de Cambridge mit au point le premier langage assembleur en 1950. 2.2.4.1 Langage assembleur Supposons que nous disposions d’une machine très simple composée – d’un bus d’adresse de 16 bits, – d’un bus de données de 8 bits, – d’une mémoire de 64 Ko, 25 22 octobre 2005 Couche physique et logique, représentation ... Compteur Ordinal 11 0 00 1 00 1 11 00 1 0 1 LCO Accumulateur CRA Bus d’adresses 01 10 Centrale Séquenceur Décodeur U.A.L 0110 CEB EDA Mémoire PSR R.E 0110 CCO 1 0 0 1 CAD LEC 1 0 0 1 1 0 0 1 ECR Registre R.I. 0110 Code Opération CEA Bus de données Adresse 1 0 0 1 LMM 1 0 0 1 1 0 0 1 EMM CRI F IG . 2.3 – Schéma d’une Unité Centrale de Traitement – d’une UAL de deux registres A, B et d’un registre de pile SP Le langage que nous utiliserons se compose de quatre séries d’instructions : • des instructions d’accès à la mémoire et aux registres 0 MOV A,B mettre la valeur de B dans A MOV B,A mettre la valeur de A dans B 1 MOV A,data mettre la valeur data dans A MOV B,data mettre la valeur data dans B 2 MOV A,[adr] mettre le contenu de l’adresse [adr] dans A MOV B,[adr] mettre le contenu de l’adresse [adr] dans B 3 MOV [adr],A mettre le contenu de A à l’adresse [adr] MOV [adr],B mettre le contenu de B à l’adresse [adr] 4 MOV A,[SP+dec] mettre la valeur de pile dans A MOV B,[SP+dec] mettre la valeur de pile dans B 5 MOV [SP+dec],A mettre la valeur de A dans la pile MOV [SP+dec],B mettre la valeur de B dans la pile • des instructions arithmétiques et logiques ADD, SUB, DIV, MUL, AND, OR, XOR, CMP qui peuvent avoir trois déclinaisons ADD A,data additionner la valeur data à A ADD A,[adr] additionner le contenu de l’adresse [adr] à A ADD A,B additionner B à A • des instructions de déplacement conditionnelles et d’appel de coroutines : 26 22 octobre 2005 Couche physique et logique, représentation ... JE adr saut à l’adresse adr si A = B JNE adr saut à l’adresse adr si A 6= B JG adr saut à l’adresse adr si A > B JGE adr saut à l’adresse adr si A ≥ B JL adr saut à l’adresse adr si A < B JLE adr saut à l’adresse adr si A ≤ B CALL adr saut à l’adresse adr RET retour d’appel Pour les 6 premières instructions un appel préalable à l’instruction CMP doit être effectué. Pour l’instruction CALL, l’adresse de la prochaine instruction à exécuter est placée sur la pile. L’instruction RET permet de revenir à cette instruction. • des instructions de manipulation de la pile PUSH A empiler le contenu de A PUSH B empiler le contenu de B POP A dépiler et mettre le sommet de pile dans A POP B dépiler et mettre le sommet de pile dans B 2.2.4.2 Influence de la longeur des adresses Lors de la conception d’un microprocesseur, le codage des instructions revêt un aspect important. Il s’agit pour le concepteur de définir un format d’instruction qui permette de coder l’instruction à réaliser mais également les données ou adresses sur lesquelles on doit travailler. En effet, plus les instructions sont courtes plus elles sont efficaces : si une machine possède une mémoire ayant un débit de d bits/s et que la longueur moyenne de ses instructions est de n bits, alors cette mémoire peut délivrer d/n instructions par seconde. Il faut également prendre en compte la largeur en bits d’une instruction et s’arranger pour que les instructions aient une taille multiple de la largeur des données manipulées par le processeur afin d’éviter le gaspillage de la mémoire. La largeur des adresses influe également sur les performances. Considérons par exemple une mémoire de 64 Ko. Celle-ci peut être organisée sous deux formats différents : – cas n◦ 1 : une mémoire de 216 octets – cas n◦ 2 : une mémoire de 214 mots de 4 octets Si on désire comparer 1 octet avec un autre octet, dans le cas 2 cela entraı̂ne un surcoût car il faut charger 2 fois 4 octets depuis la mémoire et extraire les octets correspondants. Cependant, plus une adresse est courte, plus l’instruction correspondante est courte. Il y a donc un compromis à trouver. 2.2.4.3 Code opération expansif Considérons une machine codant des instructions sur m = c + a bits, soit c bits pour le code opération et a bits pour l’adresse. Cette codification permet de représenter 2c instructions et 2a adresses. On peut désirer modifier ce codage des instructions de la manière suivante : – c + 1 bits pour le code opération et a − 1 bits pour l’adresse, soit 2 fois plus d’instructions mais 2 fois moins d’adresses – ou c − 1 bits pour le code opération et a + 1 bits pour l’adresse, soit 2 fois moins d’instructions mais 2 fois plus d’adresses Le procédé qui consiste à modifier le nombre de bits réservés au codage des instructions en fonction de leur nombre et de l’adressage mémoire s’appelle code opération expansif. Exemple : 00 01 10 1100 1101 1110 xxxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxx 3 instructions avec adresse sur 14 bits xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx 3 instructions avec adresse sur 12 bits 27 22 octobre 2005 Couche physique et logique, représentation ... 11110000 .. . xxxxxxxx .. . 11111111 xxxxxxxx 15 instructions avec adresse sur 8 bits 2.3 Exemple de langage Assembleur : l’Intel 8086/Pentium Le Pentium est capable d’exécuter un programme dans différents modes de fonctionnement : • le mode protégé multitâche permet d’utiliser toute la puissance du processeur. Les registres sont des registres 32 bits. • le mode virtuel permet à des applications 8086 (environnement DOS) de s’exécuter dans le mode protégé, • le mode réel correspond au fonctionnement d’un 8086. Les registres 32 bits (EAX, ...) ne sont pas disponibles, on utilise des registres est de 16 bits (AX, ...). 2.3.1 Registres Il existe 8 registres généraux de 32 bits EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP dont la partie basse (16 premiers bits) peut être manipulée séparément de la partie haute, on utilise alors les dénominations AX, BX, CX, DX, DI, SI, BP, SP. Parmi ces registres on distingue : – les registres de données : EAX, EBX, ECX, EDX dont la partie basse se subdivisent en 2 sous registres de 8 bits l’un appelé partie haute (H) et l’autre appelé partie basse (L). Par exemple : AX de d{ecompose en AL, AH. – EAX (accumulateur) : utilisé pour les multiplications et divisions, c’est le plus rapide pour la réalisation d’opérations arithmétiques et logiques, – EBX utilisé comme opérande ou comme registre pointeur (cf. ci-après), – ECX (compteur) utilisé comme compteur dans les opérations itératives comme le transfert de données – EDX utilisé pour les multiplications et divisions ainsi que l’accès aux circuits d’entrées et sorties. – les registres pointeurs et index : – EIP (Instruction Pointer) : pointeur d’instruction, non modifiable par le programmeur, – ESP (Stack Pointer) : pointeur de pile – EBP (Base Pointer) : utilisé par le programmeur pour pointer sur un emplcameent de la pile – ESI (Source Index) – EDI (Destination Index) – les registre segments qui combinés aux registres pointeurs et index permettent d’adresser les données. – CS (Code Segment) : segment courant du code (CS:IP contient l’adresse de la prochaine instruction à exécuter), – DS (Data Segment) : segment courant des données, – SS (Stack Segment) : segment courant de la pile, – ES (Extra Segment) : segment additionnel, – FS (Extra Segment) : segment additionnel, – GS (Extra Segment) : segment additionnel. Les registres segments sont composés d’une partie visible de 16 bits et d’une partie cachée comprenant des informations relatives à la taille du segment, son type et ses droits d’accès. – un registre d’état EFLAGS de 32 bits comprenant des indicateurs (status flags) chacun codé sur un bit : – AF (Auxiliary Flag) : indicateur de retenue auxiliaire, mis à 1 lorsqu’il y a une retenue du quartet de poids faible dans le quartet de poids fort, – CF (Carry Flag) : indicateur de retenue, mis à 1 lorsqu’un calcul produit une retenue sur 8 ou 16 bits, – OF (Overflow Flag) : indicateur de débordement indiquant que l’on a dépassé les possibilités de stockage et qu’un bit significatif a été perdu, – SF (Sign Flag) : indicateur de signe, utilisé pour les opérations sur les nombres signés, 28 22 octobre 2005 Couche physique et logique, représentation ... – PF (Parity Flag) : indicateur de parité, mis à 1 si le résultat d’une opération contient un nombre pair de 1, – ZF (Zéro Flag) : indicateur de 0, mis à 1 quand le résultat d’une opération est 0. 2.3.2 Adressage mémoire Le calcul d’une adresse mémoire physique dépend du mode de fonctionnement du processeur. – en mode protégé une adresse s’exprime sur 32 bits ce qui permet d’adresser jusqu’à 4 Go. Nous n’expliquerons pas le calcul de l’adresse dans ce mode. – en mode réel (mode du 8086), les registres de données sont sur 16 bits et les adresses s’expriment sur 20 bits (1 Mo). Pour solutionner ce problème on utilise une technique appelée ségmentation qui consiste à combiner deux registres de 16 bits pour obtenir une adresse sur 20 bits suivant la formule : adresse 20 bits = registre segment × 16 + of f set L’offset peut être une valeur numérique, un registre ou une combinaison des deux. Toutes les combinaisons entre registre segment et registre index ne sont pas possibles (voir table 2.1). Registre Segment CS SS SS DS DS ES Registre Pointeur IP SP BP SI BX DI Compteur ordinal Sommet de pile Accès à la pile TAB . 2.1 – Exemples de combinaisons segment, pointeur Pour être plus exact, la description de l’offset en mode protégé est donnée par (voir figure 2.4) : Of f set = [Base] + [Index ∗ Echelle] + deplacement avec – base est un registre général 32 bits, – Index est un registre général 32 bits (excepté ESP) multiplié par un facteur d’Echelle qui est de 1, 2, 4 ou 8. Il est de 1 par défaut, – déplacement est une constante de 8,16 ou 32 bits F IG . 2.4 – Spécifiation de l’offset 2.3.3 Types de données Le Pentium est capable de traiter des quantités allant jusqu’à 64 bits, soit deux doubles mots de 32 bits, voire jusqu’à 80 bits pour les réels. 29 22 octobre 2005 Couche physique et logique, représentation ... Dénomination bit byte (octet) word (mot) double word quad word Qté en bits 1 8 16 32 64 Codage Assembleur DBIT DB DW DD DQ TAB . 2.2 – Types de données manipulées en assembleur 2.3.4 Modes d’adressage L’instruction MOV que nous avons vu précédemment permet de transférer des données entre la mémoire et un des registres de données. Elle est parfois scindée en deux instructions LOAD et STORE sur les microprocesseurs à architecture RISC. On distingue plusieurs modes d’adressages parmi lesquels : • l’adressage immédiat consiste à affecter une valeur constante à registre : MOV AX,1 MOV CL,57 • l’adressage de registre permet de transférer des données entre registres MOV AX,BX MOV CL,AL MOV SI,DI • l’adressage direct contient l’adresse d’une variable par rapport au segment de base : MOV SI,OFFSET var SI = offset var MOV EAX,ES:1FFh EAX = ES :1FFh MOV EAX,100 EAX = DS :100 • l’adressage indirect de registre permet d’accéder à la valeur située à une adresse mémoire définie par un registre : MOV AX,[SI] AX = Mem[ SI] MOV EAX,[EBX+ESI]+4 EAX = Mem[ EBX+ESI+4 ] 2.3.5 Taille des instructions La taille des instructions varie, par exemple : 8 CALL 16/32 adresse 5 PUSH 3 Reg 2.3.6 Écriture d’un programme Assembleur Il existe conventionnellement dans les programmes élémentaires écrits en assembleur entre 2 à 3 segments : – le segment de pile pour lequel on indique la taille de la pile, – le segment de données dans lequel on définit les variables, – le segment de code qui contient le code du programme. Un programme assembleur aura donc la structure suivante : STACK SEGMENT 4096 ; Pile de 4096 octets DATA SEGMENT PUBLIC 30 22 octobre 2005 Couche physique et logique, représentation ... var0 DB ? var1 DW 1234 var2 DD ? ... DATA ENDS CODE SEGMENT PUBLIC ASSUME DS:DATA, CS:CODE MOV AX,var0 ... CODE ENDS 2.3.7 Instructions Dans la suite de cette section nous décrivons les instructions de bases pour écrire des programmes simples en assembleur. 2.3.7.1 Instructions de chargement : MOV Les instructions de chargement permettent l’affectation de valeurs entre registres et mémoire. MOV dst, src L’instruction MOV attribue la valeur de la source à l’opérande de destination, MOVSX dst, src Cette instruction se comporte comme MOV sauf qu’elle permet de convertir une valeur de 8 en 16 bits ou de 16 en 32 bits en une valeur signée, MOVZX Cette instruction se comporte comme MOV sauf qu’elle permet de convertir une valeur de 8 en 16 bits ou de 16 en 32 bits en une valeur non signée, Exemples : MOV EAX,EBX MOV EAX,ES:1FFh MOV EAX,100 2.3.7.2 Instructions arithmétiques Les instructions arithmétiques sont les suivantes : ADD dst, src réalise l’addition de deux valeurs SUB dst, src réalise la soustraction de deux valeurs INC dst incrémente la valeur DEC dst décrémente la valeur NEG dst réalise le complément à 2 de la valeur Exemples : ADD AX,BX SUB AL,3 NEG ES:[DI] 31 22 octobre 2005 Couche physique et logique, représentation ... MUL, IMUL src MUL opère une multiplication non signée entre l’accumulateur et un autre registre ou une valeur, alors que IMUL réalise une multiplication signée. En fonction de la taille des données on obtiendra le résultat dans des registres différents : ⋄ AL × 8 bits → AX ⋄ AX × 16 bits → DX :AX ⋄ EAX × 32 bits → EDX :EAX DIV, IDIV src DIV opère une multiplication non signée entre l’accumulateur et un autre registre ou une valeur, alors que IDIV réalise une multiplication signée. En fonction de la taille des données on obtiendra le résultat dans des registres différents : ⋄ AX / 8 bits → AL quotient, AH reste ⋄ DX :AX / 16 bits → AX quotient, DX reste ⋄ EDX :EAX / 32 bits → EAX quotient, EDX reste Exemples : MUL BX MUL 3 DIV EBX 2.3.7.3 Instructions logiques AND dst, src réalise le ET logique OR dst, src réalise le OU logique XOR dst réalise le OU-exclusif logique NOT dst réalise le complément Exemples : AND AX,BX OR AL,3 NOT EAX 2.3.7.4 Instructions de comparaison CMP dst, src réalise la comparaison de deux valeurs. On effectue en fait une soustraction entre les 2 valeurs mais seuls les bits du registres EFLAGS sont positionnés en conséquence. TEST dst, src réalise la comparaison de deux valeurs. On effectue en fait un ET logique entre les 2 valeurs mais seuls les bits du registres EFLAGS sont positionnés en conséquence. Exemples : CMP AX,BX CMP AL,3 TEST AX,1 32 22 octobre 2005 Couche physique et logique, représentation ... 2.3.7.5 Instructions de saut et de branchement Les instructions JMP adr saut à l’adresse adr, CALL adr appel de sous-programme, RET retour de sous-programme, JE,JZ adr Jump On Equal, ou Jump on Zero, ZF = 1 JG adr Jump on Greater Than, SF = OF et ZF = 0 JGE adr Jump on Greater or Equal, SF = OF JL adr Jump on Less, SF 6= OF JLE adr Jump on Less or Equal, SF 6= OF ou ZF = 1 Exemples : CMP AX,BX CMP AL,3 TEST AX,1 2.3.7.6 Appel de sous-programmes, passage de paramètres et variables locales Le passage de paramètres à des procédures ou des fonctions est effectué au travers de la pile. Les variables locales sont également allouées dans la pile. Lors de l’appel d’un sous-programme on réalise les opérations suivantes : – on commence par empiler les paramètres du sous-programme sur la pile, – on empile l’adresse (CS:IP) de la prochaine instruction à exécuter après appel du sous-programme, – on modifie CS:IP pour lui donner l’adresse du sous-programme, – on exécute le sous-programme jusqu’à l’instruction RET, – avec RET on dépile l’adresse de la prochaine instruction à exécuter et on l’affecte à CS:IP. int sum( int a, int b ) // sous-programme appelé { int r; r = a + b; return r; } int main( ) // sous-programme appelant { int res; res = sum(1,2); } A l’intérieur d’un sous-programme on utilise généralement la pile afin d’allouer les variables locales. Afin de faciliter l’accès aux paramètres et aux variables locales on utilise le registre BP. 33 22 octobre 2005 Couche physique et logique, représentation ... Adr Code 102 105 106 109 10A 10D B8 01 00 50 B8 02 00 50 E8 07 00 ... Instructions (main) ... MOV AX,1 PUSH AX MOV AX,2 PUSH AX CALL sum ... Adr 114 115 117 11A 11D 120 123 125 126 Code 55 89 E5 83 EC 02 8B 46 06 03 46 04 89 46 FE 89 EC 25 C3 Instructions (sum) PUSH BP MOV BP,SP SUB SP,2 (variable r, équivalent à PUSH AX) MOV AX,[BP+6] ADD AX,[BP+4] MOV [BP-2],AX MOV SP,BP POP BP RET SP SP-2 SP-4 SP-6 SP-8 SP-10 1 2 adr1 ? r BP+6 BP+4 BP+2 BP+0 BP-2 premier paramètre second paramètres adresse de retour du sous-programme ancienne valeur de BP variable r TAB . 2.3 – État de la pile et des registres BP et SP lors de l’appel à sum La pile possède une taille maximale : 4, 8 ou 16 ko en général. Au début le pointeur de pile SP prend la taille maximale de la pile. Lorsque l’on empile une valeur on décrémente SP. Les instruction PUSH et POP ont donc le comportement suivant : – PUSH AX : SP = SP - 2; Mem[SS:SP] = AX, – POP AX : AX = Mem[SS:SP]; SP = SP + 2. Lors du retour de sous-programme les paramètres sont toujours présents dans la pile, il faut donc les supprimer. Il existe ici deux manières de procéder : – c’est le sous-programme appelant (main) qui supprime les paramètres : dans ce cas, après l’appel de sum on ajoute l’instruction ADD SP,4, – c’est le sous-programme appelé (sum) qui supprime les paramètres : dans ce cas on utilise l’instruction RET avec un paramètre : RET 4. Enfin, lors de l’appel de fonctions, on peut utiliser la pile pour passer la valeur de retour de la fonction ou un registre comme c’est le cas dans l’exemple précédent. 2.4 Architectures RISC et CISC Actuellement les microprocesseurs se composent de deux grandes familles : – les CPU à architecture CISC (Complex Instruction Set Computer) – les CPU à architecture RISC (Reduced Instruction Set Computer) La conception d’un microprocesseur pose de nombreux problèmes. Plus la structure du CPU est complexe, plus les procédures de test sont longues et plus il est difficile de déterminer d’éventuels défauts de conception. Plusieurs facteurs ont encouragé par le passé la conception de machines CISC : 34 22 octobre 2005 Couche physique et logique, représentation ... • premièrement, la lenteur de la mémoire par rapport au processeur laissait à penser qu’il était plus intéressant de soumettre au CPU des instructions complexes. Plutôt que de coder une opération complexe par plusieurs instructions plus petites qui prendraient plus de temps à être chargées depuis la mémoire, il semblait préférable d’ajouter au CPU une opération complexe qui se chargerait de réaliser cette opération, • deuxièmement, le développement des langages de haut niveau (Fortran, Pascal, Ada) a posé de nombreux problèmes quant à la conception de compilateurs capables de traduire des programmes en langage évolué vers l’assembleur qui soient efficaces. On a donc eu tendance à incorporer au niveau processeur des instructions plus proches de la structure de ces langages. En effet dans les années 70 les ordinateurs utilisaient de la mémoire magnétique (réalisée à partir de tores) pour stocker les programmes. Ce type de mémoire était cher et lent. Un premier changement s’opéra avec l’arrivée des DRAM mais restait l’épineux problème du prix des DRAM : en 1977 1 Mo de DRAM coûtait $ 5000 alors qu’il ne valait plus que $ 6 en 1994. Le prix prohibitif des mémoires RAM et la lenteur des disques faisait qu’un code de programme était considéré comme intéressant s’il était compact. Le processus de compilation des langages de haut niveau comme Pascal et C était lent et le code assembleur obtenu n’était pas toujours optimisé : mieux valait coder à la main. Certains proposèrent de combler le fossé sémantique entre langage de haut niveau et assembleur afin de faciliter la tâche des programmeurs : en d’autres termes ils proposaient de faire en sorte que les instructions assembleur ressemblent aux instructions des langages de haut niveau. – On a toujours considéré que le code provenant d’un compilateur serait toujours moins performant que le code écrit à la main en assembleur par un programmeur. Soit l’exemple suivant : void swap(int t[], int k) { int temp = t[k]; t[k] = t[k+1]; t[k+1] = temp; } void sort(int n, int t[]) { int i, j; for (i=0; i < n; i++) for (j=i-1; j >= 0; --j) if (t[j] > t[j+1]) swap(t,j); } Ce morceau de code a été traduit en assembleur par un programmeur et par un compilateur C. Le code produit par le compilateur C a obtenu un meilleur résultat à l’exécution : Traducteur Temps Assembleur (à la main) 37.9 s Compilateur C 25.3 s – l’Intel 8086 possède un préfixe REP qui peut être accolé à certaines instructions afin de les utiliser de manière itérative. Si on désire transférer un bloc de données d’une adresse mémoire à une autre, deux solutions s’offrent à nous, mais la plus simple n’est pas forcément la meilleure. Transfert par REP Transfert par boucle sur des entiers sur des entiers MOV CX,size MOV CX,size MOV SI,src MOV SI,src MOV DI,dst MOV DI,dst REP MOVSB j1: MOV AL,[SI] MOV [DI],AL INC SI INC DI DEC CX JNZ j1 40 Mo/s 60 Mo/s 35 22 octobre 2005 Couche physique et logique, représentation ... Dans au milieu des années 70, deux facteurs sont venus ébranler les idées ancrées dans les esprits par les décennies précédentes : • d’une part les mémoires sont devenues plus rapides qu’elles ne l’étaient auparavant, • d’autre part, des études réalisées par Knuth (1971), Wortman (1972) et Patterson (1982) conduites sur des langages de haut niveau montrèrent que – les programmes sont constitués à 85 % d’affectations, d’instructions if et d’appels de procédures, – 80 % des affectations sont de la forme variable = valeur. Les résultats précédents peuvent se résumer par la phrase suivante : 80 % des traitements des langages de haut niveau font appel à 20 % des instructions du CPU. D’où l’idée d’améliorer la vitesse de traitement des instructions les plus souvent utilisées. Les machines RISC se distinguent des machines CISC par le fait que les instructions sont exécutées en un cycle d’horloge. RISC instructions simples ne prenant qu’un seul cycle seules les instructions LOAD et STORE ont accès à la mémoire instructions au format fixe beaucoup de registres peu de modes d’adressage CISC instructions complexes prenant plusieurs cycles toutes les instructions sont susceptibles d’accèder à la mémoire instructions au format variable peu de registres beaucoup de modes d’adressage TAB . 2.4 – Caractéristiques comparées des architectures RISC et CISC Le principe qui participe à la conception des architectures RISC est simple : tout faire pour que le temps de cycle du chemin des données soit le plus court possible. Le temps de cycle du chemin des données est constitué par : – le transfert des données entre mémoire et registres du CPU – le transfert des données entre registres du CPU et opérandes de l’UAL – la réalisation des calculs par l’UAL En fait le terme Réduit de l’appellation RISC est plutôt mal choisi. Si les processeurs RISC ont moins d’instructions que les processeurs CISC c’est une conséquence directe du fait que les modes d’adressages (cf. section 2.3.4) en RISC sont beaucoup moins nombreux que ceux des processeurs CISC : de fait le système de codage des instructions est allégé. Mais ce qui importe surtout c’est que l’on cherche à exécuter une instruction par cycle d’horloge. La relative simplicité des processeurs RISC influe sur le nombre de transistors nécessaires à leur conception. Un microprocesseur RISC contient donc bien moins de transistors (à la base) qu’un processeur CISC. La place restante sur le die peut alors être occupée par un nombre important de registres ainsi qu’un cache de premier niveau. 2.4.1 Gestion des registres en RISC Afin de minimiser les accès à la mémoire les machines RISC utilisent un grand nombre de registres (512 pour le Motorola 68030). Si on devait réaliser le codage des instructions en codant les 512 registres on perdrait beaucoup de place. Au lieu de cela on utilise une technique qualifiée de fenêtre glissante de registres mise au point par Patterson et Séquin en 1982 (cf. figure 2.5). À chaque instant le processeur voit 32 registres qui sont généralement répartis en 4 × 8 registres : – registres réservés aux variables globales du programme – regisres pour les paramètres entrant des procédures. S’il y a plus de 8 paramètres le reste des paramètres est placé dans la pile – registres pour les variables locales – registres pour les paramètres sortants En fait seuls les registres globaux ne changent pas. Par contre les autres registres glissent à chaque nouvel appel de procédure. Pour garder la cohérence il y a recouvrement des registres sortants d’une procédure 36 22 octobre 2005 Couche physique et logique, représentation ... R 0 Globaux R R Globaux Globaux 7 8 Entrée R 15 R 16 R R R Locaux appel procédure Sortie Recouvrement 23 24 Entrée 31 Locaux appel procédure Sortie Recouvrement Entrée Locaux Sortie F IG . 2.5 – Fenêtre glissante de registres en RISC avec les registres entrant de la suivante. Lorsqu’il n’y plus de registres disponibles on sauvegarde des registres de la première fenêtre en mémoire et on continue. Les registres sont donc gérés par un buffer circulaire. Cette technique est tout à fait intéressante puisqu’elle minimise les accès mémoire. Elle pourrait également être utilisée dans le cadre d’une architecture CISC. 2.5 Amélioration des CPU 2.5.1 Généralités Le temps d’exécution d’un programme est donné par la formule suivante : Texec = Nins × CP I × Tcycle – Texec : temps d’exécution, – Nins : nombre d’instructions, – CP I : nombre de cycles par instructions, – Tcycle : temps de cycle (ns) Les différentes évolutions des ordinateurs ont pour but de diminuer le temps d’exécution des programmes. ⊲ la première amélioration consiste à diminuer le temps de cycle pour cela il suffit d’augmenter la fréquence des processeurs. Grossièrement, un processeur à 3 Ghz fonctionne 3 fois plus vite qu’un processeur à 1 Ghz. ⊲ on peut ensuite diminuer le nombre d’instructions ou le nombre de cycles par instructions. Or dans ce cas, il semble que le produit Nins × CP I reste constant : – en effet si on diminue le nombre d’instructions on crée des instructions plus complexes (CISC) qui nécessitent plus de cycles pour être exécutées. – si par contre on diminue le nombre de cycles par instructions on crée des instructions simples (RISC) et il faut utiliser plusieurs instructions pour réaliser le même traitement qu’une instruction CISC. Il a donc fallu élaborer des solutions capables de diminuer le temps nécessaire au traitement des instructions qu’elles soient CISC ou RISC. 37 22 octobre 2005 Couche physique et logique, représentation ... 2.5.2 Traitement de base 16 cycles UE A B C D E F G H F IG . 2.6 – Traitement des instructions par une seule unité d’exécution Comme le montre la figure 2.6, dans un schéma de traitement des instructions classique, les instructions sont traitées de manière séquentielle par une seule unité d’exécution (UE). 2.5.3 Processeurs Superscalaires La technologie superscalaire consiste à doter le CPU de plusieurs unités d’exécution (voir figure 2.7). On trouve actuellement cette technique présente sur un grand nombre de microprocesseurs : PowerPC, UltraSparc, PA 9000, Pentium, .... Le but recherché est d’exécuter plusieurs instructions en parallèle. Il faut donc pouvoir soutenir un flot important d’instructions et pour cela disposer d’un cache (L1) performant. 8 cycles UE1 UE2 A C E B D F G H F IG . 2.7 – Traitement des instructions avec 2 unités d’exécution Les processeurs actuels sont dotés de plusieurs unités d’exécution sur les entiers et les réels. 2.5.4 Architecture Pipeline Les instructions (mnemonics) des processeurs ne sont pas exécutables directement. Elles sont décomposées en micro-opérations (µOP ) interprétables par les différentes unités d’exécution du CPU. Ainsi, une instruction assembleur peut être traduite en 1 à 100 µOP . L’exécution d’une instruction passe ensuite par les étapes suivantes : – Fetch (Load instruction) : chargement de l’instruction pointée par le CO (Compteur Ordinal) dans le RI (Registre d’Instruction) – Decode : décodage de l’instruction, traduction en µOP – Load operand : calcul de l’adresse des opérandes et chargement depuis la mémoire ou un registre – Execute : exécution de l’instruction (ALU, FPU) – Write result : écriture du résultat en mémoire ou mise à jour des registres Chaque étape peut prendre entre 1 et plusieurs cycles d’horloge. On essaye généralement de faire en sorte que chaque étape ne prenne qu’un seul cycle sauf pour les accès mémoire qui prennent plusieurs cycles. Dans un cycle d’exécution classique, une instruction réalise les 5 étapes précédentes, puis on passe à l’instruction suivante. L’idée du pipeline consiste à exploiter le parallélisme des différentes étapes de traitement des instructions : une fois qu’une instruction passe dans la phase decode, la suivante peut passer dans la phase fetch (cf. figure 2.8). Le gain obtenu dépend de la profondeur (on dit aussi nombre d’étages) du pipeline. Pour exécuter n instructions de manière séquentielle, chaque instruction s’exécutant en k cycles d’horloge, il faut n × k cycles d’horloge au total. Si on utilise un piepline de k étages, il faut k cycles d’horloge pour exécuter la 38 22 octobre 2005 Couche physique et logique, représentation ... I1 F 1 D 1 M 1 E 1 W 1 F2 D2 M2 E2 W2 I2 F3 D3 M3 E3 W3 I3 Modèle Classique 1 2 3 4 5 6 7 8 9 I1 F 1 D 1 M 1 E 1 W 1 Modèle Pipeline I2 I3 I4 I5 F2 D2 M2 E2 F3 D3 M3 F4 D4 F5 W2 E3 W3 M4 E4 W4 D5 M5 E5 W5 F IG . 2.8 – Traitement des instructions avec un pipeline première instruction puis n − 1 cycles pour les n − 1 instructions suivantes. Le gain obtenu est donc de g= n×k k+n−1 Lorsque n est grand par rapport à k, g ≃ k. Pour l’Athlon d’AMD le pipeline est composé de 11 étages. Pour les Pentium 2, 3 et 4 d’Intel, le nombre d’étages est respectivement de 12, 10 et 20. 2.5.4.1 Problèmes liés aux pipelines Dans une situation idéale le pipeline est alimenté de manière continue. Cependant, en situation réelle, il est difficile de maintenir un débit maximal dans le pipeline en raison de différents problèmes : – Les instructions CISC complexes prennent du temps à être décodées. Pendant que les décodeurs travaillent le pipeline ne peut pas être alimenté. – Certaines données sont en cours de traitement et ne peuvent être utilisées : il s’agit de problèmes de dépendances. – Les conflits d’accès à la mémoire peuvent retarder la progression des µOP dans le pipeline. – Les branchements sont également une source de problèmes pour l’alimentation du pipeline qui doit être alors réinitialisé. 2.5.4.2 Dépendance de données Soit le code suivant : I1 ADD AX,BX I2 MUL CX Pour que le résultat soit cohérent il faut que l’instruction I1 soit terminée avant le début de l’instruction I2 . Il s’agit ici d’une dépendance appelée RAW (Read After Write). Il faut que l’étape W1 soit terminée pour pouvoir exécuter D2 et charger les opérandes avec la valeur de AX (cf. figure 2.9). En ce qui concerne le pipeline cela implique que le pipeline est inactif pendant un certain nombre de cycles. 1 2 3 4 5 6 7 8 9 10 I1 F 1 D 1 M 1 E 1 W 1 I2 F2 D2 M2 E2 W2 I3 I4 I5 F3 D3 M3 E3 W3 F4 D4 M4 E4 W4 F5 D5 M5 E5 W5 F IG . 2.9 – Influence des dépendances sur le pipeline Pour résoudre ce genre de problème plusieurs solutions existent (voir figure 2.10) : 39 22 octobre 2005 Couche physique et logique, représentation ... – la première consiste pour le compilateur à insérer dans le code des instructions NOP, dont le but est de ne rien faire afin de retarder l’exécution de la prochaine instruction. – la seconde va réordonner les instructions : si les instructions suivantes ne possèdent pas de dépendances avec l’instruction I1 par exemple. Le réordonnancement peut être effectué par un compilateur ou par le processeur, on parle alors de gestion non-ordonnée des instructions (out of order). Il faut pour cela disposer d’un stock d’instructions à examiner. – la troisième consiste à faire du forward after execute, c’est à dire qu’on attend pas que l’instruction soit totalement terminée pour propager ses résultats à d’autres étages du pipeline. 1 Réarrangement des instructions 2 3 I1 F 1 D 1 M 1 F3 D3 I3 F4 I4 I5 I2 4 5 E1 M3 D4 F5 W1 E3 W3 M4 E4 W4 D5 M5 E5 W5 6 7 8 9 10 F2 D2 M2 E2 W2 F1 D1 M1 E1 W1 Forward after Execute F2 D2 M2 E2 W2 F3 D3 M3 E3 W3 F IG . 2.10 – Solutions pour les dépendances sur le pipeline 2.5.4.3 Dépendance dues à des branchements conditionnels I1 loop : MOV AX,[SI] I2 MOV [DI],AX I3 ADD SI,2 I4 ADD DI,2 I5 DEC CX I6 JNZ loop I7 MOV AX,1 I8 MOV BX,[100] ... Lors de l’exécution de l’instruction I6 , si CX est égal à 0, c’est l’instruction suivante I7 qui sera exécutée. Par contre lorsque CX n’est pas égal à 0 (ce qui est le cas souvent puisqu’il s’agit d’une boucle), il faut se rendre à l’adresse loop et donc supprimer les instructions I7 et I8 qui sont déjà dans le pipeline. Lors d’un branchement il faut calculer l’adresse de destination avant de mettre à jour le compteur ordinal. Il faudra ensuite, si le branchement est effectué éliminer les instructions déjà présentes dans le pipeline et les remplacer par une nouvelle séquence d’instructions. Or plus le pipeline est profond plus il faut de temps pour le vider. La solution réside dans la prédiction de branchement. Prédiction de branchement La prédiction de branchement consiste à prédire quelle sera la prochaine branche du programme à exécuter. On utilise un algorithme mathématique basé sur des calculs statistiques et deux tableaux le BTB et le BHT : – BTB - Branch Target Buffer contient les adresses mémoires des branches d’un programme, – BHT - Branch History Table retrace les choix de décisions pour chaque branchement. Le Pentium 3 possède un BTB de 512 octets alors que le Pentium 4 a un BTB de 4 ko. 2.5.4.4 Combiner pipeline et superscalaire Comme le montre la figure 2.11, deux architectures de pipeline sont possibles : 40 22 octobre 2005 Couche physique et logique, représentation ... Front End Architecture G4 Architecture P4 F IG . 2.11 – Architectures de pipelines – la première est celle du Power G4 pour laquelle le Front End est capable de traiter 16 instructions qui alimentent de nombreux petits pipelines, – la seconde architecture est celle du Pentium 4 pour laquelle le Front End de 126 instructions alimente quelques pipeline profonds. Pour comprendre les avantages et inconvénients liés à ces deux architectures on peut prendre l’analogie du McDonald1. 2.5.5 Processeurs Vectoriels On peut également combiner le pipelining avec les processeurs vectoriels. Il s’agit de processeurs SIMD (Single Instruction Multiple Data) capables d’effectuer une opération de manière répétitive sur plusieurs données différentes (exemple somme ou produit vectoriel de vecteurs). Dans ce genre de processeur on dispose de registres vectoriels capables de stocker un ensemble de données, d’opérer des calculs entre ces données et de stocker ensuite le résultat en mémoire une fois le calcul effectué. Les processeurs actuels intègrent des unités de calcul vectoriel dédiées au multimédia : MMX (Multi-Media eXtention) a été la première unité de calcul intégrée au processeur Pentium MMX. Ses registres ont une taille de 64 bits et ne travaillent que sur des entiers. SSE (Streaming Simd Extension) est apparue sur les Pentium 3. Elle est composée de 70 instructions, dispose de registres 128 bits et travaille sur les entiers ou les flottants (en 32 bits). SSE2 évolution de SSE pour les Pentium 4, comporte 144 nouvelles instructions et gère les flottants sur 64 bits. 3DNow ! il s’agit de la version MMX/SSE des processeurs AMD apparue sur les K6-II. Ses registres ont une taille de 64 bits. 2.5.6 Le VLIW L’approche VLIW (Very Long Instruction Word, cf. figure 2.12) peut être considérée comme une mise en oeuvre de l’architecture superscalaire et consiste à utiliser des mots de longueur assez grande (128, 256 ou 1024 bits par exemple) et à y coder plusieurs instructions à la fois qui seront exécutées en parallèle. Dans cette approche, proposée par Josh Fisher en 1980 (Yale), c’est le compilateur qui est chargé d’arranger les instructions dans un mot. La complexité des circuits de décodage est telle que le VLIW atteint ses limites au delà de 5 ou 6 instructions à exécuter en parallèle. 1 The Pentium 4 and the G4e : an Architectural Comparison, Jon Hannibal Stokes, ArsTechnica, July, 2001. 41 22 octobre 2005 Couche physique et logique, représentation ... U.E 1 Modèle classique U.E 2 U.E 3 Flux d’instructions U.E 1 U.E 2 VLIW U.E 3 F IG . 2.12 – Comparaison modèle classique (superscalaire) et VLIW 2.6 Mesure des performances des processeurs Pour mesurer les performances des processeurs on utilise des unités élémentaires appelées Mips et MFlops • Le Mips (Million of Instructions Per Second) mesure le nombre d’opération sur des nombres entiers qu’un processeur est capable d’effectuer en 1 seconde, • Le MFlops (Million of Floating point Operations Per Second) mesure le nombre d’opérations en virgule flottante qu’un processeur est capable d’effectuer en 1 seconde. On parle également de GFlops (GigaFlops), TFlops (TéraFlops) et PFlops (PétaFlops) Ces deux grandeurs sont cependant dépendantes des architectures des CPUs et il est difficile de comparer des résultats entre RISC et CISC. Certains constructeurs se sont regroupés formant une association nommée SPEC (System Performance Evaluation Cooperative) créée en 1989 qui a pour objectif de définir des mesures standard communes. Ils disposent d’une batterie de tests de référence (benchmarks) baptisés SPECint pour les entiers et SPECfp pour les nombres en virgule flottante. Il existe aussi le whetstone et le dhrystone ainsi que les tests Linpack ou plus spécifiquement les WinBench, Winstone96. • le Whetstone est basé sur des calculs scientifiques réalisés en Fortran, • le Dhrystone est inspiré du Whetstone, il fut réalisé en Ada puis réécrit en C, • Linpack regroupe un certains nombre de tests reliés au calcul matriciel (produit, inversion, résolution de systèmes, ... ). Les programmes sont écrits initialement en Fortran mais on trouve aujourd’hui des versions C. il existe également un certain nombre d’utilitaires et benchmarks de référence qui concerne l’audio, la vidéo, les jeux : • LAME (encodage MP3) • Super PI (calcul des décimales de PI) • 3DMark (mesure des performances des cartes graphiques) 2.6.1 HyperThreading et Multi-cores L’HyperThreading est une simulation de processeur multi-cores. Actuellement les processeurs sont dotés d’un seul coeur (core), c’est à dire que l’on ne peut traiter qu’un seul flux d’instructions. Avec l’arrivée de l’HyperThreading sur les Pentium 4 Northwood on est en fait capable de traiter 2 flux d’instructions soit 2 programmes en paralèle. Cependant l’HyperThreading consiste à traiter les instructions de deux flux en les réorganisant de manière à simuler un traitement en parallèle. L’arrivée des processeurs multi-core sur un même die devrait apporter un gain de performance notable mais uniquement si les performances des mémoire suit également une amélioration. Dans le cas des processeurs multi-cores, chaque core dispose de ses propres cache L1 et L2. Intel, AMD et SUN prévoient de mettre au point des processeurs composés de 2, 4, 8 ou 16 cores 42 22 octobre 2005 Couche physique et logique, représentation ... 2.7 L’architecture AMD64 Alors qu’Intel a complétement modifié l’architecture de ses processeurs Itanium lors du passage au 64 bits, AMD a fait le choix de garder la compatibilité avec les processeurs 32 bits actuels en donnant naissance à l’architecture AMD64. C’est un choix économique et technologique qui semble porter ses fruits. Intel a ensuite suivi le chemin tracé par AMD, avec la technologie EM64T. Ainsi les processeurs basés sur la technologie AMD64 peuvent évoluer dans deux modes différents : – le mode legacy qui correspond au 32 bits – le mode long qui correspond au 64 bits décomposé en deux sous modes : Compability et 64-bit 2.7.1 Les registres L’Athlon XP est basé sur une architecture IA32 et comporte 8 registres généraux (EAX à EDI) et 8 registres 80 bits (FPU). Sur l’Athlon 64 on dispose en 64 bits de : • 16 registres 64 bits (RAX à RDI) + 8 registres suplémentaires R8 à R15, • 16 registres SSE2 XMM0 à XMM15 de 128 bits F IG . 2.13 – Registre en 64 bits (Source AMD) F IG . 2.14 – Mode Register Memory • Le codage IA32 des registres utilise le bit ModRM (Mode/Register/Memory) pour lequel 3 bits sont utilisés pour coder le registre, champ reg (voir figure 2.14). Afin de ne pas endiguer la compatibilité avec l’architecture IA32, on utilise un bit du champ Register/Memory 43 22 octobre 2005 Couche physique et logique, représentation ... F IG . 2.15 – Mode d’exécution (Source AMD) 2.7.2 Le contrôleur mémoire Le northbridge est intégré directement sur le die du processeur 2.7.3 L’HyperTransport L’hypertransport est un bus de communication série de haut niveau capable d’assurer la liaison entre différents processeurs et contrôleurs en modulant son débit. Il fonctionne à 800 Mhz sur 16 bits avec une technologie DDR ce qui lui permet d’atteindre 3,2 Go/s dans 2 directions soit un total de 6,4 Go/s. L’hypertransport est une technologie client/serveur alors que les autres technologies sont de type point à point. 44