Я создаю статическую библиотеку, которая содержит некоторый код 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)
Это произведет 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)
Но я получаю следующую ошибку при сборке:
nvlink error: Undefined reference to '_ZN10test7CudaClass1C1EPKNS_11intE' in ...
У меня есть два вопроса:
Документация CUDA гласит (http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#examples)
«Можно сделать несколько ссылок на устройства в пределах одного исполняемого файла хоста, если каждая ссылка на устройство независима от другой (они не могут совместно использовать код между исполняемыми файлами устройства)»
Звучит так, будто я не могу делать то, что хочу, верно?
Я использую CUDA 5.5 и GCC 4.8.
Задача ещё не решена.
Других решений пока нет …