GRa Klausur SS 11

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.

GRa Klausur SS 11
Aufgabe 1.

E = Eingabe, S = Speicher

09, 11                  E -> D
Wir laden den Eingang nach D

14, 02, 10, 11          E -> A, S -> D
Wir speichern die vorherige Eingabe nach A.
Wir laden den Speicher nach D.

14, 01                  S -> B
Wir laden den Speicher von gerade nach B.

04, 07, 11              E-S -> C (und -> D, falls kein Sprung)
Wir machen E-S und speichern in C. Auch in D, falls kein Sprung

17                      Sprung?
Wir fragen, ob es einen Sprung gibt. Wenn ja werden die 2 nachf. Anw.
nicht ausgeführt, oder?

12                      E-S -> E
15                      E-S -> S
Beide Anweisungen leiten nur auf Speicher um.

Hierzu eine Frage zu dem Schritt in dem wir 17 “sagen”. Wir springen ja hier nicht im Mikroprogramm, oder? Sonst würde ja die vorletzte Anweisung übersprungen und die letzte (15 E-S → S) ausgeführt oder?


Noch eine Frage:

Aufgabe 2f)
Sollen die Befehle nur 1 EX durchlaufen? Ich denke nein.

Sollen wir mit Stalls arbeiten oder einfach voll in die Hazards reinlaufen?


reinlaufen waere ja langweilig und vor allem kaputt.

Stalls.

Edit: und ja, alle EX-Stages durchlaufen, da ja die eigentliche Funktionalitaet nur aufgeteilt wurde.


hat jemand eine Lösung für die Aufgabe 1 f) ?


Ich glaube, sowas haben wir gar nicht durchgenommen‽


Wenn wir es nicht können sollten, dann wäre so eine Aufgabe sicherlich nicht in der eigens für uns angefertigten Probeklausur und wäre nicht in den Intensivübungen besprochen worden.


GLoLoP und GRa durcheinander gebracht? :stuck_out_tongue:


Jop :smiley:


Hmm, okay.
Dann wird das eben ausgespart.

Bei der 1 e) habe ich

Kann das eventuell jemand bestätigen? Bin mir aufgrund eines Schreibfehlers nicht ganz sicher, ob man die Angabe eventuell in mehrere Makrobefehle aufteilen sollte.

Danke schon mal.


Ich komm aufs gleiche Ergebnis, bin aber auch über den Schreibfehler gestolpert.
Wenn mehrere Makrobefehle gefordert sind, wäre die Zusatz-Spalte in der Tabelle ziemlich unsinnig; ist es nur einer macht das "Makrobefehle bei der ominösen f) keinen Sinn.


Zur Aufgabe 1:
Wenn ich das richtig sehe wird beim Sprung genau ein Mikrobefehl übersprungen, weil das Vorzeichenbit (bei C < 0 → 1) drauf addiert wird.

Meine Lösung würde dann so aussehen:

5, 7
Speicher - Eingabe → C. C < 0 wenn (Eingabe > Speicher) → Dann muss if-teil kommen
17
Sprung falls Bedingung erfüllt
1, 13
Speicher - Eingabe → A (Annahme: B - A < B. Sont hab ich kein Plan. Und wir reden hier über GRa.)
4, 7, 8, 11, 17
A (Speicher / Speicher - Eingabe) - B (Eingabe) → D und C, wenn die Bedingung erfüllt war wird gesprungen (Nach dem Befehl sollte in C auf jeden Fall was negatives stehen)
17
Jetzt Springt der Teil der nix mehr tun soll auch
12, 17
D → E
17
Und nochmall so ein Sprung
15
E → Speicher


Ich hätte zwei Fragen zur Pipeline-Aufgabe:

  1. Frage: Wie kann jede Stufe einen Takt brauchen, wenn alleine schon der Zugriff auf die Felder in einem Takt passiert und in jeder Zeile (z.B. A[lv] = A[lv-1] + A[lv]) bei der Operandenhol-Phase schon zwei Mal auf Felder zugegriffen werden muss , was laut Angabe ebenfalls jeweils 1 Takt benötigt.

  2. Frage:

In der Fragestunde wurde hier Kontrollhazards geantwortet (oder habe ich mich verhört?). Müssten es nicht Datenhazards sein? Denn das Ergebnis des ersten Befehls mit A hat sein Ergebnis noch nicht zurückgeschrieben, da werden schon die Operanden für den nächsten A-Befehl geholt.


