- cuda-oxide adalah kompiler eksperimental untuk menulis kernel GPU SIMT dengan Rust idiomatis yang mendekati aman dan mengompilasi kode Rust standar langsung ke PTX
- Hanya menggunakan Rust tanpa DSL atau binding bahasa asing, dengan asumsi pemahaman tentang ownership, trait, dan generic, dan bab async juga memerlukan pengetahuan
.await
- v0.1.0 adalah rilis alpha awal, jadi bug, fitur yang belum selesai, dan perubahan API yang merusak kompatibilitas harus diantisipasi
- Contoh dijalankan dengan
cargo oxide run vecadd, dan fungsi #[kernel] di dalam #[cuda_module] melakukan penjumlahan vektor menggunakan thread::index_1d()
#[cuda_module] menyertakan artefak device ke dalam biner host, serta menghasilkan loader bertipe dan metode eksekusi per kernel
Cara penggunaan dan kode yang dihasilkan
-
Mulai cepat
- Setelah memenuhi prasyarat instalasi, bangun dan jalankan contoh dengan
cargo oxide run vecadd
- Panduan instalasi ada di prerequisites
- Contoh mendefinisikan fungsi
#[kernel] bernama vecadd di dalam modul #[cuda_module], mengambil indeks dengan thread::index_1d(), lalu menulis a[i] + b[i] ke DisjointSlice<f32>
- Di sisi host, kernel dijalankan menggunakan
CudaContext::new(0), stream default, kernels::load(&ctx), DeviceBuffer::from_host, DeviceBuffer::<f32>::zeroed, dan LaunchConfig::for_num_elems(1024)
- Hasil eksekusi diambil dengan
c.to_host_vec(&stream) dan memeriksa bahwa result[0] == 3.0
-
Cara kerja #[cuda_module]
#[cuda_module] menyertakan artefak device yang dihasilkan ke dalam biner host
- Menghasilkan fungsi
kernels::load yang bertipe dan metode eksekusi per kernel
- Saat perlu memuat artefak sidecar tertentu atau membuat kode eksekusi kustom, API level rendah
load_kernel_module dan cuda_launch! tetap bisa digunakan
Prasyarat dan arah pengembangan
- cuda-oxide bertujuan menulis kernel GPU dengan sistem tipe dan model ownership Rust, dengan keamanan sebagai tujuan utama
- Karena GPU memiliki banyak detail yang halus, perlu membaca the safety model
- Ini adalah backend codegen
rustc kustom yang mengompilasi Rust murni ke PTX, bukan DSL
- Mendukung eksekusi asinkron dengan menyusun pekerjaan GPU sebagai graf
DeviceOperation yang dieksekusi tertunda, menjadwalkannya ke pool stream, dan menunggu hasil dengan .await
- Diasumsikan pembaca sudah familier dengan ownership, trait, dan generic Rust; bab pemrograman GPU async berikutnya juga memerlukan pengetahuan tentang
async/.await dan runtime seperti tokio
- Materi referensi yang disediakan adalah The Rust Programming Language, Rust by Example, dan Async Book
- Rilis v0.1.0 masih berada pada tahap alpha awal, jadi bug, fitur yang belum selesai, dan perubahan API yang merusak kompatibilitas harus diantisipasi
1 komentar
Komentar Hacker News
Saya terutama penasaran bagaimana perbandingan waktu build-nya. Kebanyakan crate Rust CUDA bergantung pada pemanggilan CMake atau nvcc sehingga kompilasinya bisa terasa sangat lambat
Kebetulan minggu lalu saya sedang memprofilkan waktu build dan melihat bahwa alat seperti sccache bisa sangat mengurangi waktu rebuild lewat caching artefak, tetapi biaya pemanggilan nvcc kustom tetap ada. Misalnya candle dari Hugging Face juga memanggil perintah nvcc kustom saat kompilasi kernel: https://arpadvoros.com/posts/2026/05/05/speeding-up-rust-whi...
Soal kebanyakan crate Rust CUDA memanggil CMake atau nvcc sehingga kompilasinya lambat, saya pribadi tidak terlalu mengalaminya. Kalau melihat crate
cuda_setupyang saya buat untuk menangani build script, itu cumabuild.rssederhana jadi hanya dikompilasi ulang saat file berubah, dan waktu kompilasinya sangat kecil dibanding kode Rust di sisi CPUKalau begitu akan sangat bagus, tetapi saya pribadi merasa ini mungkin lebih dekat ke pelengkap. Saya juga penasaran apa pembeda cuda-oxide, selain fakta bahwa NVIDIA mengontrolnya sepenuhnya
Tile IR sedikit lebih tingkat tinggi jadi jauh lebih mudah untuk ditargetkan, dan hanya rugi di hal-hal seperti fusi epilog
[1] https://docs.nvidia.com/cuda/tile-ir/
[2] https://developer.nvidia.com/cuda/tile
Menurut saya menulis kernel GPU pada dasarnya tidak aman. Sangat sulit membuat bahasa yang aman karena cara kerja perangkat kerasnya dan karena kita selalu harus melakukan optimasi ekstrem
cudaFreesecara manualKedua, argumen
void*di C++ hanyalah array pointer dan hanya jumlahnya yang divalidasi, sedangkan di sini argumen kernel dipaksakan lewatcuda_launch!Ketiga, ada masalah aliasing pada penulisan yang dapat berubah. Di C++, kode yang membuat dua atau lebih thread menulis ke
out[i]denganiyang sama tetap bisa dikompilasi, tetapiDisjointSlicedanThreadIndextidak punya konstruktor publik, dan hanya API https://github.com/NVlabs/cuda-oxide/blob/2a03dfd9d5f3ecba52...index_1d,index_2d,index_2d_runtimeyang bisa dipakaiKeempat, di C++ Anda bisa
cuda memcpystd::stringatau praktis POD apa pun lalu merusak state, tetapi di sini hanya menerimaDisjointSlice, skalar, dan closure https://nvlabs.github.io/cuda-oxide/gpu-programming/memory-a...Rinciannya ada di https://nvlabs.github.io/cuda-oxide/gpu-safety/the-safety-mo... dan https://nvlabs.github.io/cuda-oxide/gpu-programming/memory-a.... Tentu tidak menangkap semuanya, tetapi tampaknya memberi jauh lebih banyak guardrail terhadap perilaku tak terdefinisi dibanding file
.cumentahApakah ini bahasa yang nyaman untuk pemrograman GPU masih harus dilihat, tetapi saya tidak akan kaget kalau ternyata bisa dibuat API mirip DSL yang cukup baik untuk menulis kode aman sambil tetap memanfaatkan semua keanehan khas GPU. Bukankah CUDA pada akhirnya juga seperti itu
Untuk pekerjaan yang aman tetapi paralel dan sulit dimasukkan dengan rapi ke model
Send/SyncRust, memang diperlukan sedikit kekasaranAkan bagus kalau model memori atau model kepemilikan bisa dimanfaatkan dengan gesekan rendah. Tetapi kalau itu justru membuat pengalaman pemakaian jauh lebih tidak nyaman, saya tidak menginginkan pendekatan seperti itu
Menurut saya baseline-nya adalah cara Cudarc bekerja sekarang. Manajemen memorinya tidak terlalu ikut campur, hanya sintaks imperatif yang membungkus FFI dan beberapa baris build script yang memanggil nvcc saat kernel berubah
Sebagai catatan, saya cukup suka Slang
[0]: https://shader-slang.org/
Misalnya descriptor set, register resource, batas dispatch, dan hal-hal semacam itu
Bahasa shading juga lebih ramah pengguna dari sisi fitur. Lagipula NVIDIA sudah memakai Slang di produksi, dan orang-orang itu tidak akan menulis ulang pipeline shader mereka ke Rust
Satu-satunya yang bisa saya temukan hanya ini
https://www.adacore.com/case-studies/nvidia-adoption-of-spar...
https://www.youtube.com/watch?v=2YoPoNx3L5E
Saya tetap mencoba mengabaikannya dan membaca dokumentasinya, tetapi ketika mulai menarik karena ada IR kustom, lalu muncul kalimat seperti “implementasi MLIR berarti C++ dengan tambahan TableGen, sistem build yang mengharuskan kompilasi seluruh LLVM, dan sesi debugging yang membuat Anda mempertanyakan pilihan karier”, saya jadi makin sulit menganggap serius industri ini
Ini tampak seperti bentuk dogfooding yang tepat dari perusahaan yang sangat membesar-besarkan AI
cuda-oxide membuat kasus umum “satu thread menulis satu elemen” aman secara struktural, lalu untuk kasus yang lebih jarang seperti shared memory, warp shuffle, dan hardware intrinsic, ia meminta
unsafedengan kontrak yang terdokumentasi, sementara fitur garis depan seperti TMA, tensor core, dan komunikasi tingkat cluster dibiarkan sepenuhnya manual agar sesuai dengan kompleksitas perangkat kerasnyaNamun ini terasa tidak terlalu khas Rust. Di Rust, kalau abstraksi yang ada tidak cocok dengan masalahnya, biasanya dibuat abstraksi aman yang baru. Rust for Linux adalah contohnya
Kalau tidak aman, jadi apa alasan memakai Rust? Menyediakan API unsafe untuk orang yang ingin memeras performa terakhir itu masuk akal, tetapi itu seharusnya bukan default
Saya jadi membandingkannya dengan pustaka user-space untuk API seperti
io_uringatau Vulkan. Mendesain API yang aman untuk hal-hal seperti itu memang cukup sulit, dan memang ada upaya yang ternyata tidak soundDemikian juga penghalang serialisasi/byte di antaranya
Misalnya saya penasaran apakah pemeriksaan batas array bisa memicu penggunaan register tambahan sehingga menurunkan konkruensi kernel