La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ottimizzazione statica del codice per processori pipelined Canella Matteo & Miglioli Filippo.

Presentazioni simili


Presentazione sul tema: "Ottimizzazione statica del codice per processori pipelined Canella Matteo & Miglioli Filippo."— Transcript della presentazione:

1 Ottimizzazione statica del codice per processori pipelined Canella Matteo & Miglioli Filippo

2 Lo scopo Scopo dellesperienza è quello di ottimizzare staticamente il codice di un programma in linguaggio assembly DLX. Per fare questo si è utilizzato il simulatore WinDLX, che permette la visualizzazione della pipeline, dei registri interni, della memoria e dello stato di esecuzione delle singole istruzioni.

3 I programmi test Per lesercitazione sono stati implementati due programmi. Il primo, più semplice, esegue una moltiplicazione di due numeri mediante somme parziali. Il secondo realizza lordinamento di un vettore di interi in memoria.

4 Il primo programma È riportata a fianco la schematizzazione in metalinguaggio del primo programma. Le variabili A e B sono i due moltiplicandi. C viene utilizzata come variabile di supporto nella quale viene memorizzato il risultato parziale. Viene sommato A a se stesso B volte. C = 0; WHILE B > 0 DO C = C + A; B = B – 1; END_WHILE END. r

5 Il primo programma Vediamo ora come è stato realizzato in assembly. I due operandi vengono memorizzati in due locazioni di memoria successive, la prima delle quali puntata dal registro R1. Il risultato delloperazione viene riscritto sulla locazione puntata da R1. LB R2, 0(R1) ;LEGGI A LB R3, -15(R1) ;LEGGI B LB R4,#0 BEQZ R3, FINE LOOP:ADD R4,R2,R4 SUBUI R3,R3,#1 BNEZ R3,LOOP SB 0(R1),R4 FINE:TRAP 0

6 Simulazione primo programma In figura vediamo il clock cycle diagram della parte del programma interessata da stalli. Si notano due stalli. 1° Stallo: Il branch è condizionato dal valore del registro R3. Tale valore è caricato nel registro dalla memoria mediante listruzione LB. Il processore ritarda il decode del branch (stallando la pipeline) perché il valore di R3 è disponibile solo dopo laccesso in memoria dellistruzione LB. Non è necessario attendere il Write Back perché è presente un feedback che rende il dato subito disponibile. 2° Stallo: il branch necessita del valore di R3, che però è disponibile solo dopo la fase di Execute dellistruzione precedente (SUBUI). Il processore quindi introduce un ciclo di stallo. Anche in questo caso viene utilizzato il meccanismo del feedback, non occorre attendere il WB sui registri. Si nota inoltre un ciclo perso dopo il branch, questo perché il simulatore usa una politica Predict Untaken, cioè esegue il fetch dellistruzione successiva prima di sapere se il salto verrà fatto.

7 Simulazione primo programma Sono stati inseriti nelle locazioni di memorie 0x000000ff e 0x000000f0 gli operandi, nellesempio 3 e 4. Come si vede, il risultato (0x0c) viene memorizzato nella locazione 0x000000ff. Lesecuzione di questo codice richiede 25 Clock Cycles.

8 Ottimizzazione primo programma 1° Stallo: il primo conflitto è stato risolto invertendo le due istruzioni di lettura in memoria (LB) in modo tale che il registro R3 sia pronto per listruzione di branch. LB R3, -15(R1) LB R2, 0(R1) LB R4,#0 BEQZ R3, FINE LOOP:SUBUI R3,R3,#1 ADD R4,R2,R4 BNEZ R3,LOOP SB 0(R1),R4 FINE:TRAP 0 2° Stallo: è stato risolto spostando il decremento di R3 sopra lADD.

