CUDA-oxide: Nvidia'nın resmî Rust-to-CUDA derleyicisi
(nvlabs.github.io)- cuda-oxide, güvenliğe yakın, idiomatik Rust ile SIMT GPU çekirdekleri yazmak ve standart Rust kodunu doğrudan PTX'e derlemek için deneysel bir derleyicidir
- DSL veya yabancı dil bağları olmadan yalnızca Rust kullanır; sahiplik, trait ve generics bilgisi varsayılır, async bölümleri içinse
.awaitbilgisi de gerekir - v0.1.0, erken alfa sürümüdür; bu nedenle hatalar, tamamlanmamış özellikler ve API'de geriye dönük uyumsuz değişiklikler beklenmelidir
- Örnek,
cargo oxide run vecaddile çalıştırılır;#[cuda_module]içindeki#[kernel]fonksiyonuthread::index_1d()ile vektör toplama işlemi yapar #[cuda_module], cihaz artifact'lerini host ikilisine gömer ve tür belirtilmiş loader ile çekirdek başına çalıştırma metodları üretir
Kullanım şekli ve üretilen kod
-
Hızlı başlangıç
- Kurulum önkoşulları sağlandıktan sonra
cargo oxide run vecaddile örnek derlenip çalıştırılır - Kurulum yönergeleri prerequisites sayfasında yer alır
- Örnek,
#[cuda_module]modülü içinde#[kernel]fonksiyonuvecadd'i tanımlar;thread::index_1d()ile indeksi alır vea[i] + b[i]sonucunuDisjointSlice<f32>içine yazar - Host tarafında
CudaContext::new(0), varsayılan stream vekernels::load(&ctx)kullanılır; çekirdekDeviceBuffer::from_host,DeviceBuffer::<f32>::zeroed,LaunchConfig::for_num_elems(1024)ile çalıştırılır - Çalışma sonucu
c.to_host_vec(&stream)ile alınır veresult[0] == 3.0doğrulanır
- Kurulum önkoşulları sağlandıktan sonra
-
#[cuda_module]nasıl çalışır#[cuda_module], üretilen cihaz artifact'lerini host ikilisine gömer- Tür belirtilmiş
kernels::loadfonksiyonu ile çekirdek başına çalıştırma metodları üretir - Belirli sidecar artifact'lerini yüklemek veya özel çalıştırma kodu yazmak gerektiğinde daha düşük seviyeli
load_kernel_modulevecuda_launch!API'leri kullanılmaya devam edilebilir
Önkoşullar ve yönelim
- cuda-oxide, Rust'ın tür sistemi ve sahiplik modeliyle GPU çekirdekleri yazmayı hedefler ve güvenliği birinci sınıf bir hedef olarak ele alır
- GPU'larda incelikli noktalar bulunduğundan the safety model belgesinin okunması gerekir
- Bu bir DSL değil, saf Rust'ı PTX'e derleyen özel bir
rustckod üretim backend'idir - GPU işlerini ertelenmiş olarak yürütülen
DeviceOperationgrafiği halinde kurmayı, bunları stream havuzuna zamanlamayı ve sonuçları.awaitile beklemeyi sağlayan asenkron yürütmeyi destekler - Rust'ta sahiplik, trait ve generics konularına aşinalık varsayılır; sonraki asenkron GPU programlama bölümleri ayrıca
async/.awaitve tokio gibi runtime'lar hakkında bilgi gerektirir - Başvuru kaynakları olarak The Rust Programming Language, Rust by Example, Async Book sunulur
- v0.1.0 sürümü erken alfa aşamasındadır; hatalar, tamamlanmamış özellikler ve API'de geriye dönük uyumsuz değişiklikler beklenmelidir
1 yorum
Hacker News yorumları
Özellikle derleme sürelerinin nasıl kıyaslanacağını merak ediyorum. Rust CUDA crate’lerinin çoğu CMake ya da nvcc çağrılarına dayanıyor, bu da derlemeyi can sıkıcı derecede yavaşlatabiliyor
Geçen hafta tam da derleme sürelerini profillerken sccache gibi araçların çıktı önbelleklemesiyle yeniden derleme süresini ciddi biçimde azaltabildiğini gördüm, ama özel nvcc çağrılarının maliyeti yine kalıyor. Örneğin Hugging Face’in candle’ı da kernel derleme sırasında özel nvcc komutları çağırıyor: https://arpadvoros.com/posts/2026/05/05/speeding-up-rust-whi...
Rust CUDA crate’lerinin çoğunun CMake ya da nvcc çağırdığı için derlemenin yavaş olduğu kısmını kişisel olarak pek yaşamadım. Derleme betiklerini ele almak için yaptığım
cuda_setupcrate’ine bakarsanız, basit birbuild.rs; dosyalar değiştiğinde yeniden derleniyor ve Rust’ın CPU tarafındaki koda kıyasla derleme süresi oldukça küçük kalıyorÖyle olsa harika olurdu, ama bana kalırsa muhtemelen tamamlayıcı olmaya daha yakın. cuda-oxide’ı farklılaştıran şeyin ne olduğunu da merak ediyorum; NVIDIA’nın tamamen kontrol ediyor olması dışında başka ne var, onu da merak ediyorum
Tile IR biraz daha üst seviye, bu yüzden hedeflemesi çok daha kolay; sadece epilog füzyonu gibi yerlerde kayıp yaşarsınız
[1] https://docs.nvidia.com/cuda/tile-ir/
[2] https://developer.nvidia.com/cuda/tile
GPU kernel yazmanın doğası gereği güvensiz olduğunu düşünüyorum. Donanımın çalışma biçimi ve sürekli en uç optimizasyonların gerekmesi nedeniyle güvenli bir dil yapmak fazlasıyla zor
cudaFree’yi elle çağırma yaklaşımının aksine use-after-free ve drop semantiğini ele alıyorİkincisi, C++’taki
void*argümanları yalnızca bir işaretçi dizisi ve sayı doğrulaması iken buradacuda_launch!ile kernel argümanları zorunlu kılınıyorÜçüncüsü, değiştirilebilir yazımın aliasing sorunu. C++’ta iki ya da daha fazla thread aynı
iileout[i]üzerine yazan kodu yine de derler, amaDisjointSliceveThreadIndexiçin açık yapıcı yok ve https://github.com/NVlabs/cuda-oxide/blob/2a03dfd9d5f3ecba52... yalnızcaindex_1d,index_2d,index_2d_runtimeAPI’lerinin kullanılmasına izin veriyorDördüncüsü, C++’ta
std::stringya da pratikte herhangi bir POD’ucuda memcpyile kopyalayıp durumu bozabilirsiniz, ama burada yalnızcaDisjointSlice, skalerler ve closure’lar kabul ediliyor https://nvlabs.github.io/cuda-oxide/gpu-programming/memory-a...Ayrıntılar https://nvlabs.github.io/cuda-oxide/gpu-safety/the-safety-mo... ve https://nvlabs.github.io/cuda-oxide/gpu-programming/memory-a... içinde var. Elbette her şeyi yakalamıyor, ama çıplak
.cudosyalarına kıyasla tanımsız davranışı önlemek için çok daha fazla guardrail sağlıyor gibi görünüyorGPU programlama için uygun bir dil olup olmadığını zaman gösterecek, ama GPU’ya özgü tüm garipliklerden yararlanırken güvenli kod yazmaya izin veren, makul bir DSL benzeri API yapılabilirse şaşırmam. Sonuçta CUDA da biraz böyle değil mi?
Rust’ın
Send/Syncmodeline kolayca oturtulamayan güvenli ama paralel işler için biraz hantallık gerekiyorBellek modeli ya da sahiplik modelinden düşük sürtünmeyle yararlanabilmek güzel olur. Ama bunun karşılığında kullanım deneyimi çok rahatsız edici hale gelirse, o yaklaşımı istemem
Mevcut taban çizgisinin Cudarc’ın yaptığı şey olduğunu düşünüyorum. Bellek yönetimine fazla karışmıyor; FFI’yi saran emirsel bir sözdizimi ve kernel değiştiğinde nvcc çağıran birkaç satırlık derleme betiği var
Bu arada Slang’i epey seviyorum
[0]: https://shader-slang.org/
Örneğin descriptor set’ler, kaynak yazmaçları, dispatch sınırları gibi şeyler
Shader dilleri özellikler açısından da daha kullanıcı dostu. Ayrıca NVIDIA zaten Slang’i prodüksiyonda kullanıyor; o ekiplerin shader pipeline’larını Rust ile baştan yazmaları pek olası değil
Bulabildiğim tek şey aşağıdaki
https://www.adacore.com/case-studies/nvidia-adoption-of-spar...
https://www.youtube.com/watch?v=2YoPoNx3L5E
Yine de bunu görmezden gelip belgeleri okumaya çalıştım, özel IR ortaya çıkınca ilginçleşecek gibi oldu ama sonra “MLIR implementasyonu C++ içinde biraz TableGen ile geliyor, LLVM’in tamamını derlemeniz gereken bir build sistemi var ve kariyer seçimlerinizi sorgulatan debug seansları yaşatıyor” tarzı ifadeleri görünce bu sektörü ciddiye almakta daha da zorlandım
Bu, AI abartısı yapan bir şirketten beklenecek kadar yerinde bir kendi ürününü kullanma örneği gibi duruyor
cuda-oxide, yaygın olan “bir thread bir eleman yazar” durumunu yapısal olarak güvenli hale getiriyor; paylaşımlı bellek, warp shuffle ve donanım iç gömülü işlevler gibi daha nadir durumlarda belgelenmiş sözleşmeleri olan
unsafegerektiriyor; TMA, tensor core ve küme düzeyinde iletişim gibi en ileri özellikleri ise donanımın karmaşıklığına uygun şekilde tamamen manuel bırakıyorAma bu pek de Rust usulü gelmiyor. Rust’ta mevcut soyutlamalar probleme uymadığında yeni güvenli soyutlamalar yapılır. Rust for Linux bunun bir örneği
Güvenli değilse Rust kullanmanın anlamı ne, diye düşündürüyor. Son damla performansı sıkmak isteyenlere unsafe API vermek tamam, ama bunun varsayılan olmaması gerekir
İnsan ister istemez
io_uringya da Vulkan gibi API’ler için yazılmış kullanıcı alanı kütüphaneleriyle kıyaslıyor. Bunlar için güvenli API tasarlamak oldukça zor ve gerçekten sound olmayan denemeler de olduAradaki serileştirme/bayt bariyeri de buna dahil
Örneğin dizi sınır kontrolünün ek yazmaç kullanımına yol açıp kernel eşzamanlılığını düşürüp düşüremeyeceğini merak ediyorum