2010-09-29 - Aufgabe 02 Speicher [Anmerk.: Cache]

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

2010-09-29 - Aufgabe 02 Speicher [Anmerk.: Cache]
Gegeben sei folgendes Assembler-Unterprogramm:

func:

jmp next %springe nach “next”

loop:

movb (%ebx), %dl % kopiere Byte von Adr. %ebx ins Reg. %dl

movb %dl, (%ecx) %kopiere Byte von Reg. %dl nach Adr. %ecx

addl $1, %ebx %addiere 1 zum Inhalt von Reg. %ebx

addl $1, %ecx %addiere 1 zum Inhalt von Reg. %ecx

subl $1, %eax %subtrahiere 1 vom Inhalt des Reg. %eax

next:

cmpl $0, %eax %vergleiche Inhalt von Reg. %eax mit 0

jne loop %springe nach “loop” wenn nicht gleich

ret

Das Unterprogramm habe die Startadresse 0xf000. Jeder Befehl sei in 32 Bits kodiert. Welche Bytes im Speicher werden gelesen, welche beschrieben, wenn das Unterprogramm mit %eax=10, %ebx=0x1000 und %ecx=0x2000 aufgerufen wird? (4 Punkte)

[color=blue]gelesen: - von 0x100[0-9] nach %dl1

geschrieben: - Inhalt %d1 nach 0x200[0-9]

(vgl. for(int i=10; i!=0; i–) {} )[/color]

  1. Was wird als ,räumliche Lokalität" und was als ,zeitliche Lokalität" bezeichnet? Wie zeigt sich die räumliche und zeitliche Lokalität am obigen Beispiel? (4 Punkte)

[color=blue]http://de.wikipedia.org/wiki/Lokalitätseigenschaft:

* Zeitliche Lokalität: In einem gewissen Zeitabschnitt wird mit einem relativ kleinen Bereich der gesamten Befehls- oder Datenmenge gearbeitet.
* Räumliche Lokalität: Befehls- oder Datenzugriffe finden auf einem relativ kleinen Bereich des gesamten Adressraums statt.

zeitliche Lokalität: 0x100[0-9] und 0x200[0-9] liegen nebeneiander.
räumliche Lokalität: 0x1000 - 0x1009 ; 0x2000-0x2009[/color]

  1. Welche Bytes aus dem Hauptspeicher müssten von einem Cache sinnvollerweise mindestens aufgenommen werden können, um das Programm zu beschleunigen? Begründen Sie Ihre Antwort! (2 Punkte)

[color=blue]Stellen im Speicher, von denen öfters gelesen werden soll.
→ mehr Cache hits.[/color]

  1. Es gibt drei Gründe, warum ein Speicherwort möglicherweise nicht im Cache liegt. Beschreiben Sie diese! Welcher dieser drei Gründe kann in einem voll-assoziativen Cache nicht auftreten? (3 Punkte)
    [color=blue]
    Drei Cache Misses (cf. Wikipedia - Cache )
    Capacity: Der Cache ist zu klein. Daten waren im Cache wurden aber aus Kapazitätsgründen wieder aus dem Cache verdrängt.
    Conflict: tritt bei DM oder satzassoziativen Caches auf, nicht aber bei FA: global gesehen hat der Cache noch Platz, aber bei einem Satz wird der Speicher knapp. → Verdrängen andererer Chunks des Satzes.
    Cumpulsory: Beim erstmaligen Zugriff auf eine Adresse befinden sich normalerweise die dazugehörigen Daten noch nicht im Cache. [/color]

An Eurer Kritik bin ich wie immer interessiert :slight_smile:


Bei den Speicherzugriffen hast du die Befehle vergessen, die ja auch im Speicher liegen “…Startadresse 0xf000” + “jeder Befehl 32 bit groß”.
Bei 5) sollte man glaub ich auch konkret sagen, welche Adressen da rein sollten.
Beim letzten haste vergessen, was in nem voll-asso-Cache nicht auftreten kann.


wie schreibe ich das hin?
zu 5): macht die frage dann sinn? was würde ich denn in den cache holen… .?

habe es doch implizit hingeschrieben, dass conflich nur bei DM und SA auftreten kann…


Naja, Programm: 0xf000-0xf023 (jeder Befehl 4 Byte lang, insgesamt 9 Befehle => 36 Byte Code)

Zum Beispiel den Programmcode der Schleife, also 0xf004-0xf01c (alles ohne den ersten jmp und das ret)

Zeitliche Lokalität hat man btw dann auch noch, weil du immer wieder auf die Schleifenbytes zugreifst => über Zeit mehr Zugriffe auf bestimmte Adressen

Stimmt, hatte ich überlesen… sorry