Компанія NVIDIA оголосила про розвиток інструментарію CUDA Rust, що дозволяє використовувати мову Rust для розробки ядер, що виконуються на GPU. Інструментарій забезпечує безпеку роботи з пам'яттю на етапі компіляції та запобігає виникненню станів гонки. Наступного року CUDA Rust планують довести до рівня, придатного для розробки робочих проектів, аналогічного інструментаріям CUDA C++ та CUDA Python.
Інструментарій CUDA Rust підтримує дві моделі розробки паралельних ядер - SIMT (Single Instruction, Multiple Threads) і Tale. Модель SIMT дозволяє на низькому рівні визначати логіку одного потоку, запускати тисячі таких потоків та керувати ними. Модель Tile пропонує більш високий рівень абстракції, в якому замість явного керування окремими потоками визначаються алгоритми дії з блоками даних (tile), а всі маніпуляції з потоками, синхронізацію доступу, керування пам'яттю та розподіл даних по тензорним ядрам бере на себе компілятор Tile IR.
Для розробки мовою Rust з використанням моделі SIMT розвивається компілятор cuda-oxide, що дозволяє компілювати код на мові Rust, що використовує штатну систему типів і модель володіння Rust, безпосередньо в інструкції для виконання віртуальній машині CUDA PTX (Parallel Thread Execution). Ядра для GPU створюються на звичайному Rust, але виконуються в оточенні no_std і можуть використовувати тільки функції з бібліотеки libcore та спеціалізовані абстракції Rust, без доступу до стандартної бібліотеки Rust (libstd).
У CUDA-ядрах Rust допускається застосування захисту через систему типів (safe), використання блоків unsafe і звернення до низькорівневих апаратних інструкцій. Для забезпечення безпеки пропонується тип DisjointSlice, який гарантує, що кожен потік отримує ексклюзивний доступ лише до своїх даних. Код cuda-oxide розповсюджується під ліцензією Apache 2.0.
Для застосування моделі Tail пропонується бібліотека cutile-rs, що дозволяє використовувати ідеоматичний мову Rust для створення коду, який компілюється безпосередньо в CUDA-ядра. Cutile-rs застосовує пропоновані в Rust суворі правила володіння та запозичення до коду, що виконується на GPU. Ядро оформляється як однопоточна програма, що працює з блоком даних, а компілятор сам розбиває обчислення на потоки та забезпечує їхню синхронізацію. Потокам надається спільний доступ до незмінних тензорів, а для безпечного доступу до змінних тензорів застосовується їх поділ на блоки, що не перетинаються. Код cutile-rs розповсюджується під ліцензією Apache 2.0.
Джерело: opennet.ru
