Die Speicherlatenz ist eines der grundlegenden Probleme, die in der Computerarchitekturforschung untersucht werden.
Spekulative Ausführung
Bei der spekulativen Ausführung mit Instruction Issue Out-of-Order wird häufig nützliche Arbeit gefunden, um die Latenz während eines L1-Cache-Treffers auszufüllen. In der Regel geht jedoch nach 10 oder 20 Zyklen die nützliche Arbeit aus. Es wurden mehrere Versuche unternommen, um den Arbeitsaufwand zu erhöhen, der während eines Fehlschlags mit langer Latenzzeit ausgeführt werden kann. Eine Idee war , zu versuchen zu tun Wert Vorhersage (Lipasti, Wilkerson und Shen, (ASPLOS-VII): 138-147, 1996). Diese Idee war in akademischen Architekturforschungskreisen für eine Weile sehr in Mode, scheint aber in der Praxis nicht zu funktionieren. Ein letzter Versuch, die Wertvorhersage aus dem Mülleimer der Geschichte zu retten, war die Runahead-Ausführung(Mutlu, Stark, Wilkerson und Patt (HPCA-9): 129, 2003). In runahead Ausführung erkennen Sie , dass Ihr Wert Prognosen falsch sein werden, aber spekulativ ausführen sowieso und dann die ganze Arbeit werfen basierend auf der Vorhersage, auf der Theorie , dass Sie zumindest werden einige der Prefetch für starten , was sonst L2 - Cache vermisst. Es stellt sich heraus, dass Runahead so viel Energie verschwendet, dass es sich einfach nicht lohnt.
Ein letzter Ansatz in diesem Sinne, der in der Industrie möglicherweise Anklang findet, besteht darin, enorm lange Puffer für die Neuordnung zu erstellen. Anweisungen werden spekulativ auf der Grundlage einer Verzweigungsvorhersage ausgeführt, es wird jedoch keine Wertvorhersage durchgeführt. Stattdessen sitzen und warten alle Anweisungen, die von einer Last mit langer Latenz abhängig sind, im Neuordnungspuffer. Da der Neuordnungspuffer jedoch so groß ist, dass Sie weiterhin Anweisungen abrufen können, wenn die Verzweigungsvorhersage einen anständigen Job ausführt, werden Sie manchmal viel später nützliche Arbeit im Anweisungsdatenstrom finden. Ein einflussreiches Forschungspapier in diesem Bereich war Continuous Flow Pipelines(Srinivasan, Rajwar, Akkary, Gandhi und Upton (ASPLOS-XI): 107-119, 2004). (Trotz der Tatsache, dass die Autoren alle von Intel sind, glaube ich, dass die Idee bei AMD mehr Anklang gefunden hat.)
Multithreading
Die Verwendung mehrerer Threads für die Latenztoleranz hat eine viel längere Tradition und ist in der Industrie viel erfolgreicher. Alle erfolgreichen Versionen verwenden Hardware-Unterstützung für Multithreading. Die einfachste (und erfolgreichste) Version davon wird oft als FGMT ( Fine Grained Multi-Threading ) oder Interleaved Multi-Threading bezeichnet . Jeder Hardwarekern unterstützt mehrere Thread-Kontexte (ein Kontext ist im Wesentlichen der Registerzustand, einschließlich der Register wie der Befehlszeiger und aller impliziten Merkerregister). In einem feinkörnigen Prozessor Multithreading jeder Thread verarbeitet wird in-bestellen. Der Prozessor verfolgt, welche Threads bei einem Load-Miss mit langer Latenzzeit angehalten werden und welche für ihre nächste Anweisung bereit sind, und verwendet eine einfache FIFO-Planungsstrategie für jeden Zyklus, um auszuwählen, welcher Ready-Thread diesen Zyklus ausführen soll. Ein frühes Beispiel dafür in großem Maßstab waren die HEP-Prozessoren von Burton Smith (Burton Smith entwarf den Tera-Supercomputer, der auch ein feinkörniger Multi-Threading-Prozessor war). Aber die Idee geht viel weiter zurück, bis in die 1960er Jahre, denke ich.
FGMT ist besonders effektiv beim Streamen von Workloads. Alle modernen GPUs (Grafikprozessoren) sind Multicore-Grafikprozessoren, bei denen jeder Kern FGMT ist, und das Konzept ist auch in anderen Computerbereichen weit verbreitet. Suns T1 war ebenfalls Multicore-FMGT, ebenso wie Intels Xeon Phi (der Prozessor, der oft noch als "MIC" und früher als "Larabee" bezeichnet wurde).
Die Idee des simultanen Multithreading (Tullsen, Eggers und Levy, (ISCA-22): 392-403, 1995) kombiniert Hardware-Multithreading mit spekulativer Ausführung. Der Prozessor hat mehrere Thread-Kontexte, aber jeder Thread wird spekulativ und nicht in der richtigen Reihenfolge ausgeführt. Ein ausgefeilterer Scheduler kann dann verschiedene Heuristiken verwenden, um aus dem Thread abzurufen, für den die wahrscheinlichste nützliche Arbeit vorliegt ( Malik, Agarwal, Dhar und Frank, (HPCA-14: 50-61), 2008 ). Ein gewisses großes Halbleiterunternehmen hat angefangen, den Begriff Hyperthreading für simultanes Multithreading zu verwenden, und dieser Name scheint heutzutage der am häufigsten verwendete zu sein.
Bedenken hinsichtlich der Mikroarchitektur auf niedriger Ebene
Nachdem ich Ihre Kommentare noch einmal gelesen hatte, wurde mir klar, dass Sie auch an der Signalisierung zwischen Prozessor und Speicher interessiert sind. Moderne Caches ermöglichen es normalerweise, dass mehrere Fehler gleichzeitig ausstehen. Dies wird als sperrfreier Cache bezeichnet (Kroft, (ISCA-8): 81-87, 1981). (Aber das Papier ist online schwer zu finden und etwas schwer zu lesen. Kurze Antwort: Es gibt viel Buchhaltung, aber Sie beschäftigen sich nur damit. Die Hardware-Buchhaltungsstruktur wird als MSHR (Miss Information / Status Holding Register) bezeichnet ), wie Kroft es 1981 in seiner Arbeit nannte.)