Und gleich noch eine Frage zu Aufgabe 3c.
Während mir ein n-fach-assoziativer-Cache mitlerweile locker von der Hand geht, komme ich gerade bei direkt abbildenden Caches ziemlich durcheinander. Kann mir jemand sagen, ob ich den Cache richtig gefüllt habe?


     Tag                           Bytes                                   
| 0x0110 0 | 0x96 | 0x97 | 0xA8 | 0x49 | 0x04 | 0xF3 | 0xE2 | 0x61 |
|          |      |      |      |      |      |      |      |      |
| 0x0111 0 | 0x88 | 0x99 | 0xAA | 0x4B | 0x34 | 0x13 | 0x02 | 0x81 |
| 0x0001 1 | 0x15 | 0x26 | 0x37 | 0x48 | 0x84 | 0x73 | 0x62 | 0x51 |

Was der jeweilige Hinweis mit
“0x18 zeigt auf einen Integerwert;”
soll, ist mir nicht wirklich klar. Ich lade doch immer 8 Bytes in meinen Cache, oder etwa nicht?


Vielleicht meinen sie einfach „Wie müssen dieses Makrobefehle [im allgemeinen]…“. Dann macht das schon Sinn. (Makrobefehl wird dann zur Einsprungadresse des Mikroprogramms dekodiert)

Edit: 1 Takt heißt wohl einfach, dass alle Operanden innerhalb des einen Takts der OP-Phase geholt werden können!
Kann mich gerade nicht mehr daran erinnern, aber die 4 Befehle die du da siehst, sind ja Makrobefehle. Du musst das Programm glaub ich erst in Assembler umschreiben / umdenken, dann hast du pro Zeile 2 load (mov) Befehle, dann die Operation und einen Store Befehl. Dann passen alle Befehle wieder in einen Takt und die Antwort wäre Edit: 4 * 9 (bei der Schleife fehlt die 0!) Befehle. Wäre nett, wenn das jemand bestätigen könnte, der mitgeschrieben hat.

Unter der hier wohl geforderten Annahme, dass Sprung-Befehle die volle Ausführungszeit benötigen, weißt du ja nach einem Sprung nicht, mit welchem Befehl du in der Pipeline weitermachen musst. Also treten auch Control-Hazards auf.
Edit: Control-Hazards kommen im Programm nicht vor. Wenn es Sprungbefehle gäbe, würde das - wie in der Fragestunde besprochen - durch die 4 Ex-Stufen zu Control-Hazards führen.


ich hab mir mitgeschrieben das es 36 instruktionen insgesamt sind also 9*4


Das macht Sinn. Wäre schön, wenn das jemand bestätigen könnte.

Aber in dem Progrämmchen kommt doch überhaupt kein Sprung vor? Oder soll man die Frage allgemein verstehen und nicht mehr auf die gegebene Schleife bezogen? Es wäre wirklich schön, wenn manche Fragen etwas klarer gestellt wären.


Schon, aber die 8 Bytes des Integers müssen nicht zwangsläufig identisch mit den 8 Bytes des Blocks sein. Bei 0x18 geht alles gut, 0x74 hingegen geht über die Grenze von zwei Blöcken; deshalb werden wenn ich das richtig seh 16 Byte gecacht (EDIT: siehe).

Mitgeschrieben hab ich leider nicht, aber deine Theorie mit der Umwandlung in Mikrobefehle kommt mir komisch vor: Ich denke, die Variablen A-D stehen hier einfach als Platzhalter und nicht notwendigerweise für Speicherzugriffe. Es ist ja überhaupt nicht klar, um welche Architektur es sich handelt; sprich ob überhaupt beide Operanden in Register geladen werden müssen und wo das Ergebnis landet.
„Array-Zugriff in einem Takt“ würde dann beduten, dass der Zugriff auf Felder eben nicht aufwendiger ist wie der auf einzelne Variablen.

Wo kommen denn bei der Aufgabe Sprungbefehle vor? :scared:


Hey :slight_smile:

Kannst du bitte kurz erklären wie hast die Adresse in der Tabelle eingetragen ??

und Danke !


Hm jetzt wo du es sagst. In Register würden die Werte jedenfalls niemals reinpassen und was meinen sie dann mit Speicherzugriffen - denn wenn die nie beachtet werden sollen, müssten sie ja nicht in die Aufgabe schreiben, dass sie einen Takt lang dauern.

Richtig, wir habens in der Fragestunde wohl nur allgemein beantwortet, gefragt wäre es wohl nicht gewesen.