Buonasera, anzi buongiorno a tutti.
ho provato ad eseguire un esercizio -testo da me inventato- che prevedeva di partire da un determinato codice sul quale poi lavorarci su con instruction reordering, loop unrolling etc al fine di migliore le prestazioni, diminuendo i vari tipi di stalli.
Ho utilizzato WINMIPS64, ma ho testato il medesimo codice, con medesimi risultati con EDUMIPS.
di seguito vi riporto la prima versione di codice:
.data
vett: .double 17.10,20.03,5.06,19.91,7.40,19.05,16.09,11.08 ; array a
n: .word 64 ; numero elementi *8
m: .double 100.00 ; base per %
vettperc: .double 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 ; array valori percentuali
.text
start: LW r1,n(r0) ; caricamento in r1 di 64
L.D f3,m(r0) ; caricamento in f3 di 100
LW r3,n(r0) ; caricamento in r3 di 64
loop: DADDI r1,r1,-8 ; i = i-8
L.D f0,vett(r1) ; caricamento in f0 di a[i]
ADD.D f1,f1,f0 ; somma
BNEZ r1,loop ; chiusura del loop
loop1: DADDI r3,r3,-8 ; i = i-8
L.D f2,vett(r3) ; caricamento in f2 di a[i]
DIV.D f0,f2,f1 ; divisione
MUL.D f0,f0,f3 ; moltiplicazione
S.D f0,vettperc(r3) ; risultato scritto nell'array
BNEZ r3,loop1 ; chiusura loop
HALT
il problema è che nell'ultima versione la sezione data (sezione dei risultati) cambia! e ciò, sinceramente credo che significhi che c'è qualcosa che non va... ho provato davvero in tutti i modi a capire cosa... l'ho anche rifatto da capo, senza mai venirne a capo. Di seguito vi riporto l'ultima versione di codice e relativi screen della sezione data "cambiata". Grazie mille
Versione 2
.data
vett: .double 17.10,20.03,5.06,19.91,7.40,19.05,16.09,11.08 ; array a
n: .word 64 ; numero elementi *8
m: .double 100.00 ; base per %
x: .word 8
vettperc: .double 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 ; array valori percentuali
.text
start: LW r1,n(r0) ; caricamento in r1 di 64
L.D f3,m(r0) ; caricamento in f3 di 100
LW r3,n(r0) ; caricamento in r3 di 64
LW r5,x(r0) ; caricamento in r5 di 8
DADDI r4,r0,vett ; puntatore al primo elem di vett
loop41:
L.D f0,0(r4) ; caricamento in f0 del primo elemento
ADD.D f1,f1,f0 ; somma parziale primo elemento
L.D f0,8(r4) ; caricamento in f0 del secondo elemento
ADD.D f1,f1,f0 ; somma parziale primo + secondo
L.D f0,16(r4) ; caricamento in f0 del terzo elemento
ADD.D f1,f1,f0 ; somma parziale f1+ terzo
L.D f0,24(r4) ; caricamento in f0 del quarto elemento
ADD.D f1,f1,f0 ; somma parziale f1+ quarto
DADDI r5,r5,-4
DADDI r4,r4,32
BNEZ r5,loop41 ; chiusura del loop
DIV.D f4,f3,f1
DADDI r7,r0,vett ; puntatore al primo elem di vett
DADDI r10,r0,vettperc ; puntatore al primo elem di vettperc
LW r6,x(r0) ; caricamento in r6 di 8
loop42: L.D f2,(r7) ; caricamento in f2 del primo elemento
MUL.D f0,f2,f4 ; moltiplic
S.D f0,(r10) ; risultato scritto nel vettore
DADDI r7,r7,8
DADDI r10,r10,8
L.D f2,(r7) ; caricamento in f2 di a[i]
MUL.D f0,f2,f4 ; x100
S.D f0,(r10) ; risultato scritto nel vettore
DADDI r7,r7,8
DADDI r10,r10,8
L.D f2,(r7) ; caricamento in f2 di a[i]
MUL.D f0,f2,f4 ; x100
S.D f0,(r10) ; risultato scritto nel vettore
DADDI r7,r7,8
DADDI r10,r10,8
L.D f2,(r7) ; caricamento in f2 di a[i]
MUL.D f0,f2,f4 ; x100
S.D f0,(r10) ; risultato scritto nel vettore
DADDI r7,r7,8
DADDI r10,r10,8
DADDI r6,r6,-4
BNEZ r6,loop42 ; chiusura loop
HALT
Grazie mille per l'attenzione.
Saluti,
Pippo
Allegati: