【问题标题】:Separate CUDA compilation with CMAKE使用 CMAKE 单独编译 CUDA
【发布时间】:2019-03-20 16:09:57
【问题描述】:

我想将 .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 库最后没有正确链接。我该怎么办?

【问题讨论】:

  • 你试过cuda_add_executable而不是add_executable吗?
  • 确实,您忘记使用默认不会添加的 CUDA 运行时。 CMake 2.8 也很旧,不能 100% 兼容现代 CMake。
  • 我使用 cmake 3.5.1。我也试过cuda_add_executable,它给了undefined reference to __cudaRegisterLinkedBinary_44_tmpxft_...

标签: c++ cmake cuda


【解决方案1】:

Cmake 3.8 添加了对 CUDA 的原生支持(here 是来自 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)

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多