CUDA-oxide: Nvidia의 공식 Rust-to-CUDA 컴파일러

22 hours ago 5
  • cuda-oxide는 안전에 가까운 관용적 Rust로 SIMT GPU 커널을 작성하고 표준 Rust 코드를 PTX로 직접 컴파일하는 실험적 컴파일러임
  • DSL이나 외국어 바인딩 없이 Rust만 사용하며, 소유권·트레이트·제네릭 이해를 전제로 하고 async 장은 .await 지식도 필요함
  • v0.1.0은 초기 알파 릴리스라 버그, 미완성 기능, API 파괴적 변경을 예상해야 함
  • 예제는 cargo oxide run vecadd로 실행하며, #[cuda_module] 안의 #[kernel] 함수가 thread::index_1d()로 벡터 덧셈을 수행함
  • #[cuda_module]은 디바이스 아티팩트를 호스트 바이너리에 포함하고, 타입 지정 로더와 커널별 실행 메서드를 생성함

사용 방식과 생성 코드

  • 빠른 시작

    • 설치 전제 조건을 갖춘 뒤 cargo oxide run vecadd로 예제를 빌드하고 실행함
    • 설치 안내는 prerequisites에 있음
    • 예제는 #[cuda_module] 모듈 안에 #[kernel] 함수 vecadd를 정의하고, thread::index_1d()로 인덱스를 얻어 a[i] + b[i]를 DisjointSlice<f32>에 기록함
    • 호스트 쪽에서는 CudaContext::new(0), 기본 스트림, kernels::load(&ctx)를 사용하고, DeviceBuffer::from_host, DeviceBuffer::<f32>::zeroed, LaunchConfig::for_num_elems(1024)로 커널을 실행함
    • 실행 결과를 c.to_host_vec(&stream)로 가져와 result[0] == 3.0을 확인함
  • #[cuda_module] 동작

    • #[cuda_module]은 생성된 디바이스 아티팩트를 호스트 바이너리에 포함함
    • 타입이 지정된 kernels::load 함수와 커널별 실행 메서드를 생성함
    • 특정 sidecar 아티팩트를 로드하거나 커스텀 실행 코드를 만들어야 할 때는 낮은 수준의 load_kernel_module과 cuda_launch! API도 계속 사용 가능함

전제와 방향

  • cuda-oxide는 Rust의 타입 시스템과 소유권 모델로 GPU 커널을 작성하는 것을 목표로 하며, 안전성을 1급 목표로 둠
  • GPU에는 미묘한 부분이 있으므로 the safety model을 읽을 필요가 있음
  • DSL이 아니라 순수 Rust를 PTX로 컴파일하는 커스텀 rustc 코드 생성 백엔드임
  • GPU 작업을 지연 실행되는 DeviceOperation 그래프로 구성하고, 스트림 풀에 스케줄링하며, .await로 결과를 기다리는 비동기 실행을 지원함
  • Rust의 소유권, 트레이트, 제네릭에 익숙하다는 전제를 두며, 이후 async GPU 프로그래밍 장은 async/.await와 tokio 같은 런타임 지식도 필요함
  • 참고 자료로 The Rust Programming Language, Rust by Example, Async Book이 제공됨
  • v0.1.0 릴리스는 초기 알파 단계이며, 버그, 미완성 기능, API 파괴적 변경을 예상해야 함
Read Entire Article