Domanda

Ho il seguente codice MIPS e sto cercando di riscrivere/riordinare il codice in modo da poter ridurre il numero di nop Istruzioni necessarie per una corretta esecuzione pipeline mentre si preserva la correttezza. Si presume che il Datapath non sia né banda né in avanti. Il problema fornisce due suggerimenti: ci ricorda che i rami e i salti sono ritardati e necessitano che i loro slot di ritardo riempiti e suggeriscono di aver sfacciato il valore di offset nelle istruzioni di accesso alla memoria (LW, SW) quando necessario.

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

È abbastanza ovvio per me che questo codice aumenta il contenuto di un array e lo memorizza in un altro array. Quindi non vedo esattamente come potrei riorganizzare questo codice poiché gli indici devono essere calcolati prima di completare il ciclo.

La mia ipotesi sarebbe spostare il lw Istruzioni dopo l'istruzione di ramo poiché (per quanto ho capito) l'istruzione nello slot di ritardo viene sempre eseguita. Poi di nuovo, non capisco bene questo argomento e apprezzerei un'esplorazione. Capisco il pipelining in generale, ma non tanto ramificata ritardata. Grazie

È stato utile?

Soluzione

Un modo per riempire lo slot di ritardo del ramo sarebbe:

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

Altri suggerimenti

In termini di secondo suggerimento:

Rendi la 4a istruzione il 2 °. Può essere pipellato in (dopo l'ID della prima istruzione, se si utilizza la terminologia P/H) mentre la prima è ancora eseguita. Quindi fai l'offset nella (vecchia) 3a istruzione 496 invece di 500. Presumo che tu vedrai ora perché?

Per quanto riguarda il primo suggerimento, non ho troppo familiarità con l'esecuzione esattamente dei rami ritardati (non implementati su SPIM, quindi non mi importava). La vecchia ultima istruzione può probabilmente essere fatta per il secondo a quando indica il nome "ritardato", ma non potrei dirti come e perché.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top