Information Technology Reference
In-Depth Information
sog. Write-Combinig beschrieben, einem Verfahren bei dem man mehrere Schreib-
zugriffe auf kleine Speichereinheiten zu einem einzelnen Schreibzugriff auf eine
größere Einheit zusammenfasst.
Prefetching. Beim Prefetching wird eine Cache-Zeile geladen, bevor der erste
Zugriff auf eine Speicherzelle innerhalb des zugeordneten Speicherblocks erfolgt.
Am einfachsten zu realisieren ist ein explizites, durch spezielle Befehle ausgelöstes
Prefetching, wobei hier Zugriffe auf den Befehls- und den Datenspeicher zu unter-
scheiden sind. Zum Beispiel verfügt der Itanium 2 von Intel [78, 75] für das voraus-
schauende Laden von Befehlen über einen Modifizierer für Sprungbefehle „.many“,
der bewirkt, dass ausgehend von der Zieladresse des Sprungbefehls alle sequentiell
folgenden Speicherblöcke in den Cache geladen werden. Dabei wird pro Takt eine
Anforderung an eine automatisch agierende Prefetch-Einheit weitergereicht, und
zwar bis zum Erkennen einer sog. Stopp-Bedingung ( stop condition ), also einem
verzweigenden bzw. falsch vorhergesagten Sprungbefehl oder den Befehl brp
( branch prediction ). Für das Prefetching von Daten verfügt der Prozessor weiterhin
über den Befehl lfetch ( line prefetch ), dem als Argument die Adresse eines erwarte-
ten Zugriffs und ein Hinweis übergeben wird, auf welche Cache-Ebenen sich das
vorausschauende Laden beziehen soll. Ein ähnlicher Befehl „prefetch“ ist im Pen-
tium 4 von Intel [82] bzw. im Athlon64 von AMD [2, 3, 4, 5, 6] implementiert.
Beim statischen, expliziten Prefetching muss vorausgesetzt werden, dass bereits zur
Übersetzungszeit bekannt ist, wie sich das Programm zur Laufzeit wahrscheinlich
verhalten wird. Insbesondere ist es ohne zusätzliche bedingungsauswertende
Befehle i.Allg. nicht möglich, das sich ändernde Laufzeitverhalten eines Pro-
gramms beim Prefetching einzubeziehen. Ein dynamisches Verfahren zum voraus-
schauenden Laden von Cache-Zeilen hat diesen Nachteil nicht, ist dafür jedoch auf-
wendiger zu realisieren. Beim Prefetching von Befehlen kann z.B. mit dem Zugriff
auf einen einzelnen Befehl bereits die Cache-Zeile geladen werden, die bei streng
sequentieller Ausführung des Programms als nächstes benötigt wird. Das Verfahren
hat jedoch keine praktische Relevanz, da mit ihm häufig Speicherbereiche in den
Cache geladen werden, die aufgrund verzweigender bedingter oder unbedingter
Sprungbefehle tatsächlich nicht zur Ausführung kommen. So ist z.B. in Kauf zu
nehmen, dass (1.) der Hauptspeicherzugriff den externen Prozessorbus belegt, er
also in der entsprechenden Zeit nicht für andere Aufgaben zur Verfügung steht und
(2.) beim Laden einer Cache-Zeile möglicherweise ein noch benötigter Inhalt aus
dem Cache verdrängt wird (was sich allerdings durch Verwendung eines cache-ähn-
lich organisierten kleinen zusätzlichen Prefetch-Buffers vermeiden lässt [65]).
Ein dynamisches Verfahren zum vorausschauenden Laden von Cache-Zeilen, das
den Kontrollfluss berücksichtigt, ist im Nemesis C der TU Berlin realisiert [114,
198]. Es arbeitet ähnlich einer globalen adaptiven Sprungvorhersage (Bild 2.35) mit
Indexteilung (Bild 2.36), wobei im Historienregister nicht die Sprungentscheidun-
gen einzelner Sprungbefehle protokolliert werden, sondern die Reihenfolge der
Zugriffe auf die im Befehlscache gehaltenen Speicherblöcke.
Die prinzipelle Funktionsweise ist in Bild 2.64 dargestellt. Das mit a markierte Zei-
lenhistorienregister ( LHR , line history register ) wird jeweils beim Verlassen des in
Search WWH ::




Custom Search