NVIDIA sta estendendo l’impiego del linguaggio Rust fino allo sviluppo diretto dei kernel GPU con una nuova iniziativa denominata CUDA Rust. Finora Rust veniva utilizzato soprattutto per richiamare kernel CUDA già esistenti, mentre il nuovo approccio punta a consentire agli sviluppatori di scrivere direttamente in Rust il codice eseguito sulla GPU e compilarlo in PTX nativo. La società ha presentato ufficialmente CUDA Rust l’8 settembre e prevede di continuare a sviluppare la tecnologia almeno oltre il 2027, affiancando Rust agli ambienti CUDA C++ e CUDA Python già utilizzati nei sistemi enterprise. L’obiettivo è ampliare le opzioni disponibili per lo sviluppo dell’infrastruttura AI senza abbandonare l’ecosistema CUDA esistente.
L’introduzione di Rust è legata soprattutto alla necessità di aumentare la sicurezza della memoria e la stabilità del software che costituisce gli strati più bassi dei sistemi AI. Infrastrutture di questo tipo vengono aggiornate continuamente e devono mantenere prestazioni elevate evitando al tempo stesso errori di memoria, condizioni di concorrenza e comportamenti difficili da individuare durante l’esecuzione. Rust permette di intercettare una parte di questi problemi già in fase di compilazione grazie al proprio sistema di ownership e alle regole sul controllo degli accessi alla memoria. NVIDIA utilizza già Rust in altri componenti della propria infrastruttura, tra cui il driver Linux Nova, il core di Dynamo e i binding NVTX, e CUDA Rust rappresenta quindi un’estensione di un percorso già avviato.
CUDA Rust prevede due modalità principali di programmazione, SIMT e Tile. L’approccio SIMT, Single Instruction Multiple Threads, segue più da vicino il modello tradizionale della programmazione GPU e permette allo sviluppatore di controllare direttamente l’esecuzione parallela di migliaia di thread. L’approccio Tile opera invece a un livello più alto: lo sviluppatore definisce le operazioni su blocchi di dati e lascia al compilatore il compito di ottimizzare automaticamente la distribuzione dei thread e l’organizzazione della memoria. NVIDIA suggerisce di utilizzare prevalentemente Tile negli scenari di sviluppo ordinari, riservando SIMT ai casi in cui sia necessario un controllo più preciso sul comportamento dell’hardware.
Insieme all’iniziativa sono stati resi disponibili due progetti open source che implementano questi modelli in Rust. cuda-oxide è basato sull’approccio SIMT e sfrutta il sistema di ownership del linguaggio per limitare i conflitti di memoria tra thread, mentre cutile-rs adotta il modello Tile e automatizza la gestione delle operazioni sui blocchi di dati. Quest’ultimo può inoltre essere utilizzato con versioni stabili di Rust senza richiedere una toolchain dedicata, riducendo così la complessità iniziale per gli sviluppatori. Entrambi i progetti mirano in particolare a prevenire errori di aliasing della memoria, una categoria di problemi che può risultare difficile da riprodurre e diagnosticare una volta che il software è entrato in produzione.
CUDA Rust rimane comunque una tecnologia in fase iniziale. Sia cuda-oxide sia cutile-rs sono ancora classificati come progetti di ricerca e le rispettive API possono cambiare nel corso dello sviluppo; inoltre, nell’approccio SIMT alcune operazioni che coinvolgono la memoria condivisa richiedono ancora l’utilizzo di blocchi unsafe, nei quali parte delle garanzie normalmente offerte dal compilatore Rust viene delegata allo sviluppatore. L’obiettivo non è quindi eliminare immediatamente ogni elemento di programmazione non sicura, ma ridurne l’estensione e rendere più facilmente verificabili le parti critiche del codice GPU.
cutile-rs è già disponibile nel repository dei pacchetti Rust Crates.io e ha iniziato a essere integrato in motori di inferenza esterni, tra cui Grout di Hugging Face e mistral.rs. NVIDIA intende ora migliorare ulteriormente l’interoperabilità con gli ecosistemi C++ e Python, in modo da permettere l’introduzione graduale di Rust senza costringere sviluppatori e aziende a riscrivere o abbandonare il patrimonio software costruito in anni di utilizzo di CUDA. La strategia prevede quindi la coesistenza tra i diversi linguaggi, con Rust utilizzato soprattutto nei componenti in cui sicurezza della memoria, concorrenza e affidabilità costituiscono requisiti particolarmente importanti.
Questo articolo è stato redatto con il supporto di strumenti di intelligenza artificiale (AI)
