Musterlösung - Rs.tu-darmstadt.de
Musterlösung - Rs.tu-darmstadt.de
Musterlösung - Rs.tu-darmstadt.de
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