Safe rust wrapper around CUDA toolkit
当前项目代码仓暂无内容
以下内容由 AI 翻译,如有问题请 点此提交 issue 反馈
cudarc:CUDA 工具包的轻量级安全 API
在 crates.io 和 docs.rs 上了解 cudarc。
欢迎贡献!
以下库的安全 CUDA 封装:
| 库 | 动态加载 | 动态链接 | 静态链接 |
|---|---|---|---|
| CUDA driver | ✅ | ✅ | N/A |
| NVRTC | ✅ | ✅ | ✅ |
| cuRAND | ✅ | ✅ | ✅ |
| cuBLAS | ✅ | ✅ | ✅ |
| cuBLASLt | ✅ | ✅ | ✅ |
| NCCL | ✅ | ✅ | ✅ |
| cuDNN | ✅ | ✅ | ✅ |
| cuSPARSE | ✅ | ✅ | ✅ |
| cuSOLVER | ✅ | ✅ | N/A |
| cuFILE | ✅ | ✅ | ✅ |
| CUPTI | ✅ | ✅ | ✅ |
| nvtx | ✅ | ✅ | N/A |
| cuFFT | ✅ | ❌ | ❌ |
支持的 CUDA 版本(使用 -F cuda-<version> 选择,例如 cuda-13010):
- 11.4-11.8
- 12.0-12.9
- 13.0-13.3
支持的 CUDNN 版本(使用 -F cudnn-<version> 选择,例如 cudnn-09021):
- 8.9.7
- 9.10.2
- 9.21.1
支持的 NCCL 版本(使用 -F nccl-<version> 选择,例如 nccl-02023):
- 2.22-2.30
配置 CUDA 版本
通过以下方式之一选择 CUDA 版本:
-F cuda-version-from-build-system:在构建时将使用nvcc获取 CUDA 工具包版本-F fallback-latest:可用于控制此操作失败时的行为。默认未启用,这将导致构建脚本 panic。如果启用-F fallback-latest,我们将使用现有的最高版本绑定。
-F cuda-<major>0<minor>0用于为特定版本的 CUDA 构建
配置链接
默认情况下,我们使用-F dynamic-loading,这使得构建时不需要任何库存在。
你也可以根据实际需求启用-F dynamic-linking或-F static-linking。
快速开始
创建新设备并将数据传输到GPU非常简单:
// Get a stream for GPU 0
let ctx = cudarc::driver::CudaContext::new(0)?;
let stream = ctx.default_stream();
// copy a rust slice to the device
let inp = stream.clone_htod(&[1.0f32; 100])?;
// or allocate directly
let mut out = stream.alloc_zeros::<f32>(100)?;
您还可以使用 nvrtc api 在运行时编译内核:
let ptx = cudarc::nvrtc::compile_ptx("
extern \"C\" __global__ void sin_kernel(float *out, const float *inp, const size_t numel) {
unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < numel) {
out[i] = sin(inp[i]);
}
}")?;
// Dynamically load it into the device
let module = ctx.load_module(ptx)?;
let sin_kernel = module.load_function("sin_kernel")?;
cudarc 提供了一个非常简洁的接口,可通过构建器模式来指定内核参数以启动内核:
let mut builder = stream.launch_builder(&sin_kernel);
builder.arg(&mut out);
builder.arg(&inp);
builder.arg(&100usize);
unsafe { builder.launch(LaunchConfig::for_num_elems(100)) }?;
当然,完成后将数据复制回主机也非常简单:
let out_host: Vec<f32> = stream.clone_dtoh(&out)?;
assert_eq!(out_host, [1.0; 100].map(f32::sin));
设计
目标如下:
- 尽可能保证安全性(由于 FFI 和异步操作,仍会存在大量不安全代码)
- 尽可能提升易用性
- 允许将高级
safeAPI 与低级sysAPI 混合使用
为此,每个包装器分为三个层级(默认导出安全 API):
use cudarc::driver::{safe, result, sys};
use cudarc::nvrtc::{safe, result, sys};
use cudarc::cublas::{safe, result, sys};
use cudarc::cublaslt::{safe, result, sys};
use cudarc::curand::{safe, result, sys};
use cudarc::nccl::{safe, result, sys};
其中:
sys是通过 bindgen 生成的原始 FFI APIresult是对 sys 的一个非常小的封装,用于从每个函数返回Resultsafe是对 result/sys 的封装,提供安全的抽象
强烈建议使用安全 API
许可证
采用双重许可,以与 Rust 项目兼容。
根据 Apache 许可证 2.0 版(http://www.apache.org/licenses/LICENSE-2.0)或 MIT 许可证(http://opensource.org/licenses/MIT)授权,您可以选择其中一种。除非根据这些条款,否则本文件不得被复制、修改或分发。
项目介绍
CUDA 工具包的安全 Rust 封装器【此简介由AI生成】
Apache-2.0 Rust655提交数cublascudacuda-kernelscuda-programmingcuda-toolkitcudnncurandgpugpu-accelerationncclnvrtcrust
定制我的领域