当前位置: 首页 > article >正文

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硬件

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 APIGPU设备的抽象层,通过提供一系列接口来操作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 Runtime与CUDA Driver\CUDA Driver API的关系

  • 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设备驱动上可以运行。如图:

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的情况只在以下两种情况下出现:

  1. 实现自定义层(custom layer):如果需要创建一个深度学习模型中的自定义层,该层的计算不是标准的深度学习操作,那么你可能需要直接使用CUDA编写这些自定义操作。
  2. 为了提高计算效率,合并多个层:在某些情况下,你可能希望将多个标准层合并为一个更大的操作,以提高计算效率。这可能需要直接使用CUDA来执行这些合并操作。

对于普通深度学习应用的终端用户来说,通常不需要使用cuDNN。

CUDA Toolkit不包含cuDNN

  • CUDA Toolkit是一个更底层的工具包,其中的库针对的是更基础的操作,比如线性代数(cuBLAS: 加速矩阵和向量运算)、信号分析(cuFFT: 用于执行快速傅立叶变换)。
  • cuDNN是专门为深度学习的各种运算所设计的库。它需要使用CUDA Toolkit中的一些库

在这里插入图片描述

上图出自:Types oNVIDIA GPU Architectures For Deep Learning


http://www.kler.cn/a/538992.html

相关文章:

  • PWM波形输出
  • Level DB --- Iterator
  • DeepSeek-R1 32B Windows+docker本地部署
  • 数据结构:单链表
  • 高并发读多写少场景下的高效键查询与顺序统计的方案思路
  • 算法篇——动态规划
  • iOS 自动翻滚广告条(榜单条)实现方案
  • CF998A Balloons​ 构造 ​
  • 牛客寒假集训营1
  • 基于Java的远程视频会议系统(源码+系统+论文)
  • 数据库如何清空重置索引,MySQL PostgreSQL SQLite SQL Server
  • ToDesk云电脑将终结显卡溢价,Web端浏览器、安卓、IOS免费试用
  • 【C++学习篇】C++11
  • Mac电脑修改hosts文件内容
  • 高效知识管理与分类优化指南:从目录设计到实践应用
  • SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现
  • 力扣-字符串-28 找出字符串中第一个匹配项的下标
  • PyTorch Profiler 的使用
  • 2024年个人总结:求变
  • 自动化测试工具:selenium
  • mysql8 用C++源码角度看客户端发起sql网络请求,并处理sql命令
  • Spring Boot整合DeepSeek实现AI对话
  • TensorFlow 示例平方米转亩(二)
  • e2studio开发RA4M2(11)----AGT定时器频率与占空比的设置
  • Vue(7)
  • 单元测试的入门实践与应用