m.s*_*.s. 5 c++ cuda cmake nvcc nvlink
我创建了一个静态库,其中包含一些CUDA代码和一些常规C ++代码。此静态库的CMakeLists.txt如下所示:
SET(TARGET_H some_header.h)
SET(CUDA_SRC cudaclass1.cu cudaclass2.cu)
SET(TARGET_SRC cppclass1.cpp cppclass2.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_LIBRARY(somestatic ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
Run Code Online (Sandbox Code Playgroud)
这将产生libsomestatic.a。
现在,我想将此静态库与可执行文件链接,该可执行文件本身由CUDA代码和C ++代码组成。
在这个可执行文件的CUDA代码,我需要实例化并使用CudaClass1从libsomestatic.a。
这是CMakeLists.txt可执行文件:
SET(TARGET_H some_header.h)
SET(CUDA_SRC cudafile.cu)
SET(TARGET_SRC main.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_EXECUTABLE(some_exe ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
TARGET_LINK_LIBRARIES(some_exe somestatic)
Run Code Online (Sandbox Code Playgroud)
但是在构建时出现以下错误:
nvlink error: Undefined reference to '_ZN10test7CudaClass1C1EPKNS_11intE' in ...
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
CUDA文档说明(http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#examples)
“可以在单个主机可执行文件中进行多个设备链接,只要每个设备链接彼此独立(它们不能跨设备可执行文件共享代码)”
听起来我无法做我想做的事,对吧?
我使用CUDA 5.5和GCC 4.8。