lab-arch/lezioni/2008/lezione6.pdf · ribla blabla Lab. Architettura - Lezione 6 p.33/64 INLINING...

16
Laboratorio di Architettura Lezione 6 Andrea Torsello Dipartimento di Informatica Universit` a “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 di alto livello (if, while) Lab. Architettura - Lezione 6 p.2/64 Procedure Le procedure sono dei pezzi di codice di particolare utilità che possono essere chiamate dal programma principale 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

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