Post on 05-Jul-2015
description
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercitazione Calcolatori Elettronici 6 dicembre 2007
Esercitazione sul linguaggio Assembly del DLX
Ambiente di simulazione di processori in architettura RISC WinDLX
11
22
http://www.slideshare.net/mova/esercitazione-calcolatori-elettronici-vanadia-2007-12-06/
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Materiale da cercare in rete● WinDLX
pagina di Herbert Gruenbacher presso la Technische Universitat Wien
http://www.soc.tuwien.ac.at/intern/RA/http://cs.uns.edu.ar/~jechaiz/arquitectura/windlx/windlx.htmlhttp://cs.uns.edu.ar/~jechaiz/arquitectura/windlx/DLXinst.html
● Dinero IV Trace-Driven Uniprocessor Cache SimulatorMark Hill presso la University of Wisconsinhttp://www.cs.wisc.edu/~markhill/DineroIV/
● EduMIPS64porting italiano di WinMIPS64 da Visual C++ a Java Swing www.edumips.orghttp://www.opencores.org/projects.cgi/web/minimips/overview
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Strumenti per la didattica
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Assembly● il linguaggio assembly è la rappresentazione simbolica che
descrive le istruzioni e i dati per un computer
● il linguaggio macchina è la codifica binaria presente nella memoria ed elaborata dal processore
● L'assembly è più leggibile del linguaggio macchina perchè utilizza simboli piuttosto che bit.
● I simboli rappresentano sequenze di bit comuni per
➔ gli opcode, i codici mnemonici per rappresentare le istruzioni
➔ i registri
➔ le label che identificano le locazioni in memoria di istruzioni o dati
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Struttura base codice sorgente Assembly
; NomeProgramma.s commenti; autore; versione
.data direttiva inizio sezione dati
definizione di tuttii dati e delle variabili
.global main direttiva che definisceun etichetta globale
.code offset direttiva inizio sezione codice
istruzioni assembler
main: entry point del codice assemblyistruzioni assembler
trap 0 ferma il simulatore
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Direttive
.ascii “string1”, “string2”, ...
.asciiz “string1”, “string2”, ...
.align nallineamento del codice e dei dati all'indirizzo successivo con i primi n bit meno significativi posti a zero
alloca le stringhe alfanumeriche nel codice oggetto che poi saranno caricate in memoria; le stringhe non sono terminate con il carattere zero
alloca le stringhe alfanumeriche nel codice oggetto che poi saranno caricate in memoria; le stringhe sono terminate con il carattere zero
.byte byte1, byte2,...alloca una sequenza di byte nel codice oggetto che poi saranno caricate in memoria
.double number1, number2,...alloca una sequenza di double, numeri floating point a doppia precisione di 64 bit nel codice oggetto che poi saranno caricate in memoria
.float number1, number2,...alloca una sequenza di float, numeri floating point a singola precisione di 32 bit nel codice oggetto che poi saranno caricate in memoria
.global labeldefinisce una etichetta come globale, un riferimento a questa locazione è disponibile ad altri codici oggetto linkato a questo sorgente
.space size lascia lo spazio per size bytes quando il codice sarà caricato in memoria
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Assemblatore Linker Loader● Un programma in linguaggio assembly è codificato in un file oggetto
usando un programma assemblatore. Un assemblatore legge un singolo file sorgente e produce il file oggetto assemblando tutte le informazioni necessarie a descrivere il codice e i dati. Queste verranno poi messe assieme da un linker a formare un programma eseguibile o una libreria, caricati in memoria da un loader all'atto dell'esecuzione o invocazione.
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Codice rilocabile
● Il file oggetto comincia con un'intestazione, un header, ed è formato da uno o più segmenti contenenti il codice macchina e la rappresentazione binaria dei dati. Vengono salvate le informazioni sulla rilocazione per le parole che dipendono dall'indirizzo assoluto in memoria in cui è caricato ogni segmento.
● Inoltre viene salvata la symbol table delle label che possono essere indirizzate da altri file sorgente e la lista di tutti i riferimenti esterni irrisolti. Per finire possono esservi informazioni di debugging.
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #1
● Scrivere, nel linguaggio Assembly del DLX scalare, l’inizializzazione a valore nullo di un vettore composto da N elementi interi di una sola word.
for (i=0; i<N; i++) {x[i] = 0;
}
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #1
● Sia R0 il registro nullo
● R1 il registro base (contenente il primo indirizzo di allocazione in memoria del vettore)
● R2 il registro contenente il numero di elementi del vettore da inizializzare
● R3 il registro indice che punta ai singoli elementi del vettore in memoria
SUB R0, R0, R0 ; 0 -> R0 ADD R3, R0, R0 ; 0 -> R3 ADD R2, R0, N ; N -> R2loop: SW R1, R3, F2 ; 0 -> M[R1+R3] ADD R3, R3, #4 ; R3 + 4 -> R3 SUB R2, R2, #1 ; R2 - 1 -> R2 JNZ loop ; se R2 > 0 salta a loop
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #1
● R0 vale sempre zero
● per caricare il valore di una parola all'etichetta N si usa LW Rx, N
● la SW (I-type) ha un indirizzamento indirizzo base + spiazzamento 16bit
● il branch richiede un registro per una condizione di == o <> da zero
SUB R0, R0, R0 ADD R3, R0, R0 ADD R2, R0, N -> LW R2, Nloop: SW R1, R3, F2 -> SW vett(R3), R0 ADD R3, R3, #4 SUB R2, R2, #1 JNZ loop -> BNEZ R2, loop
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #1; asm1_1.s
ADD R3, R0, R0 ; imposta a zero l'indice R3LW R2, N ; carica N in R2
loop: SW vettore(R3),R0 ; pone 0 alla locazione M[R3 + vettore]
ADDI R3, R3, #4 ; incrementa l'indice di 4 ogni wordSUBI R2, R2, #1 ; decrementa il contatoreBNEZ R2, loop ; salta a loop se non uguale a zero
trap 0 ; per fermare windlx
.dataN: .word 8vettore: .word 1,2,3,4,5,6,7,8
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #1
8
vettore:
0x10000x10040x10080x100c0x10100x1014
x[0] = 1
x[1] = 2
x[2] = 3
x[3] = 4
x[4] = 5
x[5] = 6
x[6] = 7
0x10180x101c0x1020 x[7] = 8
N:
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #1
; asm1_2.s
LW R2, N ; carica N in R2 SLLI R2, R2, #2 ; moltiplico per 4 shiftando a sx di 2loop: SW vettore-4(R2),R0 ; pone 0 alla M[R2 + (vettore-4)] SUBI R2, R2, #4 ; uso R2 come indice e decremento di 4 BNEZ R2, loop ; salta a loop se non uguale a zero trap 0 ; per fermare windlx .dataN: .word 8vettore:.word 1,2,3,4,5,6,7,8
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #1
8
vettore:
0x10000x10040x10080x100c0x10100x1014
x[0] = 1
x[1] = 2
x[2] = 3
x[3] = 4
x[4] = 5
x[5] = 6
x[6] = 7
0x10180x101c0x1020 x[7] = 8
N: 8<<2 = 32
vettore + 0
vettore + 4
vettore + 8
vettore + 12
vettore + 16
vettore + 20
vettore + 24
vettore + 28
vettore + 32
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #7● Scrivere nel linguaggio Assembly di una
architettura DLX-like scalare (non pipe), la procedura che esegue la somma di due vettori di n elementi interi, espressi su singola word, allocati in memoria a partire dagli indirizzi rispettivamente contenuti negli registri R1 ed R2, ponendo il risultato a partire dall'indirizzo contenuto nel registro R3.
for (i=0; i<N; i++) {z[i] = x[i] + y[i];
}
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Assembly #7.text lw r4, length slli r4, r4, #2 add r1, r4, v1 add r2, r4, v2 add r3, r4, v3 loop: beqz r4, end lw r5, -4(r1) lw r6, -4(r2) add r5, r5, r6 sw -4(r3), r5 subi r1, r1, #4 subi r2, r2, #4 subi r3, r3, #4 subi r4, r4, #4 j loop end: trap 0 .datav1: .word 1,-1, 0,-1v2: .word 2, 0, 1, 1v3: .space 4*4length: .word 4
.text lw r4, length slli r4, r4, #2
loop: beqz r4, end lw r5, v1-4(r4) lw r6, v2-4(r4) subi r4, r4, #4 ; schedulata add r5, r5, r6 sw v3(r4), r5 ; (indirizzo-4)+4 subi r4, r4, #4
j loop end: trap 0 .datav1: .word 1,-1, 0,-1v2: .word 2, 0, 1, 1v3: .space 4*4length: .word 4
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Architetture Avanzate #1
Dire quale è lo scopo del seguente programma:
loop: LD F0, 0(R1) ADDD F4, F0, F2 SD 0(R1), F4 ADDI R1, R1, #-8 BNEZ R1, loope fornire una sua versione srotolata per 6 volte schedulata in maniera opportuna.
vedi H&P pag.271 (par.6.8 pipelining avanzato ILP, srotolamento e schedulazione)
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Pipelining avanzatoILP Instruction-level parallelism
● le pipeline sono state sviluppate per poter eseguire contemporaneamente più istruzioni indipendenti
● Pipeline CPI = Ideal pipeline CPI + Structural stalls +RAW stalls + WAR stalls + WAW stalls + Control stalls
● tecniche per ridurre gli stalli● Loop unrolling – per gli stalli di controllo● Pipeline scheduling – riduce gli stalli RAW● Register renaming – riduce gli stalli WAR e WAW● Dynamic branch prediction – per gli stalli di controllo● Superscalar pipeline – riduce CPI ideale
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Esercizio Architetture Avanzate #1
loop: LD F0, 0(R1) ADDD F4, F0, F2 SD 0(R1),F4 ADDI R1, R1, #-8 BNEZ R1, loop
for(int i=1;i<=N;i++) { x[i]=x[i] + c;}
somma un valore scalare double agli elementi di un vettore di double in memoria
R1 contiene l'indirizzo dell'elemento del vettore con l'indirizzo più alto in memoria
F2 contiene il valore dello scalare c da sommare
N.B. non viene caricato l'elemento all'indirizzo zero...
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Stalli della pipeline
loop: LD F0, 0(R1) stallo ADDD F4, F0, F2 stallo stallo SD 0(R1), F4 ADDI R1, R1, #-8 stallo BNEZ R1, loop stallo
5 ISTRUZIONI10 CICLICPI = 2
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Schedulingloop: LD F0, 0(R1) stallo ADDD F4, F0, F2 stallo stallo SD 0(R1), F4 ADDI R1, R1, #-8 stallo BNEZ R1, loop stallo
loop: LD F0, 0(R1)ADDI R1, R1, #-8
ADDD F4, F0, F2 stallo BNEZ R1, loop SD 8(R1), F4
● la LD causa stallo strutturale nella fase MEM per la dipendenza con la EXE di ADDD● la ADDD causa un doppio stallo RAW per la dipendenza con SD● la ADDI causa uno stallo RAW per la dipendenza con la fase ID del branch● il branch quando salta indietro richiede uno stallo di controllo
● schedulo l'aggiornamento dell'indice nel delay slot della load● schedulo la store del risultato nel delay slot della branch (non previsto da WinDLX)● la store dipende da R1 ma sfruttare il campo immediato per avere l'indirizzo corretto
5 ISTRUZIONI6 CICLI
CPI = 1,2
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Loop unrollingloop: LD F0, 0(R1) ADDD F4, F0, F2 SD 0(R1), F4 ADDI R1, R1, #-8 BNEZ R1, loop
loop: LD F0, 0(R1) ; 1 ADDD F4, F0, F2 SD 0(R1), F4
LD F6, -8(R1) ; 2 ADDD F8, F6, F2 SD -8(R1), F8
LD F10, -16(R1) ; 3 ADDD F12, F10, F2 SD -16(R1), F12
LD F14, -24(R1) ; 4 ADDD F16, F14, F2 SD -24(R1), F16
LD F18, -32(R1) ; 5 ADDD F20, F18, F2 SD -32(R1), F20
LD F22, -40(R1) ; 6 ADDD F24, F22, F2 SD -40(R1), F24
ADDI R1, R1, #-48 BNEZ R1, loop
20 ISTRUZIONI6*6+4 = 40 CICLI
CPI = 2
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Unrolled & scheduledloop: LD F0, 0(R1) ; 1 ADDD F4, F0, F2 SD 0(R1), F4
LD F6, -8(R1) ; 2 ADDD F8, F6, F2 SD -8(R1), F8
LD F10, -16(R1) ; 3 ADDD F12, F10, F2 SD -16(R1), F12
LD F14, -24(R1) ; 4 ADDD F16, F14, F2 SD -24(R1), F16
LD F18, -32(R1) ; 5 ADDD F20, F18, F2 SD -32(R1), F20
LD F22, -40(R1) ; 6 ADDD F24, F22, F2 SD -40(R1), F24
ADDI R1, R1, #-48 BNEZ R1, loop;asm1_2
loop: LD F0, 0(R1) ; 1 LD F6, -8(R1) ; 2 LD F10, -16(R1) ; 3 LD F14, -24(R1) ; 4 LD F18, -32(R1) ; 5 LD F22, -40(R1) ; 6
ADDD F4, F0, F2 ; 1 ADDD F8, F6, F2 ; 2 ADDD F12, F10, F2 ; 3 ADDD F16, F14, F2 ; 4 ADDD F20, F18, F2 ; 5 ADDD F24, F22, F2 ; 6
SD 0(R1), F4 ; 1 SD -8(R1), F8 ; 2 SD -16(R1), F12 ; 3 SD -24(R1), F16 ; 4 SD -32(R1), F20 ; 5
ADDI R1, R1, #-48
BNEZ R1, loop SD 8(R1), F24 ; 6
;asm1_3
20 ISTRUZIONI6+3*6+6+1+1= 32 CICLI
CPI = 1,6
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
arc1_0
arc1_1
arc1_2
arc1_3
arc1_4
0 50 100 150 200 250 300
246
198
166
134
106
Cicli
CYC
arc1_0
arc1_1
arc1_2
arc1_3
arc1_4
0,00% 20,00% 40,00% 60,00% 80,00% 100,00%
68%
74%
68%
76%
88%
26%
18%
31%
6%
9%
1%
2%
2%
23%
10%
istruzioni utili / stalli
CONTRSTRUTWAW TOTRAW TOTCYC
Win
DLX
st
ats
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Architettura Superscalare
istruzione ALU istruzione FP1 loop: LD F0, 0(R1)2 LD F6, -8(R1)3 LD F10, -16(R1) ADDD F4, F0, F24 LD F14, -24(R1) ADDD F8, F6, F25 LD F18, -32(R1) ADDD F12, F10, F26 LD F22, -40(R1) ADDD F16, F14, F27 SD 0(R1), F4 ADDD F20, F18, F28 SD -8(R1), F8 ADDD F24, F22, F29 SD -16(R1), F1210 SD -24(R1), F1611 ADDI R1, R1, #-4812 SD 16(R1), F2013 BNEZ R1, loop14 SD 8(R1), F24
20 ISTRUZIONI14 CICLI
CPI = 0,7
Marco Vanadia marco.vanadia@gmail.com DEE Politecnico di Bari
Architettura VLIWistruzione Rif M1 Rif M2 istruz FP1 istruz FP2 ALU/Branch 1 LD F0, 0(R1) LD F6, -8(R1)2 LD F10,-16(R1) LD F14,-24(R1) 3 LD F18,-32(R1) LD F22,-40(R1) ADDD F4, F0,F2 ADDD F8, F6, F24 ADDD F12,F10,F2 ADDD F16,F14, F25 SD 0(R1), F4 SD -8(R1), F8 ADDD F20,F18,F2 ADDD F24, F22, F26 SD -16(R1), F12SD -24(R1), F16 ADDI R1,R1,#-487 SD 16(R1), F20 SD 8(R1), F24 BNEZ R1, loop8 nop nop nop nop nop
istruzione Rif M1 Rif M2 istruz FP1 istruz FP2 ALU/Branch 1 LD F0, 0(R1) LD F6, -8(R1)2 LD F10,-16(R1) LD F14,-24(R1) 3 LD F18,-32(R1) LD F22,-40(R1) ADDD F4, F0,F2 ADDD F8, F6, F24 ADDD F12,F10,F2 ADDD F16,F14, F25 SD 0(R1), F4 SD -8(R1), F8 ADDD F20,F18,F2 ADDD F24, F22, F2 ADDI R1,R1,#-486 SD 32(R1), F12 SD 24(R1), F16 BNEZ R1, loop7 SD 16(R1), F20 SD 8(R1), F24 (delay slot) 20 ISTRUZIONI
7 CICLI
CPI = 0,35