#cuda #kernel #interface #automatic #source #interact #build

构建 bindgen_cuda

类似于 Bindgen 的接口,用于构建可以与 Rust 交互的 CUDA 内核

6 个版本

0.1.5 2024 年 4 月 1 日
0.1.4 2024 年 2 月 6 日
0.1.3 2024 年 1 月 30 日

算法 中排名 198

Download history 1812/week @ 2024-04-15 1503/week @ 2024-04-22 1376/week @ 2024-04-29 1348/week @ 2024-05-06 1491/week @ 2024-05-13 1620/week @ 2024-05-20 1564/week @ 2024-05-27 1239/week @ 2024-06-03 1959/week @ 2024-06-10 1627/week @ 2024-06-17 1534/week @ 2024-06-24 1628/week @ 2024-07-01 1356/week @ 2024-07-08 1735/week @ 2024-07-15 1370/week @ 2024-07-22 1440/week @ 2024-07-29

每月下载量 5,971
40crate中使用(直接使用6个)

MIT 协议

24KB
435 代码行

Bindgen Cuda

Latest version Documentation License

bindgen 类似的哲学。它将帮助创建自动的 bindgen 到 CUDA 内核源文件,并使它们更容易直接从 Rust 中使用。

PTX 包含

假设你有一个文件

src/cuda.cu

__global__ void cuda_hello(){
    printf("Hello World from GPU!\n");
}

你可以将 bindgen_cuda 添加为构建依赖项

cargo add --build bindgen_cuda

然后创建这个 build.rs

fn main() {
    let builder = bindgen_cuda::Builder::default();
    let bindings = builder.build_ptx().unwrap();
    bindings.write("src/lib.rs");
}

这将创建一个包含以下代码的源文件

pub const CUDA: &str = include_str!(concat!(env!("OUT_DIR"), "/cuda.ptx"));

然后你可以使用库如 cudarc 直接在你的 Rust 代码中使用 PTX。

原始 CUDA 调用

或者你可以构建一个静态库,你可以在 build.rs 中链接它,以便直接使用 C 代码调用 CUDA。

src/cuda.cu

__global__ void cuda_hello(){
    printf("Hello World from GPU!\n");
}

int run() {
    cuda_hello<<<1,1>>>(); 
    return 0;
}

然后编写 build.rs

fn main() {
    let builder = bindgen_cuda::Builder::default();
    builder.build_lib("libcuda.a");
    println!("cargo:rustc-link-lib=cuda");
}

然后在 src/lib.rs 中通过 FFI 接口使用

extern "C" {
    fn cuda_hello();
}
fn main(){
    unsafe{ cuda_hello();}
}

依赖

~1.5MB
~28K SLoC