- CubeCL est une extension de langage multiplateforme haute performance qui permet d’écrire des noyaux GPU en Rust
- Prend entièrement en charge les fonctions, génériques et structures, avec une prise en charge partielle des traits, méthodes et de l’inférence de types
- Prend en charge des runtimes basés sur WGPU, CUDA et ROCm, et un runtime CPU JIT optimisé exploitant les instructions SIMD est également en cours de développement
- Fournit des fonctionnalités d’auto-vectorisation, d’optimisation à la compilation (Comptime) et d’auto-tuning afin de maximiser les performances du code
- Utilise une approche originale qui s’appuie sur le système de macros procédurales de Rust pour analyser et étendre le code des noyaux GPU
Présentation de CubeCL
- CubeCL est une extension du langage Rust pour le calcul haute performance, qui permet d’écrire directement des noyaux GPU
- S’appuie sur des abstractions à coût nul afin de permettre un développement de noyaux efficace et facile à maintenir
- Prend actuellement entièrement en charge les fonctions, génériques et structures, tandis que les traits, les méthodes et l’inférence de types ne sont que partiellement pris en charge
Exemple d’utilisation simple
- Utilise l’attribut
#[cube] pour désigner les fonctions à exécuter sur le GPU
- Les fonctions
gelu_array et gelu_scalar utilisent automatiquement les instructions SIMD pour améliorer les performances
- Il est possible d’exécuter un noyau avec la fonction
launch_unchecked
Runtimes pris en charge
- WGPU : prise en charge GPU multiplateforme via Vulkan, Metal, DirectX et WebGPU
- CUDA : prise en charge optimisée des GPU NVIDIA
- ROCm/HIP : prise en charge des GPU AMD (en cours de développement)
- Runtime CPU JIT : développement en cours d’un runtime CPU JIT optimisé basé sur Cranelift et exploitant les instructions SIMD
Objectifs de CubeCL
- Permettre d’écrire des noyaux de calcul haute performance sans dépendre d’un matériel spécifique
- Améliorer la configurabilité, la réutilisabilité, la testabilité et la maintenabilité du code grâce à l’auto-vectorisation, Comptime et l’auto-tuning
- Fournir une réutilisation optimisée des buffers pour un débit élevé grâce à des stratégies de gestion mémoire
- Développer des composants d’algèbre linéaire afin de construire un écosystème de calcul scientifique et haute performance
Fonctionnement de CubeCL
- Utilise une approche originale fondée sur le système de macros procédurales de Rust pour analyser et étendre le code des noyaux GPU
- Comptime : l’absence de transformation du code source facilite l’intégration des optimisations à la compilation
- Auto-vectorisation : vectorise les entrées des fonctions CubeCL pour déterminer les éléments de vectorisation de chaque variable intermédiaire
- Intégration à Rust : le code généré reste du code Rust valide et peut être distribué sous forme de bundle sans dépendance à un runtime spécifique
Design et fonctionnalités particulières
- CubeCL est conçu autour des cubes, et toutes les API de calcul peuvent être mappées au matériel de façon à utiliser une représentation 3D
- Auto-vectorisation : permet d’améliorer les performances via les instructions SIMD, et les facteurs de vectorisation sont directement accessibles dans le noyau
- Comptime : modifie l’IR du compilateur à l’exécution afin d’apporter optimisation et flexibilité
- Auto-tuning : exécute de petits benchmarks au runtime pour sélectionner le noyau et les paramètres optimaux
Points à noter et historique
- CubeCL est actuellement en version alpha et comporte encore des aspects non finalisés
- À l’origine, il a commencé comme backend WebGPU du projet Burn
- Puis il a été étendu avec l’ajout d’un runtime CUDA, d’un IR générique et d’un frontend Rust
- Des concepts génériques ont été développés pour surmonter les différences entre CUDA et WebGPU
Aucun commentaire pour le moment.