CUDA Rust
<p align="center">
<a href="https://github.com/NVIDIA/cuda-rust/actions/workflows/ci-status.yml"><img alt="Build" src="https://img.shields.io/github/actions/workflow/status/NVIDIA/cuda-rust/ci-status.yml?label=build"></a>
<a href="https://nvidia.github.io/cuda-rust/"><img alt="Docs" src="https://img.shields.io/badge/docs-latest-blue.svg"></a>
</p>
CUDA Rust는 NVIDIA의 CUDA 플랫폼을 위한 Rust 언어입니다. 이 라이브러리는 CUDA 드라이버를 다루기 위한 호스트 측 크레이트(host-side crates)와, idiomatic Rust로 GPU 커널(GPU kernels)을 작성하기 위한 장치 측 크레이트 및 도구를 제공합니다.
- cuda-oxide (book): 전통적인 CUDA SIMT (Single Instruction, Multiple Threads) 커널 프로그래밍 모델을 대상으로 사용자를 돕기 위한 사용자 정의 rustc codegen 백엔드, cargo 헬퍼 유틸리티 및 크레이트입니다. 여기에서 사용자는 장치 측 CUDA 프로그래밍의 모든 세부 사항에 접근할 수 있습니다.
- cutile-rs (book): CUDA Tile 프로그래밍 모델을 사용하여 커널을 작성하는 사용자를 돕기 위한 proc-macro 플러그인 및 크레이트입니다. 텐서(Tensors)는 장치 메모리(device memory)의 뷰이며, 서브-텐서(sub-tensors)로 분할됩니다. 커널은 이들로부터 타일(tiles)을 로드하고, 전체 타일에 대해 계산하며, 다시 타일을 저장합니다. 이때 컴파일러가 각 아키텍처에 타일이 어떻게 매핑될지 결정합니다.
- 런타임:
cuda-bindings, cuda-core (cuda-core-derive 포함), 그리고 cuda-async는 공유 런타임을 제공합니다. 여기에는 드라이버 바인딩, 컨텍스트(contexts), 스트림(streams), 장치 버퍼(device buffers), 이벤트(events), 그리고 지연되고 조합 가능한 장치 연산(lazy, composable device operations)이 포함됩니다.
두 커널 프로그래밍 모델 모두 Rust의 소유권 규칙(ownership rules)을 GPU 실행 경계(GPU launch boundary)를 넘어 확장합니다. 가변 버퍼는 실행 전에 분리된 조각들로 분할되고, 불변 버퍼는 공유되며, 런처(launchers)는 GPU 작업이 진행되는 동안 해당 참조(borrows)들을 유지합니다.
CUDA Rust는 초기 단계의 연구 프로젝트입니다. 버그, 미완성 기능, API 파손이 예상되니 참고해 주십시오. 그럼에도 불구하고, 여러분의 작업에서 이를 사용해 보시고 경험에 대한 피드백을 공유하여 개발 방향 설정에 도움을 주시기를 바랍니다.
모델 선택하기 (Picking a model)
| cuda-oxide (SIMT) | cutile-rs (Tile) |
|---|
| CUDA C++ 프로그래머에게 익숙한 느낌: 스레드(threads), 블록(blocks), 공유 메모리(shared memory) | NumPy 또는 PyTorch 프로그래머에게 익숙한 느낌: 다차원 타일(multi-dimensional tiles)에 대한 ndarray / 텐서(tensor) 연산 | |
| ... | | |
타일(Tile)과 SIMT 중 어느 것을 선택할지는 각 커널의 요구 사항에 따라 결정하십시오.
타일은 추상화(abstractions)가 워크로드에 적합할 때 개발을 단순화할 수 있는 반면, SIMT는 개별 스레드에 대한 직접적인 제어권을 제공합니다. 하나의 애플리케이션이 둘 다 사용할 수 있습니다.
CUDA Rust가 성숙함에 따라 발전할 수 있는 몇 가지 권장 사항은 다음과 같습니다:
- CUDA 프로그래밍에 익숙하다면, SIMT가 편안하게 느껴질 것입니다.
- 문제 영역이 주로 밀집된 수치 데이터(densely packed numerical data)에 대한 수학 연산을 포함한다면, 타일(Tile)이 적합합니다.
- 문제 영역이 희소하거나(sparse), 포인터 추적(pointer chasing)을 포함하거나, 전통적인 자료 구조를 GPU로 매핑하는 등 유사한 경우, SIMT가 더 많은 유연성을 제공할 것입니다.
- 성능 튜닝을 위해 더 많은 노력, 전문 지식 또는 토큰을 투입할 의향이 있다면, SIMT 기반의 CuTe 추상화(abstractions)가 좋은 선택일 수 있습니다.
두 모델의 커널은 상호 운용됩니다. 즉, cutile-rs 타일 커널과 cuda-oxide SIMT 커널이 공유 장치 버퍼(shared device buffers)를 통해 동일한 스트림(stream)에서 실행될 수 있습니다.
저장소 레이아웃 (Repository layout)
cuda-rust/
├── cuda-bindings/ runtime — CUDA 드라이버 API 바인딩
├── cuda-core/ runtime — 컨텍스트(contexts), 스트림(streams), 메모리(memory), 모듈(modules), 이벤트(events), 런칭(launch)
...
문서화 (Documentation)
CUDA Rust 문서([https://nvidia.github.io/cuda-rust/])부터 시작하세요. cutile-rs와 cuda-oxide는 각각 설치 지침, 가이드 및 참고 자료가 담긴 책자를 가지고 있습니다. 런타임 크레이트(cuda-bindings, cuda-core, cuda-async)에 대한 문서는 cutile-rs 책자에 문서화되어 있습니다.
기여 (Contributing)
커밋 서명 요구 사항, 풀 리퀘스트 및 CI에 대해서는 CONTRIBUTING.md를 참조하세요. 두 구성 요소 모두 안정 버전의 Rust를 기반으로 하며, 각각의 rust-toolchain.toml 파일에서 툴체인을 고정합니다 (cuda-oxide의 경우 cargo oxide를 통해 관리되는 rustc-dev 및 llvm-tools 사용). 각 책자는 자체적인 설정을 다룹니다.
라이선스 (License)
CUDA Rust는 Apache License 2.0에 따라 라이선스가 부여됩니다. 루트의 LICENSE 파일은 전체 리포지토리(cuda-oxide, cutile-rs 및 공유 호스트 크레이트)를 포괄합니다. 게시된 모든 크레이트는 license = "Apache-2.0"을 선언합니다.
타사 기여(Third-party attributions)는 cuda-oxide/THIRD_PARTY_NOTICES에 나열되어 있습니다.