Author |
Message |
rgerhards
|
|
Post subject: Ausgerichtete (aligned) Zugriffe
Posted: Dec 02, 2009 - 01:46 PM
|
|
Joined: Sep 25, 2006
Posts: 688
Status: Offline
|
|
Von mir vielleicht etwas Weiteres zur Sinnhaftigkeit ausgerichteter Speicherzugriffe.
Man betrachte Fernuni-Kurs 1608 Abbildung 4.22 (oder ein anderes Bild eine Speichermatrix, z.B. [1]) an: das ist ein bitorientierter Speicher, im Text auf Seite 200 sieht man aber, das die Organisation auch für größere Wortbreiten gleich ist (bzw. sein kann). Man beachte den matrixförmigen Aufbau. Bei heute real existierendem Hauptspeicher ist es so, dass nicht ein einzelnes Element ausgelesen wird, sondern vielmehr eine ganze Zeile. Diese Zeile wird in ein Zwischenregister "geschoben" und dort wird dann die entsprechende Spalte ausgelesen, womit der Zugriff dann endgültig abgeschlossen wird.
Hier kommt dann die Modulo-Operation ins Spiel. Nehmen wir einen Byte-adressierbaren Speicher mit einer Zeilengröße n von 4 Byte an (in der Praxis sind heute, meine ich, 64 Byte üblich). Betrachten wir nun eine beliebige Adresse A. Dann kann man diese Adresse in eine Zeilen-Adresse A_Z und eine Spaltenadresse A_S zerlegen. Dabei gilt
A_S = A mod n
A_Z = A div n (div sei das ganzzahlige Divisionsergebnis)
Ein Zugriff wäre dann auf den Zeilenanfang ausgerichtet, wenn A_Z gleich Null ist. Konkretes Beispiel:
A = 1024, n = 4
A_S = 1024 mod 4 = 0
A_Z = 1024 div 4 = 256
Nehmen wir an, dass zwei Byte an dieser Adresse gelesen werden müssen. Dann ist ein Zugriff auf die Speichermatrix notwendig, denn A_S lädt die (Inhalten der Speicherstellen an) Adressen 1024, 1025, 1026, 1027 in das Zwischenregister, darauf kann dann mit A_S zugegriffen werden. Es ist also nur ein Zugriff auf die Speichermatrix selbst erforderlich, um das 16-Bit Datum auszulesen.
Nehmen wir nun an, die Adresse ist 1023
A=1023, n=4
A_S = 1023 mod 4 = 3
A_Z = 1023 div 4 = 255
Da A_S <> 0, ist der Zugriff nicht auf den Beginn der Zeile ausgerichtet. Die gelesene Zeile umfasst damit die Adressen 1020, 1021, 1022, 1023. Von unserem 16-Bit Wert erhalten wir also zunächst einmal nur den Wert an Adresse 1023, anschließend ist ein weiterer Zugriff auf die Speichermatrix mit A_Z = 256 (wie oben!) erforderlich.
Im Ergebnis dauert der Zugriff also länger. Man kann das in einem rechenintensiven Programm durchaus auch in der Praxis bemerken. Solche "nicht ausgerichteten" Speicherzugriffe können die Laufzeit deutlich erhöhen. Ausserdem bringen sie noch eine Reihe weiterer Probleme mit sich, z.B. bei der Synchronisation von nebenläufigen Prozessen.
Zum Speicherzugriff könntest Du evtl. auch einmal in meine Präsentation zum Cache schauen, ab Folie drei die nächsten paar Folien:
http://www.gerhards.net/module-Pagesett ... -204.phtml
Für die Experten: ich habe hier versucht vertretbar zu vereinfachen und dennoch ein konkretes Anwendungsbeispiel zu erhalten. Ich bin der Meinung, dass die Aussagen korrekt sind. Allerdings wird man im Detail Korrekturen vornehmen müssen, wenn man an reale CPUs denkt...
Ich hoffe, das Beispiel ist nützlich.
Rainer
[1] http://www.weblearn.hs-bremen.de/risse/ ... memory.pdf |
|
|
|
|
|
|
|
|