GPU、CUDA 和 cuDNN 学习研究【笔记】
分享自己在入门显存优化时看过的一些关于 GPU 和 CUDA 和 cuDNN 的网络资料。
更多内容见:
- Ubuntu 22.04 LTS 安装 PyTorch + CUDA 深度学习环境-CSDN博客
- CUDA 计算平台 & CUDA 兼容性【笔记】-CSDN博客
文章目录
- GPU
- CUDA
- CUDA Toolkit都包含什么?
- NVIDIA Docker CUDA容器化原理分析
- 什么是CUDA Runtime,cudart,和CUDA Driver
- CUDA 版本兼容性
- CUDA 内存管理 API
- CUDA Stream: Asynchronous & Synchronize
- cuDNN
GPU
以下内容来自 B 站视频:《解密GPU - 探寻计算机中的"神笔马良"》,原视频已下架
按照产品的应用场景可以划分为三大系列:消费级系列、专业级系列、数据中心级。RTX 代表具备光线追踪能力,GTX 是不具备光追功能里最好的。4080是具体的型号,40表示的是第几代,80表示同一代里的不同档次。标注为黄色的微架构仅用于显示卡,蓝色的仅用于计算卡,红色的则是二者兼具,绿色的则是从2014年开始推出的嵌入式平台(一般用于移动设备或边缘计算设备)。
带有global前缀的函数被称为核函数,是CPU或称host向GPU或称device发送的执行逻辑。用三个<号和>号包裹起来的部分是host对发送到device上整个任务的一个维度切分操作。
整个任务被称为grid,逗号前后代表的是两个大的分割维度,前面是要把一个grid切分成多少个block,后面则是把一个block切分为多少个thread。这里的thread可以等价理解为task要执行的任务,也就是上面这个核函数里面的具体逻辑。
从代码逻辑角度来看,用户写的CUDA程序会被映射为grid,grid再切分为block,block再切分为thread。切分好之后的任务包被发送到GPU上,最终每个block会被分配到一个指定的SM上。block的整个执行逻辑都会固定在某一个SM上。
以下内容来自:Nvidia GPU虚拟化 - 知乎
在深度学习领域,Nvidia GPU的软件调用栈大致如下图所示,从上至下分别为:
- User APP:业务层,如训练或推理任务等
- Framework:框架层,如tensorflow、pytorch、paddle、megengine等
- CUDA Runtime:CUDA Runtime及周边生态库,如cudart、cublas、cudnn、cufft、cusparse等
- CUDA User Driver:用户态CUDA Driver,如cuda、nvml等
- CUDA Kernel Driver:内核态CUDA Driver,参考官方开源代码,如nvidia.ko等
- Nvidia GPU HW:GPU硬件
![](https://i-blog.csdnimg.cn/direct/d0b67644d6534717b5ea6b12a3dcaaaa.png)
CUDA
根据 CUDA 专区 - 资源库 | NVIDIA 开发者 的介绍:在 GPU 加速应用程序中,工作负载的顺序部分在 CPU 上运行,而应用程序的计算密集型部分则在数千个 GPU 核心上并行运行。CUDA 是 NVIDIA 开发的一个并行计算平台和编程模型,用于在图形处理单元 (GPU) 上进行通用计算。借助 CUDA,开发者能够利用 GPU 的强大功能显著加快计算应用程序的运行速度。
CUDA Toolkit都包含什么?
以下内容来自:CUDA相关 | CUDA Toolkit都包含什么? - 知乎
见上图第四个方块,CUDA分为两部分,CUDA Toolkit和CUDA Driver。其中,CUDA Toolkit是一个全面的工具集,提供了一系列工具和库,包括GPU加速的库、编译器、开发工具和CUDA Runtime,用于开发、优化和部署GPU加速的应用程序。
- CUDA Runtime (cudart) Libraries:用于支持GPU上的并行计算的运行时库,包括CUDA API。
- CUDA NVCC:NVIDIA CUDA编译器,用于将CUDA源代码编译为GPU可执行文件。
- CUDA加速的库:
- CUDA cuBLAS:用于执行基本线性代数子程序(BLAS),加速矩阵和向量运算。
- CUDA cuFFT:用于执行快速傅立叶变换,加速信号和频谱分析。
- ……
- CUDA 开发工具(Development Tools):
- CUDA nvprof:用于性能分析的工具,帮助开发人员优化CUDA应用程序。
- Nsight Compute:用于性能分析和调试CUDA应用程序的工具。
- Nsight Systems:用于系统性能分析的工具,支持多个操作系统。
- NVIDIA Drivers:
- NVIDIA Linux Driver:NVIDIA的Linux驱动程序,用于支持NVIDIA GPU的运行,支持多个体系结构。
- NVIDIA Windows Driver:NVIDIA的Windows驱动程序,用于支持NVIDIA GPU的运行,支持Windows和WSL。
为了方便用户,NVIDIA驱动程序通常会随CUDA Toolkit一起安装。但是,这个驱动程序是为了开发目的而安装的。这意味着它主要用于开发和调试CUDA应用程序,以帮助开发人员在其工作站上进行开发和测试。这个驱动程序不建议在生产环境中与Tesla GPU一起使用。在生产环境中,通常需要专门的、经过验证的驱动程序以确保系统的稳定性和性能。用户在安装CUDA Toolkit时,具体取决于操作系统和安装方式,可以选择是否安装NVIDIA驱动程序。
NVIDIA Docker CUDA容器化原理分析
以下内容来自:NVIDIA Docker CUDA容器化原理分析-腾讯云开发者社区-腾讯云
CUDA API体系包括:CUDA函数库(CUDA Libraries),CUDA运行时API(CUDA Runtime API),CUDA驱动API(CUDA Driver API),结构图如下
CUDA Driver API:GPU设备的抽象层,通过提供一系列接口来操作GPU设备,性能最好,但编程难度高,一般不会使用该方式开发应用程序。
CUDA Runtime API:对CUDA Driver API进行了一定的封装,调用该类API可简化编程过程,降低开发难度;
CUDA Libraries:是对CUDA Runtime API更高一层的封装,通常是一些成熟的高效函数库,开发者也可以自己封装一些函数库便于使用;
应用程序可调用CUDA Libraries或者CUDA Runtime API来实现功能,当调用CUDA Libraries时,CUDA Libraries会调用相应的CUDA Runtime API,CUDA Runtime API再调用CUDA Driver API,CUDA Driver API再操作GPU设备。
什么是CUDA Runtime,cudart,和CUDA Driver
以下内容来自:CUDA相关 | 什么是CUDA Runtime,cudart,和CUDA Driver - 知乎
- CUDA Driver 类似于搬砖工人;
- CUDA Runtime 类似于分发任务的包工头;
- CUDA Library 类似于建筑设计师。
在CUDA生态里,最底层的是CUDA Driver,直接负责访问GPU硬件。
CUDA Runtime是一个库。它建立在CUDA driver API之上,包含了与CUDA Driver交互的函数和工具,帮助程序员管理设备内存、调度并行任务和进行数据传输等操作。更具体来说,它包括一组函数和工具,用于管理GPU设备、分配内存、执行核函数(Kernel Functions,即在GPU上并行执行的函数),以及在主机(CPU)和设备(GPU)之间进行数据传输。
cudart就是 CUDA Runtime的实现,rt就是Runtime的缩写。
CUDA Runtime被实现在cudart库中,cudart库用于与应用程序链接。因此报错与cudart.so相关时,可以考虑是不是编译cuda程序时的cuda runtime库与运行cuda程序时的cuda runtime库版本不一致,导致动态链接出问题。详见CUDA相关 | libcudart.so是什么(静态链接与动态链接)。
CUDA Driver和CUDA Runtime都有各自的API接口,为上层的软件提供调用接口。
对于许多应用来说,使用CUDA Runtime已经足够了,并不需要使用CUDA driver API。CUDA driver API提供了更底层的控制,可以直接暴露一些较低级别的概念,比如CUDA上下文(contexts)和CUDA模块(modules)。
而其他一些库在运行时需要调用CUDA Runtime库。CUDA Runtime是一个库!和numpy类似,就是一个库,只不过提供的功能比较复杂高级!它提供了一些可以控制GPU的功能,所以其他要使用GPU的库要调用它。(虽然说CUDA Runtime这些功能最后又是通过调用CUDA driver API实现的。)
CUDA 版本兼容性
以下内容来自:CUDA相关 | 版本兼容性 - 知乎
运行CUDA应用程序需要满足一些硬件和软件要求。
- 首先,系统必须拥有支持CUDA的NVIDIA GPU,因为CUDA是GPU加速计算的技术。
- 此外,系统必须安装与构建应用程序时使用的CUDA Toolkit兼容的NVIDIA显示驱动程序。不同版本的CUDA Toolkit可能需要不同版本的NVIDIA驱动程序,以确保应用程序能够正常运行。
- 对于一些CUDA应用程序,它们可能依赖于外部库,这些库需要在运行时与应用程序进行动态链接。如果应用程序使用这些外部库,系统必须安装与应用程序要求的库版本兼容的库文件。
CUDA driver API 的向后兼容:CUDA driver API是用于管理GPU、编译和执行GPU代码的一组函数和工具。随着版本升级,CUDA驱动API可能修复错误或提供改进的性能。即,驱动API是向后兼容的。使用1.0版的驱动API编译的程序在2.0版的GPU设备驱动上可以运行。如图:
![](https://i-blog.csdnimg.cn/direct/1fba3ed9351045a7adfa744a3401e75c.png)
CUDA Runtime版本一致性:如果应用程序使用了插件和库,这些插件和库必须使用相同版本的CUDA Runtime,除非它们通过静态链接到Runtime。需要注意的是,如果使用nvcc链接应用程序,静态版本的CUDA Runtime库将默认使用,并且CUDA Toolkit库都是静态链接到CUDA Runtime的。
CUDA 内存管理 API
不做重点研究,相关内容可参考:
- CUDA Runtime API :: CUDA Toolkit Documentation
- NVIDIA CUDA Library: Memory Management
- CUDA GPU编程指南:内存的申请,释放与拷贝 - 半个C++程序员-大脸猫
- CUDA编程入门之处理Device显存的三个CUDA API-CSDN博客
CUDA Stream: Asynchronous & Synchronize
不做重点研究,相关内容可参考:
- 如何在 CUDA C/C++ 中实现数据传输的重叠 - NVIDIA 技术博客
- CUDA ---- Stream and Event - 苹果妖 - 博客园
- CUDA随笔之Stream的使用 - 知乎
- cuda基础之异步启动 - 知乎
cuDNN
以下内容来自:CUDA系列 | 什么是cuDNN? - 知乎
cuDNN全称NVIDIA CUDA® Deep Neural Network library, 是一个用于深度神经网络的GPU加速库。
cuDNN包含了为神经网络中常见的计算任务提供高度优化的实现。包括前向卷积、反向卷积、注意力机制、矩阵乘法(matmul)、池化(pooling)和归一化(normalization)等。
cuDNN的最常见用途是在深度学习框架(如TensorFlow或PyTorch)的开发中。深度学习框架开发者在编写框架时,通常会调用cuDNN,从而几乎不直接与CUDA进行交互。
直接使用CUDA的情况只在以下两种情况下出现:
- 实现自定义层(custom layer):如果需要创建一个深度学习模型中的自定义层,该层的计算不是标准的深度学习操作,那么你可能需要直接使用CUDA编写这些自定义操作。
- 为了提高计算效率,合并多个层:在某些情况下,你可能希望将多个标准层合并为一个更大的操作,以提高计算效率。这可能需要直接使用CUDA来执行这些合并操作。
对于普通深度学习应用的终端用户来说,通常不需要使用cuDNN。
CUDA Toolkit不包含cuDNN:
- CUDA Toolkit是一个更底层的工具包,其中的库针对的是更基础的操作,比如线性代数(cuBLAS: 加速矩阵和向量运算)、信号分析(cuFFT: 用于执行快速傅立叶变换)。
- cuDNN是专门为深度学习的各种运算所设计的库。它需要使用CUDA Toolkit中的一些库。
上图出自:Types oNVIDIA GPU Architectures For Deep Learning