Progettiamo un benchmark per Arduino e compatibili

Arduino benchmark

Presentiamo ai nostri lettori uno strumento progettato appositamente per il benchmark di schede di tipo Arduino e compatibili.

L’ineffabile Paolo Aliverti ha recentemente pubblicato una serie di video relativi a schede Arduino “potenziate”: si va da Arduino Nano Every, un Arduino su steroidi con clock a 20 MHz al WeMos, una scheda basata su Esp8266 a 80/160 MHz, alla famiglia Teensy, con clock sino a 600 MHz.

Da parte nostra, abbiamo avuto in laboratorio due schede prodotte da SeeedStudio: il Seeeduino XIAO (con un Arm Cortex-M0 da 48 MHz e 2 MB di memoria, ed il Seeeduino Wio Terminal (con un Arm Cortex-M4F da 120/200 MHz).

In che modo possiamo confrontare queste schede potenziate rispetto al nostro classico Arduino Uno a 16 MHz?

Un’occhiata all’architettura

Arduino adotta un chip con un’architettura a 8 bit: questo significa che per sommare due valori a 16 bit occorre sommare tra loro i LSB (least significant byte), quindi sommare i MSB (most significant byte) ed eventualmente aggiungere il bit di carry (riporto). In altre parole, la somma tra due valori a 16 bit richiede al microcontroller più tempo di quello necessario per una somma ad 8 bit. Questo discorso vale a maggior forza per le operazioni a 32 bit. Nel caso di schede dotate di microprocessore Arm a 32 bit invece (tipicamente un Cortex-M0 o Cortex-M4), l’architettura interna del microprocessore è già a 32 bit, quindi le operazioni hanno tutte la medesima velocità, a prescindere dal numero di byte degli operandi.

Quello che cambia, invece, è il trattamento dei dati in virgola mobile. Innanzi tutto, per lavorare in floating point occorre “vedere” la configurazione dei bit dei nostri dati in modo differente (codifica IEEE 754), poi occorre lavorare per approssimazioni successive di potenze negative di 2. Per il momento ci fermiamo qui, notando che sotto Arduino il formato dati float e double sono trattati allo stesso modo, mentre per i sistemi con microprocessore Arm la differenza nella velocità doi esecuzione è evidente.

Non è nostra intenzione portare avanti un corso di Assembler per Arduino in questa sede, tuttavia se il discorso interessa a più di qualcuno, potremmo valutare la possibilità di prepararne uno.

Arduino benchmark

Frequenza di lavoro e memoria

Un’altra chiave di lettura del nostro benchmark consiste nella frequenza di clock del microcontroller. Ovviamente, a parità di condizioni, maggiore è il clock del micro, maggiore sarà la velocità di esecuzione. Tuttavia, a causa degli stati di attesa, degli interrupt e del surriscaldamento, non è detto che con il doppio della frequenza si ottenga il doppio della velocità.

Un altro valore da tenere in considerazione è la quantità di memoria a disposizione: spesso una maggiore complessità dell’algoritmo scelto consente un notevole incremento di velocità di esecuzione, ma ciò significa l’ìutilizzo di strutture di dati più complesse, che quindi necessaitano di maggiore memoria. Spesso gli algoritmi per la AI utilizzano alberi e liste concatenate, che per loro natura sviluppano grafi che riempiono rapidamente la memoria disponibile su Arduino, e che beneficiano grandemente della migliore fornitura di memoria sulle schede compatibili.

Multitasking cooperativo, pre-emptive, e time-slicing

Discorso a parte merita il multitasking. Con multitasking si intende la possibilità di portare avanti più compiti “contemporaneamente”, suddividendo ciascun algoritmo lungo sottili “fette di tempo utile” o time-slices. Arduino non consente di lavorare in multitasking vero e proprio, ma permette l’utilizzo di interrupt: come il termine lascia comprendere, un interrupt interrompe il programma in corso per lanciare un programma a maggiore priorità, in genere brevissimo, che una volta terminato cede nuovamente il controllo al vecchio programma. Un po’ come una funzione, ma con la differenza che l’interrupt piò essere lanciato dall’hardware (e quindi dal GPIO). Per il multitasking pre-emptive occorre in genere un sistema operativo completo, mentre è possibile optare per un multitasking cooperativo utilizzando gli interrupt ed il time-slicing. Appare evidente come la presenza di un microprocessore Arm sulla nostra scheda Arduino-compatibile moltiplichi notevolmente le capacità di lavoro cooperativo del sistema.

Uno sguardo ai risultati

Abbiamo quindi creato un programma che tenga conto di tutti questi parametri, che fosse in grado di girare sulla versione base di Arduino ma riuscisse a sfruttare le potenzialità di architetture più potenti, se presenti. La prima sezione si occupa di computare una serie di operazioni di base suddivise per numero di byte degli operandi. Come è facile notare, le versioni più potenti, con architettura a 32 bit, non mostrano differenze di rilievo nella velocità di esecuzione. Al contrario, mentre per Arduino non vi è differenza tra float e double, per i sistemi a 32 bit viene eseguita una libreria di emulazione differente per valori float e double, e quindi i tempi di esecuzione tra float e double sono differenti. Infine, sono state scelte alcune routine matematiche che sfruttano diverse caratteristiche del sistema: routines matematiche con numeri interi, funzioni in virgola mobile, chiamate che sfruttano pesantemente la ricorsione e chiamate CPU/GPU intensive. I tempi presentati sono in microsecondi, quindi ad un valore più basso corrisponde una prestazione migliore. Il tempo totale del benchmark invece è definito in millisecondi: si va dai 100 secondi necessari ad Arduino per completare il benchmark ai sei secondi abbondanti di Wio Terminal overcloccato a 200 MHz: si tratta di differenze vicine ad un fattore 20!

Arduino BenchmarkSul nostro canale YouTube è stato pubblicato un video che descrive gli algoritmi scelti per il benchmark.

Conclusioni

Come abbiamo spiegato nell’articolo sull’ottimizzazione del codice per Arduino, avere più potenza consente alla nostra scheda di pilotare un maggior numero di periferiche e sensori senza dover necessariamente scomodare un Raspberry PI. Meno problemi di configurazione, consumi ridotti all’osso e notevole flessibilità di utilizzo, quindi, ad un prezzo decisamente più vantaggioso.

Contiamo di mettere i risultati del benchmark su una pagina del nostro blog. Se volete aggiungere i valori dei vostri sistemi alla tabella, inviateci una mail, e vi faremo avere  copia del file necessario: ci aiuterete nel passare da una fase di alpha test ad una di beta, ed a creare una sorta di database con i valori delle schede Arduino-compatibili – ovviamente organizzati e ricercabili.

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.