La société NVIDIA a annoncé le développement d'un outil CUDA Rust, permettant d'utiliser le langage Rust pour développer des noyaux exécutés sur GPU. Cet outil assure la sécurité de la gestion de la mémoire au moment de la compilation et prévient les états de concurrence. L'année prochaine, CUDA Rust devrait atteindre un niveau adéquat pour le développement de projets opérationnels, comparable aux outils CUDA C++ et CUDA Python.
L'outil CUDA Rust prend en charge deux modèles de développement de noyaux exécutés en parallèle — SIMT (Single Instruction, Multiple Threads) et Tile. Le modèle SIMT permet de définir à un niveau bas la logique d'un seul thread, de lancer des milliers de ces threads et de les gérer. Le modèle Tile offre un niveau d'abstraction plus élevé, où au lieu de gérer explicitement des threads individuels, les algorithmes d'action sur des blocs de données (tiles) sont définis, et toutes les manipulations de threads, la synchronisation d'accès, la gestion de la mémoire et la distribution des données aux noyaux tensoriels sont prises en charge par le compilateur Tile IR.
Pour le développement en Rust en utilisant le modèle SIMT, un compilateur cuda-oxide est en cours de développement, permettant de compiler du code en Rust, utilisant le système de types standard et le modèle de possession de Rust, directement en instructions pour exécution dans une machine virtuelle CUDA PTX (Parallel Thread Execution). Les noyaux pour GPU sont créés en Rust ordinaire, mais s'exécutent dans un environnement no_std et ne peuvent utiliser que les fonctions de la bibliothèque libcore et des abstractions Rust spécialisées, sans accès à la bibliothèque standard Rust (libstd).
Dans les noyaux CUDA en Rust, l'utilisation de la protection par le biais du système de types (safe), l'utilisation de blocs unsafe et l'accès à des instructions matérielles de bas niveau sont autorisés. Pour garantir la sécurité, un type DisjointSlice est proposé, garantissant que chaque thread a un accès exclusif uniquement à ses propres données. Le code cuda-oxide est distribué sous la licence Apache 2.0.
Pour appliquer le modèle Tail, une bibliothèque appelée cutile-rs est proposée, permettant d'utiliser le langage idiomatique Rust pour créer du code compilé directement dans des noyaux CUDA. Cutile-rs applique les strictes règles de propriété et d'emprunt proposées par Rust au code s'exécutant sur le GPU. Le noyau est conçu comme un programme monothread fonctionnant avec un bloc de données, et le compilateur découpe les calculs en flux et assure leur synchronisation. Les flux ont accès en commun à des tenseurs immuables, et l'accès sécurisé aux tenseurs mutables est réalisé en les divisant en blocs non chevauchants. Le code de cutile-rs est distribué sous la licence Apache 2.0.
Source : opennet.ru
