lab-arch/lezioni/2008/lezione6.pdf · ribla blabla Lab. Architettura - Lezione 6 p.33/64 INLINING...
Transcript of lab-arch/lezioni/2008/lezione6.pdf · ribla blabla Lab. Architettura - Lezione 6 p.33/64 INLINING...
Laboratorio di ArchitetturaLezione 6
Andrea Torsello
Dipartimento di Informatica
Universita “Ca’Foscari” di Venezia
Lab. Architettura - Lezione 6 p.1/64
La scorsa lezione
Direttive assembly
Etichette (labels)
Esempi di compilazione delle strutture di controllo dialto livello (if, while)
Lab. Architettura - Lezione 6 p.2/64
Procedure
Le procedure sono dei pezzi di codice di particolareutilità che possono essere chiamate dal programmaprincipale
Nomi usati di solito: “procedure”, “subroutine”,“function”
Lab. Architettura - Lezione 6 p.3/64
Chiamata di procedura
Una procedura può quindi chiamare un’altra procedura:
La procedura A chiama B
B viene eseguito
L’esecuzione ritorna ad A
Lab. Architettura - Lezione 6 p.4/64
Chiamate di procedura II
Abbiamo già visto, abbiamo istruzioni per saltare
In particolare, l’istruzione jal (jump and link, salta ecollega)
jal indirizzo
salta all’indirizzo, e mette nel registro speciale $ra
(return address) la locazione di memoria successivaalla jal
Lab. Architettura - Lezione 6 p.5/64
Chiamate di procedura III
Quindi se la procedura A vuole chiamare B. . .
. . .e B è all’indirizzo indirizzodiB
. . . A può usare jal indirizzodiB
Una volta saltati in B, B poi terminerà, e per tornare aeseguire quel che resta di A. . .
. . .può usare j $ra
Lab. Architettura - Lezione 6 p.6/64
Procedura
Ogni procedura può essere vista come un piccoloprogramma a sè stante:
Riceve dei dati in input
Fà qualcosa
Dà dei risultati in output
Lab. Architettura - Lezione 6 p.7/64
Analogia
È come dare un compito ad un’altra persona
Gli si danno le cose su cui lavorare (dati in input)
Lui fa le cose, e poi ce le ridà (nell’output)
Lab. Architettura - Lezione 6 p.8/64
Input/Output
Quindi, queste “scatole” dette input e output servonoper scambiarsi i dati tra procedure
Sono posti in memoria dove mettere i dati
Lab. Architettura - Lezione 6 p.9/64
Accordo
Proprio come due persone ad esempio si passano idati tramite un foglietto. . .
(ogni riferimento a compiti in classe è puramentecasuale. . .)
. . .è evidente che ogni procedura deve accordarsi conun’altra su dove sia l’input e dove sia l’output
Lab. Architettura - Lezione 6 p.10/64
Dove?
Cosa è più conveniente?
Siccome nella programmazione assembler le chiamatedi procedura sono molto frequenti, conviene tenere perquanto possibile queste zone nei registri, che sono piùveloci
Lab. Architettura - Lezione 6 p.11/64
Esempio
A chiama B, e si mettono d’accordo per avere input in$t3, e output in $t4
⇒ B processa il dato datogli in $t3, e poi mette ilrisultato in $t4
Lab. Architettura - Lezione 6 p.12/64
Esempio (cont.)
B moltiplica un numero per quattro
B ha input in $t3, e output in $t4
B:
add $t3,$t3,$t3
add $t3,$t3,$t3
add $t4,$t3,$zero
jr $ra
Lab. Architettura - Lezione 6 p.13/64
Accordo II
Siccome in generale ci sono MOLTE PROCEDURE. . .
. . .è bene che per ricordarci meglio dove dobbiamomettere i dati in input, e dove li abbiamo in output. . .
. . . si cerchi di usare circa la stessa convenzione pertutte le procedure
Lab. Architettura - Lezione 6 p.14/64
Problemi
Torniamo a B:
B:
add $t3,$t3,$t3
add $t3,$t3,$t3
add $t4,$t3,$zero
jr $ra
Cosa succede dopo aver eseguito B?
Che non solo il risultato è in $t4, ma ora anche $t3 èstato quadruplicato
Lab. Architettura - Lezione 6 p.15/64
Side-effects
Il problema è che mentre una procedura fa qualcosa,può aver bisogno di risorse di memoria (in questocaso, un registro)
Che quindi verranno modificate rispetto ai valorioriginali
⇒ chiamare una procedura fa qualche volta altre coseoltre a quelle che ci interessano
⇒ cosiddetto side-effect (effetto collaterale)
Lab. Architettura - Lezione 6 p.16/64
Side-effect
Bisogna fare attenzione ai side-effects di unaprocedura, perché può modificare/distruggere i valoridi qualche registro
⇒ registri “modificati” da una procedura, in aggiunta aquello di output dove viene messo il valore
Lab. Architettura - Lezione 6 p.17/64
Soluzione
Quando si chiama una procedura con side-effects,
o ci si assicura che non ci siano dati che ci servonodopo in qualche registro modificato dalla procedura
oppure si salvano i registri in memoria (store), sichiama la procedura, e poi si ricaricano (load)
Lab. Architettura - Lezione 6 p.18/64
MORALE
Quando si scrive una procedura, nella suadocumentazione (che cosa fa), in assembly dovrestedocumentare chiaramente:
Dov’è l’input e dov’è l’output
Se ci sono altri registri modificati
Lab. Architettura - Lezione 6 p.19/64
NOTA
È spesso fonte di errori: è importante specificareTUTTI i registri modificati (al di là ovviamente di quellodi output)
In particolare, possono essere modificati anche iregistri di input
Lab. Architettura - Lezione 6 p.20/64
Esempio (cont.)
Come si potrebbe scrivere B:
# INPUT: $t3
# OUTPUT: $t4 (contiene 4*$t3)
# MODIFICA: $t3
B:
add $t3,$t3,$t3
add $t3,$t3,$t3
add $t4,$t3,$zero
jr $ra
Lab. Architettura - Lezione 6 p.21/64
Esempio di errore
Voglio calcolare 5*$t3 e metterlo in $s0
Usando
jal B #$t4=4*$t3
add $s0,$t3,$t4
Ho che in $s0 c’è 8*$t3 (. . .!)
Lab. Architettura - Lezione 6 p.22/64
Più procedure . . .
Visto che ogni procedura è un programma a sè stante,nulla vieta di chiamare altre procedure
Esempio, P1 può chiamare P2, e P2 può chiamare P3
Vediamolo subito, dove P1=codice SPIM, P2=main, eP3=B . . .
Lab. Architettura - Lezione 6 p.23/64
AUCH!!
Dove sta il problema?
Riproviamo passo passo. . .
Appunto, il problema è che anche il registro $ra vienemodificato. . . (!)
Lab. Architettura - Lezione 6 p.24/64
Riproviamo . . .
Lab. Architettura - Lezione 6 p.25/64
CONVENZIONI
Come abbiamo visto, già per un programmino cosi’semplice la procedura main modifica $t3, e per saperlodobbiamo andare dentro al codice delle altre procedure
⇒ per programmi complessi, può non essere moltopratico dover scriversi “a cascata” tutte questemodifiche
Lab. Architettura - Lezione 6 p.26/64
CONVENZIONI (cont.)
⇒ si usano delle convenzioni per facilitarci la vita
Convenzione standard in MIPS
Andiamo subito al caso peggiore, e riserviamoci uncerto numero di registri che possiamo modificare avolontà:
$t0 . . . $t9
E infatti, “t” sta per temporaneo. . .
Lab. Architettura - Lezione 6 p.27/64
Registri temporanei
Siccome questi registri possono essere sporcati,posso anche adottare l’approccio “pigro” quando scrivoil programma, e considerare che ogni procedura possamodificare tutti i $t0, . . . $t9
⇒ assumo un MODIFICA: $t0, . . . $t9
⇒ non scrivo più che cosa modifica, lo so già
Lab. Architettura - Lezione 6 p.28/64
Quindi . . .
Non ho più bisogno di andare a vedere quali registrivengono sporcati
A patto che però segua la convenzione che ogniprocedura modifichi SOLO i registri $t0, . . ., $t9
⇒ tutti gli altri registri non possono essere modificati($a0,. . .,$a3,$s0,. . .,$s6,$ra,. . .)
Lab. Architettura - Lezione 6 p.29/64
Nota
Ciò non significa che non si possano toccare all’internodella procedura
Semplicemente, significa che quando la procedurafinisce, i registri devono avere lo stesso valore
Esempio: il programma quadruplica (v2) modifica $ra
Lab. Architettura - Lezione 6 p.30/64
Convenzioni di chiamata
Rivediamo i registri MIPS e le convenzioni ad essi associate
$zero: quando letto dà sempre 0
$at: riservato per l’assembler (usato per lepseudoistruzioni)
$v0, $v1: risultato di espressioni/funzioni
$a0. . .$a3: primi 4 argomenti di una procedura/funzione
$t0. . .$t7: registri temporanei, il contenuto nonspravvive una chiamata di procedura
$s0. . .$s7: registri temporanei salvati, il contenutospravvive una chiamata di procedura
$t8, $t9: altri 2 registri temporanei che nonsopravvivono le procedure
Lab. Architettura - Lezione 6 p.31/64
Convenzioni di chiamata
$k0, $k1: riservati per il sistema operativo
$gp, $sp, $fp: vedremo più avanti
$ra: return address, scritto da jal e usato per ritornareda procedure
Lab. Architettura - Lezione 6 p.32/64
INLINING
Si può fare a meno delle procedure?
A: . . .
jal B
blabla
B:
bla
. . .
ribla
jr $ra
Si può mettere nella linea (inline) B:
A: . . .
bla #ricopio B
. . .
ribla
blabla
Lab. Architettura - Lezione 6 p.33/64
INLINING (cont.)
Inlining è nient’altro che il “taglia e incolla” (conqualche lieve modifica, poiché si tolgono le istruzioni disalto) applicato alle procedure
È una ottimizzazione che può essere eseguitaautomaticamente da molti compilatori
Lab. Architettura - Lezione 6 p.34/64
Ottimizzazione?
L’effetto netto è il seguente:
1. Ogni volta che si esegue la procedura, non vengonopiù eseguite (come minimo) le due istruzioni di salto
2. Ma ogni volta che la procedura viene “inlined”,aumento la lunghezza del programma
Lab. Architettura - Lezione 6 p.35/64
Dunque?
Aumenta la velocità (niente salti tra procedure)
Il programma si fa più grosso (se chiamo in puntidiversi una procedura, devo ricopiare in tutti quei puntitutta la procedura
⇒ cerco di diminuire il TEMPO a spese dello SPAZIO(. . .)
Lab. Architettura - Lezione 6 p.36/64
Ottimizzazione e inlining
Per questo, l’inlining nei compilatori è unaottimizzazione di solito opzionale, lasciata alla sceltadell’utente
Visto che ottimizza qualcosa (il tempo, che di solito è lacosa a cui teniamo di più)
Ma peggiora qualcos’altro (lo spazio, cioè la grandezzadel programma)
Lab. Architettura - Lezione 6 p.37/64
Osservazione: viva l’inlining!
La memoria oggi è relativamente una risorsa di cuiabbondiamo (RAM, hard disk)
⇒ visto che aggiungo solamente il codice di unaprocedura compare una chiamata, il programma nonaumenta tantissimo
⇒ viva l’inlining!
Lab. Architettura - Lezione 6 p.38/64
Nine degrees of Separation
Nove gradi di separazione
Voi conoscete, tramite al più nove gradi di separazione,OGNI PERSONA DEL MONDO
Lab. Architettura - Lezione 6 p.39/64
Dimostrazione intuitiva
Prova: ognuno conosce 30 persone
Io conosco 30 persone
Che conoscono 30 persone ciascuna ⇒ io conosco900 persone (grado 2)
Ognuna di queste conosce 30 persone ⇒ io conosco27000 persone (grado 3) Esempio (cont.)
Morale: con nove gradi di separazione, io conosco 30alla 9 persone: 19683000000000
⇒ 19683 miliardi di persone (. . .!)
⇒ TUTTI!
Lab. Architettura - Lezione 6 p.40/64
Corrispondenza
Ogni linea di programma è una persona
Ogni volta che c’è una istruzione di salto a procedura,nasce una conoscenza tra lei e tutte le istruzioni dellaprocedura
(prima che sorgano equivoci: input e output non hannoalcuna corrispondenza. . .!)
Lab. Architettura - Lezione 6 p.41/64
Programmi e amicizie
Quindi, una procedura ha 500 istruzioni
Di cui 30 sono salti a procedura
.. Che a loro volta conoscono procedure di, diciamo, inmedia 400 istruzioni
. . .che a loro volta contengono, in media, 30 salti aprocedura ciascuno. . .
Lab. Architettura - Lezione 6 p.42/64
Inlining
Cosa fa l’inlining in questa corrispondenza?
Se ci pensate bene, aumenta la grandezza delprogramma ogni volta che c’è una conoscenza
⇒ ma quante conoscenze possono esserci. . .?
⇒ ragion per cui, quanto grande può diventare ilprogramma. . .? (!)
Lab. Architettura - Lezione 6 p.43/64
Morale
In molti casi (specie se complessi), l’espansione fornitadall’inlining può far crescere esponenzialmente lataglia del programma. . .
Ecco perché è opzionale
E soprattutto, ecco perché è conveniente usare leprocedure!!
Lab. Architettura - Lezione 6 p.44/64
Esercizio
Mostrare come e perché la prova dei Nove Gradi diSeparazione che vi ho dato sia in realtà sbagliata
Cosa succede allora nella corrispondenza fraprogrammi e persone?
E con l’inlining?
Lab. Architettura - Lezione 6 p.45/64
Problema
Dobbiamo evitare i side-effects
⇒ dobbiamo salvare i valori prima di chiamare un’altraprocedura, e poi rimetterli al loro posto
Lab. Architettura - Lezione 6 p.46/64
Nomi
Per far questo, abbiamo visto un semplice metodo
Ci si sceglie posticino tranquillo per noi, un indirizzo inmemoria, gli si dà un nome, e si usa quello come unavariabile di salvataggio
Lab. Architettura - Lezione 6 p.47/64
Limitazioni?
Funziona sempre?
Ricordate i “Nove gradi di separazione”
Voi conoscete, tramite al più nove gradi di separazione,OGNI PERSONA DEL MONDO
Lab. Architettura - Lezione 6 p.48/64
Dimostrazione intuitiva
Prova: ognuno conosce 30 persone
Io conosco 30 persone
Che conoscono 30 persone ciascuna ⇒ io conosco900 persone (grado 2)
Ognuna di queste conosce 30 persone ⇒ io conosco27000 persone (grado 3)
Lab. Architettura - Lezione 6 p.49/64
Perché è sbagliata?
Perché tra tutte le persone che conoscono i miei 30amici, non tutte sono distinte, molti sono amici comuni(ad esempio, proprio io!)
⇒ non ho 30*30 amici, ma molti meno
E cosi’ via per distanze più lontane
Lab. Architettura - Lezione 6 p.50/64
Problema astratto
Il problema astratto è dunque che la relazione diconoscenza può avere cicli:
A conosce B che conosce A
Lab. Architettura - Lezione 6 p.51/64
Problema concreto
Per la nostra metafora, significa che ci potrebbe essereuna procedura A che chiama una procedura B che poirichiama A
⇒ ci possono essere situazioni RICORSIVE
Lab. Architettura - Lezione 6 p.52/64
Problema dei nomi
Ora i nomi non sono più posti tranquilli e riservati pernoi, visto che ci servono per fare cose diverse insituazioni diverse
Per cui, salvare in delle variabili fisse non funziona nelcaso in cui la procedura chiami se stessa (direttamenteo indirettamente)
Lab. Architettura - Lezione 6 p.53/64
Nomi II
Nomi diversi: hanno le buona proprietà che possiamofare cose anche parallelamente: ognuno mette i suoidati in posti diversi
Lab. Architettura - Lezione 6 p.54/64
Sequenzialità
Però, noi in questo ambito non abbiamo processiparalleli
Le operazioni che facciamo sono sempre sequenziali:prima qualcuno fa qualcosa, poi un altro faqualcos’altro, e cosi’ via
⇒ In ogni momento, c’è solo un programma attivo
Lab. Architettura - Lezione 6 p.55/64
Dunque . . .
Possiamo sfruttare questo fatto per immagazzinare lenostre variabili:
USIAMO UN UNICO POSTO per tutti
Un posto che permette di salvare più dati
⇒ LO STACK
Lab. Architettura - Lezione 6 p.56/64
Stack
È un punto dove noi possiamo mettere e togliere dati
Come un mazzo di carte:
PUSH (mette una carta in cima al mazzo)
POP (toglie la carta in cima al mazzo)
Lab. Architettura - Lezione 6 p.57/64
Funziona?
Per il “senso civico”
Se tutti puliscono dopo che hanno fatto, non siaccumula spazzatura e tutto va bene
Lab. Architettura - Lezione 6 p.58/64
Perché funziona
Perché in ogni momento c’è solo una sola procedurache mette le carte.
E spetta a lei, quando ha finito, togliere le carte che hamesso nel mazzo
In questo modo, ognuno quando ha finito lascia le coseesattamente come stavano Come funziona
Dobbiamo semplicemente implementare in qualchemodo le istruzioni di PUSH (metti) e POP (togli)
C’è un registro apposito per implementare lo stack: sp(stack pointer, puntatore allo stack)
Lab. Architettura - Lezione 6 p.59/64
PUSH (metti)
PUSH(registro) mette un registro sullo stack
addi $sp,$sp,-4
# fa spazio sullo stack
sw registro,0($sp)
# mette il registro nello
# stack
Lab. Architettura - Lezione 6 p.60/64
POP (togli)
POP toglie il primo elemento dello stack (e lo mette daqualche parte)
lw registro,0($sp)
#copia il primo elemento
#dello stack nel registro
addi $sp,$sp,4
#libera lo stack
Lab. Architettura - Lezione 6 p.61/64
Esempio
Chi è? Leonardo Fibonacci
Il più grande matematico del Medioevo
Fibonacci = filo bonacci, figlio di bonaccio
Ha scritto il Liber Abaci (“libro dell’abaco”), trattato diaritmetica e algebra, in cui tra l’altro difende i metodidella notazione araba
Lab. Architettura - Lezione 6 p.62/64
I conigli di Fibonacci
Si mette una coppia di giovani conigli assieme
I conigli impiegano due mesi di tempo a fare unacoppia di figli
Quanti conigli ci sono dopo n mesi?
⇒ F(n) , l’n-esimo numero di Fibonacci Numeri diFibonacci
F(1)=1
F(2)=1
F(n) = F(n-1) + F(n-2)
Lab. Architettura - Lezione 6 p.63/64
Passiamo ora a SPIM
Programma iniziale
E programma finale
Lab. Architettura - Lezione 6 p.64/64