【问题标题】:Cuda CMake 3.10 CMakeLists.txtCuda CMake 3.10 CMakeLists.txt
【发布时间】:2018-09-20 21:23:01
【问题描述】:

我有一个创建 dll 的可视化 c++ 项目。 对于这个项目,我有一个有效的 CMakeLists.txt。

现在我创建了两个 cuda 源文件来完成项目和 使用视觉工作室,构建工作正常。 我想将匹配的命令添加到我的 cmake 文件中。 谁能告诉我需要添加的基本命令吗?

我尝试构建一个使用 .cu 和 .cpp 文件的 dll 库.... 我的 cmake 文件的重要部分如下所示:

# ----------------------------------------------------------------------------
# Set Cuda properties
# ----------------------------------------------------------------------------
enable_language(CUDA)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
  set(CUDA_64_BIT_DEVICE_CODE_DEFAULT ON)
endif()
set(CUDA_NVCC_FLAGS "-gencode arch=compute_50,code=sm_50;-rdc=true;-use_fast_math")

message(STATUS "CUDA_PROPAGATE_HOST_FLAGS: ${CUDA_PROPAGATE_HOST_FLAGS}")
message(STATUS "CUDA_HOST_COMPILER: ${CUDA_HOST_COMPILER}")
message(STATUS "CUDA_NVCC_FLAGS: ${CUDA_NVCC_FLAGS}")

# ----------------------------------------------------------------------------
# Create shared library project
# ----------------------------------------------------------------------------
add_library(${LIB_NAME} SHARED ${HEADERS} ${SOURCES} ${CUDA_SOURCES})
set(CUDA_LIBRARIES "cudadevrt.lib;cudart.lib")
target_link_libraries(${LIB_NAME} ${CUDA_LIBRARIES})

但它不会编译带有正确标志的 cuda 文件。 同样在 Visual Studio 中,预处理器定义也在属性的 cuda 部分中......有什么建议吗?

【问题讨论】:

  • @halfelf:引用问题的only answer 描述了find_package(CUDA) 的用法。现在 CMake 支持 CUDA 作为一种语言(与CCXXFortran 相同),因此收据已更改。在引用的问题将在“新”CMake 中获得答案之前,我不希望将其作为重复项。不幸的是,我不太了解 CUDA,所以无法准备好答案。
  • @Tsyvarev 感谢您的提示。我在我的项目中尝试过enable_language(CUDA)。但是,我仍然建议使用find_package(CUDA) 系列函数/变量,因为似乎很难找到任何有关如何链接/包含其他 cuda 库/头文件(如 npp、curand 等)的文档。
  • @GoranFlegar 感谢您的示例和开发博客。我的意思是在使用find_package(CUDA) 时,首先我不需要CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES 用于标头,我也不需要find_library() 用于每个cuda lib,因为它们已设置为CUDA_xxx_LIBRARY 变量。新功能对我来说感觉比旧的find_package(cuda) 复杂一点,或者我错过了什么?
  • @halfelf 如果您正在构建 .cu 文件,则不需要 CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES,仅当您从 .c/.cpp 文件调用 CUDA 运行时 API 时才需要。对于库,这是真的,它们没有预定义,但您始终可以为它们制作一个小包装脚本,并将其包含在您的所有项目中。

标签: cmake cuda


【解决方案1】:

我将尝试使用 cmets 的讨论来回答这个问题,并添加一些额外的信息。

首先,有两种方法可以在 CMake 中启用 CUDA 支持。一个是旧的FindCUDA module,另一个是CMake 3.8中新增的内置CUDA语言支持,并解释了here。 您可以选择其中之一(但您可能希望对新项目使用内置支持),但您必须坚持自己的选择。

要使用内置支持,您可以将其添加到 project(...) 语句或使用:

enable_language(CUDA);

要使用旧的 FindCUDA 包,您可以使用:

find_package(CUDA);

请注意,这两个选项使用完全不同的变量进行设置。要查看 FindCUDA 支持哪些变量,请参阅 this page,对于内置 CUDA 支持,请参阅 this(不要忘记 <LANG> 占位符可以替换为任何语言,这意味着 CUDA也是可用的替代品之一)。

例如使用FindCUDA,您将使用CUDA_NVCC_FLAGS 手动设置编译器标志,使用内置语言支持,您将使用CMAKE_CUDA_FLAGS 用于相同目的。根据经验:如果变量以CUDA_ 开头,它是FindCUDA 包的一部分,如果它以CMAKE_ 开头,那么它是内置支持的一部分。

【讨论】:

  • 不知何故,对于我使用cuda_gl_interop.hcuda_runtime_api 的项目,只需添加project(... CUDA) 会导致链接器错误,抱怨` undefined reference to cudaSetDevice' 等。所以我求助于find_paclage(CUDA)cuda_add_executable 链接很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 2013-09-10
  • 1970-01-01
相关资源
最近更新 更多