Společnost NVIDIA oznámila vývoj nástrojů CUDA Rust, které umožňují vývoj jader prováděných na GPU pomocí jazyka Rust. Tento nástroj zajišťuje bezpečnost práce s pamětí během kompilace a zabraňuje vzniku závodních stavů. V příštím roce plánují CUDA Rust dovést na úroveň vhodnou pro vývoj pracovních projektů, obdobně jako nástroje CUDA C++ a CUDA Python.
Nástroj CUDA Rust podporuje dva modely vývoje paralelně vykonávaných jader — SIMT (Single Instruction, Multiple Threads) a Tile. Model SIMT umožňuje na nízké úrovni definovat logiku jednoho vlákna, spouštět tisíce takových vláken a spravovat je. Model Tile nabízí vyšší úroveň abstrakce, kde místo explicitního řízení jednotlivých vláken se definují algoritmy operací s datovými bloky (tile), přičemž všechny manipulace s vlákny, synchronizace přístupu, správa paměti a rozdělení dat na tenzorová jádra jsou řízeny kompilátorem Tile IR.
Pro vývoj v jazyce Rust s využitím modelu SIMT se vyvíjí kompilátor cuda-oxide, který umožňuje kompilaci kódu v jazyce Rust, používajícího standardní systém typů a model vlastnictví Rust, přímo do instrukcí pro provádění v virtuálním stroji CUDA PTX (Parallel Thread Execution). Jádra pro GPU jsou vytvářena v běžném Rustu, ale provádějí se v prostředí no_std a mohou používat pouze funkce z knihovny libcore a specializované Rust-abstrakce, bez přístupu k standardní knihovně Rust (libstd).
V CUDA jádrech na Rustu je povoleno použití typového systému bezpečnosti (safe), využití bloků unsafe a přístup k nízkoúrovňovým hardwarovým instrukcím. Pro zajištění bezpečnosti je navržen typ DisjointSlice, který zaručuje, že každé vlákno má výhradní přístup pouze ke svým datům. Kód cuda-oxide je distribuován pod licencí Apache 2.0.
Pro model Tail doporučuje knihovnu cutile-rs, která umožňuje využít idiomatický jazyk Rust k vytvoření kódu kompilovaného přímo do CUDA jader. Cutile-rs využívá přísná pravidla vlastnictví a půjčování nabízená jazykem Rust pro kód, který běží na GPU. Jádrům je dána podoba jednoprocesorového programu, který pracuje s blokem dat, přičemž kompilátor sám rozděluje výpočty do vláken a zajišťuje jejich synchronizaci. Vláknům je poskytnut sdílený přístup k neměnným tenzorům a pro bezpečný přístup ke změnitelným tenzorům se používá jejich rozdělení na nepřekrývající se bloky. Kód cutile-rs je distribuován pod licencí Apache 2.0.
Zdroj: opennet.ru
