17.06.2014 Aufrufe

Musterlösung - Rs.tu-darmstadt.de

Musterlösung - Rs.tu-darmstadt.de

Musterlösung - Rs.tu-darmstadt.de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Insti<strong>tu</strong>t für Datentechnik D-64283 Darmstadt, Merckstr. 25<br />

Fachgebiet Rechnersysteme Telefon: (06151) 16-2076<br />

Professor Dr.-Ing. H. Eveking Telefax: -4976<br />

Klausur für die Prüfung<br />

R E C H N E R S Y S T E M E 1<br />

Frühjahr 2011<br />

Mittwoch, <strong>de</strong>r 23. März 2011<br />

16:00-17:30 Uhr<br />

Musterlösung<br />

_______________________________________________________________________________________________<br />

Nachname Vorname Matrikelnummer<br />

Hinweis für alle Aufgaben:<br />

Bearbei<strong>tu</strong>ngszeit:<br />

Lassen Sie bitte die Aufgabenblätter zusammengeheftet<br />

und führen Sie die Rechnung<br />

auf <strong>de</strong>m dafür vorgesehenen Platz im Aufgabentext<br />

o<strong>de</strong>r auf <strong>de</strong>r leeren Seite rechts daneben<br />

durch.<br />

90 Minuten<br />

Die Punkteverteilung ist <strong>de</strong>n einzelnen Aufgaben zu entnehmen.


1. Aufgabe 40 Punkte<br />

1.1 Ein 16 Bit breiter Bus wird auf 4 Teilbusse aufgeteilt wie in <strong>de</strong>r Skizze dargestellt.<br />

Bestimmen Sie für <strong>de</strong>n Input 0xB7E9 die Ausgangswerte w, x, y und z (hexa<strong>de</strong>zimal).<br />

w= 2<br />

x= 6F<br />

0xB7E9<br />

16<br />

y= D<br />

[15:14] [13:7] [6:3] [2:0]<br />

z= 1<br />

w<br />

x y z<br />

1.2 Wan<strong>de</strong>ln Sie die folgen<strong>de</strong> Zahl im IEEE 754 Standard in eine Dezimalzahl (mit Rechnung!):<br />

1 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />

MSB<br />

LSB<br />

(-1)* 1,625 * 2 (174-127) = (-1)* 1,625 * 2 47<br />

1.3 Geben sie an, wie bei <strong>de</strong>r Ausführung <strong>de</strong>r unten angegebenen DLX-Befehle in einem DLX-<br />

Prozessor die Werte in <strong>de</strong>n Registern PC und R31 modifiziert wer<strong>de</strong>n:<br />

JR R31 :<br />

PC := PC+4+R31<br />

R31 := R31<br />

SW R31, 4(R29) :<br />

PC := PC+4<br />

R31 := R31


1.4 Bei <strong>de</strong>r Abarbei<strong>tu</strong>ng eines Programmabschnitts wird eine 1-Bit Sprungvorhersage verwen<strong>de</strong>t.<br />

Das Vorhersage-Bit sei zu Beginn <strong>de</strong>s Programmstücks gelöscht (keine Verzweigung<br />

vorausgesagt). Ob die Verzweigung tatsächlich ausgeführt wird ist bereits in <strong>de</strong>r Tabelle<br />

eingetragen (J Verzweigung wird ausgeführt, N Verzweigung wird nicht ausgeführt.).<br />

Vervollständigen Sie die nachfolgen<strong>de</strong> Tabelle, in<strong>de</strong>m Sie 0 o<strong>de</strong>r 1 in die Fel<strong>de</strong>r für das<br />

Voraussagebit eintragen. Tragen Sie in die Fel<strong>de</strong>r für „Voraussage falsch“ ein J für „die<br />

Voraussage war falsch“, o<strong>de</strong>r ein N für „die Voraussage war nicht falsch“ ein!<br />

Voraussagebit<br />

Verzweigung ausgeführt<br />

Voraussage falsch<br />

