使用 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.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)
我终于明白了!
链接问题是由于缺少 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})
我正在处理一个使用可分离编译的 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.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)
我终于明白了!
链接问题是由于缺少 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})