cudarc:CUDA工具包的最小化安全API封装,支持多版本与灵活链接

Safe rust wrapper around CUDA toolkit

分支1Tags87
当前项目代码仓暂无内容

cudarc:CUDA 工具包的轻量级安全 API

crates.io docs.rs

crates.iodocs.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));

设计

目标如下:

  1. 尽可能保证安全性(由于 FFI 和异步操作,仍会存在大量不安全代码)
  2. 尽可能提升易用性
  3. 允许将高级 safe API 与低级 sys API 混合使用

为此,每个包装器分为三个层级(默认导出安全 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};

其中:

  1. sys 是通过 bindgen 生成的原始 FFI API
  2. result 是对 sys 的一个非常小的封装,用于从每个函数返回 Result
  3. safe 是对 result/sys 的封装,提供安全的抽象

强烈建议使用安全 API

许可证

采用双重许可,以与 Rust 项目兼容。

根据 Apache 许可证 2.0 版(http://www.apache.org/licenses/LICENSE-2.0)或 MIT 许可证(http://opensource.org/licenses/MIT)授权,您可以选择其中一种。除非根据这些条款,否则本文件不得被复制、修改或分发。

项目介绍

CUDA 工具包的安全 Rust 封装器【此简介由AI生成】

定制我的领域
131.22 K166访问 GitHub