0 1 1 0 0<br />

J J N N J<br />

J N J N J<br />

1.5 Ein Prozessor mit Stack-Architek<strong>tu</strong>r unterstützt die folgen<strong>de</strong>n Befehle:<br />

PUSH m<br />

ADD<br />

MULT<br />

STORE m<br />

Schreiben Sie ein Programm, dass die Polynomfunktion<br />

z= xa⋅ xbc<br />

berechnet und an Speicherstelle z ablegt. Die Speicherstellen für x, a, b, c und z sind 100, 200,<br />

300, 400 und 500.<br />

PUSH 100<br />

PUSH 200<br />

ADD<br />

PUSH 100<br />

PUSH 300<br />

ADD<br />

MULT<br />

PUSH 400<br />

ADD<br />

STORE 500


1.6 Gegeben sei ein DLX Prozessor mit 5 Pipelinings<strong>tu</strong>fen. Bedingte Verzweigungen wer<strong>de</strong>n nach<br />

einer predict-not-taken Strategie behan<strong>de</strong>lt und wer<strong>de</strong>n ggf. in <strong>de</strong>r ID-Phase durchgeführt.<br />

Auf <strong>de</strong>m Prozessor wird nun folgen<strong>de</strong>r Programmco<strong>de</strong> ausgeführt:<br />

1. ADDI R3, R0, #32<br />

2. loop: LW R2, (200)R3<br />

3. ADDI R2, R2, #1<br />

4. SW (400)R3, R2<br />

5. SUBI R3, R3, #4<br />

6. LW R4, (600)R3<br />

7. BNEZ R4, loop<br />

a) An welchen Stellen im Programmco<strong>de</strong> treten Stalls auf? Markieren Sie die<br />

entsprechen<strong>de</strong>n Stellen und begrün<strong>de</strong>n Sie <strong>de</strong>n Stall in Stichworten.<br />

Zwischen Zeile 1 und 2: Stall wegen Datenabhängigkeit R2<br />

Zwischen Zeile 6 und 7: Stall wegen Datenabhängigkeit R4<br />

Zwischen Zeile 7 und 8: Stall wegen Branch<br />

b) Das Programm aus Aufgabenteil a) wird auf einem Prozessor mit "<strong>de</strong>layed-branch"<br />

Technik ausgeführt, d.h. <strong>de</strong>r Prozessor führt <strong>de</strong>n ersten Befehl nach einem Branch immer<br />

aus. Sortieren Sie die Befehle um und nutzen Sie <strong>de</strong>layed-branch um möglichst alle Stalls<br />

zu vermei<strong>de</strong>n. Sie müssen dazu even<strong>tu</strong>ell Befehle än<strong>de</strong>rn, dürfen aber keine zusätzlichen<br />

Register verwen<strong>de</strong>n.<br />

1. ADDI R3, R0, #32<br />

2. loop: LW R2, (200)R3<br />

3. LW R4, (596)R3<br />

4. SUBI R3, R3, #4<br />

5. ADDI R2, R2, #1<br />

6. BNEZ R4, loop<br />

7. SW (404)R3, R2<br />

8. ADD R3, R0, R0


1.7 Gegeben ist folgen<strong>de</strong>r, aus <strong>de</strong>r Vorlesung bekannter, DLX-Prozessor mit Pipelining:<br />

rd<br />

rs1<br />

rs2<br />

32*32<br />

Registersatz rf<br />

temp<br />

temp1<br />

di<br />

a<br />

b<br />

ALU<br />

temp<br />

ar<br />

Datenspeicher<br />

di temp1<br />

temp<br />

temp1<br />

di<br />

imm<br />

temp<br />

temp1<br />

di<br />

b<br />

do<br />

Auf <strong>de</strong>r DLX wer<strong>de</strong>n nun die folgen<strong>de</strong>n Befehle ausgeführt. Gegeben Sie zu je<strong>de</strong>m Zeitpunkt die<br />

