Architecture Avancée SEOC 2A PIBUS Figure 2. Machine d’état du Maître 3 types de Composant: 1) Maître (Initiateur) Emettent des “transactions” 2) Esclaves (Cibles) Recoivent les “transactions” 3) Controleur du Bus Gére le protocole Tous le signaux sont en broadcast Adresse => Cible du transaction Parte haute : sélectionne 1 esclave parmi les autres Parte basse : “offset” dans l’esclave sélectionné A[31:2] = sur 30 bits Données => “alignées” vers le bas D[31:24] XXX XXX — D[23:16] XXX XXX — D[15:8] XXX — — D[7:0] 1 oct transmission 2 oct transmission 4 oct transmission Types d’opcode | Opération => OPC[3:0] WDU = 1 mot HWa = 1 demi-mot a=1 a=0 BYab = 1 octet qui a pour adress {A[31:2], a, b} (Concaténation) ab = 11 ab = 10 ab = 01 ab = 00 Exemple d’un transaction sur le bus ACK[2:0] description RDY transfert effectué ERR transfer avorté WAT attend Architecture des machines Cycles par instruction (CPI) => Le nombre moyen cycles pour chaque instruction exécuté Exemple: Figure x - Processeur monocycle MIPS (avant Pipeline, sur processeur monocycle) Quoique la boite Imm fait ? Elle construit le immediat, en analysant l’opération effectué. Parfois l'immédiat est composé de 13 bits qui viennent d’une certaine partie de l’instruction, mais en d’autres types d’instructions il est composé par plus/moins bits qui sont dans une autre partie de l’instruction. Pipeline risc 5 étages (CPI = 5 sans pipeline et IPC = 1 avec pipeline) : 1. Cycle de récupération d'instructions (IF). 2. Décodage d'instructions/Cycle de récupération de registre (DE). 3. Cycle d'exécution/d'adressage effectif (EXE). 4. Accès mémoire (MEM). 5. Cycle de réécriture (WB). Il n’y a pas de bypass de MEM à EXE Figure x - Processeur avec pipeline avec RaW problèmes Read after Write (RaW) => On a besoin de trois nop pour n’avoir pas RaW Pipeline risc 6 étages : 1. IF procède au chargement de l’instruction via la mémoire d’instruction 2. RF (Registers Fetch) réalise à la fois le décodage de l’instruction et la récupération des valeurs des registres 3. ALU1 est utilisé pour le calcul de l’adresse effective des accès mémoire et des branchements 4. MEM permet d’accéder à la mémoire de données 5. ALU2 est utilisé pour les opérations de l’ALU et pour les comparaisons utilisées par les branchements 6. WB writeback Figure x - Processeur avec pipeline 6 états avec RaW problèmes Figure x - Processeur avec pipeline 6 états sans RaW problème Branchements et Sauts à l’étape fetch… Branch Predictor : prédit si le branch sera pris ou pas. - Branch History Table (BHT): Branch target buffer (BTB): qui trouve l’adresse cible du branchement. à l’étape EXE, il faut vérifier si la prédiction a été bien faite. Caches Petites morceaux de mémoire avec un accès plus rapide par le processeur. Exs: Caches d’instructions et Cache de données. Principes de localité - localité temporelle : si on a accédé à l’adresse A, il y a de forte chance pour qu'on l’accède de nouveau bientôt; - localité spatiale: si on accède A, on accèdera à A+1, A-1, … Types de mapping - Full associative: n’importe quel ligne de mémoire peut aller à n’importe où dans le cache (il n’a besoin que du TAG pour trouver la donnée); - Direct Mapping: on fait des règles pour les emplacements… MEM CACHE ⟶ 15,11,7,3 3 ⟶ 14,10,6,2 2 ⟶ 13,9,5,1 1 ⟶ 12,8,4,0 0 - Set associative: traite les collisions plus efficacement…. Number of sets = numéro de lignes Number of ways = quantité de caches en parallel Composition de l’adresse Caches x-way associative Politique de Remplacement - Random, FIFO, LRU (Least recently used, “optimal”), Pseudo LRU, LFU (Least frequently used); Average Memory Access Time (AMAT) 𝐴𝑀𝐴𝑇 = 𝐻𝑖𝑡𝑡𝑖𝑚𝑒 + 𝑀𝑖𝑠𝑠𝑟𝑎𝑡𝑒 𝑥 𝑀𝑒𝑚𝑜𝑟𝑦𝐴𝑐𝑐𝑒𝑠𝑠𝑡𝑖𝑚𝑒 𝑀𝑖𝑠𝑠𝑟𝑎𝑡𝑒 = % 𝑑𝑒 𝑓𝑜𝑖𝑠 𝑞𝑢'𝑜𝑛 𝑑𝑜𝑖𝑡 𝑎𝑙𝑙𝑒𝑟 𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑟 𝑙𝑎 𝑑𝑜𝑛𝑛é𝑒 𝑒𝑛 𝑚𝑒𝑚𝑜𝑖𝑟𝑒 𝐻𝑖𝑡𝑡𝑖𝑚𝑒 = 𝑞𝑡𝑑 𝑑𝑒 𝑐𝑦𝑐𝑙𝑒𝑠 𝑞𝑢'𝑜𝑛 𝑢𝑡𝑖𝑙𝑖𝑠𝑒 𝑞𝑢𝑎𝑛𝑑 𝑜𝑛 𝑎 𝑢𝑛 ℎ𝑖𝑡0 *Hit_time = 1 à 3 cycles; Mem. access = 50 à 100 cycles. Temps d’execution texec = tideal ∗ (IPC × (1 - QTD_LectMemoire) + QTD_LectMemoire × AMAT) Types de Caches - Write Through (On écrit directement dans la mémoire et n’utilise le cache que pour lecture) - Write Back (On écrit dans le cache et quand on a une miss dans la ligne précédemment écrite on l’écrira dans le cache) ASID est un identificateur du processus utilisé quand on utilise l'adresse virtuelle dans le cache Virtually Indexed Physically Tagged (VIPT) : Problème : si la page offset est plus petit qui l'index parce que s’on aurait 2 adresse virtuelle différente avec le même adresse physique on les mettrait dans 2 lignes de cache différentes Solution : le SE doit mettre les derniers bits de l’adresse virtuelle toujours différente pour 2 adresses différents Multiprocessors Solutions pour garantir la cohérence mémoire (ou cohérence de cache)... - quand on utilise des caches write through: - sw invalider la ligne qui contient la variable partagée avant d’y accéder; - Une autre solution c’est placer les données partagées dans des plages non cachées. - Une autre solution c’est le SNOOPY: chaque cache espionne le bus d’adresse et ‘read’; - Si écriture et l’adresse est dans mon cache, je: - invalide la ligne - WIT - ou mise à jour la ligne (si j’ai aussi accès à la donnée) - WTU - quand on utilise des caches write back: - Protocole MSI: - Trois états : Modified, shared and invalid. - On peut avoir plusieurs caches avec la ligne aux états invalide ou shared, mais on ne peut avoir qu’un seul au état modified. Là l’exclusive représente l’état modified donnée en cours Scalability Si on a une valeur N de processeurs importante, on ne peut pas avoir de bus, parce que la bande passante par proc. devient trop faible. - Solutions: - Hiérarchie de bus; - Réseaux sur Puce (NoC) - Protocole ”Directory based cache coherence”: dans notre mémoire (ou dans un cache plus haut), on aura des "présence bits (Pi)”; - Pi = 1 ssi le processeur i cache la ligne L; - Est utilisée pour diminuer la quantité des messages dans le bus, parce qu’on seulement les caches avec la ligne cachée recevra les messages de modifications dans cette ligne - Alternative: SMT (Simultaneous multithreading) Hyperthreading - Les processeurs ont “plusieurs datapaths” et peuvent exécuter 2-4 threads en parallèle. - Ils partagent donc les mêmes caches, une fois qu’ils sont plusieurs cores dans un même processeur. Synchronisation multi-cores Assembleur des lock et unlock des verrous : - Gestion des sections critiques; - Support HW pour la prise de verrous. lock: lw bnez li sw ret to, 0(a0) to, lock to, 1 to, 0(a0) Test&Set - lit la variable et “atomiquement” la met à 1 (Support Hardware). - première primitive créée pour ça. lock: unlock: test&set to, 0(a0) sw zero, 0(a0) bnez to, lock ret ret fetch&add (ou fetch&xor, fetch&and, …) - toutes capables de résoudre la même classe de problème; - Dans un système avec des caches, la prise des verrous peuvent poser de problèmes; - Stratégie pour minimiser le taux d’injection: Compare & swap lock: lw to, 0(a0) bnez to, lock test&set to, 0(a0) bnez to, lock ret <-<-- spin sur le cache Load(Reserverd, Exclusive, Linked) : lr Utilisé pour lire une donnée et met à 1 un bit de réservation sur cette donnée Store(Conditional, Exclusive) : sc Utilisé pour écrire une donnée sauf si le bit de réservation a été mis à 0 Lock avec lr et sc: li t1, 1 lr t0, 0(a0) bnez to, lock sc t0, ti, 0(a0) bnez t0, lock t1 est la donnée qu’on veut écrire. t0 indique si le store conditionnel n’échouait pas