准备工作
在使用CUDA前,应该在电脑上安装如下工具
- CUDA Toolkit 英伟达为CUDA提供的工具包,下载地址:https://developer.nvidia.com/cuda-toolkit。
- CMake 版本在3.11以上。
- C/C++编译器,如果是在Windows系统上,推荐使用visual studio 20xx。
添加CUDA环境
有两种方法可以添加CUDA的支持,如果工程默认使用CUDA,那么可以使用这条命令:
project(CUDA_PROJECT LANGUAGES CUDA CXX)
如果你希望CUDA时可选的,那么使用这条命令:
enable_language(CUDA)
可以将它放到条件语句后面,如果满足条件则启用对CUDA的支持。
检查是否成功启用了CUDA命令
include(CheckLanguage) check_language(CUDA) if(CMAKE_CUDA_COMPILER) message(STATUS "Find CUDA !") else() message(FATAL_ERROR "Not found CUDA!") endif()
通过判断CMAKE_CUDA_COMPILER变量的值来确定是否成功的启动了CUDA库,注意这个变量是在CMake 3.11 之后加入的。
也可以通过CMAKE_CUDA_COMPILER_VERSION 变量来判断CUDA的版本号。
CUDA相关的变量
-
CMAKE_CUDA_ARCHITECTURES 指定为特定的显卡架构生成代码
-
CMAKE_CUDA_COMPILE_FEATURES CUDA编译器包含的组件列表
添加源代码
和正常往C/C++工程中添加.cpp .h 文件一样,只不过文件格式是.cu。
add_executable(CMake_CUDA_Test test.cu CUDA_SEPARABLE_COMPILATION ON)
CUDA_SEPARABLE_COMPILATION参数用于判断是否开启分离编译,即是否可以将函数声明于函数实现放在不同的.cu文件之中,默认情况下是不支持这样编译的。
不推荐使用分离式编译,因为声明与实现分离之后会部分程度的阻碍编译器对代码的优化。
根据不同的硬件架构,生成不同的代码
经过长时间的迭代,英伟达家的显卡架构一直在变化,根据每个架构的特性,CUDA Toolkit希望会生成不同的针对性优化的代码,所以在CMake中需要设置代码所支持的硬件架构。
set(CMAKE_CUDA_ARCHITECTURES 75)
使用这个变量可以设置生成代码时需要支持的硬件架构,可以同时支持多个架构的显卡。
set(CMAKE_CUDA_ARCHITECTURES 75;86)
支持多个价格的显卡意味着要生成多分代码,所以在开发时建议针对硬件平台设置,否则会大大的影响编译的时间。
以下是部分版本号对应的显卡:
- 版本52:Quadro M6000 , GeForce 900, GTX-970, GTX-980, GTX Titan X
- 版本53:Tegra (Jetson) TX1 / Tegra X1, Drive CX, Drive PX, Jetson Nano
- 版本60:Quadro GP100, Tesla P100, DGX-1 (Generic Pascal)
- 版本61:GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030 (GP108), GT 1010 (GP108) Titan Xp, Tesla P40, Tesla P4, Discrete GPU on the NVIDIA Drive PX2
- 版本62:Integrated GPU on the NVIDIA Drive PX2, Tegra (Jetson) TX2
- 版本70:DGX-1 with Volta, Tesla V100, GTX 1180 (GV104), Titan V, Quadro GV100
- 版本72:Jetson AGX Xavier, Drive AGX Pegasus, Xavier NX
- 版本75:GTX/RTX Turing – GTX 1660 Ti, RTX 2060, RTX 2070, RTX 2080, Titan RTX, Quadro RTX 4000, Quadro RTX 5000, Quadro RTX 6000, Quadro RTX 8000, Quadro T1000/T2000, Tesla T4
- 版本80:NVIDIA A100 (the name “Tesla” has been dropped – GA100), NVIDIA DGX-A100
- 版本86:Tesla GA10x cards, RTX Ampere – RTX 3080, GA102 – RTX 3090, RTX A2000, A3000, A4000, A5000, A6000, NVIDIA A40, GA106 – RTX 3060, GA104 – RTX 3070, GA107 – RTX 3050, Quadro A10, Quadro A16, Quadro A40, A2 Tensor Core GPU
有部分比较新的显卡或者比较老的显卡型号的版本号没有标注出来,如果在这里没有找到你的硬件设备,可以到CUDA Toolkit网站上查阅相关文档。
完整的代码
cmake_minimum_required(VERSION 3.11) #添加对CUDA支持 project(CMake_CUDA_Test LANGUAGES CUDA CXX) #或者使用这个语句添加 #enable_language(CUDA) #检查是否成功找到CUDA include(CheckLanguage) check_language(CUDA) if(CMAKE_CUDA_COMPILER) message(STATUS "Find CUDA !") else() message(FATAL_ERROR "Not found CUDA!") endif() set(src main.cpp test.cu) set(CMAKE_CUDA_ARCHITECTURES 86) add_executable(CMake_CUDA_Test ${src})
文章评论