« Fonctionnement d'un ordinateur/Exécution dans le désordre » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 90 :
==Éclaireurs matériels==
 
Il existe d'autres techniques d’exécution dans le désordre, qui se basent sur un autre principe, relativement simple : exécuter les instructions indépendantes d'une lecture pendant que celle-ci attend la mémoire ou le cache. ParmiMais ces techniques,architectures onsont peutmoins citerefficaces que les architectures découpléesà etexécution lesdans éclaireursle matérielsdésordre, (hardware scouts). Si aucun accès mémoirevu nqu'estelles enne cours,peuvent leque processeur se contente de démarrer les instructions dansdiminuer l'ordreimpact dudes programme.accès En sommemémoire, cespas architecturesplus. sontParmi moinsces efficaces quetechniques, les architectures àdécouplées exécutionseront vues dans leun désordrechapitre :à ellepart, ne peuventtandis que diminuerles l'impactéclaireurs desmatériels accès(hardware mémoire,scouts) pasvont plusêtre abordés maintenant.
 
===File d’attente différée===
 
Lors d'une lecture, le processeur met en attente les instructions dépendantes de la donnée lue, mais continue d’exécuter les instructions indépendantes de celle-ci. Les instructions sont mises en attente dans une mémoire tampon, qui s'appelle la '''file d’attente différée''' (deferred queue). Celle-ci est souvent une simple mémoire FIFO, mais peut être plus complexe et former une véritable fenêtre d'instruction à retardement. Quand la donnée lue est disponible, et écrite dans le registre de destination, les instructions mises en attente sont réexécutéesré-exécutées.
 
ToutLe ceprocesseur qu'àa juste à faire le processeur, c'est de détecter les instructions dépendantes d'une lecture et de les mettre en attente. Cette détection s'effectue en marquant les registres des instructions comme « invalides ». Lele registre de destination de la lecture estcomme le« premierinvalide registre marqué invalide», et ledu restemoins tant que la lecture n'a pas écrit son résultat dedans. Ensuite, chaque instruction qui a un registre invalide comme opérande sera détectée comme à mettre en attente : son registre de destination sera aussi marqué invalide. Pour marquer les registres comme valides ou invalides, on utilise un bit par registre, qui indique si le registre attribué contient une donnée valide ou non. L'ensemble de ces bits est regroupé dans un registre spécial, invisible pour le programmeur. Pour déterminer le bit de validité d'une instruction, il suffit de deux choses :
 
Pour marquer les registres comme valides ou invalides, on utilise un bit par registre, qui indique si le registre attribué contient une donnée valide ou non. L'ensemble de ces bits est regroupé dans un registre spécial, invisible pour le programmeur. Pour déterminer le bit de validité d'une instruction, il suffit de deux choses :
 
* soit il s'agit d'une lecture, et elle est marquée automatiquement comme invalide ;
Ligne 106 ⟶ 104 :
===Points de contrôle===
 
Cependant, il arrive qu'une instruction indépendante de la lecture écrase un résultat calculé par les instructions dépendantes. Dans ce cas, l’exécution normale du programme voudrait que le registre contienne la version écrite par l'instruction indépendante, plus récente. Mais le fait de réexécuterré-exécuter les instructions dépendantes de la lecture après les instructions indépendante viole totalement ce principe ! Pour éviter tout problème, on est obligé de sauvegarder le contenu des registres à chaque lecture : le processeur peut ainsi revenir à la normale en cas de problème en remettant les registres à leur état antérieur. Et ces sauvegardes doivent être faites à chaque fois qu'on commence à spéculer, c'est-à-dire pour chaque accès mémoire : le processeur doit donc être capable de gérer un grand nombre de sauvegardes.
 
Pour éviter tout problème, on est obligé de sauvegarder le contenu des registres à chaque lecture : le processeur peut ainsi revenir à la normale en cas de problème en remettant les registres à leur état antérieur. Et ces sauvegardes doivent être faites à chaque fois qu'on commence à spéculer, c'est-à-dire pour chaque accès mémoire : le processeur doit donc être capable de gérer un grand nombre de sauvegardes.
 
===Simultaneous single-threading===
 
Sur le processeur Rock cette technique a été adaptée avec la présence de deux fenêtres d'instruction :
 
* une pour les instructions à réexécuter qui proviennent de la file d’attente différée ;
* et une autre pour les instructions qui viennent d'être chargées et décodées.
 
Ainsi, cela permet au processeur de répercuter des instructions tout en continuant à charger, voire d’exécuter de nouvelles instructions.
 
{{AutoCat}}