La latence de la mémoire est l'un des problèmes fondamentaux étudiés dans la recherche en architecture informatique.
Exécution spéculative
L'exécution spéculative avec un problème d'instruction dans le désordre est souvent en mesure de trouver un travail utile à faire pour combler la latence lors d'un accès au cache L1, mais elle manque généralement de travail utile après 10 ou 20 cycles environ. Il y a eu plusieurs tentatives pour augmenter la quantité de travail qui peut être effectué lors d'une absence à longue latence. Une idée était d'essayer de faire des prévisions de valeur (Lipasti, Wilkerson et Shen, (ASPLOS-VII): 138-147, 1996). Cette idée était très à la mode dans les cercles de recherche en architecture universitaire pendant un certain temps, mais ne semble pas fonctionner dans la pratique. Une dernière tentative pour sauver la prédiction de valeur de la poubelle de l'histoire a été l' exécution runahead(Mutlu, Stark, Wilkerson et Patt (HPCA-9): 129, 2003). Dans l'exécution runahead, vous reconnaissez que vos prédictions de valeur vont être erronées, mais exécutez quand même de manière spéculative , puis jetez tout le travail basé sur la prédiction, sur la théorie que vous commencerez au moins quelques préfetches pour ce qui serait autrement le cache L2 manque. Il s'avère que runahead gaspille tellement d'énergie que cela n'en vaut pas la peine.
Une approche finale dans ce sens, qui peut être en train de gagner du terrain dans l'industrie, consiste à créer des tampons de réapprovisionnement extrêmement longs. Les instructions sont exécutées de manière spéculative sur la base de la prédiction de branche, mais aucune prédiction de valeur n'est effectuée. Au lieu de cela, toutes les instructions qui dépendent d'une charge à longue latence manquent de s'asseoir et d'attendre dans le tampon de réorganisation. Mais comme le tampon de réorganisation est si grand, vous pouvez continuer à chercher des instructions si le prédicteur de branche fait un travail décent, vous pourrez parfois trouver du travail utile beaucoup plus tard dans le flux d'instructions. Un article de recherche influent dans ce domaine était Pipelines à débit continu(Srinivasan, Rajwar, Akkary, Gandhi et Upton (ASPLOS-XI): 107-119, 2004). (Malgré le fait que les auteurs sont tous d'Intel, je pense que l'idée a gagné en popularité chez AMD.)
Multi-threading
L'utilisation de plusieurs threads pour la tolérance de latence a une histoire beaucoup plus longue, avec un succès beaucoup plus grand dans l'industrie. Toutes les versions réussies utilisent le support matériel pour le multithreading. La version la plus simple (et la plus réussie) de ceci est ce qui est souvent appelé FGMT ( multi-threading à grain fin ) ou multi-threading entrelacé . Chaque noyau matériel prend en charge plusieurs contextes de threads (un contexte est essentiellement l'état du registre, y compris les registres comme le pointeur d'instruction et tous les registres de drapeaux implicites). Dans un processeur multi-thread à grain fin, chaque thread est traité en-ordre. Le processeur garde une trace des threads qui sont bloqués en cas de manque de charge à longue latence et qui sont prêts pour leur prochaine instruction et il utilise une stratégie de planification FIFO simple à chaque cycle pour choisir le thread prêt à exécuter ce cycle. Un premier exemple de cela à grande échelle était les processeurs HEP de Burton Smith (Burton Smith a ensuite architecté le supercalculateur Tera, qui était également un processeur multi-thread à grain fin). Mais l'idée remonte beaucoup plus loin dans les années 1960, je pense.
FGMT est particulièrement efficace sur les charges de travail en streaming. Tous les GPU modernes (unités de traitement graphique) sont multicœurs où chaque cœur est FGMT, et le concept est également largement utilisé dans d'autres domaines informatiques. Le T1 de Sun était également FMGT multicœur, tout comme le Xeon Phi d'Intel (le processeur qui est souvent encore appelé "MIC" et était autrefois appelé "Larabee").
L'idée du multithreading simultané (Tullsen, Eggers et Levy, (ISCA-22): 392-403, 1995) combine le multi-threading matériel avec une exécution spéculative. Le processeur a plusieurs contextes de threads, mais chaque thread est exécuté de manière spéculative et dans le désordre. Un ordonnanceur plus sophistiqué peut ensuite utiliser diverses heuristiques pour extraire du thread qui est le plus susceptible d'avoir un travail utile ( Malik, Agarwal, Dhar et Frank, (HPCA-14: 50-61), 2008 ). Une certaine grande entreprise de semi-conducteurs a commencé à utiliser le terme hyperthreading pour le multithreading simultané, et ce nom semble être le plus utilisé de nos jours.
Préoccupations microarchitecturales de bas niveau
J'ai réalisé après avoir relu vos commentaires que vous êtes également intéressé par la signalisation qui se passe entre le processeur et la mémoire. Les caches modernes permettent généralement à plusieurs échecs d'être simultanément en suspens. C'est ce qu'on appelle un cache sans verrouillage (Kroft, (ISCA-8): 81-87, 1981). (Mais le document est difficile à trouver en ligne, et quelque peu difficile à lire. Réponse courte: il y a beaucoup de comptabilité mais il suffit de s'en occuper. La structure de comptabilité matérielle est appelée MSHR (Miss Information / Status Holding Register ), qui est le nom que Kroft lui a donné dans son article de 1981.)