Nvidia опубликовала CUDA-oxide, компилятор из Rust в CUDA

good-penguin.png

Компания Nvidia опубликовала первый выпуск инструментария CUDA-oxide, позволяющего создавать на языке Rust параллельно исполняемые в GPU ядра CUDA SIMT (Single Instruction, Multiple Threads). Проект позволяет компилировать код на языке Rust, использующий штатную систему типов и модель владения Rust, напрямую в инструкции для выполнения в виртуальной машине CUDA PTX (nvidia.com) (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 (nvlabs.github.io) (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.

>>> Источник

©  Linux.org.ru