CUDA Rust — теперь с двумя путями для нативной разработки GPU-ядер на Rust

  • PublicPublic
  • 09 Sep, 2026
CUDA Rust — теперь с двумя путями для нативной разработки GPU-ядер на Rust

В сентябре 2026 года NVIDIA объявила, что делает ставку на нативную разработку GPU на Rust. CUDA C++ и CUDA Python — зрелые промышленные инструментарии, но системный слой ИИ — движки инференса, обслуживающая инфраструктура, драйверы и рантаймы агентов — постоянно переписывается и всё чаще пишется на Rust, который ловит целые классы ошибок ещё на этапе компиляции, не жертвуя производительностью. Сама NVIDIA — часть этого сдвига: драйвер Nova Linux написан на Rust, NVIDIA Dynamo построена на Rust-ядре, а у NVTX есть Rust-биндинги. Исключением оставалось GPU-ядро, поскольку ядра можно было запускать из Rust, но обычно их приходилось писать на другом языке. CUDA Rust закрывает этот разрыв, позволяя писать ядра на Rust и компилировать их нативно в PTX, а не оборачивать код из чужих источников.

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

Путь SIMT — это cuda-oxide, кастомный кодген-бэкенд rustc. Он перехватывает компиляцию, проводит функции #[kernel] через Rust MIR, фреймворк Pliron IR и LLVM IR вплоть до PTX, а всё остальное передаёт стандартному бэкенду. GPU-диалекты поверх Pliron принадлежат NVIDIA, и каждое преобразование остаётся на Rust до тех пор, пока не вступает в дело стандартный LLVM-бэкенд. Требования включают Linux, GPU с compute capability 8.0 или выше, CUDA toolkit 12.x или новее, clang с его заголовками libclang и закреплённый nightly-тулчейн. Подкоманда Cargo cargo-oxide управляет сборкой, а cargo oxide doctor проверяет тулчейн. Проект скаффолдится через cargo oxide new, а первый cargo oxide run собирает кодген-бэкенд, так что последующие запуски используют кэш.

Путь Tile — это cutile-rs, который работает на уровень выше: вы выполняете вычисления над тайлами, а не над скалярами. Каждый тайл-блок выполняет тело ядра один раз как единый логический поток над одним под-тензором данных, а компилятор решает, сколько реальных GPU-потоков его поддерживают. Макрос #[cutile::module] встраивает AST ядра в бинарник хоста и JIT-компилирует его через CUDA Tile IR при первом обращении к ядру. Требования легче, чем у пути SIMT: GPU с compute capability 8.0 или выше, CUDA 13.3, стабильный Rust 1.89 или новее и Linux, без nightly-тулчейна и без собственного LLVM. Поскольку cutile опубликован, вы просто запускаете cargo add cutile, ничего не клонируя.

Оба пути приводят один и тот же аргумент о безопасности в отношении памяти. В примере SIMT изменяемый выходной буфер — это DisjointSlice<f32>, специально созданный тип, который даёт каждому потоку эксклюзивный доступ к своему элементу, потому что &mut [f32] имеет неправильную форму, когда каждому потоку потребовалось бы одно и то же изменяемое заимствование. Запуск проверяется, а не принимается на веру: объявление #[launch_contract] проверяется на соответствие LaunchConfig1D и фактическим лимитам устройства, а ядра без контракта предоставляют только сырые unsafe-методы запуска. На стороне Tile разделение даёт каждому тайл-блоку один записываемый под-тензор, который не может пересекаться с другими блоками, и эта эксклюзивность — ровно то, что уже гарантирует &mut. Передача выходного буфера ядра как одного из его собственных входов не компилируется, что отлавливает гонки алиасинга, которые иначе прошли бы тесты, а затем всплыли в продакшене.