Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Lezione 12 (14.04.2021)
Il problema che avevamo lasciato aperto era quello delle interruzioni interne. Perché si può alterare all'interno un ordine delle interruzioni? Perché c'è l'internal forwarding, per cui è possibile che si generino delle interruzioni non esatte. L'obiettivo è: creare un sistema che sia in grado di arrestare opportunamente la pipe in modo da completare le istruzioni che precedono quella che ha generato l'interruzione senza avviare quelle che seguono, così da ottenere un comportamento che rispetti quello descritto da Von Neumann che viene definito "gestione precisa delle interruzioni". Ma ciò non è semplice per la varietà di situazioni e d'interruzioni da fronteggiare: - esterne (meno critico) - interne. Questo problema si può avere anche se ho una singola pipe, perché se siamo nella fase di decodifica,
mentre l'istruzione i è nella fase EX, potrebbe succedere che i+1 può generare un'eccezione e l'istruzione i ancora non la genera perché lo farebbe in fase di MEM e ci arriva dopo.
Esistono 2 diverse soluzioni: quella conservativa e quella non conservativa. Le non conservative si occupano di fare "roll-back" cioè devono tornare indietro rispetto.
DOMANDA: perché alcuni produttori usano l'approccio preciso e altri no? L'approccio preciso comporta un maggior impiego di hardware. Però perché può servire l'approccio preciso? Cioè, perché se ci sono più azioni in corso in un'azienda, mi interessa sapere l'ordine preciso con cui un evento è accaduto? Quando faccio un'interruzione faccio un servizio che altera il comportamento; se arrivo ad avere un comportamento illegale riesco a sapere qual è il punto preciso dell'illegalità (non
correttezza).=> Supponiamo che ho un programma che si divide su vari rami ; se quando vado a fare il test enon ho le interruzioni precise, può succedere che mi interrompe i+1 per un motivo casuale e nonvedo che l’istruzione i mi avrebbe bloccato illegalmente. Allora io vado a correggere i+1pensando che l’unica anomalia era questa, quando invece c’è un’anomalia più importante.Quindi perdo del tempo a rifare test e quindi soldi e ho delle indeterminazioni.Qual è l’approccio software a questo problema? Nella pipe ho le istruzioni che vanno da i-2 a i+2:quando vado a fare l’analisi del problema, i debugger mi dicono che mi ha interrotto l’istruzionei+1, ma non so se ti poteva interrompere anche i, i-1 e i-2 e quindi vatti a vedere come vannoloro => il debugger mi da un grado di indeterminazione.L’approccio di roll back è una metodologia che già dovremmo conoscere? Su basi di dati, quandoabbiamo
parlato delle azioni ACID (azioni atomiche: azioni che non sono divisibili). L'idea è semplice: se sono nello stato S0 e devo andare in S1, questo sistema di rollback mi dice che se non sono in grado di andare in tutti i sottostanti (in figura), devo tornare indietro. I sistemi di rollback sono sistemi in cui, prima di convalidare uno stato, posso essere sicuro di poter tornare indietro. DOMANDA: Quando succede che passo da S0 a S1 e non posso più tornare indietro? Gli stati sono memorizzati quando scrivo nei registri, perché ormai quando ho scritto ho scritto (cioè quello che nella base dati è la fase di memorizzazione). Però, poiché il processore è una macchina sequenziale, modificare lo stato significa modificare valori nei registri. Come si implementa questo metodo di rollback nei processori? Attraverso 2 tecniche: - checkpoint - history buffer La tecnica del checkpoint significa che io faccioogni tanto una fotografia dei registri, per cui quando c'è un'interruzione io ripristino i registri prima della fotografia. Quindi, se i+1 mi ha dato interruzione, faccio rollback rispetto all'ultima fotografia che avevo, e da quella foto ripristino le istruzioni i-k e vado a fare le istruzioni una alla volta e l'approccio diventa conservativo (però è diventato conservativo dopo che ho avuto un problema). La questione si complica quando in realtà scrivo nella memoria (perché ho anche i registri della memoria). La tecnica dell'history buffer è più precisa, perché quando faccio un'operazione, faccio un log delle operazioni: quando si verifica l'interruzione, inserisco il codice INT ma non la faccio generare, la faccio generare quando termina l'istruzione i. Se termina i e genera interruzione mi fermo in modo preciso, altrimenti i si chiude, posso registrare anche i+1 e quindi.l'interruzione correttamente si verificherà all'istruzione i+2.=> questo è più preciso perché non fa una foto, ma memorizza "la storia". OSS: in questo log non necessariamente entrano tutte le istruzioni
Ad un certo punto ci si è scatenati per trovare sempre maggiore velocità.
Nelle architetture VLIW (Very Long Instruction Word) più istruzioni sono impacchettate in una sola.
Nelle architetture superscalari il parallelismo diviene doppio: non solo vengono eseguite in parallelo diverse fasi delle istruzioni grazie alla pipe, ma abbiamo più pipe in parallelo. Con due pipe vengono schedulate due istruzioni alla volta.
Nelle VLIW abbiamo unità separate, non di tipo pipelined, che eseguono ciascuna un diverso tipo di operazione: una l'addizione, una la moltiplicazione ecc.
Le istruzioni del programma sono impacchettate dal compilatore in modo da utilizzare tutte le diverse stazioni: cercano cioè di
alimentare contemporaneamente le diverse stazioni con operazioni di addizione, moltiplicazione ecc. Dunque un certo numero di istruzioni vengono eseguite in parallelo da unità disgiunte. Occorre però essere in grado di creare macroistruzioni a partire da microistruzioni, in base alle unità funzionali disponibili. Esistono una serie di problemi: se c'è una sola addizione da fare non è possibile inserirne due nella relativa stazione; se due operazioni, dello stesso o diverso tipo, vanno in conflitto sui dati non possono essere caricate in ordine casuale. Inoltre, le istruzioni di salto diventano ancora più complicate, perché non si possono fare previsioni e non si può bloccare la pipe dal momento che non esiste una pipe. Se si effettua un salto sbagliato, non si può tornare indietro. Queste architetture trovano applicazione non nei comuni PC, ma nei processori DSP (Digital Signal Processing). Un DSP è un processore
orientato all'elaborazione dei segnali; alcuni DSP sono estremamente verticalizzati in tale finalità, altri sono un po' più general purpose.
Lezione 13 (16.04.2021)
Il mondo esterno non sempre è a valori discreti, quindi teoricamente, quando dobbiamo collegare qualcosa dall'esterno abbiamo il problema di dover capire se è qualcosa di digitalizzato oppure no. Se dobbiamo prendere qualcosa che non è digitale, dobbiamo utilizzare un convertitore, A/DD/A.
Se pensiamo ad una tastiera, è un insieme di elementi limitato, quando premo un tasto teoricamente ho deciso che ho premuto su una certa riga e una certa colonna: dalla codifica di riga e colonna ricavo un'informazione che può essere ulteriormente codificata, per poter in qualche modo dire poi che carattere è stato digitato.
"codifica non minima" "codifica minima"
Dalla tastiera ho una che poi diventa attraverso l'utilizzo poi di una
macchina combinatoria. Questo della tastiera possiamo dire che è un esempio in cui il segnale di ingresso è già pressoché "digitale". Se invece abbiamo una convertitore A/D, come si comporta? Se ho un segnale A/D ho due problemi:
- di dinamica: una volta individuato un segnale ho un problema di quantizzazione
- Sono due problemi differenti: se ho una tensione sempre fissa, non ho un problema di dinamica ma comunque ho un problema di quantizzazione.
Se devo prendere la "dinamica del segnale", cioè la capacità di ricostruire un segnale sia nel tempo sia nei valori, devo decidere prima di discretizzare il tempo e poi di discretizzare i valori: il campionamento (prendere un valore in un certo tempo) è legato alla banda sel segnale. Quindi, se ho un segnale che voglio acquisire, saputa la banda (cioè la frequenza massima) devo campionare, secondo il teorema di Nyquist a 2fc. Vuol dire che se il segnale ha una dinamica molto elevata,
Per poter acquisire tutti i campioni, devo andare molto veloce: per questo, potrei avere sistemi dedicati che acquisiscono prima tutti i segnali e poi li elaborano. Se non riesco a campionare a quella frequenza, sono costretto a filtrare il segnale (perdo qualche informazione) e poi posso campionarlo.
Una volta che campiono e prendo un certo valore, devo rendere questo valore discreto e devo capire in più il convertitore quanti bit usa per convertire: più bit metto, più accurata è la rappresentazione, più difficile però è stare dietro la dinamica (perché devo prendere tanti campioni). È necessario allora decidere un trade-off.
Per quantizzare un segnale analogico dal punto di vista elettronico, solitamente ci sono dei componenti basati su operazionali, che fanno tanti confronti del tipo "è stato maggiore o minore del segnale confrontato, allora sarà 0 oppure 1" (ad esempio valori di tensione rispetto ad
Un valore di riferimento). In questo modo il segnale passa da un dominio analogico ad un dominio discreto.
Qual è il problema che abbiamo ora? Abbiamo il problema che in qualche modo il processore è una macchina che in realtà è in grado soltanto di effettuare operazioni su registri, perché questa macchina è sequenziale e quindi nella sua evoluzione l'effetto finale che ha è quella di poter modificare valori nei registri: questo vuol dire che se voglio interagire con il mondo esterno posso solo scrivere o leggere dei valori nei registri.
Allora vuol dire che esistono dei registri che sono all'esterno dei registri della memoria, ma che il processore può raggiungere solo attraverso meccanismi di lettura e scrittura, che sono registri particolari: dal lato del processore posso solo leggere o scrivere, dal lato della periferica possono inviare e ricevere segnali.
Esistono dunque tre tipi di registri:
- di tipo dato, che possono