Время сборки моей библиотеки cuda увеличивается, поэтому я подумал, что отдельная компиляция, представленная в CUDA 5.0, может мне помочь. Я не мог понять, как добиться отдельной компиляции с помощью cmake. Я просмотрел документацию NVCC и нашел, как скомпилировать объект устройства (с использованием опции -dc) и как связать их (используя -dlink). Мои попытки запустить его с помощью cmake не удались. Я использую cmake 2.8.10.2 и голову ствола FindCUDA.cmake. Однако я не мог узнать, как указать, какие файлы должны быть скомпилированы, и как связать их с библиотекой.
Особенно синтаксис function(CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS output_file_var cuda_target options object_files source_files)
неясен для меня, потому что я не знаю, что такое output_file_var
и cuda_target
.
Здесь не работают результаты моих попыток:
cuda_compile(DEVICEMANAGER_O devicemanager.cu OPTIONS -dc)
cuda_compile(BLUB_O blub.cu OPTIONS -dc)
CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS(TEST_O gpuacceleration
"" DEVICEMANGER_O BLUB_O)
set(LIB_TYPE SHARED)
#cuda_add_library(gpuacceleration ${LIB_TYPE}
#${gpuacc_SRCS}
#devicemanager.cu
# blub.cu
#DEVICEMANAGER_O
# TEST_O
#)
Кто-нибудь знает, как скомпилировать и связать библиотеку cuda с помощью cmake? Спасибо заранее.
EDIT: После того, как друг посоветовался с разработчиком FindCUDA.cmake, ошибка была исправлена в примере с FindCUDA.cmake(https://gforge.sci.utah.edu/gf/project/findcuda/scmsvn/?action=browse&path=%2F checkout% 2Ftrunk% 2FFindCuda.html), Теперь я могу построить пример. В моем проекте я могу построить библиотеку по мере необходимости, используя следующую (см. 2.8.10):
set(LIB_TYPE SHARED)
set(CUDA_SEPARABLE_COMPILATION ON)
cuda_add_library(gpuacceleration ${LIB_TYPE}
blub.cu
blab.cu
)
НО: Я не могу ссылаться на эту библиотеку. Когда я построил lib без отдельной компиляции, я смог связать ее. Теперь получаем следующую ошибку:
undefined reference to `__cudaRegisterLinkedBinary_53_tmpxft_00005ab4_00000000_6_blub_cpp1_ii_d07d5695'
для каждого файла с функцией, используемой в интерфейсе. Кажется странным, поскольку он строит без предупреждения и т.д. Любые идеи, как заставить это работать?
EDIT: Наконец я понял, как это сделать. См. @PHD и мой ответ для деталей.