CUDA GPU编程指南:使用CMake配置开发环境

2023年7月24日 6213点热度 1人点赞 0条评论

准备工作

​ 在使用CUDA前,应该在电脑上安装如下工具

  1. CUDA Toolkit 英伟达为CUDA提供的工具包,下载地址:https://developer.nvidia.com/cuda-toolkit
  2. CMake 版本在3.11以上。
  3. 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相关的变量

添加源代码

​ 和正常往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})

大脸猫

这个人虽然很勤快,但什么也没有留下!

文章评论