【问题标题】:Separate Compilation and Linking of CUDA C++ Device Code with cmake使用 cmake 单独编译和链接 CUDA C++ 设备代码
【发布时间】:2018-10-13 18:42:58
【问题描述】:

我想在使用 cmake 构建系统的现有 C++ 代码库中添加 cuda 代码。我从 NVIDIA 找到了一篇文章(下面的链接),它准确地展示了它是如何完成的,除了它使用 make build。我是 cmake 构建系统的新手,但我通过阅读和试验本网站其他链接的内容进行了很好的尝试。至今没有成功!有人知道吗?如果是,请指导我。

https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/

这是我的 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.5.1)
message(STATUS "CMake version: ${CMAKE_VERSION}")

project(CUDAwithC)
find_package(CUDA 9.1 REQUIRED)
INCLUDE(FindCUDA)
INCLUDE_DIRECTORIES(/usr/local/cuda-9.1/include include)
set(SOURCE_FILES src/app.cpp src/particle.cpp src/v3.cpp)
cuda_add_executable(
    tee ${SOURCE_FILES}
)
set(
    CUDA_NVCC_FLAGS
    ${CUDA_NVCC_FLAGS};
    -x cu -gencode -arch=compute_20 -dc
)

target_link_libraries(
    tee /usr/local/cuda/lib64/libcudart.so
)

【问题讨论】:

  • cuda 9.1 不支持-arch=compute_20This 可能感兴趣。使用它而不是 -dc 标志。如果您在 SO 上的 cuda 标记上进行一些搜索,您会发现有关单独编译的其他问题,这些问题可能有您想要的。试试this search
  • @RobertCrovella,来自 Nvidia 的帖子将 cuda 代码添加到 cpp 文件中,但 stackoverflow 上的其他帖子侧重于处理 .cu 文件和 .cpp 文件。我找不到任何引用链接中提到的方法的答案。
  • 您找不到任何与CUDA_SEPARABLE_COMPILATION 属性相关的答案?我给了你一个返回几个例子的搜索链接。
  • 嗨@RobertCrovella 非常感谢您的建议。我可以用 cmake 构建代码。有效的解决方案:将所有 .cpp 文件转换为 .cu 文件并设置 cuda_seperable_complaition。但是,我仍然不明白整个想法。所有文件都有一些 CUDA 特定的关键字和扩展名 .cu 所以,这些文件必须由 nvcc 编译而不设置 cuda_seperable_complaition 那么为什么它只在 seperable_compliation 上工作?如果我不启用它,那么它会为没有任何 cuda 特定关键字的函数出现链接错误。请解释一下好吗?
  • 可分离编译在nvcc manual中描述。每当您在一个编译单元中有设备代码并调用另一个编译单元中的设备代码时,都需要它。如果您的项目中有这样的场景,那么简单地将所有内容转换为 .cu 文件并使用 nvcc 进行编译是不够的。您还必须启用可分离编译。除此之外,我无法解释您的项目的任何具体内容,因为您没有给出任何完整的示例。

标签: c++ cmake cuda gpgpu gpu


【解决方案1】:

查看错误消息会有所帮助。

仅查看您的代码,而不是指定库路径,使用 ${CUDA_LIBRARIES}。

转储标志部分并使用 cuda_add_executable 的 OPTIONS 参数来传递 -arch 标志。

不要使用 include_directories(最佳实践),而是使用 target_include_directories 并将其传递给 ${CUDA_INCLUDE_DIRS}。您根本不必这样做,因为 cuda_add_executable 会为您执行此操作(据报道)。

启用 compile_commands.json 有助于查看构建系统正在尝试执行的操作。

set( CMAKE_EXPORT_COMPILE_COMMANDS ON )

还值得通过 FindCUDA.cmake 阅读以了解它提供的内容。

/usr/share/cmake-3.10/Modules/FindCUDA.cmake

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2012-11-20
    • 2020-09-20
    • 1970-01-01
    • 2018-05-03
    • 2020-11-07
    相关资源
    最近更新 更多