c++ - CMAKE_CXX_SOURCE_FILE_EXTENSIONS 不适用于推力/cuda

标签 c++ cmake cuda thrust

Thrust 允许在 cmake 配置时通过 THRUST_DEVICE_SYSTEM 标志指定不同的后端。我的问题是,当用户使用 -DTHRUST_DEVICE_SYSTEM=OMP 运行 cmake 时,我有一堆 .cu 文件,我希望将这些文件编译为常规 c++ 文件(例如) 。如果我将 .cu 文件的扩展名更改为 .cpp 它们编译得很好(表明我只需要告诉 cmake 在 .cu 上使用 c++ 编译器 文件)。但是,如果我将 .cu 添加到 CMAKE_CXX_SOURCE_FILE_EXTENSIONS,则会收到 CMake 错误:无法确定目标“cuda_kernels”的链接语言。这是一个最小的 cmake 示例:

cmake_minimum_required(VERSION 3.19)

project(kernels LANGUAGES C CXX Fortran)

set(KERNELS_USE_OMP OFF)
if ("${THRUST_DEVICE_SYSTEM}" STREQUAL "OMP")
  set(KERNELS_USE_OMP ON)
endif()

# verify CUDA support
include(CheckLanguage)
check_language(CUDA)
if (CMAKE_CUDA_COMPILER AND NOT KERNELS_USE_OMP)
  enable_language(CUDA)
else()
  list(PREPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS "cu;CU")
endif()

message(STATUS "${CMAKE_CXX_SOURCE_FILE_EXTENSIONS}")

find_package(Thrust REQUIRED CONFIG)
thrust_create_target(Thrust FROM_OPTIONS)


add_library(cuda_kernels my_kernels.cu)
target_link_libraries(cuda_kernels Thrust)

我的系统上 message 命令的输出是:-- cu;CU;C;M;c++;cc;cpp;cxx;mm;mpp;CPP;ixx; cppm

为什么 cmake 不尊重我的 CMAKE_CXX_SOURCE_FILE_EXTENSIONS 更改?

最佳答案

Why is cmake not respecting my CMAKE_CXX_SOURCE_FILE_EXTENSIONS changes?

<LANG> 的语言扩展一旦<LANG>被设置通过检查 CMAKE_<LANG>_SOURCE_FILE_EXTENSIONS 的值来启用语言检测模块退出时变量。

不幸的是,没有什么好的方法可以覆盖 CXX 的此列表。因为它被硬编码在Modules/CMakeCXXCompiler.cmake.in中.

也许解决实际错误的最佳方法是使用 LANGUAGE源文件属性告诉 CMake 如何编译各个 CUDA 文件,如下所示:

cmake_minimum_required(VERSION 3.19)
project(kernels LANGUAGES CXX)

find_package(Thrust REQUIRED)
thrust_create_target(Thrust FROM_OPTIONS)

thrust_is_cuda_system_found(USE_CUDA)
if (USE_CUDA)
  enable_language(CUDA)
endif()

set(cuda_kernel_sources my_kernels.cu)

add_library(cuda_kernels ${cuda_kernel_sources})
target_link_libraries(cuda_kernels PRIVATE Thrust)

if (NOT USE_CUDA)
  set_source_files_properties(
    ${cuda_kernel_sources}
    PROPERTIES
    LANGUAGE CXX
  )
endif ()

这对于其他可能尝试 add_subdirectory 的项目来说肯定会更加友好。你的。


但是,如果我们想要非常顽皮,我们可以这样做:

cmake_minimum_required(VERSION 3.19)
project(kernels LANGUAGES NONE)

###
# Hacky language extension override

function(add_cuda_extensions variable access value current_list_file stack)
  if (NOT cu IN_LIST value)
    list(PREPEND "${variable}" "cu" "CU")
    set("${variable}" "${${variable}}" PARENT_SCOPE)
  endif ()
endfunction()

# verify CUDA support
include(CheckLanguage)
check_language(CUDA)
if (CMAKE_CUDA_COMPILER AND NOT THRUST_DEVICE_SYSTEM STREQUAL "OMP")
  enable_language(CUDA)
  enable_language(CXX)
else()
  variable_watch(CMAKE_CXX_SOURCE_FILE_EXTENSIONS add_cuda_extensions)
  enable_language(CXX)
endif()

###
# Normal project code starts here

message(STATUS "${CMAKE_CXX_SOURCE_FILE_EXTENSIONS}")

find_package(Thrust REQUIRED)
thrust_create_target(Thrust FROM_OPTIONS)

add_library(cuda_kernels my_kernels.cu)
target_link_libraries(cuda_kernels PRIVATE Thrust)

这会等待平台模块尝试写入 CMAKE_CXX_SOURCE_FILE_EXTENSIONS然后每当访问它时,都会快速插入 cuCU列表的扩展。

关于c++ - CMAKE_CXX_SOURCE_FILE_EXTENSIONS 不适用于推力/cuda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71041077/

相关文章:

c++ - 可变参数模板未编译

c++ - 分配bitset c++的不同区域

c++ - 从 SAX 解析器事件填充 C++ POD 结构

visual-studio-2010 - find_package() 在 Windows Cmake 上没有检测到 boost

c++ - 如何让 CMake 在 Mac OS X 上使用 GCC 而不是 Clang?

带有整数参数的 CUDA pow 函数

c++ - 使用外部依赖项运行 VC++ 单元测试时为 "Failed to set up execution context"

boost - 如何确定 CMake 的 Boost 库名称

c - 无法杀死在 NVIDIA GPU 上运行的坏内核

cuda - Kepler 中的全局内存访问和 L1 缓存