查找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>``、REQUIRED 和``QUIET``。 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 文件添加到多个目标,请关闭。
这允许用户从 CUDA 文件构建目标;但是,如果将 CUDA 源文件添加到多个目标,可能会发生不好的事情。执行并行构建时,自定义构建命令可能会并行运行多次并导致神秘的构建错误。 VS 为目标中的每个源文件运行规则,一个源无论添加到多少个项目都只能有一个规则。当规则从多个目标运行时,竞争条件可能会出现在生成的文件上。最终一切都会构建起来,但如果用户没有意识到这种行为,可能会造成混淆。如果此脚本能够检测跨多个目标的源文件重用并为用户关闭该选项,那就太好了,但是找不到好的解决方案。
CUDA_BUILD_CUBIN``(默认值:``OFF)设置为
ON以在设备模式下使用-cubin选项启用和额外的编译传递。解析和注册输出,在构建期间打印共享内存使用情况。CUDA_BUILD_EMULATION``(默认:设备模式为``OFF)为仿真模式设置为“开”。当 CUDA_BUILD_EMULATION 为 TRUE 时,-D_DEVICEEMU 是为 CUDA C 文件定义的。
CUDA_LINK_LIBRARIES_KEYWORD``(默认值:""``)在 3.9 版本加入.
<PRIVATE|PUBLIC|INTERFACE>关键字用于内部target_link_libraries()调用。默认是不使用使用旧的“普通”形式的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)为主机代码的 C 编译设置为
OFF。CUDA_HOST_COMPILER``(默认值:``CMAKE_C_COMPILER)设置 nvcc 使用的主机编译器。如果
-ccbin或--compiler-bindir已经存在于CUDA_NVCC_FLAGS或CUDA_NVCC_FLAGS_<CONFIG>变量中,则忽略。对于 Visual Studio 目标,主机编译器由一个或多个 visual studio 宏构建,例如$(VCInstallDir),当从 VS 中运行命令时,它会扩展到路径。在 3.13 版本加入: 如果设置了 CUDAHOSTCXX 环境变量,它将被用作默认值。
CUDA_NVCC_FLAGS,CUDA_NVCC_FLAGS_<CONFIG>其他 NVCC 命令行参数。注意:多个参数必须以分号分隔(例如``--compiler-options;-Wall``)
在 3.6 版本加入: 这些变量的内容可以使用
generator expressions。CUDA_PROPAGATE_HOST_FLAGS``(默认值:``ON)设置为
ON以通过 nvcc 的 `` 将CMAKE_{C,CXX}_FLAGS及其依赖于配置的对应项(例如CMAKE_C_FLAGS_DEBUG)自动传播到主机编译器-Xcompiler`` 标志。这有助于使生成的主机代码更好地匹配系统的其余部分。有时某些标志会给 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()的格式(OBJ、PTX、CUBIN或FATBIN)。如果输入源文件不是 .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 目标调用(例如:command:set_target_properties 和:command: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 计算架构。Common和All:涵盖架构的通用和整个子集。<name>:Fermi,Kepler,Maxwell,Kepler+Tegra,Kepler+Tesla,Maxwell+Tegra` 之一`,``帕斯卡。<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)
对于某些配置(即 VS 生成目标文件并将 CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE 设置为 ON),不会为给定的 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_STRINGX.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_DIRS包含 cuda 标头的目录。为
cuda_add_executable()和cuda_add_library()自动添加。CUDA_LIBRARIESCuda 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_LIBRARYCUDA 分析工具接口库。仅适用于 CUDA 版本 4.0+。
CUDA_curand_LIBRARYCUDA 随机数生成库。仅适用于 CUDA 版本 3.2+。
CUDA_cusolver_LIBRARY在 3.2 版本加入: CUDA 直接求解器库。仅适用于 CUDA 版本 7.0+。
CUDA_cusparse_LIBRARYCUDA 稀疏矩阵库。仅适用于 CUDA 版本 3.2+。
CUDA_npp_LIBRARYNVIDIA 性能基元库。仅适用于 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+。仅限窗户。
CUDA_nvcuvid_LIBRARYCUDA 视频解码器库。仅适用于 CUDA 版本 3.2+。仅限窗户。
CUDA_nvToolsExt_LIBRARY在 3.16 版本加入: NVIDIA CUDA 工具扩展库。适用于 CUDA 版本 5+。
CUDA_OpenCL_LIBRARY在 3.16 版本加入: NVIDIA CUDA OpenCL 库。适用于 CUDA 版本 5+。