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>
、REQUIRED
和 QUIET
。CUDA_FOUND
将报告是否找到了可接受的 CUDA 版本。
如果无法通过系统路径中 nvcc 的位置确定前缀,并且为 find_package()
指定了 REQUIRED
,则脚本将提示用户指定 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_EMULATION
为TRUE
时,为 CUDA C 文件定义-D_DEVICEEMU
。CUDA_LINK_LIBRARIES_KEYWORD
(默认值:""
)在 3.9 版本中添加。
用于内部
target_link_libraries()
调用的<PRIVATE|PUBLIC|INTERFACE>
关键字。默认值是不使用关键字,它使用target_link_libraries()
的旧“plain”形式。请注意,这很重要,因为在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 版本中添加: 这些变量的内容可以使用
生成器表达式
。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()
指定的格式(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 目标调用可以在调用此宏后在目标上使用(例如 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
之一。
返回要添加到 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 或可链接对象(使用 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_MAJOR
nvcc 报告的 cuda 主版本。
CUDA_VERSION_MINOR
次版本。
CUDA_VERSION
,CUDA_VERSION_STRING
以
X.Y
格式表示的完整版本。CUDA_HAS_FP16
在 3.6 版本中添加: 是否支持短浮点数 (
float16
,fp16
)。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 分析工具接口库。仅适用于 CUDA 4.0+ 版本。
CUDA_curand_LIBRARY
CUDA 随机数生成库。仅适用于 CUDA 3.2+ 版本。
CUDA_cusolver_LIBRARY
在 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
3.16 版本新增: NVIDIA CUDA 工具扩展库。适用于 CUDA 5+ 版本。
CUDA_OpenCL_LIBRARY
3.16 版本新增: NVIDIA CUDA OpenCL 库。适用于 CUDA 5+ 版本。