Скомпилируйте код CUDA с помощью cmake и возможностью вычислений 3.5

Мне нужно скомпилировать код CUDA, который использует динамический параллелизм с помощью cmake.
Код является:

#include <stdio.h>

__global__ void childKernel() {
printf("Hello ");
}

__global__ void parentKernel() {
childKernel<<<1,1>>>();
cudaDeviceSynchronize();
printf("World!\n");
}

int main(int argc, char **argv){

parentKernel<<<1, 1>>>();

return 0;
}

и cmake является следующим:

cmake_minimum_required(VERSION 2.8)

find_package(CUDA QUIET REQUIRED)

include_directories(/usr/include)
include_directories(/usr/local/cuda/lib)
include_directories(/usr/local/cuda-8.0/lib)
include_directories(/usr/local/cuda/include)
include_directories(/usr/local/cuda-8.0/include)

set(CUDA_SEPARABLE_COMPILATION ON)
find_package(CUDA QUIET REQUIRED)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)

set(
CUDA_NVCC_FLAGS
${CUDA_NVCC_FLAGS};
-arch=compute_35 -rdc=true -lcudadevrt
)

cuda_add_executable(
prova
test.cu
)

Я попытался скомпилировать код непосредственно с Nvcc, передавая -arch=compute_35 -rdc=true -lcudadevrt и компилируется отлично, но когда
Я пытаюсь скомпилировать с помощью cmake, он возвращает мне следующую ошибку:

CMakeFiles/prova.dir/prova_intermediate_link.o: In function `__cudaRegisterLinkedBinary_66_tmpxft_00001101_00000000_13_cuda_device_runtime_compute_62_cpp1_ii_8b1a5d37':
link.stub:(.text+0xcc): undefined reference to `__fatbinwrap_66_tmpxft_00001101_00000000_13_cuda_device_runtime_compute_62_cpp1_ii_8b1a5d37'
link.stub:(.text+0xd0): undefined reference to `__fatbinwrap_66_tmpxft_00001101_00000000_13_cuda_device_runtime_compute_62_cpp1_ii_8b1a5d37'
collect2: error: ld returned 1 exit status
CMakeFiles/prova.dir/build.make:200: recipe for target 'prova' failed
make[2]: *** [prova] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/prova.dir/all' failed
make[1]: *** [CMakeFiles/prova.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

0

Решение

Неопределенные символы, которые вы видите, определены в libcudadevrt.a, Я вижу, что вы говорите CMake ссылаться на него, но, похоже, компилятор не может его найти. Попробуйте это в командной строке:

VERBOSE=1 make

и проверить вывод, чтобы увидеть, если вы ищете /usr/local/cuda/lib64 для библиотек.

Это может быть не связано, но я также заметил, что вы указываете CMake для поиска /usr/local/cuda/lib а также /usr/local/cuda-8.0/lib для заголовочных файлов. Это неверно, так как эти каталоги содержат только библиотеки.

1

Другие решения

Спасибо за ответ, я попытался использовать правильные вычислительные возможности Tegra X2 (compute_62), и я проверил вывод подробного make, и я нашел следующий вывод:

CMakeFiles/prova.dir/prova_generated_test.cu.o CMakeFiles/prova.dir/prova_intermediate_link.o  -o prova -rdynamic /usr/local/cuda-8.0/lib64/libcudart_static.a -lpthread -ldl -lrt

Похоже, что компоновщик пытается найти /usr/local/cuda-8.0/lib64/libcudart_static.a, но не libcudadevrt.a

1

По вопросам рекламы [email protected]