Performance

MIPS

Pseudoinstruktionen

move $t0, $t1       ->  add $t0, $t1, $zero

blt $t1, t2, label  ->  slt $at, $t1, $t2
                        bne $at, $zero, $label

bne $t1, $t2, far_l ->  beq $t1, $t2, tmp_l
                        j far_l
                        tmp_l: ...

li $t1, imm         ->  ori $t1, $zero, imm

load_long $t1, imm  ->  lui $t1, imm_high
                        ori $t1, $t1, imm_low

Stack

stack

Overflow

Steuerwerk

ALU

0000 = and
0001 = or
0010 = add
0110 = subtract
0111 = slt
1100 = nor

???

Pipelines

Strukturkonflikte

Datenabhängigkeit

add       $t1, $t2, $t3
#          v    
addi $t1, $t1, 1
#     v
sw   $t1, 4($s2)

Data Hazards treten auf, wenn Abhängigkeiten zu dicht auf einander folgen.

# RAW WAW WAR RAR
Hazard? ja ja ja nein
Typ echte Abh. Ausgabeabh. Anti Abh. -
Pipeline? ja maybe beim umsortieren -

NOPs einfügen

Operand forwarding

LW, dann Register lesen verursacht immer noch Hazard!

STALL oder besser: Umordnen von Code


Dynamisches Pipeline Scheduling

In Order falls möglich, sonst queue

-> WAR und WAW Hazards

Kontrollflusskonflikte

bei branches: wo steht der nächste Befehl

Branch Prediction

Dynamische Sprungvorhersage:

Vorhersage muss zwei mal falsch sein, damit übernommen wird.

Branch Target Buffer (wie Cache)

Superskalare MIPS

ALU Datatransfere
- lw
addi -
add -
bne sw

Caching



Direct Mapped Cache

Lesen

hit miss
easy stall, schreiben, erneut lesen

Schreiben

-> Daten inkonsistent mit Hauptspeicher

Write Through Write Back
gleichzeitig schreiben dirty bit
-* read miss

*mit Buffer -> read miss & buffer nicht leer

Cache Types

Fully Associative

Set Associative / n-way set-associative

Verdrängungsstrategien