我正在开发一个使用可分离编译的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.h
和thrust/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)
答案 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})