Per il terzo esercizio invece devi considerare le fasi di esecuzioni, in presenza di pipelining:
ISTR1 if id ex mem wb
ISTR2 if id ex mem wb
Considerando che normalmente gli operandi vengono caricati nella fase di ID e il risultato viene scritto nella fase di WB, se abbiamo una DIPENDENZA DI DATI (l'operando della seconda istruzione è il risultato della prima) allora l'esecusione della seconda sarà:
ISTR2 if - - - id ex mem wb
e quindi ci saranno tre stalli!
Se invece c'è il DATA FORWARDING, allora i dati verranno campionati tramite un bus subito dopo l'uscita dell'ALU (alla fine della fase EX) e quindi saranno già disponibili per l'istruzione 2:
ISTR2 if - id ex mem wb
e quindi possiamo ridurre gli stalli ad uno solo!
La 5 è teorica quindi non saprei cosa dirti, spero di aver tempo per studiarla domani
La 9 invece non penso ci sia proprio una formula, devi andare di ragionamento..
Partendo dal presupposto che conosci il funzionamento della cache (copiare alcune parti della ram), sai che devi leggere 1000 parole di un'array ma -invece di copiare dalla ram parola per parola- ogni volta copi l'intero blocco di 8 parole. Essendo la lettura sequenziale, sarà:
1 parola-> non presente (copio anche le 7 parole successive nella ram)
2-3-4-5-6-7 parola -> già caricate in cache (caricate insieme alla prima parola)
8 parola-> non presente (copio anche le 7 parole successive nella ram)
e così via .. quindi ogni 8 parole, devi copiare un blocco di otto parole in cache (o in altre parole, hai una possibilità su 8 di avere un cache miss) e quindi il miss-rate = 1/8= 0.125= 12.5%
Per la seconda lettura dell'array invece, avendo una politica LRU e leggendo nuovamente l'array dalla prima all'ultima parola, ad ogni nuovo blocco di parole caricato in cache, sarà necessario sovrascrivere un vecchio blocco .. e quindi non abbiamo alcun miglioramente, il miss-rate rimane il 12.5%
@Spartan, almeno mi faccio un bel ripasso
ma quali intendi tu?