Wie liest die CPU Daten aus dem RAM?

Wie liest der in einem Allzweckcomputer (wie einem normalen PC) CPUdie RAM, vorausgesetzt, er liest zuerst aus der Cache.

Angenommen, es cachehandelt sich um einen assoziativen Cache mit n-Wege-Sets . Wieder hätten wir L1 Cacheund L2 Cache.

  1. CPULiest normalerweise eine blockder Daten aus der RAM. blocksDas können also mehrere sein words. Kostet das nicht viel Zeit/Taktzyklen? Wie kann/kann dies effizienter gestaltet werden? (Die Rede ist hier nicht von Cache-Nutzung, sondern von der Datenübertragung)

  2. RAMist ziemlich langsamer als der CPU, wie CPUschafft der es trotzdem, effizient zu sein?

Oft werden die Daten in großen Blöcken an die CPU geliefert und sehr schnell verarbeitet, und dann wird der große Block nach der Verarbeitung an eine andere Stelle verschoben / abgelegt. Das eigentliche Streamen von Daten ist in den meisten Fällen nicht so schnell wie die CPU
ist das hausaufgabe?

Antworten (2)

Es gibt Durchsatz und Latenz.

Auf sehr einfachen, langsamen Kernen läuft der Cache mit der gleichen Geschwindigkeit wie die CPU und kann Daten in einem Zyklus bereitstellen, sodass Daten sofort verfügbar sind, ohne ins Stocken zu geraten. Bei einem Cache-Miss werden Daten aus dem Hauptspeicher genommen, und die anfängliche Latenz kann über 10 Zyklen betragen. Das Gute daran ist, dass sobald die ersten Daten verfügbar sind, die folgenden Daten schnell erhalten werden können, daher die Idee von Burst-Übertragungen und Cache-Füllungen. Die CPU benötigt nur ein Byte oder ein 32-Bit-Wort, aber 32 oder 64 Bytes werden auf einmal vom Speicher zum Cache übertragen.

Auf fortgeschritteneren CPUs, denjenigen mit L1, L2, DRAM und Gigahertz-Takt, kann nicht einmal der Inhalt des L1-Cache sofort abgerufen werden. Für Anweisungen gibt es Mechanismen zum Vorhersagen des Befehlsflusses und zum Abrufen von Anweisungen im Voraus: Kontinuierliches Abrufen aufeinanderfolgender Adressen, es sei denn, die Anweisung ist eine Verzweigung, ein Aufruf usw. Bei Daten ist es komplexer. Durch die Verwendung von Pipelining können einige CPUs mehrere ausstehende Datenübertragungen haben, bevor sie ins Stocken geraten. Die eigentliche aktuelle Lösung zur Verringerung langer Latenzen ist die Ausführung außerhalb der Reihenfolge. Die CPU erledigt so viel Arbeit wie möglich, selbst wenn sie Anweisungen nicht in der Programmreihenfolge ausführt, um die lange Latenz von Anweisungen wie Datenlesen und -schreiben zu verbergen.

Es wäre wahrscheinlich lohnenswert, das Abrufen von Blöcken aus dem Cache zuerst für kritische Chunks (z , nur warten, bis die angeforderten Daten verfügbar sind). Auch die zusätzliche Latenz des Bursts ist relativ gering (z. B. benötigt 1 GHz DDR3 4 ns, um die 8 Übertragungen in einem Burst zu übertragen, verglichen mit typischerweise über 50 ns, um den Zugriff zu starten). Wenn man die Lokalität annimmt, liefert einer der anderen Brocken Daten für einen weiteren Fehlschlag.
  1. Ja. Durch die Verwendung von effizienterem RAM, z. B. Speicher, der den Burst-Modus unterstützt.

  2. Durch die Verwendung von Cache, bei dem es sich um schnelleren RAM handelt, zusammen mit einem Speichercontroller, der weiterhin aus dem RAM liest, während die CPU damit beschäftigt ist, das auszuführen, was sich im Cache befindet.

Es ist auch erwähnenswert, dass moderne "normale PCs" mehrere Caching-Ebenen verwenden und die Logik, die verwendet wird, um zu bestimmen, was zwischengespeichert wird (insbesondere im Fall moderner Read-Ahead-Algorithmen), von Produkt zu Produkt unterschiedlich und nicht trivial ist. Ein Teil des Schreibens von Software umfasst häufig auch Optimierungen, die der CPU helfen, indem sie auf vorhersehbare / effiziente Weise auf den Speicher zugreifen. Dies ist sicherlich eine sehr weit gefasste Frage.