ESERIZIO 1 Sia dato il seguente ciclo di un programma in linguaggio ad alto livello: do { BASE[i] = BASEA[i] + BASEB[i] + IN1 + IN2; i++; } while (i!= N) Il programma sia stato compilato nel seguente codice assembly MIPS. Si supponga che i registri $4, e $7 siano stati inizializzati rispettivamente ai valori 0 e 4N. I simboli BASEA, BASEB e BASE sono costanti a 16 bit, prefissate. Il ciclo di clock del processore vale 2 ns. L1: lw $2, BASEA ($4) addi $2, $2, IN1 lw $3, BASEB ($4) addi $3, $3, IN2 add $5, $2, $3 sw $5, BASE ($4) bne $4, $7, L1 Si consideri una generica iterazione del ciclo eseguita dal processore MIPS in modalità pipeline a 5 stadi. Si supponga che non siano presenti ottimizzazioni nella pipeline. Disegnare lo schema della pipeline e individuare i conflitti sui dati (in rosso) di tipo RAW (Read After Write) e i conflitti sul controllo (in blu) presenti nel programma. Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L1: lw$2,basea($4) ID EX M WB addi $2,$2,IN1 ID EX M WB lw $3,BASEB($4) ID EX M WB addi $3,$3,IN2 ID EX M WB add $5,$2,$3 ID EX M WB sw $5,BASE($4) ID EX M WB bne $4,$7,L1 ID EX M WB
Inserire gli stalli necessari a risolvere i conflitti presenti nel programma: Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 L1:lw$2,BASEA($4) ID EX M WB addi $2,$2,IN1 S S S ID EX M WB lw $3,BASEB($4) ID EX M WB addi $3,$3,IN2 S S S ID EX M WB add $5,$2,$3 S S S ID EX M WB sw $5,BASE($4) S S S ID EX M WB bne $4,$7,L1 S S S ID EX M WB S S S Indicare sinteticamente nella prima colonna il numero di stalli da inserire prima di ciascuna istruzione in modo da risolvere i conflitti presenti nel programma. Num. Stalli Istruzione 3 L1:lw$2,BASEA($4) 3 addi $2,$2,IN1 lw $3,BASEB($4) 3 addi $3,$3,IN2 3 add $5,$2,$3 3 sw $5,BASE($4) 3 bne $4,$7,L1
Scrivere il numero totale di stalli inseriti nel programma: 18 alcolare il PI ottenuto: PI = (I + stalli + 4) /I = 30 / 8 = 3,75 Asintoticamente (N cicli) : PI AS = (I + stalli) / I = (8 + 18) / 8 = 3,25 alcolare il Throughput (espresso in MIPS) del programma corrispondente: MIPS = f LOK / PI * 10 6 = (500 * 10 6 ) / (3,75 * 10 6 ) = 133, 3 Asintoticamente (N cicli): MIPS AS = f LOK / PI AS * 10 6 = (500 * 10 6 ) / (3,25 * 10 6 ) = 153,8
Si supponga nella pipeline siano state introdotte le seguenti ottimizzazioni: - nel Register File è possibile la lettura e la scrittura allo stesso indirizzo nello stesso ciclo di clock; - introduzione del forwarding - calcolo del P nelle branch sia stato anticipato nello stadio ID. Disegnare lo schema della pipeline e individuare i conflitti sui dati (in rosso) di tipo RAW (Read After Write) e i conflitti sul controllo (in blu) rimasti nel programma. Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L1: lw$2,basea($4) ID EX M WB addi $2,$2,IN1 ID EX M WB lw $3,BASEB($4) ID EX M WB addi $3,$3,IN2 ID EX M WB add $5,$2,$3 ID EX M WB sw $5,BASE($4) ID EX M WB bne $4,$7,L1 ID EX M WB Inserire gli stalli necessari a risolvere i conflitti presenti nel programma e indicare in verde i percorsi di forwarding utilizzati Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Percorso di forwarding usato L1: lw$2,basea($4) ID EX M WB addi $2,$2,IN1 ID S EX M WB MEM-EX lw $3,BASEB($4) S ID EX M WB addi $3,$3,IN2 ID S EX M WB MEM-EX add $5,$2,$3 S ID EX M WB EX-EX sw $5,BASE($4) ID EX M WB MEM-MEM bne $4,$7, L1 S ID EX M WB EX-ID S
Indicare sinteticamente nella prima colonna il numero di stalli da inserire prima di ciascuna istruzione in modo da risolvere i conflitti presenti nel programma. Num. Stalli Istruzione 1 L1:lw$2,BASEA($4) 1 addi $2,$2,IN1 lw $3,BASEB($4) 1 addi $3,$3,IN2 0 add $5,$2,$3 0 sw $5,BASE($4) 1 bne $4,$7,L1 Scrivere il numero totale di stalli inseriti nel programma: 4 alcolare il PI ottenuto: PI = (I + stalli + 4) /I = 16 / 8 = 2 Asintoticamente (N cicli) : PI AS = (I + stalli) / I = (8 + 4) / 8 = 1,5 alcolare il Throughput (espresso in MIPS) del programma corrispondente: MIPS = f LOK / PI * 10 6 = (500 * 10 6 ) / (2 * 10 6 ) = 250 Asintoticamente (N cicli): MIPS AS = f LOK / PI AS * 10 6 = (500 * 10 6 ) / (1,5 * 10 6 ) = 333,33
Si supponga nella pipeline siano state introdotte le ottimizzazioni precedentemente esaminate più la seguente: - Predizione statica dei salti all indietro (backward) di tipo branch always taken Disegnare lo schema della pipeline e individuare i conflitti sui dati (in rosso) di tipo RAW (Read After Write) e i conflitti sul controllo (in blu) rimasti nel programma. Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L1: lw$2,basea($4) ID EX M WB addi $2,$2,IN1 ID EX M WB lw $3,BASEB($4) ID EX M WB addi $3,$3,IN2 ID EX M WB add $5,$2,$3 ID EX M WB sw $5,BASE($4) ID EX M WB bne $4,$7,L1 ID EX M WB Inserire gli stalli necessari a risolvere i conflitti presenti nel programma e indicare in verde i percorsi di forwarding utilizzati Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Percorso di forwarding usato L1: lw$2,basea($4) ID EX M WB addi $2,$2,IN1 ID S EX M WB MEM-EX lw $3,BASEB($4) S ID EX M WB addi $3,$3,IN2 ID S EX M WB MEM-EX add $5,$2,$3 S ID EX M WB EX-EX sw $5,BASE($4) ID EX M WB MEM-MEM bne $4,$7, L1 S ID EX M WB EX-ID
Indicare sinteticamente nella prima colonna il numero di stalli da inserire prima di ciascuna istruzione in modo da risolvere i conflitti presenti nel programma. Num. Stalli Istruzione 1 L1:lw$2,BASEA($4) 1 addi $2,$2,IN1 lw $3,BASEB($4) 1 addi $3,$3,IN2 0 add $5,$2,$3 0 sw $5,BASE($4) bne $4,$7,L1 Scrivere il numero totale di stalli inseriti nel programma: 3 alcolare il PI ottenuto: Asintoticamente (N cicli) : PI AS = (I + stalli) / I = (8 + 3) / 8 = 1,375 alcolare il Throughput (espresso in MIPS) del programma corrispondente: Asintoticamente (N cicli): MIPS AS = f LOK / PI AS * 10 6 = (500 * 10 6 ) / (1,375 * 10 6 ) = 363,6
Si supponga che, oltre alle ottimizzazioni hardware finora introdotte, sia stato ottimizzato anche lo scheduling del programma assembly come segue: L1: lw $2, BASEA ($4) lw $3, BASEB ($4) addi $2, $2, IN1 addi $3, $3, IN2 add $5, $2, $3 bne $4, $7, L1 sw $5, (BASE-4) ($4) # branch delay slot Disegnare lo schema della pipeline e individuare i conflitti sui dati (in rosso) di tipo RAW (Read After Write) e i conflitti sul controllo (in blu) eventualmente rimasti nel programma e indicare in verde i percorsi di forwarding utilizzati Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L1: lw$2,basea($4) ID EX M WB lw $3,BASEB($4) ID EX M WB addi $2,$2,IN1 ID EX M WB addi $3,$3,IN2 ID EX M WB add $5,$2,$3 ID EX M WB bne $4,$7,L1 ID EX M WB sw $5,BASE-4($4) ID EX M WB Non è necessario intodurre stalli alcolare il PI ottenuto: Asintoticamente (N cicli) : PI AS = PI ideale = 1 alcolare il Throughput (espresso in MIPS) del programma corrispondente: Asintoticamente (N cicli): MIPS AS = MIPS ideale = f LOK / PI ideale * 10 6 = (500 * 10 6 ) / (1 * 10 6 ) = 500
Si supponga che, nel programma precedentemente ottimizzato, ogni accesso in lettura nella fase MEM alla cache dati generi un MISS che richieda 2 stalli: L1: lw $2, BASEA ($4) lw $3, BASEB ($4) addi $2, $2, IN1 addi $3, $3, IN2 add $5, $2, $3 bne $4, $7, L1 sw $5, (BASE-4) ($4) # branch delay slot Disegnare lo schema della pipeline corrispondente e indicare in verde i percorsi di forwarding utilizzati Istruzione 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 L1:lw $2,BASEA($4) ID EX M S S WB lw $3,BASEB($4) ID EX S S M S S WB ID S S EX S S M WB addi $2,$2,IN1 S S ID S S EX M WB addi $3,$3,IN2 S S ID EX M WB add $5,$2,$3 ID EX M WB bne $4,$7,L1 ID EX M WB sw $5,BASE-4($4) ID EX M WB 17 18 19 20 21 E necessario introdurre 4 stalli alcolare il PI ottenuto: Asintoticamente (N cicli) : PI AS = (I + stalli) / I = (8 + 4) / 8 = 1,5 alcolare il Throughput (espresso in MIPS) del programma corrispondente: Asintoticamente (N cicli): MIPS AS = f LOK / PI AS * 10 6 = (500 * 10 6 ) / (1,5 * 10 6 ) = 333,33