Übungsblatt 2
Institut für Rechnerentwurf und Fehlertoleranz
Sommersemester 1998
| |
Die Besprechung dieses Übungsblattes findet am Donnerstag, den
14. Mai 1997 um 14.00 Uhr im Tulla-Hörsaal statt. Die Musterlösung ist nach der Übung
im WWW zu finden.
2. Übungsblatt zur Vorlesung Rechnerstrukturen
Für die nachfolgenden beiden Aufgaben wird im folgenden eine
vereinfachte RISC-Maschine definiert. Sie verfüge über acht
globale Register R0-R7 (dabei ist das Register R0
mit 0 und das Register R1 mit 1 belegt) und über achtzig
weitere Register als Umlaufspeicher für die überlappenden
Registerfenster. Ein Fenster umfasse acht "in"-Register
R8-R15, acht lokale Register R16-R23 und acht
"out"-Register R24-R31. Die Maschine besitze außerdem
ein Statusregister SR , den Befehlszähler PC
und ein Register für den Zeiger auf das aktuelle Registerfenster
CWP. Die einzelnen Befehle werden in einer fünfstufigen
Befehls-Pipeline verarbeitet. (Befehl-Holen, Befehl-Dekodieren,
Operand-Holen, Operation-Ausführen, und Operand-Speichern). Dabei
wird in der 2. Hälfte des Taktes von Stufe 5 gespeichert und in
der 1. Hälfte des Taktes von Stufe 3 geladen. Der
Befehlszähler wird bei allen Sprungbefehlen in der 2. Hälfte
des Taktes in Stufe 4 geändert. Der Zeiger auf des aktuelle
Registerfenster wird ebenfalls in der 4. Stufe geändert (bei den
Unterprogrammbefehlen CALL und RET). In den
folgenden Tabellen sind die Befehle des Prozessors angegeben. Die
Semantik wird durch Pseudo-C-Code dargestellt. Dabei bezeichnet
Ri ein Register, Addr eine Adresse, Val
eine Konstante und Cond eine Bedingung.
|
Ladebefehle
|
| LDC Val, Ri |
Ri = Val |
| LOAD Ri, Rj |
Rj = *Ri |
| LOAD Addr, Ri |
Ri = *Addr |
| STORE Ri, Rj |
*Rj = Ri |
| STORE Ri, Addr |
*Addr = Ri |
|
Arithmetische Befehle
|
| ADD Ri, Rj, Rk |
Rk = Ri + Rj |
| SUB Ri, Rj, Rk |
Rk = Ri - Rj |
| MUL Ri, Rj, Rk |
Rk = Ri * Rj |
| OR Ri, Rj, Rk |
Rk = Ri | Rj |
| AND Ri, Rj, Rk |
Rk = Ri & Rj |
| NOT Ri, Rj |
Rj = ~ Ri |
|
Vergleichsbefehl
|
| CMP Ri, Rj |
SR = Ri - Rj |
|
Sprungbefehle
|
| JMP Cond, Addr |
if( Cond ) PC = Addr |
| CALL Ri, Addr |
Ri = PC; PC = Addr; CWP-- |
| RET Ri |
PC = Ri; CWP++ |
|
Bedingungen für JMP
|
| T | true |
| F | false |
| LT | SR < 0 |
| LE | SR <= 0 |
| GT | SR > 0 |
| GE | SR >= 0 |
| Z | SR == 0 |
1. Aufgabe (RISC-Rechner)
-
Eine mögliche Definition für die (ganzzahlige positive)
Binomialfunkion n über k lautet:
| / |
1 | wenn k == 0 |
| bin( n, k ) := | { | 0 | wenn n < k |
| \ | bin( n - 1, k ) + bin( n - 1, k - 1 ) | sonst |
Schreiben Sie für die gegebene Funktion bin( n, k ) ein
Programm für den gegebenen RISC-Prozessor. Die Parameter
n und k sollen vom aufrufenden Assemblerprogramm in
den Registern R25 bzw. R26 übergeben werden und
das Ergebnis soll nach Abarbeitung des Algorithmus im Register
R27 sein. Das Register R24 diene zur Aufnahme der
Rückkehradresse bei Unterprogrammaufrufen.
- Testen Sie Ihr Programm für bin( 2, 1 ) auf dem
Papier und zeichnen Sie sich die Fensterwechsel für diesen
Testlauf auf. Trennen Sie die einzelnen Registertypen voneinander und
machen Sie sich die Überlappung der einzelnen Registerfenster
klar, indem Sie die Fenster in zeitlicher Reihenfolge untereinander
anordnen und dieselben Register auf dieselbe Spalte ausrichten. Die
Inhalte der verwendeten Register sollen in die Fenster eingetragen
werden.
- Für wieviele Rekursionen reicht die Gesamtanzahl der Register
aus? Was passiert bei zu großen Argumenten? Welche Techniken
könnten Sie sich vorstellen, um auch größere
Rekursionstiefen zu ermöglichen?
- Treten bei der Abarbeitung Ihres Programms Pipeline-Konflikte auf?
Stellen Sie diese Konflikte dar.
- Auf welche Weise könnte man die Konflikte aus der vorigen
Teilaufgabe beheben? Führen Sie die entsprechenden Korrekturen
aus.
2. Aufgabe (Pipelining)
Auf dem oben angegeben Prozessor soll ein Programm ausgeführt
werden. Dabei gelten die folgenden Modifikationen:
- In der 3. Stufe wird der Operand in der zweiten Hälfte des
Taktes gelesen.
- In der 5. Stufe wird der Operand in der ersten Hälfte des
Taktes gespeichert.
Die folgende Codesequenz enthält noch Pipelinekonflikte, welche
die in den Kommentaren angedeutete Arbeitsweise der einzelnen Befehle
beeinflussen. Die Adressen a, b, c, vier und erg
bezeichnen Variablen im Speicher, welche bereits geeignet
initialisiert sind.
max: LOAD b, R2 ; R2 = *b
MUL R2, R2, R2 ; R2 *= R2
LOAD vier, R3 ; R3 = *vier
LOAD a, R4 ; R4 = *a
MUL R3, R4, R3 ; R3 *= R4
LOAD c, R4 ; R4 = *c
MUL R3, R4, R3 ; R3 *= R4
CMP R2, R3 ; ST = R2 - R3
JMP GE, high ; if ( ST >= 0 ) goto high
low: ADD R0, R0, R2 ; R2 = 0
JMP T, join ; goto join
high: SUB R2, R3, R2 ; R2 -= R3
join: STORE R2, erg ; *erg = R2
- Welcher Ausdruck soll (nach den Kommentaren) für
erg berechnet werden?
- Finden Sie eine Assembler-Anweisung, mit der ein NOP-Befehl
realisiert werden kann, und lösen Sie alle Pipelinekonflikte
durch das Einfügen einer minimalen Anzahl von NOP-Befehlen auf.
- Optimieren Sie dieses mit NOPs ergänzte Programm weiter,
indem Sie durch Verschiebung von Anweisungen NOP-Befehle einsparen.
3. Kontrollfragen
Das folgende sind Fragen zu Stichworten des bisher behandelten
Stoffs. Sie sollen dazu dienen, das eigene Wissen zu
überprüfen und dazu anregen, die entsprechenden Kapitel im
Skript noch einmal aufzuschlagen.
- In welche fünf Phasen kann man die Befehlsausführung im
allgemeinen zerlegen?
- Was sind die charakteristischen Eigenschaften einer
RISC-Architektur?
- Warum benötigen RISC-Rechner mehr Register als CISC-Rechner?
- Können die von CISC-Rechnern bekannten Adressierungsarten
auch mit den wenigen Adressierungsarten der RISC-Rechner realisiert
werden?
- Welche Pipelinekonfikte gibt es und wie können diese
umgangen werden?
- Worin besteht der Unterschied zwischen Superpipeline-Prozessoren
und superskalaren Prozessoren?
- Warum ist der Compilerbau für VLIW-Maschinen aufwendiger als
für superskalare Prozessoren?
- Was versteht man unter der Effizienz eines Pipeline-Prozessors ?
- Unter welchen Bedingungen ist ein Pipeline-Prozessor von der
Bearbeitungszeit her günstiger als ein serieller Prozessor ?
Sebastian Wilhelmi
<wilhelmi@ira.uka.de>
Informatikgebäude am Schloß, Raum 263
Telefon: 608-4353
Sprechstunde: Dienstags 9.00-11.00 Uhr