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

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
相关文章:

GPU、CUDA 和 cuDNN 学习研究【笔记】
分享自己在入门显存优化时看过的一些关于 GPU 和 CUDA 和 cuDNN 的网络资料。 更多内容见: Ubuntu 22.04 LTS 安装 PyTorch CUDA 深度学习环境-CSDN博客CUDA 计算平台 & CUDA 兼容性【笔记】-CSDN博客 文章目录 GPUCUDACUDA Toolkit都包含什么?NVID…...

【5】阿里面试题整理
[1]. 介绍一下ZooKeeper ZooKeeper是一个开源的分布式协调服务,核心功能是通过树形数据模型(ZNode)和Watch机制,解决分布式系统的一致性问题。 它使用ZAB协议保障数据一致性,典型场景包括分布式锁、配置管理和服务注…...

计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

Wpf美化按钮,输入框,下拉框,dataGrid
Wpf美化按钮,输入框,下拉框,dataGrid 引用代码后 引用资源 <ControlTemplate x:Key"CustomProgressBarTemplate" TargetType"ProgressBar"><Grid><Border x:Name"PART_Track" CornerRadius&q…...

搜索插入位置:二分查找的巧妙应用
问题描述 给定一个已排序的整数数组 nums 和一个目标值 target,要求在数组中找到目标值并返回其索引。如果目标值不存在于数组中,则返回它按顺序插入的位置。必须使用时间复杂度为 O(log n) 的算法。 示例: 示例1: 输入: nums …...

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡
Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡 实战操作 去除权限 要在 Cocos2d-x 开发的游戏中去掉 APK 自带权限,可以按照以下步骤操作: 编辑 AndroidMa…...

自动化xpath定位元素(附几款浏览器xpath插件)
在 Web 自动化测试、数据采集、前端调试中,XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大,但面对复杂 DOM 结构时,XPath 仍然更具灵活性。因此,掌握 XPath,不仅能提高自动化测试的稳定性,还能在爬…...

String类(6)
大家好,今天我们继续来学习一下String类的查找方法,主要是反向查找的一些方法。 ⭐️从后往前找一样的道理,如果找到了就返回对应字符的下标. 如果后面有对应的字符,则会返回第一个遇到的字符下标. ⭐️注意一下传入字符串的找法…...

动态表格html
题目: 要求: 1.表格由专业班级学号1-10号同学的信息组成,包括:学号、姓 名、性别、二级学院、班级、专业、辅导员; 2.表格的奇数行字体为黑色,底色为白色;偶数行字体为白色,底 色为黑…...

