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

Undefined Symbol Error when using thrust::max_element

我正在处理一个使用可分离编译的 CUDA C++ 项目,但我在编译 thrust 函数时遇到了一些问题。

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

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\Google Drive\WireMeshOT Rafael\CUDA\simulator\build\src\visualize_intermediate_link.obj 1   

有趣的是,另一个 thrust 函数调用编译得很好:

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)

我终于明白了!

链接问题是由于缺少 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:仅当您使用 3.7.2 以上的 CMake 版本时,如下所示仅链接到 CUDA_LIBRARIES 确实可以解决问题。在较低版本中,此变量存在但不包含 cudadevrt 库。

target_link_libraries(project glut glew ${CUDA_LIBRARIES})