首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将用C编写的自定义CUDA内核与锈蚀项目联系起来?

如何将用C编写的自定义CUDA内核与锈蚀项目联系起来?
EN

Stack Overflow用户
提问于 2018-03-18 14:15:45
回答 1查看 442关注 0票数 3

我正在努力使用一个build.rs文件将我的CUDA内核与我的Rust项目连接起来,并将其与机箱cc:

build.rs

代码语言:javascript
复制
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");
}

我知道这个错误:

代码语言:javascript
复制
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

显然,这就是当你不连接棍棒的时候会发生的事,但我想我是这样做的。也许我做错了?只有当我试图编译和链接我的CUDA内核时,才会发生错误。当我不工作的时候,我可以使用像铁锈中的cudaMalloc这样的CUDA功能

这是我的kernel.cu文件:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2020-06-25 07:04:38

最初的海报诊断出这是一个路径问题,并能够将build.rs修改为此(取自这里):

代码语言:javascript
复制
extern crate cc;
use std::env;


fn main() {

    if let Ok(cuda_path) = env::var("CUDA_HOME") {
        println!("cargo:rustc-link-search=native={}/lib64", cuda_path);
    } else {
        println!("cargo:rustc-link-search=native=/usr/local/cuda/lib64");
    }

    println!("cargo:rustc-link-lib=dylib=cuda");
    println!("cargo:rustc-link-lib=dylib=cudart");
    println!("cargo:rustc-link-lib=dylib=cublas");
    println!("cargo:rustc-link-lib=dylib=curand");

    cc::Build::new().cuda(true)
        .flag("-gencode").flag("arch=compute_52,code=sm_52") // Generate code for Maxwell (GTX 970, 980, 980 Ti, Titan X).
        .flag("-gencode").flag("arch=compute_53,code=sm_53") // Generate code for Maxwell (Jetson TX1).
        .flag("-gencode").flag("arch=compute_61,code=sm_61") // Generate code for Pascal (GTX 1070, 1080, 1080 Ti, Titan Xp).
        .flag("-gencode").flag("arch=compute_60,code=sm_60") // Generate code for Pascal (Tesla P100).
        .flag("-gencode").flag("arch=compute_62,code=sm_62") // Generate code for Pascal (Jetson TX2).
        .file("kernels/vectorfragment.cu").compile("libvectorfragment.a");
    cc::Build::new().cuda(true).cpp_link_stdlib(None)
        .flag("-gencode").flag("arch=compute_52,code=sm_52")
        .flag("-gencode").flag("arch=compute_53,code=sm_53")
        .flag("-gencode").flag("arch=compute_61,code=sm_61")
        .flag("-gencode").flag("arch=compute_60,code=sm_60")
        .flag("-gencode").flag("arch=compute_62,code=sm_62")
        .file("kernels/vectorpacked.cu").compile("libvectorpacked.a");
    cc::Build::new().cuda(true).cpp_link_stdlib(None)
        .flag("-gencode").flag("arch=compute_52,code=sm_52")
        .flag("-gencode").flag("arch=compute_53,code=sm_53")
        .flag("-gencode").flag("arch=compute_61,code=sm_61")
        .flag("-gencode").flag("arch=compute_60,code=sm_60")
        .flag("-gencode").flag("arch=compute_62,code=sm_62")
        .file("kernels/matrix.cu").compile("libmatrix.a");
}

这显然是在原来没有的地方起作用的。

注意:这个答案以社区wiki的形式从评论中添加,现在删除了这个答案,以便将这个问题从CUDA标签的未回答问题队列中删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49348859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档