ZU47DR 100G光纤 高性能板卡
简介 2347DR是一款最大可提供8路ADC接收和8路DAC发射通道的高性能板卡。板卡选用高性价比的Xilinx的Zynq UltraScale RFSoC系列中XCZU47DR-FFVE1156作为处理芯片(管脚可以兼容XCZU48DR-FFVE1156,主要差别在有无FEC(信道纠错编解码࿰…...

mysql8.0使用pxc实现高可用
环境准备 准备三台虚拟机,其对应的主机名和IP地址为 pxc-1192.168.190.129pxc-2192.168.190.133pxc-3192.168.190.134 解析,都要做解析 测试 下载pxc的安装包, 官网:https://www.percona.com/downloads 选择8.0的版本并下载,…...

Kotlin 使用 Chrome 无头浏览器
1. 概念 无头浏览器在类似于流行网络浏览器的环境中提供对网页的自动控制,但是通过命令行界面或使用网络通信来执行。 它们对于测试网页特别有用,因为它们能够像浏览器一样呈现和理解超文本标记语言,包括页面布局、颜色、字体选择以及JavaSc…...

Arbess基础教程-创建流水线
Arbess(谐音阿尔卑斯) 是一款开源免费的 CI/CD 工具,本文将介绍如何使用 Arbess 配置你的第一条流水线,以快速入门上手。 1. 创建流水线 根据不同需求来创建不同的流水线。 1.1 配置基本信息 配置流水线的基本信息,如分组,环境&…...

vscode安装ESP-IDF
引言 ESP-IDF(Espressif IoT Development Framework)是乐鑫官方为其 ESP32、ESP32-S 系列等芯片提供的物联网开发框架。结合 Visual Studio Code(VSCode)这一强大的开源代码编辑器,能极大提升开发效率。本教程将详细介…...
第31周:文献阅读
目录 摘要 Abstract 文献阅读 问题引入 研究背景 研究动机 创新点 动态预训练方法(DynPT) 深度循环神经网络(DRNN) 传感器选择 方法论 时间序列的动态预训练 异构传感器数据的DRNN 基于稀疏度的传感器过滤 实验研…...

GenAI + 电商:从单张图片生成可动态模拟的3D服装
在当今数字化时代,电子商务和虚拟现实技术的结合正在改变人们的购物体验。特别是在服装行业,消费者越来越期待能够通过虚拟试衣来预览衣服的效果,而无需实际穿戴。Dress-1-to-3 技术框架正是为此而生,它利用生成式AI模型(GenAI)和物理模拟技术,将一张普通的穿衣照片转化…...

进程(1)
1.什么是进程 要回答这个问题首先我们要解答什么是程序的问题。什么是程序呢?程序本质是就是存放在磁盘上的文件。我们要运行程序,首先必须要将其加载到内存中,这样才能与cpu交互,这是冯诺依曼体系架构所决定的。 程序运行起来后…...

ChatGPT搜索免费开放:AI搜索引擎挑战谷歌霸主地位全面分析
引言 2025年2月6日,OpenAI宣布ChatGPT搜索功能向所有用户免费开放,且无需注册登录。这一重大举措在搜索引擎行业引发巨大反响,有观点认为"谷歌搜索时代即将结束"。本文将深入分析ChatGPT生成式AI搜索对谷歌搜索业务及全球搜索市场…...

hadoop之MapReduce:片和块
假如我现在500M这样的数据,如何存储? 500M 128M 128M 128M 116M 分为四个块进行存储。 计算的时候,是按照片儿计算的,而不是块儿。 块是物理概念,一个块就是128M ,妥妥的,毋庸置疑。 片是逻辑概念&…...

GitPuk快速安装配置教程(入门级)
GitPuk是一款国产开源免费的代码管理工具,工具简洁易用,开源免费,本文将讲解如何快速安装和配置GitPuk,以快速入门上手。 1、安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Linux安装 以下以Centos7安装…...

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
题目:在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值,如此往…...

深入浅出Java数组:从基础到高阶应用
目录 引言 一、数组概述 1.什么是数组? 2.数组的分类? 3.Java数组存储元素的特点? 4.数组优点? 5.数组缺点? 二、一维数组 1. 静态初始化一维数组 2.增强 for 循环(for-each 循环) 3…...

基于 Nginx 的 CDN 基础实现
概览 本文是对基于Nginx的CDN网络的学习笔记,阅读的代码为:https://github.com/leandromoreira/cdn-up-and-running 其中,先确定CDN中的一些基础概念: Balancer:负载均衡,即请求数据的流量最开始打到Bal…...

讲人话的理解ai学习原理
通过把各种东西打上分数标签存起来。ai不花算力是不可能的,需要巨大的算力,需要要大量gpu芯片,如果大大降低成本,就需要蒸馏别人成果,把这些参数偷偷弄过来。 比如”猫睡在石头上感觉很凉快,很舒服&#x…...

Spring boot整合quartz方法
目录 1.定时任务 1.quartz说明 2.Quartz提供了不同的数据存储策略以管理作业调度信息: 1.Quartz引入依赖 2.开发定时任务 (1)更新定时任务 (2)停止定时任务 (3)唤醒定时任务 ÿ…...

网站改HTTPS方法
默认的网站建设好后打开的样子那看起来像是钓鱼网站,现在的浏览器特别只能,就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而,随着HTTPS的推出,传输协议通…...

数据中台是什么?:架构演进、业务整合、方向演进
文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例:金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…...

Java Stream API:高效数据处理的利器引言
Java Stream API:高效数据处理的利器引言 在 Java 编程中,数据处理是一项极为常见且关键的任务。传统的 for 循环在处理数据集合时,往往会导致代码变得冗长、复杂,这不仅增加了代码的编写难度,还降低了代码的可读性和…...

qml之Text 组件显示当前时间
在 QML 中,显示时间的常用组件是 Text,结合 JavaScript 时间函数或者 Qt 的时间模块来实现动态时间显示。虽然 QML 没有专门用于显示时间的组件,但可以通过 Text 来显示格式化后的时间信息。 1. 使用 Text 组件显示当前时间 示例代码: import QtQuick 2.15 import QtQui…...

两栏布局、三栏布局、水平垂直居中
文章目录 1 两栏布局1.1 浮动 margin1.2 浮动 BFC1.3 flex布局1.4 左绝父相 margin1.5 右绝父相 方向定位 2 三栏布局2.1 子绝父相 margin2.2 flex布局2.3 浮动 margin2.4 圣杯布局2.5 双飞翼布局 3 水平垂直居中3.1 绝对定位 translate3.2 绝对定位 margin3.3 绝对定位…...