Il prossimo grande linguaggio di programmazione di cui non hai mai sentito parlare
Exo si basa sull’idea della pianificazione dell’utente per esternalizzare la mappatura dell’hardware e le decisioni di ottimizzazione
Alla International Conference on Programming Language Design and Implementation (2022), gli scienziati del Computer Science and Artificial Intelligence Laboratory (CSAIL) del MIT hanno pubblicato un documento di ricerca intitolato “Exocompilation for Productive Programming of hardware accelerators” che propone un nuovo linguaggio di programmazione, “Exo ‘, che può essere utilizzato per scrivere codice ad alte prestazioni su acceleratori hardware.
Exo è un linguaggio di programmazione specifico del dominio che aiuta gli ingegneri delle prestazioni di basso livello a trasformare programmi molto semplici che specificano ciò che vogliono calcolare in programmi molto complessi che fanno la stessa cosa delle specifiche ma molto più velocemente. È sia un linguaggio di programmazione che un compilatore e consente di definire istruzioni hardware personalizzate, memorie specializzate e stati di configurazione dell’acceleratore nelle librerie utente.
Exo si basa sull’idea della pianificazione dell’utente per esternalizzare la mappatura dell’hardware e le decisioni di ottimizzazione.
Il fattore di spinta
Acceleratori come GPU e processori di segnali di immagine svolgono un ruolo sempre più importante nei moderni sistemi informatici. Anche nelle CPU, i miglioramenti delle prestazioni derivano sempre più da nuove istruzioni da parte di unità funzionali specializzate. Questi hardware specializzati sono più efficienti del software in esecuzione su hardware generico. Tuttavia, la maggior parte delle applicazioni può ottenere queste prestazioni ed efficienza solo nella misura in cui le librerie chiave di basso livello di kernel ad alte prestazioni (come BLAS, cuDNN, MKL e altri) sono ottimizzate per sfruttare l’hardware. Pertanto, il ruolo svolto dalle librerie del kernel ad alte prestazioni diventa critico.
Tuttavia, gli ingegneri delle prestazioni che creano queste librerie di basso livello ad alte prestazioni hanno un supporto limitato per il linguaggio di programmazione. Nonostante decenni di lavoro sull’ottimizzazione completamente automatica del compilatore, i kernel all’avanguardia , come quelli per l’elaborazione dei segnali, la crittografia, il deep learning e l’algebra lineare, sono ancora scritti principalmente a mano, direttamente in C di basso livello e hardware- intrinseci o assembly specifici, o con una metaprogrammazione leggera (ad esempio, macro o modelli C++) di tale codice di basso livello. Di conseguenza, lo sviluppo e l’ottimizzazione di queste librerie richiede un’enorme quantità di lavoro, che limita la gamma di routine accelerate (ad esempio, sequenze di codice destinate ad essere chiamate e utilizzate ripetutamente durante l’eseguibile di un programma) e rende difficile l’implementazione di nuove o acceleratori migliorati.
Con Exo, gli ingegneri delle prestazioni non hanno bisogno di scrivere manualmente le librerie del kernel e possono concentrarsi esclusivamente sul miglioramento delle prestazioni invece di eseguire il debug del codice complesso e ottimizzato.
Esocompilazione
Exo funziona secondo il principio dell’esocompilazione. L’esocompilazione è un nuovo approccio al linguaggio di programmazione e al supporto del compilatore per lo sviluppo di librerie ad alte prestazioni con accelerazione hardware . L’esocompilazione esternalizza la maggior parte possibile della logica di generazione del codice e della politica di ottimizzazione specifica dell’acceleratore dal compilatore agli autori di librerie ad alte prestazioni a livello di utente.
L’esocompilazione consente all’ingegnere delle prestazioni, piuttosto che al compilatore, di controllare quali ottimizzazioni utilizzare, quando utilizzarle e in quale ordine. Ciò consente agli ingegneri di evitare le ottimizzazioni non necessarie che i compilatori effettuano automaticamente. Invece, Exo assicura che le ottimizzazioni siano corrette.
“Tradizionalmente, molte ricerche si sono concentrate sull’automazione del processo di ottimizzazione per l’hardware specifico. Questo è ottimo per la maggior parte dei programmatori, ma per gli ingegneri delle prestazioni, il compilatore si intromette tutte le volte che aiuta. Poiché le ottimizzazioni del compilatore sono automatiche, non c’è un buon modo per risolverlo quando fa la cosa sbagliata”, ha affermato Yuka Ikarashi , dottoranda al MIT CSAIL, negli Stati Uniti e autrice principale dell’articolo .
Un altro aspetto chiave di Exocompilation è che elimina la necessità di assumere sviluppatori di compilatori. Finora, gli sviluppatori di compilatori erano responsabili del mantenimento della definizione dell’interfaccia hardware. Considerando che l’interfaccia hardware nella maggior parte dei chip acceleratori è solitamente proprietaria, le aziende devono mantenere la propria copia di un intero compilatore tradizionale modificato per supportare i loro chip particolari. Con Exocompilation, gli ingegneri delle prestazioni possono descrivere i nuovi chip che desiderano ottimizzare senza dover modificare il compilatore.
Decodifica del sistema Exo
Il sistema Exo consiste in un linguaggio di programmazione imperativo , mezzi per definire obiettivi hardware tramite librerie e un sistema di pianificazione basato sulla riscrittura.
La definizione dell’hardware nelle librerie ha i suoi vantaggi: i fornitori di hardware non hanno bisogno di mantenere i fork del compilatore per proteggere i dettagli proprietari del proprio hardware e il costo dell’aggiunta del supporto per il nuovo hardware è notevolmente ridotto.
La pianificazione basata sulla riscrittura consente agli utenti Exo di trasformare un semplice programma in una versione equivalente ma più complessa e ad alte prestazioni mirata allo specifico acceleratore hardware mediante la successiva riscrittura dell’applicazione.
Panoramica dell’esosistema
Tre caratteristiche chiave del linguaggio Exo sono le memorie, le istruzioni e lo stato di configurazione. Un programmatore Exo può scrivere manualmente il codice per indirizzare un determinato acceleratore o utilizzare la pianificazione per riscrivere un semplice programma per indirizzare un determinato acceleratore utilizzando queste funzionalità.
Come se la cava Exo?
I ricercatori hanno dimostrato come Exo ha consentito una più rapida co-progettazione dell’interfaccia hardware-software di Gemmini. Gemmini è un acceleratore di machine learning open source . Exo ha reso più facile per i programmatori modificare gli obiettivi hardware, cosa comune durante lo sviluppo di nuovi acceleratori. I casi di studio hanno inoltre dimostrato che Exo potrebbe essere utilizzato per ottenere prestazioni competitive con librerie all’avanguardia e altamente ottimizzate su x86.
“Abbiamo dimostrato che possiamo utilizzare Exo per scrivere rapidamente codice che è tanto performante quanto la Math Kernel Library di Intel ottimizzata a mano”, afferma Gilbert Bernstein, candidato post-dottorato alla UC Berkeley.
Exo è attualmente considerato la soluzione giusta per i programmatori e gli ingegneri delle prestazioni che lavorano per ottimizzare i programmi numerici e sviluppare il proprio hardware di accelerazione. I ricercatori hanno in programma di abilitare la generazione automatica di programmi corridori che semplificherebbero il benchmarking e fornirebbero supporto per accessi dipendenti dai dati come gli istogrammi. Inoltre, prevedono un metalinguaggio di scheduling più produttivo ed espandono la sua semantica per supportare modelli di programmazione parallela da applicare a un numero ancora maggiore di acceleratori, incluse le GPU.