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

build bindgen_cuda

Bindgen like interface to build cuda kernels to interact with within Rust

6 releases

0.1.5 Apr 1, 2024
0.1.4 Feb 6, 2024
0.1.3 Jan 30, 2024

#196 in Algorithms

Download history 220/week @ 2024-01-06 226/week @ 2024-01-13 266/week @ 2024-01-20 534/week @ 2024-01-27 1109/week @ 2024-02-03 995/week @ 2024-02-10 1461/week @ 2024-02-17 1338/week @ 2024-02-24 1085/week @ 2024-03-02 1172/week @ 2024-03-09 1385/week @ 2024-03-16 2106/week @ 2024-03-23 2033/week @ 2024-03-30 1372/week @ 2024-04-06 1849/week @ 2024-04-13 1269/week @ 2024-04-20

6,784 downloads per month
Used in 36 crates (5 directly)

MIT license

24KB
435 lines

Bindgen Cuda

Latest version Documentation License

Similar crate than bindgen in philosophy. It will help create automatic bindgen to cuda kernels source files and make them easier to use directly from Rust.

PTX inclusion

Let's say you have a file

src/cuda.cu

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

You can add bindgen_cuda as a build dependency:

cargo add --build bindgen_cuda

And then create this build.rs

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

This will create a src file containing the following code:

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

You can then use the PTX directly in your rust code with a library like cudarc.

Raw cuda calls

Alternatively you can build a static library that you can link against in build.rs in order to call cuda directly with the c code.

src/cuda.cu

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

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

Then write the build.rs:

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

Which you can then interface through FFI in src/lib.rs:

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

Dependencies

~1.5MB
~28K SLoC