Parallélisme et mécanismes architecturaux avancés Parallélisme • Parallélisme d’instructions – Parallélisme temporel – Parallèlisme – Débit d’instructions • Parallélisme de données – SIMD • Parallélisme de tâches – Multithread – Multi processeur : pipeline : VLIW et Superscalaire : vectoriel Plan I. II. III. IV. V. VI. VII. VIII. Architectures Pipelinées Architectures Superscalaires et VLIW Architectures Vectorielles Architectures Multi-thread Interruptions DMA Cache Exemple : Les processeurs graphiques (GPU) I. Parallélisme d’instructions 1.1 La technique du pipeline L'exécution complète d'une instruction dans un processeur met en jeu plusieurs unités du processeur (unité d'adressage, unité de décodage, unité d'exécution, etc...) qui ne sont pas toutes utilisées simultanément. La technique du pipeline consiste à améliorer les performances du processeur en même temps que son rendement. Le pipeline permet de superposer les sous­cycles d'exécution des instructions. mémoire mémoire reg. P C RI @ calcul WB 1. Accès Instruction (IA) 2. Recherche Instruction (IF) 3. Stockage Instruction (IS) 4. Décodage opérandes (DI) 5. Calcul d'adresse (AC) 6. Accès mémoire (MA) 7. Exécution (EX) 8. Ecriture résultat (WB) EX MA AC DI IS IF IA Cycles du processeur reg. mémoire mémoire reg. P C RI reg. @ Insertion de registres d'étages (les niveaux du pipeline) Les données et tous les signaux de contrôle sont mémorisés et propagés à chaque niveau calcul mémoire mémoire reg. P C RI reg. @ Instruction i : calcul IA mémoire mémoire reg. P C RI reg. @ Instruction i : Instruction i+1 calcul IA : IF IA mémoire mémoire reg. P C RI reg. @ Instruction i : Instruction i+1 Instruction i+2 calcul IA : : IF IA IA SI IF mémoire mémoire reg. P C reg. RI @ Instruction Instruction Instruction Instruction i : i+1 i+2 i+3 calcul IA : : : IF IA IA IA SI IF IF DI SI mémoire mémoire reg. P C reg. RI @ Instruction Instruction Instruction Instruction Instruction i : i+1 i+2 i+3 i+4 calcul IA : : : : IF IA IA IA IA SI IF IF IF DI SI SI AC DI mémoire mémoire reg. P C reg. RI @ Instruction Instruction Instruction Instruction Instruction Instruction i : i+1 i+2 i+3 i+4 i+5 calcul IA : : : : : IF IA IA IA IA IA SI IF IF IF IF DI SI SI SI AC DI DI MA AC mémoire mémoire reg. P C reg. RI @ calcul Instruction i : IA IF SI DI AC MA EX Instruction i+1 : IA IF SI DI AC MA Instruction Instruction Instruction Instruction Instruction : : : : : IA IA IA IA IA IF IF IF IF SI SI SI DI DI AC i+2 i+3 i+4 i+5 i+6 mémoire mémoire reg. P C Toutes les unités du processeur sont utilisées à 100 % reg. RI Instruction Instruction Instruction Instruction Instruction Instruction Instruction Instruction @ i : i+1 i+2 i+3 i+4 i+5 i+6 i+7 IA : : : : : : : IF IA IA IA IA IA IA IA calcul SI IF IF IF IF IF IF DI SI SI SI SI SI AC DI DI DI DI MA EX WB AC MA EX AC MA AC Effet du pipeline L'effet du pipeline rentabilise l'utilisation du silicium => Augmentation du rendement silicium (proche de 100%) Le pipeline augmente le débit des instructions sans modifier le temps d'exécution des instructions => augmentation de la fréquence d'exécution des instructions => augmentation de la performance de la machine La présence du pipeline permet d'augmenter la fréquence apparente d'exécution des instructions => plus de niveaux, niveaux plus «courts», donc plus rapides Exemple : Pentium IV = 20 niveaux de pipeline !! 1.2 Inconvénients du pipeline 1. Il est impossible d'assurer en permanence l'exécution d'une instruction par cycle d'horloge Le débit effectif est inférieur à 1 inst/s (IPC < 1) 1. Un pipeline doit être rempli et vidé en cas de rupture de séquence 2. Il peut apparaître des dépendances entre les instructions dans le pipeline (les aléas de pipeline) : ● Conflit d'accès à des ressources (aléas structurels) ● Dépendances de données entre instructions (aléas de données) ● Rupture de séquence (aléa de contrôle) a. Cas des conflits de ressources Un conflit de ressource se produit lorsque plusieurs instructions, dans des étages différents du pipeline, requièrent la même ressource. C'est le cas systématique de l'accès à la mémoire : mémoire mémoire reg. P C reg. RI Instruction Instruction Instruction Instruction Instruction Instruction @ i : i+1 i+2 i+3 i+4 i+5 IA : : : : : IF IA IA IA IA IA calcul SI IF IF IF IF DI SI SI SI AC DI DI MA Conflit AC d'accès à la mémoire Solutions aux conflits de ressources Solutions aux conflits de ressources : 1. Détecter les cas et introduire une «bulle» dans le pipeline : • Diminution du IPC 2. Utiliser des ressources à accès multiples : • mémoires double port (lecture/écriture) • Mémoires caches distinctes (IC et DC) pour les conflits MA/IF • Utilisation d'une architecture Harvard (cas du DSP SHARC) b. Cas des conflits de données Un conflit de données se produit lorsque plusieurs instructions dans le pipeline ont une dépendance de registre. Ex : ADDD LOAD R1, R2, #100 R3, R1 L'instruction LOAD nécessite la mise à jour de R1 avant de s'exécuter... impossible tant que l'instruciton ADD n'aura pas terminé son cycle d'exécution (avant l'étape WB). Un conflit de données peut se produire également lors de l'exécution d'instructions multicyles dans le pipeline... => Réorganisation de l'ordre d'écriture des registres ! Exemple : Instruction ADD R1, R2, #100 LOAD R3, R1 0 IA 1 IF IA 2 IS IF 3 DI SI 4 AC . 5 MA . 6 EX . 7 WB . 8 9 10 11 12 DI AC MA EX WB Sans ressources additionnelles, insertion de «bulles» dans le pipeline : l'étape de recherche des opérandes de l'instruction LOAD est retardée Solutions aux conflits de données Solutions aux conflits de données : 1. Détecter les cas et introduire une «bulle» dans le pipeline : • Diminution du IPC 2. Utiliser, lorsque c'est possible, des chemins de court­circuit dans le pipeline : mémoire ALU reg. c. Cas des aléas de contrôle Un aléa de contrôle se produit lors de l'exécution d'instructions de branchement conditionnels, lorsque la condition n'est pas encore connue au moment de charger une nouvelle instruction dans le pipeline. Ex : ADD R1, R2, #30 CALL routine LOAD R0, R4 ADD R5, R0, R2 Ces instructions sont déjà dans le pipeline avant l'exécution de CALL Solution : ● Vider le pipeline avant de remplir avec les nouvelles instructions ! ● Utiliser des instructions de branchements retardés (cf. cours DSP SHARC) Exemple : BEQ ... ... ADD etiq etiq R4, R1, R2 Calcul de la condition et de l'adresse de destination Instruction BEQ etiq ... ... ADD R4, R1, R2 0 IA 1 IF IA . 2 IS IF IA . 3 DI SI IF IA . 4 AC . 5 MA . 6 EX . 7 WB . 8 9 10 11 12 IA . IA IF IS DI AC MA EX WB Sous-utilisation du pipeline : Les instructions ne doivent pas être exécutées (pas de modification memoire/état) 1.3 La prédiction des branchements La majorité des ruptures de séquences par branchements inconditionnels se fait à des adresses constantes. Pour éviter de vider/remplir les pipelines, on utilise la méthode de la prédiction des branchements : ● Les adresses des branchements sont stockées dans une table, à l'image des mémoires cache des DSP ● Une unité dédiée détecte les éventuels branchements et met à jour le PC par anticipation de l'adresse de destination Valable aussi pour les branchements conditionnels, avec l'exécution spéculative des instructions : les instructions du branchement sont mises dans le pipeline avant de savoir si le branchement doit être pris ou non => algorithmes complexes de prédiction Unité(s) de calcul Registres Unité d’adressage @ mémoire données données Unité de décodage Unité d’exécution @ mémoire programme instructions Adresse prédite PC Table mise à jour automatiquement lors de l'exécution d'instructions de branchement : Prédiction des adresses de branchement Adresses de destination Adresses des instructions de branchement Exemple : Sans prédiction d'adresse : Instruction JUMP etiq Instruction 0 IA 1 IF . 2 IS . 3 DI . 4 AC . 5 MA IA 6 EX IF 7 WB IS 8 9 10 11 AC MA EX WB 12 Calcul de l'@ de destination Avec prédiction d'adresse : Instruction JUMP etiq Instruction 0 IA 1 IF IA 2 IS IF 3 DI IS Prédiction de l'@ de destination 4 AC DI 5 MA AC 6 EX MA 7 WB EX 8 WB 9 10 11 12 Exécution spéculative et prédiction Dans le cas des branchements conditionnels, il n'est pas possible d'anticiper le calcul de l'adresse du branchement (dépend d'une condition à calculer). Stratégie : ● Exécuter spéculativement les instructions en «pariant» sur la valeur de la condition ✔ ✔ ● Si pari gagnant : OK, pas de cycles perdus Si pari perdu : insertion de bulles Différents algorithmes de prédiction qui dépendent des cas (application, instructions) ➢ ➢ ➢ ➢ Branchement toujours pris : valable pour les boucles (cas du traitement de signal ?) Analyse à la compilation (profiling) Prédiction dynamique par apprentissage en ligne (proc. modernes) Efficacité en fonction des bonnes prédictions 1.4 Bilan pipeline La présence du pipeline permet d'améliorer significativement les performances d'une unité de calcul avec des conséquences pour les architectures embarquées... Sous­étapes plus simples = plus de niveaux de pipeline = fréquence de fonctionnement plus élevée MAIS puissance dissipée plus importante ! plus de niveaux de pipeline = plus d'aléas ET plus de ressources pour corriger les aléas Compromis pour l'embarqué : rarement plus de 3 à 5 niveaux de pipeline..... 2 Les mémoires cache Le principe consiste à interposer entre le processeur et la mémoire centrale une mémoire de taille plus petite mais beaucoup plus rapide (SRAM) ➢ les temps de cycle du processeur sont toujours plus courts que ceux de la mémoire principale (SDRAM) : +60%/an contre +9%/an. Le processeur teste la présence de ses données dans le cache : ● Donnée présente = succès = cache hit ● Donnée non présente = défaut = cache miss L'amélioration des performances dépend du taux de succès dans le cache (de l'algorithme de mise à jour du cache) et du temps d'accès au cache Une mémoire cache exploite les propriétés de localité temporelle et spatiale des données : Localité temporelle Une donnée adressée à l'instant t possède une forte probabilité d'être adressée à nouveau dans un avenir proche Localité spatiale Si une donnée a été adressée à l'instant t, alors une donnée voisine possède une forte probabilité d'être adressée dans un avenir proche => Les instructions d'un programme possèdent de fortes caractéristiques de localité temporelle et spatiale (boucles, branchements courts) Processeur adresses données Table des étiquettes (CAM) = miss Mémoire hit Blocs ou lignes de cache Utilisation des mémoires cache : 1) Avec l'augmentation du nombre de niveaux de pipeline et de la fréquence de fonctionnement des processeurs, les cycles d'accès aux mémoires sont de plus en plus courts. Les mémoires caches permettent d'accélérer les accès à la mémoire. 2) Pipeline = 1 instruction par cycle = aléas de ressources (mémoire). Une mémoire cache permet de résoudre une partie des aléas structurels dans le pipeline (cas des DSP avec des caches «simples». Inconvénients : ➢ ➢ ➢ Les temps de calculs sont difficiles à anticiper : dépendance aux compilateurs Gestion difficile de la cohérence des données (caches multiples) Ressources supplémentaires pour la mise à jour des caches Améliorer les performances • Passer en dessous de 1 instruction/cycle • Nécessite des processeurs à lancement multiple • Deux formes : – Superscalaire, • lancement d’un nombre variable d’instructions par cycle • Peuvent être ordonnancées statiquement par le compilateur • Ou dynamiquement (Algorithme de Tomasulo) – VLIW • Nombre fixe d’instructions codées dans un mot long 3 Les architectures VLIW VLIW = Very Large Instruction Word Les architectures VLIW intègrent plusieurs unités de calcul et peuvent effectuer plusieurs opérations simultanées Typiquement : plusieurs opérations arithmétiques entières + opérations flottantes + opérations booléennes Pipeline = au plus 1 instruction (opération) par cycle VLIW = augmentation du OPS (Operation Per Cycle) Instructions codées sur un nombre important de bits (jusqu'à 1024 bits !) mémoire mémoire reg. reg. Calcul 1 P C RI VLI W @ Calcul 2 Calcul 3 Le codage des instructions contient plus de champs Reg et Op Les bus d'accès aux registres sont multipliés (bancs de registres multiples) Plusieurs unités de calcul en parallèle Calculs généralement de registre à registre mémoire Op 1 P C mémoire reg. Calcul 1 Op 2 Op 3 reg. @ RI VLI W Calcul 2 Calcul 3 Le compilateur est chargé de détecter les parallélisme potentiel des opérations et de compacter le codage des instructions Décodage des instructions pas nécessairement plus complexe Toutes les opérations ne sont pas toujours parallèles : forte dépendance à l'application, au compilateur, rendement potentiellement faible ! Profondeur des pipelines inégales : optimisations très difficiles Exemple de l'architecture du coeur de DSP Texas C64x : Jusqu'à 8 opérations simultanées sur deux chemins de données parallèles ● Unité de calcul logique ● Unité auxiliaire ● Multiplieur ● Unité de calcul entière ● 4 Les architectures superscalaires Le principe des architectures superscalaires est de retarder au moment de l'exécution l'ordonnancement des instructions parallèles. VLIW computers) = architectures EPIC (Explicit Parallelism Instruction Superscalaires = parallélisme des instruction non explicite à la compilation Ces architectures reposent sur la mise en parallèle de plusieurs pipeline (4 à 9 aujourd'hui) non nécessairement synchronisés. ● ● ● ● ● Récupération de plusieurs instructions Pré­décodage (branchement ?) Décodage, résolution des dépendances (manipulation des registres) Répartition sur plusieurs pipelines (exécution dans le désordre) Envoi aux unités de calcul HP PA-RISC : ● VLIW + superscalaire degré 2 ● 4 instructions/cycle max ● 1 unité entière ● 3 unités flottantes UltraSPARC III : ● Exécution dans l'ordre ● Pipeline 14 étages ● 4 instructions/cycle max ● 6 unités fonctionnelles Intel Itanium 2 : ● Bi-coeur ● 109 transistors ● Exécution dans l'ordre ● 6 instructions/cycle max ● 128 registres entiers ● 128 registres flottants ● 128 registres de condition AMD Opteron : ● Mode 64 bits ● Exécution dans le désordre ● 9 instructions/cycle max ● 3 calculs entiers ● 3 calculs d'@ ● 3 calculs flottants 5. Conclusion Les architectures modernes combinent plusieurs facteurs d'optimisation des performances : ● Pipeline ● Mémoires caches ● Mécanismes câblés (cf. DSP) ● Instruction Level Parallelism : VLIW (MIMD) ● Architectures superscalaires (MPMD ?) Toutes ces technologies ont encore un coût exhorbitant dans le cas de l'embarqué (surface, fréquences, puissance dissipée) L'avenir passe par la mise en parallèle de plusieurs processeurs autour de ressources d'interconnexion rapides => MPSOC Architecture MPSoC (DiMITRI, Thalès) DiMITRI SoC AM RF FM RF Local D-memory 64 KB DDC0 DDC1 Periph. DMA System timer Clock & Power Ctrl ARM920 ARM946 RISC Core RISC Core D-Cache 16 KB I-Cache 16 KB D-Cache 8 KB I-Cache 8 KB 1/4 VGA display LCD Ctrl Multi-layer AHB interconnection matrix Interrupt Ctrl Timers Local I-memory 32 KB ARM920 data mem. VITERBI DECODER Periph. bus bridge Int. RAM 16KB Ext. mem. Ctrl 0 ARM920 instr. mem. Ext. mem. Ctrl 1 ARM946 data mem. Communication interfaces Memory card Ethernet USB Debug 3 I2S I2C 4 SPI 3 USART PIO ARM946 instr. mem. DRM Chip Set 1G available Narrow band OFDM modem Source Codecs Direct RF conversion SoC Platform Dual-processor (ARM920+ARM946) Coprocessors Viterbi, DDC Multi-layer AHB Full set of peripherals (Ethernet, USB, Usart, SPI, I2C,…) Characteristics 0.18µm, 12 Mxtors 56mm2, avg. 600 mW (including external memories) Package: PBGA 388 II. Augmentation du débit d’instructions, architecture vectorielle Les processeurs vectoriels • Ces processeurs disposent d’instructions de haut niveau qui travaillent sur des vecteurs (tableaux linéaires). • Une instruction vectorielle typique est l’addition de 2 vecteurs de 64 éléments virgule flottante • Ceci est équivalent à une boucle avec – Calcule un des 64 éléments – Mise à jour des indices Propriétés • Le calcul de chaque résultat est indépendant du calcul des résultats précédents, permettant un pipeline très profond sans générer d’aléa de données (géré par le compilateur) • Le besoin en bande passante instructions est réduit (SIMD) • Les accès mémoire sont connus si les éléments du vecteur sont tous adjacents • Plus rapide qu’une séquence d’instructions scalaires Architecture de base • Constituée d’une unité scalaire pipelinée et d’une unité vectorielle – CRAY(CRAY-2, X-MP, Y-MP, C-90), NEC, Fujitsu, Hitachi • L’architecture de gauche (DLXV) – 8 registres vectoriels – Des UAL vectoriels flottantes – Les 2 sont reliés par plusieurs ports à un crossbar – 32 registres scalaires Code scalaire double Y = a*X + Y LD ADDI boucle : LD MULTD LD ADDD SD ADDI ADDI SUB BNZ F0, a R4, tabx, #512 // dernière adresse F2, 0(tabx) // X[i] F2, F0, F2 // a.X[i] F4, 0(taby) // Y[i] F4, F2, F4 // a.X[i] + Y[i] F4, 0(taby) tabx, tabx, #8// index X taby, taby, #8// index Y R20, R4, tabx // condition de fin R20, boucle Code Vectoriel LD LV MULTSV LV ADDV SV F0, a V1,tabx V2, F0, V1// mult vecteur-scalaire V3, taby V4, V2, V3 taby, v4 Comparaison • Réduction du débit d’instructions : 6 contre 600 – Opérations vectorielles – Absence de gestion de boucle (moitié des instructions scalaires) Temps d’exécution vectoriel • Dépend essentiellement de trois facteurs: – La longueur du vecteur – Le pas du vecteur – Les aléas structurels entre les opérations – Et les dépendances de données • Supposant des débits de 1 opérande consommée et un résultat calculé par cycle Tronçonnage de vecteur m=(n mod MVL) • Calcul vectoriel de taille n supérieure à la longueur max du vecteur du proc (MVL) • j varie de 0 à n/MVL, i est l’indice du vecteur de taille n Temps d’exécution en fonction de la longueur du vecteur • Opération de multiplication scalaire A=B.s • MVL = 64 • Temps total = temps de calcul d’un élément du vecteur • Surcoût total = surcoût de temps de la boucle 64 128 196 Exemple, processeur CELL (Playstation 3 ) • • • Développé par les trois compagnies, le Cell est un processeur doté d'une architecture multicore et multithread 64 bits produit avec la technologie 90 nm SOI. Optimisé pour les calculs intensifs en virgule flottante et les applications multimédia haut débit, tels que les jeux, films et autres contenus numériques, il est capable de faire tourner simultanément plusieurs système d’exploitations, gérera les ressources système en temps réels, sera doté d'une interface d'entrée/sorte qualifiée de flexible et contiendra un système de sécurité pour la protection des propriétés intellectuelles. Une station de travail Cell fournirait une puissance de calcul de 16 teraflops selon le trio. Définitions Tâche • [Au sens UNIX] Une tâche est un ensemble d'instructions à exécuter. Une tâche peut désigner aussi bien un processus regroupant plusieurs threads, un ensemble de threads ou quelques instructions. Threads • [Au sens UNIX] Un thread est un flot d'exécution de programme possédant un compteur d'exécution, une pile et un contexte d'exécution propre. Ils sont exécutés de manière concurrente au processus qui les a créé. Un thread peut accéder à la mémoire du processus dont il est issu Processus • [Au sens UNIX] Un processus regroupe un ensemble de traitements appartenant à un même espace d'adressage et supportant plusieurs flots d'exécution de programme (threads). Une application est un processus Modèle d'exécution Le modèle d'exécution d'une architecture décrit le procédé d'exécution des processus sur cette architecture. Il détaille la façon dont les processus sont chargés en mémoire, exécutés puis restitués. Il inclut l'ensemble des mécanismes d'exécution comme le partage des données, les synchronisations ou encore la gestion des entrées-sorties. Un modèle d'exécution est une description détaillée du fonctionnement de l'architecture. Modèle de programmation • Le modèle de programmation s'intéresse uniquement à la programmation de l'architecture. Il décrit la façon dont les processus doivent être explicités afin de rendre possible leur transformation, par des outils de compilation, en vue d’une exécution sur cette architecture. Architecture multithread • Une architecture multithread est un processeur qui gère le changement de contexte en matériel, réduisant ainsi le surcoût du multithreading. • On distingue les MT – À gros grains (CMT) fournissant une instruction de changement de contexte rapide – À grains fins (FMT) changeant de contexte automatiquement à chaque instruction Direct Memory Access • • • • • • Device wishing to perform DMA asserts the processors bus request signal. Processor completes the current bus cycle and then asserts the bus grant signal to the device. The device then asserts the bus grant ack signal. The processor senses in the change in the state of bus grant ack signal and starts listening to the data and address bus for DMA activity. The DMA device performs the transfer from the source to destination address. During these transfers, the processor monitors the addresses on the bus and checks if any location modified during DMA operations is cached in the processor. If the processor detects a cached address on the bus, it can take one of the two actions: – – • • Processor invalidates the internal cache entry for the address involved in DMA write operation Processor updates the internal cache when a DMA write is detected Once the DMA operations have been completed, the device releases the bus by asserting the bus release signal. Processor acknowledges the bus release and resumes its bus cycles from the point it left off Interrupt Handling Here we describe interrupt handling in a scenario where the hardware does not support identifying the device that initiated the interrupt. In such cases, the possible interrupting devices need to be polled in software. • A device asserts the interrupt signal at a hardwired interrupt level. • The processor registers the interrupt and waits to finish the current instruction execution. • Once the current instruction execution is completed, the processor initiates the interrupt handling by saving the current register contents on the stack. • The processor then switches to supervisor mode and initiates an interrupt acknowledge cycle. • No device responds to the interrupt acknowledge cycle, so the processor fetches the vector corresponding to the interrupt level. • The address found at the vector is the address of the interrupt service routine (ISR). • The ISR polls all the devices to find the device that caused the interrupt. This is accomplished by checking the interrupt status registers on the devices that could have triggered the interrupt. • Once the device is located, control is transferred to the handler specific to the interrupting device. • After the device specific ISR routine has performed its job, the ISR executes the "return from interrupt" instruction. • Execution of the "return from interrupt" instruction results in restoring the processor state. The processor is restored back to user mode Synchronisation par DMA et intérruptions • Software designers need to keep in mind that DMA operations can be triggered at bus cycle boundary while interrupts can only be triggered at instruction boundary.