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>、REQUIRED 和 QUIET 的标准 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_EMULATION为TRUE时,为 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_FLAGS或CUDA_NVCC_FLAGS_<CONFIG>变量中已存在-ccbin或--compiler-bindir,则忽略此设置。对于 Visual Studio 目标,主机编译器将使用一个或多个 Visual Studio 宏构建,例如$(VCInstallDir),该宏在从 VS 内部运行命令时会展开为路径。版本 3.13 中已添加: 如果设置了
CUDAHOSTCXX环境变量,则将其用作默认值。CUDA_NVCC_FLAGS、CUDA_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_FORMAT3.3 版本中新增。
如果设置此源文件属性,则可以覆盖
cuda_wrap_srcs()(OBJ、PTX、CUBIN或FATBIN)中指定的格式。如果输入源文件不是.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_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 计算架构。Common和All:涵盖常用架构和整个架构子集。<name>:Fermi、Kepler、Maxwell、Kepler+Tegra、Kepler+Tesla、Maxwell+Tegra、Pascal中的一个。<ver>、<ver>(<ver>)、<ver>+PTX,其中<ver>是2.0、2.1、3.0、3.2、3.5、3.7、5.0、5.2、5.3、6.0、6.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 或可链接的对象(使用 PTX 或 OBJ 作为 <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 在遇到问题时不会删除不完整的结果。这会使构建系统误认为目标已生成,而实际上存在一个不可用的文件。该脚本现在会在出错时删除输出文件。
通过将所有影响构建的选项放入一个文件,然后使构建规则依赖于该文件,可以在选项更改时重新生成输出文件。
此脚本还查看可选参数 STATIC、SHARED 或 MODULE 来确定何时定位共享库的目标对象编译。BUILD_SHARED_LIBS 在 cuda_wrap_srcs() 中被忽略,但在 cuda_add_library() 中受到尊重。在某些系统上,会添加特殊标志来构建用于共享库的对象。当检测到共享库编译时,会定义一个预处理器宏 <target_name>_EXPORTS。
使用 -D 或 /D 通过 add_definitions 传入的标志会传递给 nvcc。
结果变量¶
该脚本定义了以下变量
CUDA_VERSION_MAJORnvcc 报告的 CUDA 的主版本。
CUDA_VERSION_MINOR次要版本。
CUDA_VERSION、CUDA_VERSION_STRING完整版本,格式为
X.Y。CUDA_HAS_FP16版本 3.6 中已添加: 是否支持短浮点数(
float16、fp16)。CUDA_TOOLKIT_ROOT_DIRCUDA 工具包的路径(如果未设置则定义)。
CUDA_SDK_ROOT_DIRCUDA SDK 的路径。使用此路径查找 SDK 中的文件。此脚本不直接支持查找特定库或头文件,因为 NVIDIA 不支持此功能。如果您想在路径更改时更改库,请参阅
FindCUDA.cmake脚本以获取清除这些变量的示例。如果您选择(自行承担风险)使用CUDA_SDK_ROOT_DIR来查找头文件或库,也有相关示例。CUDA_INCLUDE_DIRScuda 头文件的包含目录。会自动为
cuda_add_executable()和cuda_add_library()添加。CUDA_LIBRARIESCuda RT 库。
CUDA_CUFFT_LIBRARIESCuda FFT 实现的设备或仿真库(替代
cuda_add_cufft_to_target()宏)。CUDA_CUBLAS_LIBRARIESCuda BLAS 实现的设备或仿真库(替代
cuda_add_cublas_to_target()宏)。CUDA_cudart_static_LIBRARY可静态链接的 CUDA 运行时库。仅适用于 CUDA 版本 5.5+。
CUDA_cudadevrt_LIBRARY版本 3.7 中已添加: 设备运行时库。可分离编译所需。
CUDA_cupti_LIBRARYCUDA Profiling Tools Interface 库。仅适用于 CUDA 版本 4.0+。
CUDA_curand_LIBRARYCUDA 随机数生成库。仅适用于 CUDA 版本 3.2+。
CUDA_cusolver_LIBRARY版本 3.2 中已添加: CUDA Direct Solver 库。仅适用于 CUDA 版本 7.0+。
CUDA_cusparse_LIBRARYCUDA 稀疏矩阵库。仅适用于 CUDA 版本 3.2+。
CUDA_npp_LIBRARYNVIDIA Performance Primitives 库。仅适用于 CUDA 版本 4.0+。
CUDA_nppc_LIBRARYNVIDIA Performance Primitives 库(核心)。仅适用于 CUDA 版本 5.5+。
CUDA_nppi_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 5.5 - 8.0。
CUDA_nppial_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppicc_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppicom_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0 - 10.2。已被 nvjpeg 取代。
CUDA_nppidei_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppif_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppig_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppim_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppist_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppisu_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_nppitc_LIBRARYNVIDIA Performance Primitives 库(图像处理)。仅适用于 CUDA 版本 9.0。
CUDA_npps_LIBRARYNVIDIA Performance Primitives 库(信号处理)。仅适用于 CUDA 版本 5.5+。
CUDA_nvcuvenc_LIBRARYCUDA 视频编码器库。仅适用于 CUDA 版本 3.2+。仅限 Windows。
CUDA_nvcuvid_LIBRARYCUDA 视频解码器库。仅适用于 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+。