Sakhanda Wire
NVDA $230.86 +1.09% MSFT $512.80 -0.02% GOOGL $338.24 -1.70% META $725.93 +0.10% AMZN $248.23 -0.37%
← К новостям

NVIDIA представляет CUDA Rust с cuda-oxide (SIMT) и cutile-rs (Tile) для безопасных на этапе компиляции GPU-ядер

NVIDIA анонсировала CUDA Rust — инициативу, призванную сделать Rust полноценным языком для написания GPU-ядер. Код на Rust уже мог запускать CUDA-ядра, но тело ядра обычно приходилось писать на другом языке. CUDA Rust устраняет этот пробел с помощью двух проектов с открытым исходным кодом от NVlabs: cuda-oxide для модели SIMT и cutile-rs для более новой модели Tile. Оба проекта нативно компилируют ядра на Rust и используют правила владения Rust, чтобы выявлять ошибки, связанные с алиасингом, на этапе компиляции.

Можно ли это развернуть? Частично. cutile-rs опубликован на crates.io, работает со стабильной версией Rust 1.89+ и уже используется в движке инференса Grout от Hugging Face и в mistral.rs. cuda-oxide находится на ранней альфа-стадии. Оба проекта находятся в альфа-фазе и пока не подтверждены для использования в промышленной эксплуатации.

Почему Rust для GPU-ядра

Системный уровень ИИ — от движков инференса до драйверов и сред выполнения агентов — всё чаще пишется на Rust. Драйвер NVIDIA Nova для Linux написан на Rust, NVIDIA Dynamo имеет ядро на Rust, а у NVTX есть привязки для Rust. GPU-ядро оставалось исключением.

Эти два направления соответствуют двум программным моделям, которые уже предлагает CUDA. SIMT — модель, используемая в CUDA C++ и numba-cuda: вы описываете действия одного потока и запускаете тысячи таких потоков. Tile — более новая модель, также доступная в C++ и Python: вы описываете действия одного фрагмента данных, а компилятор Tile IR обрабатывает сопоставление потоков и размещение в памяти. NVIDIA рекомендует в первую очередь Tile, а SIMT — для явного управления потоками и памятью. Планируемая межъязыковая совместимость означает, что выбор Rust не лишит разработчиков доступа к C++ или Python.

Направление SIMT: cuda-oxide

cuda-oxide — это пользовательский бэкенд генерации кода для rustc. Он направляет функции с атрибутом #[kernel] через Rust MIR, разработанный сообществом фреймворк Pliron IR и LLVM IR до PTX, а всё остальное передаёт стандартному бэкенду. NVIDIA создала диалекты GPU поверх Pliron.

Требования: Linux, GPU с вычислительной возможностью 8.0 или новее, CUDA 12.x или новее, clang с libclang и зафиксированный nightly toolchain (nightly-2026-04-03). Команда cargo oxide doctor проверяет конфигурацию, а cargo oxide new создаёт каркас программы сложения векторов, в которой код хоста и устройства находится в одном файле.

Аргумент в пользу безопасности заложен в сигнатуре ядра. Входы a и b — обычные общие срезы. Выход c — это DisjointSlice<f32>, тип, который предоставляет каждому потоку исключительный доступ к собственному элементу. Обычный &mut [f32] потребовал бы, чтобы каждый поток удерживал одну и ту же изменяемую ссылку, чего Rust не допускает. c.get_mut(idx) возвращает Option, поэтому выход за границы превращается в обрабатываемую ветку. Атрибут #[launch_contract] объявляет форму блока, а сгенерированный метод prepare_vecadd проверяет соответствие конфигурации запуска этому контракту до выполнения безопасного запуска.

Направление Tile: cutile-rs

cutile-rs работает на уровень выше. Каждый блок tile выполняет тело ядра один раз как единый логический поток над одним подтензором, а компилятор определяет, сколько реальных GPU-потоков будет его поддерживать. Макрос #[cutile::module] встраивает AST ядра в двоичный файл хоста и JIT-компилирует его через CUDA Tile IR при первом запуске ядра.

Требования проще: вычислительная возможность 8.0 или новее, CUDA 13.3, стабильная версия Rust 1.89 или новее и Linux; nightly и пользовательский LLVM не требуются. Настройка выполняется с помощью cargo new, затем нужно выполнить cargo add cutile.

Вызов .partition([128]) на стороне хоста выполняет 3 задачи. Он предоставляет каждому tile исключительное владение фрагментом из 128 элементов, фиксирует сетку как 1 024 / 128 = 8 tile и задаёт константную ширину tile B. Входные тензоры используют -1 в качестве динамического измерения, разрешаемого при запуске. Сгенерированный лаунчер получает во владение все тензоры и возвращает их после завершения работы GPU. До вызова .sync_on(&stream) ничего не выполняется; всё предшествующее ему представляет собой ленивое описание, записанное в одну цепочку.

Что выявляет компилятор

Передача выходного буфера SIMT-ядра в качестве одного из его собственных входов приводит к ошибке error[E0502]: cannot borrow c_dev as mutable because it is also borrowed as immutable. Та же проблема с алиасингом на стороне Tile приводит к ошибке error[E0382]: use of moved value: z. cuda-oxide проверяет каждый вызов запуска; в cutile-rs владение следует за тензорами через границу запуска, что NVIDIA называет более сильной гарантией.

Tile не предоставляет доступ к общей памяти или индексации потоков, которыми можно было бы воспользоваться неправильно. SIMT сохраняет такой контроль, но для общей памяти в cuda-oxide в настоящее время требуется unsafe.

Ключевые выводы

  • CUDA Rust добавляет 2 нативных направления для GPU-ядер на Rust: cuda-oxide (SIMT) и cutile-rs (Tile).
  • cuda-oxide компилирует Rust MIR через Pliron и LLVM в PTX; для него требуется зафиксированная nightly-версия.
  • cutile-rs работает со стабильной версией Rust 1.89+ и CUDA 13.3 и выполняет JIT-компиляцию через CUDA Tile IR.
  • Оба проекта отклоняют алиасинг буферов на этапе компиляции с помощью проверяющего заимствования и владения в Rust.
  • cutile-rs уже используется в Grout и mistral.rs; ни один из проектов пока не готов к промышленной эксплуатации.

Ознакомьтесь с техническими подробностями здесь. Также подписывайтесь на нас в Twitter и не забудьте присоединиться к нашему сабреддиту о машинном обучении с более чем 150 тыс. участников и подписаться на нашу рассылку. Постойте! Вы есть в Telegram? теперь вы также можете присоединиться к нам в Telegram.

Хотите стать нашим партнёром для продвижения вашего репозитория GitHub, страницы на Hugging Face, релиза продукта, вебинара и т. д.? Свяжитесь с нами

Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.

Впервые опубликовано изданием MarkTechPost

Читать оригинал на MarkTechPost ↗

Текст и изображения принадлежат MarkTechPost и приводятся здесь с указанием авторства и ссылкой на оригинальную публикацию.

← К новостям

Ещё новости

Все последние новости