Компания NVIDIA опубликовала первый выпуск инструментария CUDA-oxide, позволяющего создавать на языке Rust параллельно исполняемые в GPU ядра CUDA SIMT (Single Instruction, Multiple Threads). Проект позволяет компилировать код на языке Rust, использующий штатную систему типов и модель владения Rust, напрямую в инструкции для выполнения в виртуальной машине CUDA PTX (Parallel Thread Execution) без применения промежуточных предметно-ориентированных языков (DSL) и обвязок. Код инструментария написан на языке Rust и распространяется под лицензией Apache 2.0. Первый выпуск позиционируется как начальная альфа-версия.
Инструментарий включает в себя:
- Бэкенд генерации кода для компилятора rustc, позволяющий компилировать функции с атрибутом «#[kernel]» в параллельно исполняемые на GPU ядра в представлении CUDA PTX. При компиляции используется штатная для rustc цепочка преобразований на базе фреймворка Pliron: Rust -> MIR -> Pliron IR -> LLVM IR -> PTX.
- Унифицированная система сборки компонентов, выполняемых на хост-системе и на GPU, которая сводится к выполнению команд «cargo oxide build» и «cargo oxide run».
- Набор Rust-абстракций, который можно использовать в ядрах на стороне GPU. Например, доступны функции для индексации, использования разделяемой памяти и барьеров, атомарных операций, синхронизации групп потоков, TMA (Tensor Memory Accelerator). Возможен вызов обвязок над низкоуровневыми инструкциями, специфичными для архитектуры Blackwell (например, расширенные матричные операции).
- Crate-пакеты с выполняемыми на стороне хоста компонентами CUDA runtime, позволяющими управлять памятью, запускать ядра на GPU и взаимодействовать с выполняемыми на GPU функциями в асинхронном режиме.
- Коллекция примеров ядер, демонстрирующих такие возможности, как работа с векторами, умножение матриц (GEMM), атомарные операции, асинхронное выполнение, интеграция с библиотекой MathDx, применение дженериков и замыканий, взаимодействия с CUDA-ядрами на C++/CCCL.
Ядра для GPU создаются на обычном Rust (не диалект), но выполняются в окружении no_std и могут использовать только функции из библиотеки
libcore и ранее отмеченные специализированные Rust-абстракции, без доступа к стандартной библиотеке Rust (libstd). Поддерживаются примитивные типы (u8..u64, f32, f64, bool), структуры, перечисления, кортежи, массивы
([T; N]) и слайсы (&[T]), операторы match / if / if let, циклы for и while, итераторы (.iter(), .enumerate()), замыкания и дженерики. Не поддерживаются типы String, Vec и Box, макросы format!, panic! и println!, Trait-объекты и реализуемые через обращение к операционной системе функции стандартной библиотеки (работа с файлами, ввод/вывод, сетевые операции).
Доступно три уровня обеспечения безопасности CUDA-ядер на Rust: защита через систему типов (safe), использование блоков unsafe и обращение к низкоуровневым аппаратным инструкциям.
Производительность созданной на CUDA-oxide реализации матричного умножения (GEMM SoL) на GPU B200 достигает 868 триллионов операций в секунду, что составляет 58% от производительности оптимизированной библиотеки cuBLAS.
НОВОСТИ В КЫРГЫЗСТАНЕ