• Non ci sono risultati.

Prestazioni e comparazione

4.1 Modalità di test

La valutazione delle prestazioni su ciascuno dei due dispositivi è differente. Il modo in cui la rete neurale viene implementata è infatti profondamente differente e le informazioni, i tool di sviluppo e le simulazioni disponibili per ciascuna delle due architetture varia.

4.1.1 Generazione dei parametri delle reti

Per testare le varie implementazioni della rete neurale occorre scegliere un data-set associato ad un particolare problema da risolvere. Una volta scelto il data-set che si vuole impiegare occorre addestrare una rete neurale in modo che i risultati che ottiene siano in gran parte corretti. Per fare ciò si utilizza il Deep Learning Tool™

di Matlab™ [2]. La rete neurale generata in Matlab™ viene addestrata utilizzan-do il data-set per l’apprendimento (training) e viene testata con il data-set per la validazione (validation) per vedere se si ottengono dei buoni risultati. I valori di input provenienti dal data-set vengono salvati in un file che servirà da input per le

implementazioni fisiche della rete neurale. I bias e i pesi della rete neurale vengono estrapolati e salvati in un file in modo che possano successivamente venire caricati su microcontrollore e su FPGA; l’ordine con cui vengono salvati si trova nei paragrafi 2.3.3 e 3.4. Anche gli output generati dalla rete neurale su Matlab™ vengono salvati in un file necessario per verificare il funzionamento delle implementazioni fisiche.

4.1.2 Testing dell’implementazione su FPGA

Il testing della rete neurale su FPGA avviene interamente tramite simulazioni. La famiglia di FPGA utilizzata per i test è l’Intel Cyclone 10 LP FPGA [7] come de-scritto nel paragrafo 2.1.3. Il codice viene compilato utilizzando l’IDE Intel Quartus Prime Starter Edition. I test vengono effettuati con Altera Modelsim utilizzando un file di testbench che preleva i pesi della rete neurale e gli input da file in formato floating point; il testbench trasforma tutti i valori in fixed point e invia alla rete prima i bias e i pesi, poi gli input, rispettando i segnali descritti nel paragrafo 2.3.1.

Allo stesso tempo salva gli output in un file per valutare se la rete stia operando correttamente. I valori di output di riferimento utilizzati sono quelli generati con Matlab™.

I test per la valutazione del numero di colpi di clock medio impiegati per cia-scuna operazione vengono effettuati utilizzando la versione Register Transfer Level (RTL) del circuito. Si valuta il numero totale di cicli utilizzati per il calcolo e lo si divide per il numero totale di operazioni eseguite. Le operazioni vengono eseguite con il massimo throughput possibile: i dati vengono inviati non appena la macchina è pronta a riceverne e vengono prelevati non appena sono validi in uscita. È impor-tante notare che il numero di cicli medio per operazione non è pari al numero di cicli che intercorrono tra l’inserimento dell’input e la generazione dell’output: poi-ché la macchina ha un numero di livelli di pipeline molto elevato dopo l’inizio di un’operazione molte altre possono essere iniziate prima che questa finisca. Questo parametro è indicativo per valutare facilmente l’energia consumata per operazione;

invertendolo si può ottenere il throughput del circuito.

Quartus è in grado di valutare i percorsi critici del circuito e quindi la frequenza massima a cui questo può lavorare. Utilizzando questa informazione è possibile va-lutare il tempo di calcolo effettivo, moltiplicando il numero di cicli per operazione per il periodo del segnale di clock (eq. 4.1). In questo modo è stato possibile an-che minimizzare la lunghezza dei percorsi critici inserendo registri di pipeline dove necessario.

top[s] = cicliop

f[Hz] (4.1)

Utilizzando la versione gate-level del circuito ricavata dal compilatore è inoltre possibile ricavare un file Value Change Dump (.vcd) dove vengono registrate tutte le variazioni di tensione all’interno dell’architettura. Questo consente a Quartus di ricavare le switching activity dei segnali e quindi la potenza dissipata dal dispositivo, sia a livello statico che a livello dinamico, con un’incertezza del 20%. Si trascura la potenza dissipata per gli input e per gli output in quanto non è definito il modo in cui i valori vengono inviati al chip e poiché anche su microcontrollore le operazioni di input e output non vengono considerate. Bisogna tenere conto del fatto che se si vuole valutare la dissipazione di potenza dinamica a frequenze diverse rispetto a quella in cui è stata misurata occorre effettuare una proporzione: la potenza dinamica dipende linearmente dalla frequenza. Moltiplicando infine la potenza dissipata per il tempo di operazione è possibile valutare l’energia spesa per singola operazione (eq.

4.2).

Eop[J] = top[s] · P [W ] (4.2)

4.1.3 Testing dell’implementazione su microcontrollore

Il testing dell’implementazione della rete neurale su microcontrollore avviene su scheda NUCLEO-STM32F303RE della ST Microelectronics [11] che dispone di un microcontrollore [8] basato su Arm Cortex M4, di utilizzo piuttosto diffuso.

Viene programmata una semplice interfaccia grafica utilizzando Visual C# il cui compito è quello di prelevare i valori dei pesi e degli input da file, convertirli in valori fixed point e inviarli al microcontrollore tramite linea seriale UART; i dettagli riguardanti al modo in cui i dati vengono ricevuti dal dispositivo si trovano nel paragrafo 3.1. La stessa interfaccia si occupa poi di ricevere i valori di output e di salvarli in un file per verificarne la correttezza.

Le prestazioni vengono valutate utilizzando un contatore del microcontrollore stesso, anche questo descritto nel paragrafo 3.1. Il tempo totale di calcolo misurato in us viene inviato all’interfaccia grafica su PC alla fine delle operazioni. Per ottenere il tempo medio necessario a effettuare una singola operazione si divide questo tempo per il numero totale di operazioni effettuate.

Dal datasheet del microcontrollore si può ricavare la frequenza massima di fun-zionamento e la potenza media dissipata durante l’elaborazione. La potenza segnata

dipende dalla frequenza, ma non linearmente poiché contiene anche il contributo statico. A partire dalla frequenza massima di funzionamento si può calcolare il nu-mero di cicli necessari per un’operazione per poter fare un confronto con l’FPGA indipendente dal periodo del clock (eq. 4.3).

cicliop = top[s] · f[Hz] (4.3)

A partire invece dalla potenza dissipata e dal tempo per operazione si può ricavare l’energia utilizzata per operazione, come nell’equazione 4.2.