【问题标题】:Compile CUDA code with cmake and 3.5 compute capability使用 cmake 和 3.5 计算能力编译 CUDA 代码
【发布时间】:2018-05-03 22:00:44
【问题描述】:

我需要编译一个使用 cmake 动态并行的 CUDA 代码。 代码是:

#include <stdio.h>

__global__ void childKernel() {
    printf("Hello ");    
}

__global__ void parentKernel() {    
    childKernel<<<1,1>>>();
    cudaDeviceSynchronize();    
    printf("World!\n");    
}

int main(int argc, char **argv){

    parentKernel<<<1, 1>>>();

    return 0;
}

cmake 如下:

cmake_minimum_required(VERSION 2.8)

find_package(CUDA QUIET REQUIRED)

include_directories(/usr/include)
include_directories(/usr/local/cuda/lib)
include_directories(/usr/local/cuda-8.0/lib)
include_directories(/usr/local/cuda/include)
include_directories(/usr/local/cuda-8.0/include)

set(CUDA_SEPARABLE_COMPILATION ON)
find_package(CUDA QUIET REQUIRED)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)

set(
    CUDA_NVCC_FLAGS 
    ${CUDA_NVCC_FLAGS}; 
    -arch=compute_35 -rdc=true -lcudadevrt
)

cuda_add_executable(
    prova 
    test.cu
)

我尝试使用传递 -arch=compute_35 -rdc=true -lcudadevrt 的 nvcc 直接编译代码,它编译完美,但是当 我尝试用 cmake 编译它返回以下错误:

CMakeFiles/prova.dir/prova_intermediate_link.o: In function `__cudaRegisterLinkedBinary_66_tmpxft_00001101_00000000_13_cuda_device_runtime_compute_62_cpp1_ii_8b1a5d37':
link.stub:(.text+0xcc): undefined reference to `__fatbinwrap_66_tmpxft_00001101_00000000_13_cuda_device_runtime_compute_62_cpp1_ii_8b1a5d37'
link.stub:(.text+0xd0): undefined reference to `__fatbinwrap_66_tmpxft_00001101_00000000_13_cuda_device_runtime_compute_62_cpp1_ii_8b1a5d37'
collect2: error: ld returned 1 exit status
CMakeFiles/prova.dir/build.make:200: recipe for target 'prova' failed
make[2]: *** [prova] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/prova.dir/all' failed
make[1]: *** [CMakeFiles/prova.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

【问题讨论】:

    标签: c++ cuda compute-capability


    【解决方案1】:

    您看到的未定义符号在libcudadevrt.a 中定义。我看到你告诉 CMake 链接到它,但编译器似乎找不到它。在命令行上试试这个:

    VERBOSE=1 make
    

    并检查输出以查看您是否在 /usr/local/cuda/lib64 搜索库。

    这可能无关,但我也注意到您指示 CMake 搜索 /usr/local/cuda/lib/usr/local/cuda-8.0/lib 以查找头文件。这是不正确的,因为这些目录只包含库。

    【讨论】:

      【解决方案2】:

      感谢您的回答,我已尝试使用 Tegra X2 (compute_62) 的正确计算能力,并检查了详细 make 的输出,发现以下输出:

      CMakeFiles/prova.dir/prova_generated_test.cu.o CMakeFiles/prova.dir/prova_intermediate_link.o  -o prova -rdynamic /usr/local/cuda-8.0/lib64/libcudart_static.a -lpthread -ldl -lrt
      

      似乎链接器尝试搜索 /usr/local/cuda-8.0/lib64/libcudart_static.a 而不是 libcudadevrt.a

      【讨论】:

        猜你喜欢
        • 2013-03-02
        • 2013-05-03
        • 2011-08-28
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 2020-09-20
        • 2018-10-13
        • 1970-01-01
        相关资源
        最近更新 更多