I am struggling to link my CUDA kernel with my Rust project using a build.rs file with the crate cc:
build.rs
extern crate cc;
fn main() {
println!("cargo:rustc-link-lib=cuda");
println!("cargo:rustc-link-lib=cudart");
println!("cargo:rustc-link-lib=cudnn");
cc::Build::new()
.cuda(true)
.flag("-cudart=shared")
.flag("-gencode")
.flag("arch=compute_61,code=sm_61")
.file("kernel.cu")
.compile("kernel");
}
I get this error:
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183.1y16o1qfye96o7m0.rcgu.o" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183.3rngp6bm2u2q5z0y.rcgu.o" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183.3vhdzx0ywzealo7m.rcgu.o" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183.4xq48u46a1pwiqn7.rcgu.o" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183.8xzrsc1ux72v29j.rcgu.o" "-o" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183.crate.allocator.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-z,relro,-z,now" "-nodefaultlibs" "-L" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps" "-L" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/build/rust_cudnn-df924982e63c2363/out" "-L" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-l" "cudart" "-l" "cudnn" "-l" "cuda" "-Wl,-Bstatic" "-Wl,--whole-archive" "-l" "kernel" "-Wl,--no-whole-archive" "-Wl,-Bdynamic" "-l" "stdc++" "-Wl,-Bstatic" "/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/liblibc-dca5860987df25ef.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-0006dc6e9901bcad.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-8d1c3982c0670998.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc_jemalloc-2a12cd93029b9807.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-a5d3ff19e13d9f37.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc_system-c5f69e7df1f06d84.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-e2e7ce88a6c41eea.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-3d7473d271611dc2.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_unicode-58e7a51af24928de.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-6806ae6018eec5e7.rlib" "/home/ltei/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-85fd2d595ec0faf9.rlib" "-Wl,-Bdynamic" "-l" "util" "-l" "util" "-l" "dl" "-l" "rt" "-l" "pthread" "-l" "pthread" "-l" "gcc_s" "-l" "c" "-l" "m" "-l" "rt" "-l" "pthread" "-l" "util" "-l" "util"
= note: /home/ltei/Dev/Workspaces/rust_cudnn/target/debug/deps/rust_cudnn-c2a0c7c98bc21183.3vhdzx0ywzealo7m.rcgu.o : In fonction « rust_cudnn::main » :
/home/ltei/Dev/Workspaces/rust_cudnn/src/main.rs:213 : undefined reference to « Kernel_test »
/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/build/rust_cudnn-df924982e63c2363/out/libkernel.a(kernel.o) : In fonction « __sti____cudaRegisterAll_41_tmpxft_0000098e_00000000_7_kernel_cpp1_ii_a9220a05() » :
/tmp/tmpxft_0000098e_00000000-4_kernel.cudafe1.stub.c:7 : undefined reference to « __cudaRegisterFatBinary »
/home/ltei/Dev/Workspaces/rust_cudnn/target/debug/build/rust_cudnn-df924982e63c2363/out/libkernel.a(kernel.o) : In fonction « __cudaUnregisterBinaryUtil() » :
/usr/include/crt/host_runtime.h:238 : undefined reference to « __cudaUnregisterFatBinary »
collect2: error: ld returned 1 exit status
Apparently, that is what happens when you don't link cudart, but I thought I did. Maybe I did it wrong? The error only occurs when I try to compile and link my CUDA kernel. When I don't, it works and I can use CUDA functions like cudaMalloc
from Rust
Here is my kernel.cu file:
#include "kernel.h"
__global__ void vectorAdd_ker(float* vector, int len, float value) {
int tid = blockIdx.x * blockDim.x + threadIdx.x;
if (tid < len) { vector[tid] += value; }
}
void Kernel_vectorAdd(float* vector, int len, float value) {
dim3 gridDim;
dim3 blockDim;
blockDim.x = 1024;
gridDim.x = (len + blockDim.x - 1) / blockDim.x;
vectorAdd_ker <<<gridDim, blockDim>>> (vector, len, value);
}
int Kernel_test() {
return 7;
}