使用thrust :: max_element时未定义的符号错误

时间:2017-04-20 16:00:04

标签: cuda cmake thrust nvcc

我正在开发一个使用可分离编译的CUDA C ++项目,我在编译推力函数时遇到了一些麻烦。

在添加以下函数调用之前,项目构建没有问题。

thrust::device_ptr<float> max_int = thrust::max_element(
    thrust::device_ptr<float>(dev_temp_intensity_buffer),
    thrust::device_ptr<float>(dev_temp_intensity_buffer + INT_BUF_SIZE);

如上所述,我收到了构建错误:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2019 unresolved external symbol __fatbinwrap_66_tmpxft_00006db0_00000000_18_cuda_device_runtime_compute_61_cpp1_ii_8b1a5d37 referenced in function __cudaRegisterLinkedBinary_66_tmpxft_00006db0_00000000_18_cuda_device_runtime_compute_61_cpp1_ii_8b1a5d37 visualize   C:\Users\13\Google Drive\WireMeshOT Rafael\CUDA\simulator\build\src\visualize_intermediate_link.obj 1   

有趣的是,这个其他推力函数调用编译得很好:

thrust::exclusive_scan(thrust::device_ptr<unsigned int>(dev_ray_alive),
    thrust::device_ptr<unsigned int>(dev_ray_alive + NRAYS),
    thrust::device_ptr<unsigned int>(dev_scanned_alive_rays));

Obs1:dev_temp_intensity_buffer是一个浮动设备指针,我包括thrust/extrema.hthrust/device_ptr.h

Obs2:我正在使用CMake配置构建。相关的CMake代码摘录如下所示。

SET(CUDA_SEPARABLE_COMPILATION ON)

set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -rdc=true -D_FORCE_INLINES) 
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -arch=compute_52  -code=sm_52 -lcudart -lcudadevrt -lcuda)
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -Xptxas -v)

cuda_add_executable(
 project 
 file1.cu
  ...)

target_link_libraries (project glut glew)

1 个答案:

答案 0 :(得分:1)

我终于明白了!

链接问题是由于缺少cudadevrt库。问题是,仅-lcudadevrt添加CUDA_NVCC_FLAGS是不够的!

将CUDA运行时设备库链接到CMake目标时问题就消失了,如下所示:

target_link_libraries(project glut glew ${CUDA_cudadevrt_LIBRARY})

Obs1:CUDA_cudadevrt_LIBRARY变量仅在3.7.2以上的CMake版本上可用。添加行cmake_minimum_required(VERSION 3.7.2)是一个好主意。

Obs2:仅链接到CUDA_LIBRARIES,如果您使用的是3.7.2以上的CMake版本,确实可以解决问题。在较低版本中,此变量存在但不包含cudadevrt库。

target_link_libraries(project glut glew ${CUDA_LIBRARIES})