Dans les processeurs (CPU) des ordinateurs, les micro-opérations (également appelées micro-ops ou μops, historiquement aussi micro-actions[1]) sont des instructions détaillées de bas niveau utilisées dans certaines conceptions pour implémenter des instructions-machine complexes (parfois appelées macro-instructions dans ce contexte)[2]:8–9.
Habituellement, les micro-opérations effectuent des opérations de base sur des données stockées dans un ou plusieurs registres, y compris le transfert de données entre registres ou entre registres et bus externes du processeur (CPU), et l’exécution d’opérations arithmétiques ou logiques sur des registres. Les micro-opérations sont généralement représentées à l’aide d’un Register Transfer Language (RTL)[3]. Dans un cycle typique de récupération-décodage-exécution (fetch-decode-execute en anglais), chaque étape d’une macro-instruction est décomposée pendant son exécution, de sorte que le CPU détermine et passe à travers une série de micro-opérations. L’exécution des micro-opérations est effectuée sous le contrôle de l’unité de contrôle du CPU, qui décide de leur exécution tout en effectuant diverses optimisations telles que le réordonnancement, la fusion et la mise en cache[4].
Diverses formes de μops ont longtemps servi de base aux routines traditionnelles de microcode utilisées pour simplifier la mise en œuvre d’une conception de CPU particulière ou peut-être simplement, le séquencement de certaines opérations multi-étapes ou modes d’adressage. Plus récemment, les μops ont également été utilisés différemment afin de permettre aux processeurs CISC modernes de gérer plus facilement l’exécution asynchrone parallèle et spéculative: comme pour le microcode traditionnel, une ou plusieurs tables de recherche (ou équivalent) sont effectuées pour localiser la séquence μop appropriée en fonction du codage et de la sémantique de l’instruction machine (l’étape de décodage ou de traduction), cependant, au lieu d’avoir des séquences μop rigides contrôlant directement le CPU depuis une ROM de microcode, les μops sont ici mises en mémoire tampon dynamiquement pour une re-planification avant leur exécution[5]:6–7, 9–11.
Cette mise en mémoire tampon signifie que les étapes de récupération et de décodage peuvent être plus détachées des unités d’exécution que ce qui est possible dans une conception plus traditionnelle microcodée (ou câblée). Comme cela permet une certaine liberté concernant l’ordre d’exécution, cela permet d’extraire un certain parallélisme au niveau des instructions d’un programme monothread normal (à condition que les dépendances soient vérifiées, etc.). Cela ouvre la voie à une analyse plus approfondie et donc aussi à la réorganisation des séquences de code afin d’optimiser dynamiquement la cartographie et l’ordonnancement des μops sur les ressources machines (telles que les ALU, les unités de chargement/stockage, etc.). Comme cela se produit au niveau μop, les sous-opérations de différentes instructions machine (macro) peuvent souvent se mélanger dans une séquence μop particulière, formant des instructions machine partiellement réorganisées comme conséquence directe de l’envoi dans le désordre de micro-instructions provenant de plusieurs macro-instructions. Cependant, ce n’est pas la même chose que la fusion des micro-opérations, qui vise à expliquer qu’une micro-instruction plus complexe peut remplacer quelques micro-instructions plus simples dans certains cas, généralement pour minimiser les changements d’état et l’utilisation de la file d’attente et du tampon de réorganisation (ROB), réduisant ainsi la consommation d’énergie. La fusion des micro-opérations est utilisée dans certains modèles modernes de processeurs[2]:89–91, 105–106,[5]:6–7, 9–15.
L’optimisation de l’exécution est allée encore plus loin; les processeurs traduisent non seulement de nombreuses instructions machine en une série de μops, mais font aussi l’inverse lorsque cela est approprié. Ils combinent certaines séquences d’instructions machine (comme une comparaison suivie d’un saut conditionnel) en une μop plus complexe qui s’adapte mieux au modèle d’exécution et peut donc être exécuté plus rapidement ou avec moins de ressources machine impliquées. Cela est également connu sous le nom de fusion des macro-opérations[2]:106–107,[5]:12–13.
Une autre façon d’améliorer les performances est de mettre en cache les micro-opérations décodées dans un cache de micro-opérations, de sorte que si la même macro-instruction est exécutée à nouveau, le processeur puisse accéder directement aux micro-opérations décodées depuis le cache, au lieu de les décoder à nouveau. Le cache de traces(en) d’exécution trouvé dans la microarchitecture IntelNetBurst (Pentium 4) est un exemple largement répandu de cette technique[6]. La taille de ce cache peut être exprimée en termes de milliers (ou strictement un multiple de 1024) de micro-opérations qu’il peut stocker: Kμops[7].
↑(en) Baruch Solomon, Avi Mendelson, Doron Orenstein, Yoav Almog et Ronny Ronen, ISLPED'01: Proceedings of the 2001 International Symposium on Low Power Electronics and Design (IEEE Cat. No.01TH8581), Intel, , 4–9p. (ISBN1-58113-371-5, DOI10.1109/LPE.2001.945363, S2CID10934861, lire en ligne[PDF]), «Micro-Operation Cache: A Power Aware Frontend for Variable Instruction Length ISA»