9 Ottimizzazione primo programma Vediamo che sono stati risolti tutti i conflitti. Lunico ciclo perso rimane quello dopo il branch. Questo problema non si può risolvere se non utilizzando una politica branch delayed, non supportata dal simulatore WinDLX. Lesecuzione di questo codice richiede 21 Clock Cycles.

10 Il secondo programma FOR I = INIZ TO (INIZ + LUNG - 1) FOR J = I + 1 TO (INIZ + LUNG) IF A[I] > A[J] THEN SOS = A[J]; A[J] = A[I]; A[I] = SOS; END_IF; A lato è riportata la schematizzazione in metalinguaggio. Scopo del programma è ordinare un vettore di interi (A) contenuto in memoria a partire dalla locazione INIZ e di lunghezza LUNG.

11 Il secondo programma LOOP:LB R8,0(R1) ;R1 PUNTATORE ALLA PRIMA LOCAZIONE SUBI R4,R1,#15 ;R4 PUNTA ALLA LOCAZIONE SUCCESSIVA R1 SUBI R7,R2,#1 ;R7 È IL CONTATORE DEL LOOP SECONDARIO LOOP1:LB R9,0(R4) SLEU R5,R8,R9 ;R8 E MINORE UGUALE DI R9? BNEZ R5,DOPO ;SE SI SALTA A DOPO SB 0(R10),R8 ;SCAMBIO R8 CON R9 SE R8 È MAGGIORE DI R9 SB 8(R10),R9 ;LA LOCAZIONE PUNTATA DA R10 E LA SUCCESSIVA LB R9,0(R10) ;SERVONO COME SUPPORTI PER LO SCAMBIO LB R8,8(R10) SB 0(R1),R8 ;SCRITTURA IN MEMORIA DEI DATI SCAMBIATI. SB 0(R4),R9 DOPO:SUBI R4,R4,#15 SUBI R7,R7,#1 BNEZ R7,LOOP1 SUBI R1,R1,#15 SUBI R2,R2,#1 ;R2 È LA DIMENSIONE DELL'ARRAY, SERVE COME SUBI R11,R2,#1 ;CONTATORE BNEZ R11,LOOP TRAP 0 R1 punta alla prima locazione di memoria (corrispondente alla variabile INIZ in metalinguaggio). R4 punta alla locazione di memoria successiva. R2 contiene la lunghezza del vettore (LUNG). Il programma esegue dei confronti (SLEU) e degli scambi (utilizzando due locazioni di supporto) fino ad ordinare lintero vettore.

12 Simulazione secondo programma 1° Stallo: Listruzione di confronto SLEU aspetta che venga caricata nel registro R9 il contenuto della locazione puntata da R4. Questo causa uno stallo nella pipeline. 2° Stallo: Il branch condizionato aspetta R5, contenente il risultato del confronto. Notiamo due cicli di stallo: il primo è causato dallistruzione precedente (SLEU), il secondo è quello relativo allistruzione branch. Senza lottimizzazione, il programma viene eseguito in 188 cicli di clock

13 Ottimizzazione secondo programma LOOP:LB R8,0(R1) SUBI R4,R1,#15 SUBI R7,R2,#1 LOOP1:LB R9,0(R4) SLEU R5,R8,R9 BNEZ R5,DOPO SB 0(R10),R8 SB 8(R10),R9 LB R9,0(R10) LB R8,8(R10) SB 0(R1),R8 SB 0(R4),R9 DOPO:SUBI R4,R4,#15 BNEZ R7,LOOP1 SUBI R1,R1,#15 SUBI R2,R2,#1 SUBI R11,R2,#1 BNEZ R11,LOOP TRAP 0 SUBI R7,R7,#1 Soluzione 1° stallo: listruzione SUBI R7,R7,#1 che veniva eseguita alla fine ciclo interno LOOP1, appena prima del branch, viene spostata allinizio del ciclo, in modo da porsi tra le due istruzioni che provocavano lo stallo. E possibile fare questo spostamento in quanto è indifferente eseguire il decremento del contatore allinizio o alla fine del loop. Lesecuzione richiede così 168 clock cycle.