Werte <strong>de</strong>r Register (R1, R2, R3, temp, temp1, ar, di, do) und <strong>de</strong>r Steuersignale (rd, rs1, rs2) und von<br />

imm an. Än<strong>de</strong>rt sich <strong>de</strong>r alte Wert nicht, so kann das Feld leer gelassen wer<strong>de</strong>n.<br />

Zeitpunkt 1 2 3 4 5 6 7 8<br />

SW 100(R3), R1<br />

ADD R1, R2, R3<br />

SUB R2, R1, R3<br />

LW R1, 100(R3)<br />

IF ID EX MEM WB<br />

IF ID EX MEM WB<br />

IF ID EX MEM WB<br />

IF ID EX MEM WB<br />

R1<br />

R2<br />

R3<br />

temp<br />

temp1<br />

ar<br />

di<br />

do<br />

imm<br />

a<br />

2<br />

5<br />

4<br />

9 5<br />

9 5<br />

104 104<br />

2<br />

100 100<br />

4 5 2 4<br />

b 2 4 4 25<br />

9<br />

5<br />

2


1.8 Gegeben ist die folgen<strong>de</strong> Schal<strong>tu</strong>ng, die aus 2:1 Multiplexoren, ALUs und Registern besteht:<br />

r1<br />

+, &<br />

r4<br />

*<br />

r5<br />

r3<br />

+, &<br />

r2<br />

Geben Sie an, ob die folgen<strong>de</strong>n Operationen parallel auf <strong>de</strong>r Schal<strong>tu</strong>ng ausgeführt wer<strong>de</strong>n können:<br />

ausführbar<br />

nicht ausführbar<br />

(r5


2. Aufgabe 20 Punkte<br />

Realisieren Sie für <strong>de</strong>n 32-Bit DLX-Prozessor eine Assembler-Funktion, die zwei 16-Bit Zahlen<br />

multiplizieren kann.<br />

Für bei<strong>de</strong> Aufgabenteile gilt: Ihnen stehen alle Register zur Verfügung. Soweit nicht an<strong>de</strong>rs angegeben<br />

brauchen Sie keine Register zu retten. Alle verwen<strong>de</strong>ten Zahlen sind so gewählt, dass keine<br />

Überläufe auftreten können. Vermei<strong>de</strong>n Sie unnötige Befehle. Achten Sie auf die korrekte<br />

Beendigung Ihrer Funktionen!<br />

Bei<strong>de</strong> Aufgabenteile sind unabhängig voneinan<strong>de</strong>r lösbar!<br />

Die Mulitplikation funktioniert nach folgen<strong>de</strong>m Algorithmus:<br />

Res = 0;<br />

for i=0..15 do<br />

if (A[i] = 1) then<br />

Res = Res + B;<br />

end if;<br />

B = shiftleft(B,1);<br />

end for;<br />

a) Entwickeln Sie zunächst die Funktion pruefe_Ai. Diese dient zur Überprüfung <strong>de</strong>s<br />

Ausdrucks (A[i] = 1). Der Ausdruck dient zu Abfrage eines einzelnen Bits eines<br />

Registers. Die Variablen A und i wer<strong>de</strong>n in <strong>de</strong>n Registern R11 und R12 erwartet, das<br />

Ergebnis wird über Register R10 zurückgegeben. Entschei<strong>de</strong>n Sie selbst, ob Sie eine '1'<br />

o<strong>de</strong>r eine '0' zurückgegeben wenn <strong>de</strong>r Ausdruck wahr ist.<br />

Tipp: Die DLX-Befehle zum Schieben (SLL, SRL, SRA), für logische Operatoren (AND,<br />

OR, XOR) sowie die jeweiligen immediate-Version können helfen!<br />

pruefe_Ai:<br />

SRL R10, R11, R12<br />

ANDI R10, R10, #1<br />

JR R31<br />

% A um i-Stellen nach schieben<br />

% Und-Verknüpfung mit '1'<br />

% Gib eine '1' zurück wenn<br />

