Отдельная компиляция CUDA с помощью CMAKE - PullRequest
0 голосов
/ 20 марта 2019

Я хочу скомпилировать .cu и .cpp в файлы .o отдельно, а затем связать их с исполняемым файлом.У меня есть несколько простых файлов: cuda_func.cu.cuda_func.h и main.cpp.В основной cpp я включаю cuda_func.h и запускаю cuda_func ().Я придумал следующий код cmake:

project(cuda)

cmake_minimum_required(VERSION 2.8)

# CUDA PACKAGE
find_package(CUDA REQUIRED)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
set(CUDA_HOST_COMPILER g++)

# COMPILE CU FILES
file(GLOB CUDA_FILES *.cu)
list( APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_30,code=sm_30; -std=c++11")
CUDA_COMPILE(CU_O ${CUDA_FILES})

SET(CMAKE_EXE_LINKER_FLAGS  "-L/usr/local/cuda/lib -lcudart")

# SETUP FOR CPP FILES
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

# COMPILE AND LINK
add_executable(main main.cpp ${CU_O})

Но я получаю неопределенную ссылку на ошибку "cudaMemcpy".Когда я компилирую его вручную, используя nvcc и g ++ для получения файлов .o и, наконец, g ++ для создания исполняемого файла, он работает нормально.Кажется, что библиотека CUDA не связана должным образом в конце.Что мне делать?

1 Ответ

1 голос
/ 20 марта 2019

Cmake 3.8 добавил встроенную поддержку CUDA ( здесь - это документ от NVIDIA, в котором объясняется, как его использовать таким образом), вы можете просто добавить cuda в качестве языка, и соответствующий компилятор будет использоваться автоматически для каждый файл.

cmake_minimum_required (VERSION 3.8)

project(youProject LANGUAGES CXX CUDA)

add_executable(yourExecutable)
target_sources(yourExecutable <you can add c++ as well as cuda files here>)

// Or if you want to separate cuda and C++ more clearly, put your cuda code
// in a library and link to it (which obviously allows you to compile them separately)
add_library(yourCudaLib <you can add your cuda files here>)
target_link_libraries(yourProject PRIVATE yourCudaLib)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...