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 支持。

此脚本使用 <VERSION>REQUIREDQUIET 的标准 find_package() 参数。CUDA_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 文件添加到多个目标,请设置为 OFF

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

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

CUDA_NVCC_FLAGSCUDA_NVCC_FLAGS_<CONFIG>

额外的 NVCC 命令行参数。注意:多个参数必须用分号分隔(例如,--compiler-options;-Wall)。

版本 3.6 中已添加: 这些变量的内容可以使用 生成器表达式

CUDA_PROPAGATE_HOST_FLAGS(默认:ON

设置为 ON 可通过 nvcc 的 -Xcompiler 标志自动将 CMAKE_{C,CXX}_FLAGS 及其特定于配置的对应项(例如 CMAKE_C_FLAGS_DEBUG)传播给主机编译器。这有助于使生成的宿主代码更好地匹配系统的其余部分。有时某些标志会导致 nvcc 出错,这有助于您关闭标志传播。这不会影响通过 CUDA_NVCC_FLAGS 或通过 cuda_add_library()cuda_add_executable()cuda_wrap_srcs() 指定的 OPTION 标志直接传递给 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_LIBRARIES 中使用 CUDA 运行时库的静态版本。如果配置的 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()

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

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_OBJECTSoutput_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 中的一个。

<out_variable> 中返回要添加到 CUDA_NVCC_FLAGS 的标志列表。此外,将 <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

版本 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

版本 3.7 中已添加: 设备运行时库。可分离编译所需。

CUDA_cupti_LIBRARY

CUDA Profiling Tools Interface 库。仅适用于 CUDA 版本 4.0+。

CUDA_curand_LIBRARY

CUDA 随机数生成库。仅适用于 CUDA 版本 3.2+。

CUDA_cusolver_LIBRARY

版本 3.2 中已添加: CUDA Direct Solver 库。仅适用于 CUDA 版本 7.0+。

CUDA_cusparse_LIBRARY

CUDA 稀疏矩阵库。仅适用于 CUDA 版本 3.2+。

CUDA_npp_LIBRARY

NVIDIA Performance Primitives 库。仅适用于 CUDA 版本 4.0+。

CUDA_nppc_LIBRARY

NVIDIA Performance Primitives 库(核心)。仅适用于 CUDA 版本 5.5+。

CUDA_nppi_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 5.5 - 8.0。

CUDA_nppial_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppicc_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppicom_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0 - 10.2。已被 nvjpeg 取代。

CUDA_nppidei_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppif_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppig_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppim_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppist_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppisu_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_nppitc_LIBRARY

NVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。

CUDA_npps_LIBRARY

NVIDIA Performance Primitives 库(信号处理)。仅适用于 CUDA 版本 5.5+。

CUDA_nvcuvenc_LIBRARY

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

CUDA_nvcuvid_LIBRARY

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

CUDA_nvToolsExt_LIBRARY

版本 3.16 中已添加: NVIDA CUDA Tools Extension 库。适用于 CUDA 版本 5+。

CUDA_OpenCL_LIBRARY

版本 3.16 中已添加: NVIDA CUDA OpenCL 库。适用于 CUDA 版本 5+。