% A[i]='1' ist


) Realisieren Sie jetzt die Funktion multipliziere, die die bei<strong>de</strong>n Variablen A (steht in Register<br />

R1) und B (steht in Register R2) nach <strong>de</strong>m oben angegebenen Algorithmus multipliziert und<br />

das Ergebnis in Register R1 speichert:<br />

Vor <strong>de</strong>m Aufruf <strong>de</strong>r Funktion pruefe_Ai müssen Sie die Rücksprungadresse sichern.<br />

multipliziere:<br />

ADDI R11, R1, #0<br />

% Umkopieren von A<br />

ADD R1, R0, R0 % Res = 0<br />

ADD R12, R0, R0 % i = 0<br />

ADD R20, R31, R0<br />

% Register R31 retten<br />

Schleife: JAL Pruefe_ai<br />

% Funktionsaufruf<br />

BEQZ R10, Weiter<br />

ADD R1, R1, R2<br />

% B addieren<br />

Weiter: SLLI R2, R2, #1<br />

SGTI R3, R12, #15 % Abbruch wenn i>15<br />

BEQZ R3, En<strong>de</strong><br />

En<strong>de</strong>: ADD R31, R20, R0 % R31 wie<strong>de</strong>r herstellen<br />

JR R31


3. Aufgabe 20 Punkte<br />

Aufgabenteile 3.1 und 3.2. können unabhängig voneinan<strong>de</strong>r gelöst wer<strong>de</strong>n.<br />

3.1 Bestimmen Sie die Speicherzugriffe, die bei Ausführung <strong>de</strong>s folgen<strong>de</strong>n DLX-Assembler<br />

Programms notwendig sind, in<strong>de</strong>m Sie in Tabelle 2 die Hauptspeicheradresse und Zugriffsart<br />

eintragen. Der Inhalt <strong>de</strong>s Hauptspeichers vor Ausführung <strong>de</strong>s Programms ist in Tabelle 1<br />

dargestellt. Tragen Sie in die dritte Spalte <strong>de</strong>r Tabelle 1 <strong>de</strong>n neuen Inhalt ein.<br />

ADDI R1, R0, #8<br />

ADDI R2, R1, #4<br />

loop: LW R3, 00H (R1)<br />

LW R4, 00H (R2)<br />

ADD R5, R3, R4<br />

LW R5, 00H (R5)<br />

SW 00H (R5), R3<br />

SUBI R1, R1, #4<br />

SUBI R2, R2, #4<br />

BNEZ R1, loop<br />

Adresse (hex.) Inhalt (<strong>de</strong>z.) Neuer Inhalt<br />

0x00 14<br />

0x04 10<br />

0x08 30<br />

0x0C 6<br />

0x10 48 30<br />

0x14 2<br />

0x18 34<br />

0x1C 17 10<br />

0x20 4<br />

0x24 16<br />

0x28 28<br />

0x2C 27<br />

0x30 29<br />

Zugriff Adresse (hex) L/S<br />

1. 0x8 L<br />

2. 0xC L<br />

3. 0x24 L<br />

4. 0x10 S<br />

5. 0x4 L<br />

6. 0x8 L<br />

7. 0x28 L<br />

8. 0x1C S<br />

9.<br />

10.<br />

11.<br />

12.<br />

13.<br />

14.<br />

15.<br />

16.<br />

Tabelle 1: Auszug aus Hauptspeicher Aufgabenteil 3.1 Tabelle 2: Speicherzugriffe Aufgabenteil 3.1


3.2 Auf einem Rechner soll ein hier nicht näher beschriebenes Programm ausgeführt wer<strong>de</strong>n, bei<br />

<strong>de</strong>m die unten in <strong>de</strong>r Tabelle 3 angegebenen Speicherzugriffe ausgeführt wer<strong>de</strong>n. Der Inhalt <strong>de</strong>r für<br />

die Aufgabe relevanten Speicherstellen vor Beginn <strong>de</strong>r Programmausführung ist in Tabelle 4<br />