14 Ottimizzazione secondo programma LOOP:LB R8,0(R1) SUBI R4,R1,#15 SUBI R7,R2,#1 LOOP1:LB R9,0(R4) SUBI R7,R7,#1 SLEU R5,R8,R9 BNEZ R5,DOPO SB 0(R10),R8 SB 8(R10),R9 LB R9,0(R10) LB R8,8(R10) SB 0(R1),R8 SB 15(R4),R9 DOPO: BNEZ R7,LOOP1 SUBI R1,R1,#15 SUBI R2,R2,#1 SUBI R11,R2,#1 BNEZ R11,LOOP TRAP 0 SUBI R4,R4,#15 Soluzione 2° stallo: lo spostamento del puntatore alla memoria R4 verso la cella successiva che veniva fatto alla fine del ciclo interno, può essere spostato allinizio di esso. Viene cioè messo tra le due istruzioni che provocavano lo stallo. E necessario modificare loffset di accesso alla cella puntata dal registro R4 nellistruzione che riscrive in memoria i dati cambiati. Questo perché ho decrementato R4 prima di usarlo. Lesecuzione richiede così 158 clock cycle

15 Simulazione secondo programma 3° Stallo: nello scambio delle due celle di memoria, listruzione di scrittura SB che venga scritto il contenuto del registro R8 dallistruzione precedente. Questo provoca uno stallo. 4° Stallo: il branch aspetta la fine dellistruzione di decremento del registro R8, provocando uno stallo nella pipeline

16 Ottimizzazione secondo programma LOOP:LB R8,0(R1) SUBI R4,R1,#15 SUBI R7,R2,#1 LOOP1:LB R9,0(R4) SUBI R7,R7,#1 SLEU R5,R8,R9 SUBI R4,R4,#15 BNEZ R5,DOPO SB 0(R10),R8 SB 8(R10),R9 LB R9,0(R10) LB R8,8(R10) SB 0(R1),R8 SB 15(R4),R9 DOPO:BNEZ R7,LOOP1 SUBI R1,R1,#15 SUBI R2,R2,#1 SUBI R11,R2,#1 BNEZ R11,LOOP TRAP 0 SB 15(R4),R9 SB 0(R1),R8 Soluzione 3° stallo: Vengono scambiate le due istruzioni di scrittura in memoria (SB) dei registri scambiati (R8, R9). Il programma impiega così 151 cicli di clock

17 Ottimizzazione secondo programma LOOP:LB R8,0(R1) SUBI R4,R1,#15 SUBI R7,R2,#1 LOOP1:LB R9,0(R4) SUBI R7,R7,#1 SLEU R5,R8,R9 SUBI R4,R4,#15 BNEZ R5,DOPO SB 8(R10),R9 SB 0(R10),R8 LB R9,0(R10) LB R8,8(R10) SB 15(R4),R9 SB 0(R1),R8 DOPO:BNEZ R7,LOOP1 SUBI R1,R1,#15 SUBI R2,R2,#1 SUBI R11,R2,#1 BNEZ R11,LOOP TRAP 0 SUBI R1,R1,#15 Soluzione 4° stallo: sposto il decremento del puntatore R1 prima del branch. Ho risolto così tutti gli stalli. Il programma ottimizzato viene eseguito in 147 cicli di clock, cioè 41 cicli in meno della versione non ottimizzata.

18 Simulazione secondo programmma Vediamo a lato leffetto dellordinamento in memoria. Il vettore parte dallindirizzo 0xff e occupa 5 posizioni. Vediamo che il vettore [7,1,5,3,2] diventa [1,2,3,5,7], ordinato.


Scaricare ppt "Ottimizzazione statica del codice per processori pipelined Canella Matteo & Miglioli Filippo."

Presentazioni simili


Annunci Google