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
然后每当访问它时,都会快速插入 cu
和CU
列表的扩展。
关于c++ - CMAKE_CXX_SOURCE_FILE_EXTENSIONS 不适用于推力/cuda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71041077/