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
FLOATING POINT UNIT (FPU)
Esistono decodifiche Half (16 bit) / single (32 bit) /double (64 bit) precision, a seconda della precisione che vogliamo ottenere.
La codifica HALF PRECISION ha:
- 1 bit per il segno;
- 5 bit di esponente;
- 10 bit di Mantissa;
per un totale di 16 bit.
La codifica SINGLE PRECISION, che è la più utilizzata (usata anche nella nostra fpu) ha:
- 1 bit per il segno;
- 8 bit per l'esponente;
- 23 bit di Mantissa;
La DOUBLE PRECISION è una codifica a 64 bit, che ha una dinamica molto elevata e un'elevata precisione, però è una codifica molto costosa dal punto di vista delle risorse.
FORMATO A 8 BIT
Non è un formato standardizzato. Quando rappresentiamo un numero abbiamo 3 possibili formati:
- INTEGERS FORMAT (formato intero) che può essere:
- Unsigned;
- Signed;
- FIXED POINT FORMAT (formato a virgola fissa, è un buon compromesso):
Viene usato solo per i numeri interi.
è un intero,
Il quale però i bit vengono suddivisi tra una parte intera e una parte decimale, come nella rappresentazione a fianco dove vi sono 4 bit per la parte intera e 3 bit per la parte decimale. Questo viene chiamato formato Q4.3. Poi abbiamo un formato, il Q0.7, abbiamo 0 bit per la parte intera e 7 bit per la parte decimale.
3) FLOATING POINT FORMAT: per utilizzare questo formato serve un grosso dispendio di energia. È emulabile tramite software.
- IEEE754 like (8bits) è il Floating Point Format. In questo formato non abbiamo una risoluzione costante.
- Signed integers è un intervallo più esteso, ma comunque non sufficiente.
NUMERO NORMALIZZATO (floating point)
- Viene codificato come: Nsegno + parte (fixed) tra 1.0 e 2.0 moltiplicata per 2
- Segno (1 bit):
- 0: positivo
- 1: negativo
- Esponente (fixed) (8-bit):
- ha un valore compreso tra 0 e 254
- ha un range che varia da -126 a +127
- Mantissa (risoluzione) (23-bit): è un valore tra 0
saturazione(tramite i quali possiamo gestire una saturazione).Riassumendo… La precisione ha dei limiti però, perché cipotrebbero essere degli errori diarrotondamento, dovuti al fatto che ilnumero lo rappresentiamo con una certaapprossimazione. Questi errori diarrotondamento possono accumularsi conil susseguirsi di operazioni e potrei avereun risultato che non è preciso.Lo schema rappresenta la differenza tra calcoli di somme o moltiplicazionicon FPU e senza FPU.Si nota che abbiamo un fattore di guadagno 10x.SPECIFICHE FPU NEL CORTE-M4• La nostra scheda lavora con single precision FPU• Effettua le conversioni tra:- Numeri interi;- Single precision floating point;- Half precision floating point;• Riesce a gestire le eccezioni di floating point;• Il programmer’s model ha una struttura con 16 registri ed ha un proprio status register.ISTRUZIONI ARITMETICHE Ogni istruzione ha la ‘V’ avanti, che sta per‘Vector’
caratteristica delle FPU. La nostra floating point unit è complied, non tutte le istruzioni, con IEEE754-2008.
Ad esempio, non possiamo:
- arrotondare i floating point number a interi;
- convertire da binario a decimale e viceversa;
- compaire diretta tra SP (Single Precision) e DP (Double Precision).
Il FLUSH TO ZERO entra in azione quando abbiamo valori molto piccoli. Tutti i valori sotto una certa soglia li mette a zero, è settabile attraverso il bit FZ della FPU.
FPU PROGRAMMER’S MODEL
Anche la FPU ha il suo programmer’s model. Quindi anch’essa ha la sua lista dei registri e le sue modalità di funzionamento. Durante l’esecuzione del programma nella pipeline abbiamo il primo ciclo di fetch incomune e successivamente si decide se è un’istruzione normale o una delle FPU.
La FPU ha una sua piccola pipeline che tiene separate le funzioni di decode ed execute.
Principalmente i registri sono divisi nel seguente modo:
- CPACR
(Co-processor Access Control Register): gestisce la modalità di accesso, cioè se in modalità privilegiata o no, oppure se l'accesso è negato;
FPSCR (Floating Point Status and Control Register): sono dei registri di controllo che gestiscono alcune funzioni come il flush to zero oppure l'alternate half precision format;
ADDITIONAL REGISTER.FPU REGISTER
Dato che l'FPU è un co-processore, anche lei ha una lista di registri general purpose che vengono utilizzati per l'esecuzione delle varie istruzioni.
Abbiamo 32 registri, a single precision (32 registri a 32 bit che possono diventare 16 registri, R0-R15, a 64 bit).
I registri da R0 a R15 sono chiamati CALLER SAVED: se una funzione A chiama una funzione B, la funzione A deve salvare il contenuto di questi registri prima di chiamare la funzione B.
I registri da R16 a R31 sono i registri CALLEE SAVED: se la funzione A chiama la funzione B e la funzione B ha bisogno di utilizzare
più di 16 registri per i suoi calcoli, bisogna salvare il contenuto di questi registri ad es. all'interno dello stack e poi può fare il restore dei registri prima di tornare alla funzione A.
ECCEZIONI FPU
Lo status control register della FPU può generare delle eccezioni che vengono gestite in un modo nonstandard, ma che il nostro FPU in generale è capace di gestire.
STACK FRAME IN FPU
/*La FPU è un co-processore, perché ha le sue modalità di funzionamento, i suoi registri, le sue funzioni di interrupt e quindi complica l'architettura interna. */
Quando bisogna eseguire una routine di interrupt, c'è bisogno di un piccolo overhead nei sistemi che richiedono questo interrupt, nel quale vengono eseguite alcune operazioni. Una delle quali è salvare i valori dei registri usati nell'operazione corrente. Quindi ogni volta che c'è un'interruzione devo salvare il doppio della roba sullo stack,
Causando un notevole ritardo. Come possiamo notare c'è una bella differenza di coseda salvare sullo stack tra Frame con FPU e senza FPU,così facendo invece di migliorare le prestazioni le storiducendo, vediamo come migliorare la situazione.
Per gestire al meglio il controllo dell'implementazione delcontext switching l'FPU ha un registro di controllo apposito,FPCCR, che a seconda di come è configurato vengono inseriti idati sullo stack in modo differente.
2 flag hanno il funzionamento più importante: -ASPEN -LSPEN.
Guardando la figura di sopra possiamo dire che:
- ASPEN=0: non viene riservato lo spazio e i registri non sono caricati automaticamente;
- ASPEN=1, LSPEN=1: viene riservato lo spazio, ma i registri non vengono caricati automaticamente;
- ASPEN=1, LSPEN=0: viene riservato lo spazio e i registri vengono caricati automaticamente.
Quando il flag di ASPEN è settato, esso abilita la conservazione automatica dello stato dei registri.
da S0 a S15 e del FPSCR. Se settato il flag LSPEN, consente di abilitare il Lazy stacking, che è una tecnica utile per abbassare la latenza del context switching. Essa permette di allocare lo spazio di memoria dello stack, ma i registri non sono caricati automaticamente.
Riguardo la FPU un problema molto importante riguarda gli arrotondamenti delle cifre dopo la virgola che possono implicare risultati leggermente differenti. Riguardo a questo problema è consigliabile sempre di evitare di lasciare decidere al compilatore; quindi, bisogna specificare sempre il tipo di dato.
Si raccomanda di utilizzare sempre tipologie di conversioni semplici. Non bisogna nemmeno fare tatti accumulazioni, arrotondando sempre, perché si può avere un errore. Anche nella parte di sottrazione e addizione ci possono essere errori di approssimazione.
ISTRUZIONI DSP (Data Signal Processing)
Inizialmente i processori compivano task molto semplici e ripetuti, attualmente invece
Effettuiamo innumerevoli task differenti e abbiamo applicazioni che richiedono una grossa quantità di calcolo dei dati. Per questo motivo sono state fornite al processore degli algoritmi per semplificare i calcoli e dargli un po' di capacità computazionale in più.
Nell'instruction set dell'ARM c'è un blocchetto chiamato SINGLE-CYCLE MULTIPLY-ACCUMULATE UNIT che si occupa di effettuare operazioni come la moltiplicazione e l'accumulazione in un singolo ciclo di clock. Nel Cortex M3 invece ci vogliono molti più cicli.
Con questo blocchetto possiamo fare operazioni in un singolo ciclo del tipo:
- Moltiplicazione con e senza segno;
- Accumulazioni-moltiplicazioni con e senza segno;
- Accumulazioni-moltiplicazioni con e senza segno con accumulazione long (64bit).
I benefici sono molto evidenti:
- Guadagno di performance 4x riguardo le MAC a 16bit (dual 16-bit MAC);
- Guadagno di performance 2x riguardo le MAC a 32bit;
Guadagno di performance 7x riguardo le MAC a 64bit (perché fare un'operazione in hardware ci porta un certo numero di cicli, emularla con un software richiede un overhead molto maggiore, perciò avendo un M4 che ha la possibilità di poter svolgere operazioni tramite hardware interni (M4), ci fa guadagnare a livello prestazionale ed è anche più semplice riguardo l'emularlo su un software (M3), motivo per il quale è più performante l'M4 che l'M3).
ESEMPI MAC è l'operazione che moltiplica 2 unsigned int (Rm ed Rn) e somma il valore ottenuto ad un altro unsigned int a 64 bit contenuto nel registro di destinazione a 64 bit RdLo e RdHi che sono la parte bassa e la parte alta del registro di destinazione.