angegeben. Der Hauptspeicher mit 2 8 -Byte Speicherkapazität ist byte-adressiert und wortorganisiert<br />

bei einer Wortgröße von 4 Byte. Die Speicheradressen sind damit 8-Bit breit.<br />

Vorgeschaltet ist ein 2-Wege-assoziativer Cache mit 64-Byte Datenkapazität bei einer Blockgröße<br />

von 8 Byte (siehe Tabelle 5). Die Schreib-Strategie <strong>de</strong>s Caches ist write-through und write-notallocate.<br />

Es wird die least recently used (LRU)-Strategie benutzt, um Daten in <strong>de</strong>n Sektoren <strong>de</strong>s 2-<br />

Wege-assoziativen Caches zu ersetzen. Das heißt, <strong>de</strong>r Block, auf <strong>de</strong>m am längsten nicht zugegriffen<br />

wur<strong>de</strong>, wird ersetzt.<br />

Notation und Hinweis: Eine LRU-Warteschlange wird beispielsweise als „01“ notiert. Dabei<br />

bezeichnet die Zahl am rechten Rand (im Beispiel „1“) das älteste Element, das als erstes ersetzt<br />

wird. Fin<strong>de</strong>t nun ein Zugriff auf Block „1“ statt, wird die Warteschlange zu „10“ ak<strong>tu</strong>alisiert.<br />

Adressen sind hexa<strong>de</strong>zimal, <strong>de</strong>r Inhalt <strong>de</strong>zimal angegeben!<br />

Simulieren Sie nun die Speicherzugriffe und tragen Sie die Än<strong>de</strong>rungen in Tabelle 4 und Tabelle 5<br />

ein. Insbeson<strong>de</strong>re müssen die LRU-Warteschlangen ak<strong>tu</strong>alisiert wer<strong>de</strong>n. Bestimmen Sie weiter<br />

durch ankreuzen in Tabelle 3, ob ein Cache-Hit o<strong>de</strong>r Cache-Miss vorliegt. Adressen sind<br />

hexa<strong>de</strong>zimal, Daten <strong>de</strong>zimal anzugeben.<br />

Adresse Tag (3 Bit) In<strong>de</strong>x (2 Bit) Offset (1 Bit) Zugriffsart Daten Hit Miss<br />

1. 0x24 1 0 1 read<br />

X<br />

2. 0x30 1 2 0 write 23 X<br />

3. 0x0C 0 1 1 read<br />

X<br />

4. 0x18 0 3 0 write 42 X<br />

5. 0x34 1 2 1 read<br />

X<br />

Tabelle 3: Speicherzugriffe Aufgabenteil 3.2<br />

Adresse Inhalt neuer Inhalt Adresse Inhalt neuer Inhalt<br />

0x00 99 0x20 123<br />

0x04 36 0x24 124<br />

0x08 32 0x28 13<br />

0x0C 17 0x2C 19<br />

0x10 15 0x30 17 23<br />

0x14 16 0x34 4<br />

0x18 23 42 0x38 10<br />

0x1C 24 0x3C 20<br />

Tabelle 4: Auszug aus Hauptspeicherinhalt vor Ausführung <strong>de</strong>s Programms<br />

Der Cache vor <strong>de</strong>m Ausführen <strong>de</strong>r in Tabelle 3 angegebenen Zugriffe.<br />

Sektor 0 Sektor 1<br />

LRU-Queue<br />

In<strong>de</strong>x Tag Offset 0 Offset 1 Tag Offset 0 Offset 1<br />

0 1 123 124 0 99 36 10<br />

1 3 41 44 1 13 19 01<br />

2 2 111 141 0 15 16 01<br />

3 0 23 24 3 17 19 01


1) Der Cache nach <strong>de</strong>m 1. Zugriff. Tragen Sie nur die Än<strong>de</strong>rungen ein.<br />

Sektor 0 Sektor 1<br />

