NVIDIA развивает CUDA Rust — инструментарий для написания GPU-ядер на Rust с проверкой безопасности памяти ещё на этапе компиляции.
Компания NVIDIA объявила о работе над CUDA Rust — набором средств, который открывает разработчикам возможность писать ядра для графических процессоров на языке Rust. Ключевое преимущество подхода — контроль безопасности работы с памятью прямо во время компиляции, что позволяет заранее отлавливать состояния гонки. В течение следующего года инструментарий планируют довести до состояния, пригодного для реальных рабочих проектов, — наравне с CUDA C++ и CUDA Python.
CUDA Rust поддерживает две модели создания параллельно исполняемых ядер: SIMT (Single Instruction, Multiple Threads) и Tile. В модели SIMT разработчик на низком уровне описывает логику отдельного потока, а затем запускает и контролирует тысячи таких потоков. Модель Tile предлагает более высокий уровень абстракции: вместо ручного управления потоками программист формулирует алгоритмы работы с блоками данных (tile), а всю рутину — манипуляции с потоками, синхронизацию доступа, управление памятью и распределение данных по тензорным ядрам — берёт на себя компилятор Tile IR.
Для SIMT-разработки на Rust создаётся компилятор cuda-oxide. Он позволяет напрямую превращать Rust-код со штатной системой типов и моделью владения в инструкции для виртуальной машины CUDA PTX (Parallel Thread Execution). Ядра пишутся на обычном Rust, но исполняются в окружении no_std: доступны только функции из libcore и специализированные Rust-абстракции, стандартная библиотека libstd недоступна. В CUDA-ядрах на Rust разрешены как защита через систему типов (safe), так и блоки unsafe и обращение к низкоуровневым аппаратным инструкциям. Для безопасности предлагается тип DisjointSlice, который гарантирует каждому потоку эксклюзивный доступ только к его данным. Код cuda-oxide распространяется под лицензией Apache 2.0.
Для модели Tile предусмотрена библиотека cutile-rs. Она даёт возможность писать на идиоматическом Rust код, компилируемый напрямую в CUDA-ядра, и переносит строгие правила владения и заимствования Rust на код, выполняемый на GPU. Ядро оформляется как однопоточная программа, работающая с блоком данных, а компилятор сам разбивает вычисления на потоки и синхронизирует их. Неизменяемые тензоры доступны потокам совместно, а для безопасной работы с изменяемыми тензорами их разделяют на непересекающиеся блоки. Код cutile-rs также выходит под лицензией Apache 2.0.
