CRITICITA' SUI  DATI

 

RAW hazards.

1. Windlx li riporta nelle statistiche quando il forwarding è disabilitato.

E' il classico tipo di RAW hazard, può accadere innumerevoli volte e non si può lasciare al compilatore la risoluzione di tutti questi casi (il compilatore inserirebbe, quando possibile, un'altra istruzione fra le due add) .

Per risolvere questo hazard basta abilitare il forwarding:

Forwarding disabilitato
add      r1, r2, r3
add      r4, r1, r2
Forwarding abilitato

 

2.  LD Stalls

Lo stallo è causato dall'istruzione load.

lw      r1, 4(r3)
sw     0(r1), r2

 

3. Branch/Jump instruction.

Questo caso è simile al punto 1, però non può essere risolto allo stesso modo. Infatti l'istruzione beqz richiede di conoscere il valore di r1 nello stadio ID (decodifica delle istruzioni e lettura da register file).

add       r1, r2, r3
beqz     r1, Finish

 

4. Floating point instruction.

Caso a.

Un'istruzione dipende dal risultato di un'istruzione precedente che, a causa del ritardo dovuto all'unità di elaborazione floating-point, non ha ancora finito lo stadio che coinvolge la ALU. In questo caso gli stalli dipendono essenzialmente dal tipo di operazione che deve essere svolta (ovvero dalla durata dell'operazione) e quindi possono propagarsi anche per molte istruzioni successive.

Windlx assume come default i seguenti valori:
Addition unit    2
Multiplication unit   5
Division unit    19

Esempio di una mult (l'hazard si propaga per 5 cicli):

multu      r5, r11, r12 
addi       r1, r1, 1
add        r1, r2, r2
add        r1, r2, r5

 

Caso b.

L'istruzione fp si trova a passare allo stadio MEM nello stesso ciclo di clock di un'istruzione intera, in questo caso (almeno per ciò che riguarda WinDlx), l'istruzione fp ha la precedenza. (ricordo che addf richiede due cicli per la ALU)

addf      f5, f11, f12 
add       r1, r2, r2

 

Caso c.

In questo caso la situazione è un po' più strana in quanto quello della terza istruzione non è uno stallo vero e proprio. Lo stallo si propaga dalla prima istruzione: quando la terza dovrebbe entrare nello stadio della ALU lo trova già occupato dalla seconda. Ma quello che voglio far notare è che se la terza istruzione usasse l'unità floating-point potrebbe andare avanti regolarmente!   

addf          f5, f11, f12 
movi2fp   f1, r1
cvti2d      f10, f10

 

 

WAW  hazards.

 

Questo tipo di stalli possono avvenire soltanto in pipelines che possono scrivere  (WB stage) in più di uno stadio: nel caso di WinDlx ciò non è possibile.

Si possono comunque verificare con istruzioni floating-point, ad esempio:

multf      f5, f11, f12
addf       f5, f1, f1

Vengono inseriti ben 4 stalli, ma se ciò non avvenisse la multf scriverebbe in f5 un valore incoerente con quello che ci si aspetterebbe dal normale flusso del programma.