学习过程中 有很多地方会使用到GPU来进行运算,如训练网络等。了解GPU的工作原理是非常有必要并且很有价值。
GPU和CPU的区别
比喻
CPU
CPU就像一位经验丰富的教授,不仅会各种高深的计算,还能处理复杂的逻辑。虽然教授贵,但一个教授的算力能顶许多普通计算力,适合负责一些复杂、精细的任务。
但是教授人少,因此不适合去做一本小学口算题。
GPU
GPU更像是由很多小学生组成的团队,虽然每个人只能完成简单的计算,但可以通过人海战术完成大量重复的任务。
处理一本小学口算题,让一群小学生分工合作,每人算一道题,这样既快又高效。
适用场景
CPU
CPU则适合那些步骤紧密关联、必须按顺序执行的计算任务。常用于个人电脑、设备控制等需要精确顺序的任务。
GPU
GPU擅长处理大量彼此独立、无需依赖前后顺序的计算任务。像游戏、挖矿和图形处理等,都是将一个大任务分解成无数个小任务,每个小任务可以单独完成。
计算能力
剩下很多区别不是本文的重点,就不赘述了
GPU评价指标
FLOPS
FLOPS"意为每秒浮点运算次数。它是衡量计算机系统或处理器性能的一种常见指标,特别是在科学计算、工程领域和高性能计算中。例如,一个处理器的性能为 1 TFLOPS,意味着它可以每秒执行 1 万亿次浮点运算。FLOPS、TOPS和FLOPs的区别_tops flops-优快云博客
MACs
Multiply–Accumulate Operations,乘加累积操作。1MACs包含一个乘法操作与一个加法操作(Ax+b),大约等于2FLOPs。
throughput and latency
如何理解Latency和Throughput: 吞吐量和延迟 - Binyao - 博客园
优化延迟:
- 通信时延对 MACs 的影响 >> 优化带宽
- Batch Size 大小与内存大小 >> 多级缓存设计
矩阵乘
看我这篇博客详解矩阵乘优化方法-优快云博客
GPU工作原理
GPU的计算能力
以A100来举例说明下
数量 | 名称 | 类型 |
约7000 | FP32 | CUDA Core |
约3500 | FP64 | CUDA Core |
约7000 | INT32 | CUDA Core |
432 | Tensor Core | |
13824 | Thread |
可以看出 A100的并行计算能力十分强大,相较于CPU来说
GPU缓存机制
分为2类
芯片上:L1cache/Shared Memory、L2cache
芯片外:HBM Memory(显存)
最好让计算单元从L1cache读取数据
下表为计算单元读取数据的速度
以A100举例
有128个SM,每个SM包含1个L1cache和share momary
外部有两个L2cache
在外面有HBM
下面有NVlink可以多卡协同
PCIe与内存传输数据

GPU如何管理线程
CUDA:人工智能编程 | 谭升的博客
主设概念: CUDA引入主机端(host)和设备(device)概念。CUDA 程序中既包含host程序,又包含device程序。
互相通信: host与device之间可以进行通信,这样它们之间可以进行数据拷贝。
CUDA 执行流程中最重要的一个过程是调用CUDA的核函数来执行并行计算,kernel是CUDA中一个重要的概念。
在 CUDA 程序构架中,Host 代码部分在CPU上执行,是普通C代码;
当遇到数据并行处理的部分,CUDA 就会将程序编译成GPU能执行的程序,并传送到GPU,这个程序在CUDA里称做核(kernel)。
CUDA Kernel函数:是数据并行处理函数(核函数),在GPU上执行时,一个Kernel对应一个Grid,基于GPU逻辑架构分发成众多thread去并行执行。kernel 用 __global__符号声明,在调用时需要用 <<<grid, block>>> 来指定kernel要执行及结构。
下图是Cuda的编程结构
thread
在GPU编程中,线程是最基本的执行单元。一个GPU程序会同时启动成千上万个线程来执行任务
warp
GPU 的 每一行由1个控制单元加上若干计算单元所组成,这些所有的计算单元执行的控制指令是一个 。这其实就是个非常典型的 "单指令多线程机制(SIMT)" 。
warp是硬件级别上的调度单位的最小单元,一个 warp 包含32个并行 thread,这些 thread 以不同数据资源执行相同的指令。
Block
- 块是线程的集合,它们被组织成一个工作单元,可以共享内存和同步。
- 在GPU编程中,通常会将线程划分成若干个块,以便更有效地管理和协调线程的执行。
- 块内的线程可以进行协作和通信,通常通过共享内存来提高性能。
- Block 间并行执行,并且无法通信,也没有执行顺序
Grid
多个block则会再构成grid。kernel 在 device 上执行时,实际上是启动很多线程,一个kernel 所启动的所有线程称为一个网格(grid)。同一个网格上的线程共享相同的全局内存空间。
当一个 kernel 被执行时,grid 中的线程块被分配到 SM (多核处理器) 上,一个线程块的 thread 只能在一个SM 上调度,SM 一般可以调度多个线程块,大量的 thread 可能被分到不同的 SM 上。每个 thread 拥有它自己的程序计数器和状态寄存器,并且用该线程自己的数据执行指令。
SM
被分成4个处理单元,
每个处理单元有
1warp Scheduler:调度warp
16个int32 fp32
8个fp64
1个tensor core
ld/st单元:用来传输数据
SM内部共享1个L1Cache
Tensor Core
不同于nvidia以往的cuda core(全浮点型),Tensor core是近几年推出来的、混合精度的、将累加和累乘放在一起的计算硬件;可以在一个时钟周期内做完矩阵乘法和矩阵加法。
混合精度 是指在底层硬件算子层面,使用半精度(FP16)作为输入和输出,使用全精度(FP32)进行中间结果计算从而不损失过多精度的技术。
这个底层硬件层面其实指的就是Tensor Core,所以 GPU 上有 Tensor Core 是使用混合精度训练加速的必要条件。
参考