NVIDIA, CUDA Rust 발표: SIMT 및 Tile 트랙을 통한 Rust 기반 네이티브 GPU 커널
요약 – NVIDIA의 CUDA Rust를 사용하면 Rust로 직접 GPU 커널을 작성할 수 있습니다. 두 가지 프로그래밍 모델(cuda-oxide를 통한 SIMT 및 cutile-rs를 통한 Tile)을 제공하며, PTX로 컴파일되고 컴파일 타임 안전성을 보장합니다.
네이티브 Rust GPU 커널이 중요한 이유
- Rust의 소유권 및 타입 시스템은 CUDA C++ 커널에서는 전통적으로 누락되었던 메모리 안전성 버그를 컴파일 타임에 잡아냅니다.
- NVIDIA의 드라이버 스택은 이미 Rust로 전환 중입니다(Nova Linux 드라이버, Dynamo 코어, NVTX 바인딩). 커널 계층까지 Rust를 확장함으로써 언어 커버리지를 완성합니다.
- 개발자는 이제 Rust에서 커널을 실행할 뿐만 아니라 커널 코드 자체를 Rust로 작성할 수 있어, 외부 언어 래퍼가 필요하지 않습니다.
CUDA 모델을 반영한 두 가지 트랙
1. SIMT 트랙 – cuda-oxide
- 모델: CUDA C++ 또는 numba-cuda와 동일한 전통적인 SIMT(Single-Instruction-Multiple-Thread) 프로그래밍.
- 툴체인:
#[kernel]함수를 Rust MIR → Pliron IR → LLVM IR → PTX로 라우팅하는 커스텀rustc코드 생성 백엔드. - 요구 사항: Linux, 컴퓨팅 성능 ≥ 8.0인 GPU, CUDA 12.x+, clang, 고정된 nightly Rust 툴체인(
cargo +nightly-2026-04-03). - 시작하기:
cargo +nightly-2026-04-03 install --git https://github.com/NVlabs/cuda-oxide.git cargo-oxide cargo oxide new vecadd_demo cd vecadd_demo cargo oxide doctor # 환경 검증 cargo oxide run # 벡터 합산 예제 빌드 및 실행 - 안전성 하이라이트:
- 커널 인자는
DisjointSlice를 사용하여 각 스레드에 독점적인 가변 접근 권한을 부여함으로써, 잘못된&mut [T]패턴을 방지합니다. #[launch_contract]는 스레드 블록 기하학적 구조를 선언하며,prepare_vecadd는 계약 및 장치 제한에 따라 실행 구성을 검증하여 안전한vecadd호출에 필요한 증명 객체를 생성합니다.- 컴파일 타임 오류를 통해 기존의 별칭(aliasing) 버그를 방지합니다. 예를 들어, 동일한 버퍼를 입력과 가변 출력으로 동시에 전달하려고 하면
E0502오류가 발생합니다.
- 커널 인자는
2. Tile 트랙 – cutile-rs
- 모델: *타일(Tile)*이 하위 텐서에서 작동하는 논리적 스레드인 타일 수준 추상화입니다. 컴파일러가 각 타일을 지원할 물리적 GPU 스레드 수를 결정합니다.
- 툴체인: 순수 안정 버전 Rust(≥ 1.89). nightly나 커스텀 LLVM이 필요 없습니다. CUDA 13.3 및 컴퓨팅 성능 ≥ 8.0인 GPU가 필요합니다.
- 시작하기:
cargo new vecadd_demo cd vecadd_demo cargo add cutile cargo run # src/main.rs에 예제를 붙여넣은 후 실행 - 안전성 하이라이트:
- 텐서 파티셔닝(
api::zeros(...).partition([128]))은 각 타일에 독점적인 가변 소유권을 부여하여 특수한DisjointSlice타입이 필요 없게 합니다. - 동적 차원은 타입 서명에서
-1로 표현되며, 실제 크기는 실행 시점에 결정되므로 재컴파일 없이 유연한 형태를 지원합니다. - 런처(
kernel::add)는 텐서를 소비하고 튜플로 반환하며,.sync_on(&stream)이 호출될 때만 실행되어 전체 프로그램을 원자적으로 실행되는 지연 설명(lazy description)으로 만듭니다.
- 텐서 파티셔닝(
컴파일러가 자동으로 잡아내는 것
- 별칭 없는 보장(Alias-free guarantees) – 두 트랙 모두 적절한 독점성 없이 동일한 버퍼를 읽고 쓰는 커널을 거부하며, 컴파일 타임에
cannot borrow as mutable because it is also borrowed as immutable(SIMT) 또는use of moved value(Tile)와 같은 오류를 발생시킵니다. - 스레드 인덱스 안전성 – SIMT에서
thread::index_1d()는 타입이 지정된 인덱스를 반환하며, 범위를 벗어난 접근은 정의되지 않은 메모리 읽기가 아닌 명시적인Option분기가 됩니다. - 실행 시점 검증 –
#[launch_contract]는 제공된LaunchConfig가 커널의 선언된 기하학적 구조 및 장치 제한과 일치하는지 강제하여, 흔한 런타임 충돌 원인을 컴파일 타임 검사로 전환합니다.
프로젝트 성숙도 및 생태계 위치
- cuda-oxide – 초기 알파 단계. nightly 툴체인이 필요하며 Linux 전용입니다. CUDA의 기존 PTX 파이프라인에 가까운 저수준 MIR 기반 경로를 제공합니다.
- cutile-rs – crates.io에 게시되었으며, HuggingFace의 Grout 추론 엔진과 mistral.rs 프로젝트에서 이미 사용 중입니다. 더 안정적인 것으로 간주되지만, 여전히 1.0 이전 버전이며 API 변경 가능성이 있습니다.
- 두 프로젝트는 다른 Rust-GPU 노력(rust-cuda, rust-gpu, CubeCL)과 공존합니다. NVIDIA 블로그는 이러한 관계를 매핑한 생태계 부록으로 연결됩니다.
오늘 바로 시도해보기
- SIMT 예제 –
cargo oxide new vecadd_demo && cargo oxide run. - Tile 예제 – 타일 기반 벡터 합산 코드를 복사한 후
cargo add cutile && cargo run. - 문서 – cuda-oxide book 및 cutile-rs docs.
- 논문 – Fearless Concurrency on the GPU (arXiv 2606.15991).
- 커뮤니티 – 각 GitHub 저장소에 이슈를 제기하거나, Discord에 참여하거나, RustConf 2026에서 열리는 Melih Elibol의 발표를 확인하세요.
커뮤니티 반응 (선별된 HN 댓글)
"실행 시점이 신뢰되는 것이 아니라 검증된다. 젠장, NVIDIA조차도 완전히 Claude가 작성한 기사를 내놓고 있네." – claiir
"이런 것을 기다려왔다. CUDA C++은 골칫거리다. 커널 프로그래밍을 위한 Rust의 안전성은 게임 체인저가 될 수 있다." – Driftbench
"NVIDIA가 이제 HuggingFace를 소유하고 있고, HuggingFace는 Rust 기반 추론을 위한 훌륭한 Candle 크레이트를 가지고 있으니, 이는 멋진 네이티브 Rust 커널을 향한 좋은 단계로 보인다." – dllu
"나는 CUDA를 매우 싫어한다… GPU를 프로그래밍하는 가장 좋은 방법은 Metal, OpenCL, D3D12처럼 커널을 별도 파일로 작성하고 수동으로 실행하는 것이다." – jacobgorm (철학적 대안을 제시함).
전망
NVIDIA의 CUDA Rust 이니셔티브는 저수준 제어(SIMT)와 고수준 추상화(Tile)라는 두 가지 상호 보완적인 트랙을 시작으로, Rust의 안전성 보장을 GPU 스택으로 가져오려는 전략적 추진을 의미합니다. 도구는 아직 초기 단계이지만, 이미 프로덕션급 Rust 추론 엔진에 채택되고 있어 빠른 성숙 경로를 시사합니다. API가 안정화됨에 따라 개발자들은 완전히 Rust로 고성능 GPU 커널을 작성하는 더 부드럽고 안전한 경험을 기대할 수 있을 것입니다.
Sources
관련
- Dispatch
- Dispatch
- 프로젝트
- 프로젝트
- 프로젝트