In<strong>de</strong>x Tag Offset 0 Offset 1 Tag Offset 0 Offset 1<br />

0 01<br />

1<br />

2<br />

3<br />

LRU-Queue<br />

2) Der Cache nach <strong>de</strong>m 2. Zugriff. Tragen Sie nur die Än<strong>de</strong>rungen ein.<br />

Sektor 0 Sektor 1<br />

In<strong>de</strong>x Tag Offset 0 Offset 1 Tag Offset 0 Offset 1<br />

0<br />

1<br />

2<br />

3<br />

LRU-Queue<br />

3) Der Cache nach <strong>de</strong>m 3. Zugriff. Tragen Sie nur die Än<strong>de</strong>rungen ein.<br />

Sektor 0 Sektor 1<br />

LRU-Queue<br />

In<strong>de</strong>x Tag Offset 0 Offset 1 Tag Offset 0 Offset 1<br />

0<br />

1 0 32 17 10<br />

2<br />

3<br />

4) Der Cache nach <strong>de</strong>m 4. Zugriff. Tragen Sie nur die Än<strong>de</strong>rungen ein.<br />

Sektor 0 Sektor 1<br />

LRU-Queue<br />

In<strong>de</strong>x Tag Offset 0 Offset 1 Tag Offset 0 Offset 1<br />

0<br />

1<br />

2<br />

3 0 42 24 01<br />

5) Der Cache nach <strong>de</strong>m 5. Zugriff. Tragen Sie nur die Än<strong>de</strong>rungen ein.<br />

Sektor 0 Sektor 1<br />

LRU-Queue<br />

In<strong>de</strong>x Tag Offset 0 Offset 1 Tag Offset 0 Offset 1<br />

0<br />

1<br />

2 1 23 4 10<br />

3<br />

Tabellen 5: Cache


4. Aufgabe 20 Punkte<br />

Gegeben ist <strong>de</strong>r folgen<strong>de</strong> Statechart. Er startet im Zustand A. Die Berechnung wird mit <strong>de</strong>m Signal<br />

start begonnen. Nach <strong>de</strong>m vierten Taktschritt steht das Ergebnis in Register y1. Die Kontrolllogik<br />

sen<strong>de</strong>t so lange das Signal ready = 1 bis eine neue Berechnung gestartet wird.<br />

start=0<br />

ready


a0 a1 a2 a3 x0 x1 x2 x3<br />

s03<br />

s13<br />

00 01 10 11<br />

s04<br />

s14<br />

00 01 10 11<br />

s1<br />

0 1<br />

0 1 s2<br />

0 1 s5<br />

alu1 ALU<br />

alu2 ALU<br />

><br />

VGL<br />

e1<br />

e2<br />

y1<br />

y2<br />

Verwen<strong>de</strong>n Sie die folgen<strong>de</strong>n Multiplexoren. Ersetzen Sie X entsprechend durch eine fortlaufen<strong>de</strong><br />

Nummer.<br />

sX<br />

0 1<br />

s0X<br />

s1X<br />

00 01 10 11


) Geben Sie an, wie die Steuersignale <strong>de</strong>r Multiplexoren und Register in <strong>de</strong>n verschie<strong>de</strong>nen<br />

Zustän<strong>de</strong>n gesetzt wer<strong>de</strong>n müssen, damit Ihr entwickelter Datenpfad die jeweiligen parallelen<br />

Registertransfers berechnet. Tragen Sie dazu in die Tabelle zu je<strong>de</strong>m parallelen Transfer die<br />

Belegung <strong>de</strong>r Steuersignale ein. Verwen<strong>de</strong>n Sie für die Multiplexorsignale Ihre Bezeichnungen<br />

aus Teil a). Verwen<strong>de</strong>n Sie soweit möglich Don`t Care-Werte.<br />

Transfer<br />

alu1 alu2 e1 e2<br />

Multiplexorsteuersignale<br />

s1 s2 s03 s13 s04 s14 s5<br />

y1

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!