FindCUDA

在 3.27 版本中变更: 仅当策略 CMP0146 未设置为 NEW 时才可用。 将项目移植到 CMake 的一流 CUDA 语言支持。

从 3.10 版本起已弃用: 在新代码中不要使用此模块。

不再需要使用此模块或调用 find_package(CUDA) 来编译 CUDA 代码。 相反,在对顶级 project() 命令的调用中列出 CUDA,或者使用 CUDA 调用 enable_language() 命令。 然后可以将 CUDA (.cu) 源文件直接添加到目标中,类似于其他语言。

在 3.17 版本中添加: 要手动查找和使用 CUDA 工具包库,请改用 FindCUDAToolkit 模块。 无论是否启用了 CUDA 语言,它都可以工作。

已弃用用法文档

用于构建 CUDA C 文件的工具:库和构建依赖项。

此脚本定位 NVIDIA CUDA C 工具。 它应该在 Linux、Windows 和 macOS 上运行,并且应该与 CUDA C 版本相当同步。

在 3.19 版本中添加: QNX 支持。

此脚本使用标准 find_package() 参数 <VERSION>REQUIREDQUIETCUDA_FOUND 将报告是否找到合适的 CUDA 版本。

如果无法通过系统路径中 nvcc 的位置确定前缀,并且 REQUIRED 指定给 find_package(),则脚本将提示用户指定 CUDA_TOOLKIT_ROOT_DIR。 要使用工具包的不同安装版本,请在运行 cmake 之前设置环境变量 CUDA_BIN_PATH(例如 CUDA_BIN_PATH=/usr/local/cuda1.0 而不是默认的 /usr/local/cuda)或在配置后设置 CUDA_TOOLKIT_ROOT_DIR。 如果更改了 CUDA_TOOLKIT_ROOT_DIR 的值,将重新定位依赖于路径的各种组件。

在某些平台上可能需要手动设置 CUDA_TOOLKIT_ROOT_DIR,或者使用未安装在默认位置的 CUDA 运行时。 在工具包的较新版本中,CUDA 库包含在图形驱动程序中 - 请确保驱动程序版本与 CUDA 运行时版本所需的版本匹配。

输入变量

以下变量影响脚本中宏的行为(按字母顺序)。 请注意,在调用 cuda_add_executable()cuda_add_library()cuda_compile()cuda_compile_ptx()cuda_compile_fatbin()cuda_compile_cubin()cuda_wrap_srcs() 之前,可以在同一个目录中多次更改这些标志中的任何一个。

CUDA_64_BIT_DEVICE_CODE(默认值:主机位大小)

设置为 ON 以编译为 64 位设备代码,设置为 OFF 以编译为 32 位设备代码。 请注意,在从 CUDA 代码生成对象或 C 文件时,如果将此设置为与主机代码不同,则将不起作用,因为 size_t 在生成的源文件中由 nvcc 定义。 如果您编译为 PTX,然后自己加载该文件,则可以在设备和主机之间混合位大小。

CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE(默认值:ON

如果希望自定义构建规则附加到 Visual Studio 中的源文件,则将其设置为 ON。 如果将同一个 cuda 文件添加到多个目标,则将其关闭。

这允许用户从 CUDA 文件构建目标;但是,如果将 CUDA 源文件添加到多个目标,则可能会发生不好的事情。 在执行并行构建时,自定义构建命令可能运行不止一次并且以并行方式运行,从而导致难以理解的构建错误。 VS 为目标中的每个源文件运行规则,并且源文件无论添加到多少个项目都只能有一个规则。 当规则从多个目标运行时,可能会在生成的文件上发生竞争条件。 最终,所有内容都将构建,但如果用户不知道此行为,可能会造成混淆。 如果此脚本可以检测跨多个目标重用源文件并为用户关闭该选项,那就太好了,但没有找到合适的解决方案。

CUDA_BUILD_CUBIN(默认值:OFF

设置为 ON 以在设备模式下启用额外的编译传递,并使用 -cubin 选项。 解析输出,并在构建期间打印寄存器、共享内存使用情况。

CUDA_BUILD_EMULATION(默认值:设备模式为 OFF

设置为 ON 以使用仿真模式。 当 CUDA_BUILD_EMULATIONTRUE 时,为 CUDA C 文件定义 -D_DEVICEEMU

CUDA_LINK_LIBRARIES_KEYWORD(默认值:""

在 3.9 版本中添加。

用于内部 target_link_libraries() 调用的 <PRIVATE|PUBLIC|INTERFACE> 关键字。 默认情况下,不使用关键字,该关键字使用旧的“普通”形式的 target_link_libraries()。 请注意,这很重要,因为在 FindCUDA 模块内部使用的任何内容也必须在外部使用 - target_link_libraries() 的两种形式不能混合使用。

CUDA_GENERATED_OUTPUT_DIR(默认值:CMAKE_CURRENT_BINARY_DIR

设置为您希望放置生成文件的路径。 如果为空,则输出文件将放置在 CMAKE_CURRENT_BINARY_DIR 中。 中间文件始终放置在 CMAKE_CURRENT_BINARY_DIR/CMakeFiles 中。

CUDA_HOST_COMPILATION_CPP(默认值:ON

设置为 OFF 以使用 C 编译主机代码。

CUDA_HOST_COMPILER(默认值:CMAKE_C_COMPILER

设置 nvcc 将使用的主机编译器。 如果 -ccbin--compiler-bindir 已经存在于 CUDA_NVCC_FLAGSCUDA_NVCC_FLAGS_<CONFIG> 变量中,则忽略此设置。 对于 Visual Studio 目标,主机编译器使用一个或多个 Visual Studio 宏构建,例如 $(VCInstallDir),该宏在从 VS 内部运行命令时扩展为路径。

在 3.13 版本中添加: 如果设置了 CUDAHOSTCXX 环境变量,它将用作默认值。

CUDA_NVCC_FLAGSCUDA_NVCC_FLAGS_<CONFIG>

其他 NVCC 命令行参数。 注意:多个参数必须以分号分隔(例如 --compiler-options;-Wall

在版本 3.6 中添加: 这些变量的内容可以使用 generator expressions

CUDA_PROPAGATE_HOST_FLAGS (默认值: ON)

设置为 ON 以自动将 CMAKE_{C,CXX}_FLAGS 及其配置相关的对应项(例如 CMAKE_C_FLAGS_DEBUG)通过 nvcc 的 -Xcompiler 标志传播到主机编译器。这有助于使生成的主机代码更好地匹配系统的其余部分。有时某些标志会导致 nvcc 出现问题,这将帮助您关闭标志传播。这不会影响直接通过 CUDA_NVCC_FLAGS 或通过 OPTION 标志(通过 cuda_add_library()cuda_add_executable()cuda_wrap_srcs() 指定)传递给 nvcc 的标志。用于共享库编译的标志不受此标志影响。

CUDA_SEPARABLE_COMPILATION (默认值: OFF)

如果设置此选项,将为所有 CUDA 运行时目标文件启用可分离编译。如果在 cuda_add_executable()cuda_add_library() 之外使用(例如,直接调用 cuda_wrap_srcs()),则应调用 cuda_compute_separable_compilation_object_file_name()cuda_link_separable_compilation_objects()

CUDA_SOURCE_PROPERTY_FORMAT

在版本 3.3 中添加。

如果设置了此源文件属性,它可以覆盖为 cuda_wrap_srcs() 指定的格式(OBJPTXCUBINFATBIN)。如果输入源文件不是 .cu 文件,则设置此文件将导致将其视为 .cu 文件。有关如何设置此属性,请参阅 set_source_files_properties 的文档。

CUDA_USE_STATIC_CUDA_RUNTIME (默认值: ON)

在版本 3.3 中添加。

启用后,静态版本的 CUDA 运行时库将在 CUDA_LIBRARIES 中使用。如果配置的 CUDA 版本不支持此选项,则会静默禁用它。

CUDA_VERBOSE_BUILD (默认值: OFF)

设置为 ON 以查看构建 CUDA 文件时使用的所有命令。使用 Makefile 生成器时,该值默认为 VERBOSE(运行 make VERBOSE=1 以查看输出),尽管将 CUDA_VERBOSE_BUILD 设置为 ON 将始终打印输出。

命令

该脚本创建以下函数和宏(按字母顺序排列)

cuda_add_cufft_to_target(<cuda_target>)

将 cufft 库添加到目标(可以是任何目标)。处理您是否处于仿真模式。

cuda_add_cublas_to_target(<cuda_target>)

将 cublas 库添加到目标(可以是任何目标)。处理您是否处于仿真模式。

cuda_add_executable(<cuda_target> <file>...
                    [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [OPTIONS ...])

创建一个可执行文件 <cuda_target>,它由指定的文件组成。所有非 CUDA C 文件都使用 CMake 指定的标准构建规则进行编译,CUDA 文件使用 nvcc 和主机编译器编译为目标文件。此外,CUDA_INCLUDE_DIRS 会自动添加到 include_directories()。可以在调用此宏后对目标使用一些标准 CMake 目标调用(例如 set_target_properties()target_link_libraries()),但设置调整编译标志的属性不会影响由 nvcc 编译的代码。此类标志应在调用 cuda_add_executable()cuda_add_library()cuda_wrap_srcs() 之前修改。

cuda_add_library(<cuda_target> <file>...
                 [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [OPTIONS ...])

cuda_add_executable() 相同,只是创建了一个库。

cuda_build_clean_target()

创建一个便捷目标,用于删除生成的所有依赖项文件。您应该在运行此目标后执行清理操作,以确保重新生成依赖项文件。

cuda_compile(<generated_files> <file>... [STATIC | SHARED | MODULE]
             [OPTIONS ...])

从输入源文件返回生成的文件列表,该列表用于 add_library()add_executable()

cuda_compile_ptx(<generated_files> <file>... [OPTIONS ...])

从输入源文件返回生成的 PTX 文件列表。

cuda_compile_fatbin(<generated_files> <file>... [OPTIONS ...])

在版本 3.1 中添加。

从输入源文件返回生成的 FATBIN 文件列表。

cuda_compile_cubin(<generated_files> <file>... [OPTIONS ...])

在版本 3.1 中添加。

从输入源文件返回生成的 CUBIN 文件列表。

cuda_compute_separable_compilation_object_file_name(<output_file_var>
                                                    <cuda_target>
                                                    <object_files>)

计算用于可分离编译的中间链接文件的名称。此文件名通常传递给 CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS。output_file_var 是根据 cuda_target 生成的,需要可分离编译的目标文件列表,如 <object_files> 所指定。如果 <object_files> 列表为空,则 <output_file_var> 将为空。此函数会为 cuda_add_library()cuda_add_executable() 自动调用。请注意,这是一个函数,而不是宏。

cuda_include_directories(path0 path1 ...)

设置应传递给 nvcc 的目录(例如 nvcc -Ipath0 -Ipath1 ...)。这些路径通常包含其他 .cu 文件。

cuda_link_separable_compilation_objects(<output_file_var> <cuda_target>
                                        <nvcc_flags> <object_files>)

从给定的目标文件生成可分离编译所需的链接目标。这会为 cuda_add_executable()cuda_add_library() 自动调用,但在直接使用 cuda_wrap_srcs() 时可以手动调用。从 cuda_add_library()cuda_add_executable() 调用时,传递的 <nvcc_flags> 与通过 OPTIONS 参数传递的标志相同。自动添加的唯一 nvcc 标志是 CUDA_64_BIT_DEVICE_CODE 指定的位数标志。请注意,这是一个函数,而不是宏。

cuda_select_nvcc_arch_flags(<out_variable> [<target_CUDA_architecture> ...])

根据 target_CUDA_architecture 为 nvcc 选择 GPU 架构标志。

有关 target_CUDA_architecture 的值

  • Auto:在运行时检测本地机器 GPU 计算架构。

  • CommonAll:涵盖架构的常见和完整子集。

  • <name>FermiKeplerMaxwellKepler+TegraKepler+TeslaMaxwell+TegraPascal 中的一个。

  • <ver>, <ver>(<ver>), <ver>+PTX,其中 <ver> 是以下之一:2.02.13.03.23.53.75.05.25.36.06.2

返回要添加到 CUDA_NVCC_FLAGS 的标志列表,这些标志位于 <out_variable> 中。此外,将 <out_variable>_readable 设置为生成的数字列表。

示例

cuda_select_nvcc_arch_flags(ARCH_FLAGS 3.0 3.5+PTX 5.2(5.0) Maxwell)
list(APPEND CUDA_NVCC_FLAGS ${ARCH_FLAGS})

有关 CUDA 架构的更多信息,请访问:https://en.wikipedia.org/wiki/CUDA。请注意,这是一个函数而不是宏。

cuda_wrap_srcs(<cuda_target> <format> <generated_files> <file>...
               [STATIC | SHARED | MODULE] [OPTIONS ...])

所有魔法都在这里发生。 cuda_add_executable()cuda_add_library()cuda_compile()cuda_compile_ptx() 都在后台调用此函数。

给定文件列表 <file>...,此宏将生成自定义命令,以生成 PTX 或可链接对象(使用 PTXOBJ 作为 <format> 参数进行切换)。不以 .cu 结尾或具有 HEADER_FILE_ONLY 属性的文件将被忽略。

OPTIONS 之后传递的参数是传递给 nvcc 的额外命令行选项。您也可以通过指定配置名称后跟选项来指定每个配置选项。通用选项必须位于配置特定选项之前。不必指定所有配置,仅提供要使用的配置。例如

cuda_add_executable(...
  OPTIONS -DFLAG=2 "-DFLAG_OTHER=space in flag"
  DEBUG -g
  RELEASE --use_fast_math
  RELWITHDEBINFO --use_fast_math;-g
  MINSIZEREL --use_fast_math)

对于某些配置(即当 CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE 设置为 ON 时,VS 生成的具有对象文件),对于给定的 cuda 文件将不会生成任何生成的文件。这是因为当您将 cuda 文件添加到 Visual Studio 时,它知道此文件会生成一个对象文件,并且会自动链接生成的该对象文件。

此脚本还将生成一个单独的 cmake 脚本,该脚本在构建时用于调用 nvcc。这样做有几个原因

  • nvcc 可以返回负数作为返回值,这会让 Visual Studio 误以为命令成功。该脚本现在检查错误代码,并在出现问题时产生错误。

  • nvcc 之前一直存在不删除不完整结果的问题,当遇到问题时。这会导致构建系统误以为目标已生成,而实际上存在一个不可用的文件。该脚本现在在出现错误时会删除输出文件。

  • 通过将影响构建的所有选项都放在一个文件中,然后使构建规则依赖于该文件,当选项发生变化时,输出文件将重新生成。

此脚本还会查看可选参数 STATICSHAREDMODULE 来确定何时针对共享库进行目标对象编译。 BUILD_SHARED_LIBScuda_wrap_srcs() 中被忽略,但在 cuda_add_library() 中被尊重。在某些系统上,会为构建专用于共享库的对象添加特殊标志。当检测到共享库编译时,会定义一个预处理器宏 <target_name>_EXPORTS

使用 -D/D 传递到 add_definitions 的标志将传递给 nvcc。

结果变量

该脚本定义了以下变量

CUDA_VERSION_MAJOR

由 nvcc 报告的 cuda 的主版本号。

CUDA_VERSION_MINOR

次版本号。

CUDA_VERSIONCUDA_VERSION_STRING

完整版本,采用 X.Y 格式。

CUDA_HAS_FP16

Added in version 3.6: 是否支持短浮点数 (float16fp16)。

CUDA_TOOLKIT_ROOT_DIR

CUDA 工具包的路径(如果未设置,则定义)。

CUDA_SDK_ROOT_DIR

CUDA SDK 的路径。使用此路径查找 SDK 中的文件。此脚本不会直接支持查找特定的库或头文件,因为 NVIDIA 不支持这样做。如果您希望在路径发生变化时更改库,请参阅 FindCUDA.cmake 脚本以了解如何清除这些变量的示例。如果您选择这样做(自担风险),还有示例说明如何使用 CUDA_SDK_ROOT_DIR 查找头文件或库。

CUDA_INCLUDE_DIRS

cuda 头文件的包含目录。自动添加到 cuda_add_executable()cuda_add_library() 中。

CUDA_LIBRARIES

Cuda RT 库。

CUDA_CUFFT_LIBRARIES

Cuda FFT 实现的设备或仿真库(作为 cuda_add_cufft_to_target() 宏的替代方案)

CUDA_CUBLAS_LIBRARIES

Cuda BLAS 实现的设备或仿真库(作为 cuda_add_cublas_to_target() 宏的替代方案)。

CUDA_cudart_static_LIBRARY

静态可链接的 cuda 运行时库。仅适用于 CUDA 5.5 及更高版本。

CUDA_cudadevrt_LIBRARY

Added in version 3.7: 设备运行时库。可分离编译所需。

CUDA_cupti_LIBRARY

CUDA 性能分析工具接口库。仅适用于 CUDA 4.0 及更高版本。

CUDA_curand_LIBRARY

CUDA 随机数生成库。仅适用于 CUDA 3.2 及更高版本。

CUDA_cusolver_LIBRARY

Added in version 3.2: CUDA 直接求解器库。仅适用于 CUDA 7.0 及更高版本。

CUDA_cusparse_LIBRARY

CUDA 稀疏矩阵库。仅适用于 CUDA 3.2 及更高版本。

CUDA_npp_LIBRARY

NVIDIA 性能基元库。仅适用于 CUDA 4.0 及更高版本。

CUDA_nppc_LIBRARY

NVIDIA 性能基元库(核心)。仅适用于 CUDA 5.5 及更高版本。

CUDA_nppi_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 5.5 - 8.0。

CUDA_nppial_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppicc_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppicom_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0 - 10.2。已由 nvjpeg 替换。

CUDA_nppidei_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppif_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppig_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppim_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppist_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppisu_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_nppitc_LIBRARY

NVIDIA 性能基元库(图像处理)。仅适用于 CUDA 9.0。

CUDA_npps_LIBRARY

NVIDIA 性能基元库(信号处理)。仅适用于 CUDA 5.5 及更高版本。

CUDA_nvcuvenc_LIBRARY

CUDA 视频编码器库。仅适用于 CUDA 3.2 及更高版本。仅限 Windows。

CUDA_nvcuvid_LIBRARY

CUDA 视频解码器库。仅适用于 CUDA 3.2 及更高版本。仅限 Windows。

CUDA_nvToolsExt_LIBRARY

Added in version 3.16: NVIDA CUDA 工具扩展库。适用于 CUDA 5 及更高版本。

CUDA_OpenCL_LIBRARY

Added in version 3.16: NVIDA CUDA OpenCL 库。适用于 CUDA 5 及更高版本。