不奢望岁月静好 只希望点滴积累

0%

GPU的产生和发展(第30、31讲)

GPU的历史进程

1
2
3
4
5
6
GPU是随着需要在计算机里渲染三维图形、而发展起来的设备

90年代中期、随个人电脑的性能越来越好、开始有了3D显卡的需求、那个时代之前的3D游戏、都是伪3D
从不同视角看到的是8副不同的贴图、并不是通过图形学渲染出来的多边形

为什么CPU的性能已经大幅度提升、还需要单独的GPU呢 ?

图形渲染的流程

1
2
3
4
5
6
7
8
9
10
现在电脑显示的3D画面、其实是通过多边形组合出来的. 现在各种游戏人物的脸、不是相机或者摄像头拍出来的、而是通过多边形建模创建出来的

实际这些人物在画面里的移动、动作、乃至根据光线发生的变化、都是通过计算机根据图形学的各种计算、实时渲染出来的

图像实时渲染、可拆解为:
1. 定点处理 (Vertex Processing)
2. 图元处理 (Primitive Processing)
3. 栅格化 (Rasteerization)
4. 片段处理 (Fragement Processing)
5. 像素操作 (Pixel Operations)

解放图像渲染的GPU

1
2
3
4
5
6
7
若使用CPU渲染、需要多少资源来处理 ?
上世纪90年代、屏幕分辨率大概: 640*480, 约30w, 为了眼睛看到的画面不眩晕、希望画面有60帧、即:
每秒重新渲染60次(1800万次单个像素的渲染), 从栅格化开始、每个像素有3个流水线步骤、假设每个步骤只有1个指令、也需要5400w条指令

90年代的CPU性能是多少呢 ? 93年第一代Pentium处理器、主频60MHZ、后续逐步推出了 66MHZ、75MHZ、100MHZ的处理器、以这个性能来看、用CPU来渲染3D图形、就基本上把CPU的性能耗光了、因为实际的每一个渲染步骤不可能只包含一个指令、所以、CPU跑不动3D图形渲染

既然图形渲染的流程是固定的、直接使用硬件来处理、不用CPU计算是不是可以呢 ? Voodoo FX这样的图形加速器出现了、显然、硬件会比制造通用计算性能的cpu要便宜的多、因为整个计算过程是固定的、不需要流水线停顿、乱序执行等各类导致CPU计算变的复杂的问题、也不需要可编程能力、只让硬件按照谢浩的逻辑进行运算即可

现代GPU的三个核心创意

1
2
3
4
现代CPU里的晶体管越来越多、越来越复杂、其实已经不是用来实现`计算`这个核心功能、而是拿来实现乱序执行、分支预测及存储器高速缓存

而 对于GPU、这些电路就很多余了、GPU的整个处理过程是一个流式处理的过程(Stream Processing),
因为没有太多分支条件或者复杂的依赖关系、可以把GPU的对应电路都省掉、只保留取指令、指令译码、ALU以及执行这些计算需要的寄存器和缓存、一般会抽象为如下图三部分: 取指令、指令译码、ALU和执行上下文(乱序执行、分支预测、高速缓存... 都被省掉)

image.png

SIMT和多核并行

1
2
3
4
5
6
7
8
9
10
这样一来、GPU的电路就比CPU简化很多了、于是可以在一个GPU里、塞很多并行的GPU来实现计算、好像CPU里的多核CPU一样、和CPU不同的是、不需要单独实现多线程的计算、GPU的计算是天然并行的

上节提到:
无论是对多边形里的顶点进行处理还是对屏幕里的每一个像素、每个点的计算都是独立的、所以:
简单的添加多核的GGPU、就能做到并行加速、
另外: CPU的SIMD技术: 在向量计算的时候、要执行的指令是一样的、只是同一个指令的数据有所不同、在GPU的渲染管里、无论是顶点线性变换还是屏幕上临近像素点的光照和上色、都是在用相同指令流程进行计算、GPU就借鉴了SIMD、用来一种叫SIMT的技术,

SIMT比SIMD更加灵活、在SIMD里、CPU一次性取出了多个固定长度的数据、放在寄存器里、用同一个指令去执行、而SIMT可以将多条数据、交给不同的线程来处理

各个线程里执行的指令流程是相同的、但可能根据数据的不同、走到不同的条件分支、这样相同的代码和相同的流程、可能执行不同的具体的指令、于是GPU可以进一步简化、取指的时候可以交给后面多个不同的ALU并行计算、这样一个GPU的核里就可以放下更多的ALU、同时进行更多的并行运算了

多核并行.png

SIMT并行-多个ALU.png

GPU里的超线程

1
2
3
4
GPU里的指令、可能会遇到和CPU类似的流水线停顿问题、是不是可以想到优化方案`超线程` ?
在GPU里一样可以有类似的优化. 即: 遇到流水线停顿时、调度一些别的计算任务给当前的ALU

和超线程一样、既然要调度一个不同的任务执行、就需要针对这个任务、提供更多的执行上下文、so. 一个Core里的执行上下文的数量、需要比 ALU 多

image.png

GPU在深度学习上的性能差异

1
2
3
4
通过芯片瘦身、SIMT和更多的执行上下文、GPU更擅长并行进行暴力运算、恰好适合深度学习的应用场景

一方面: GPU是一个可以进行通用计算的框架、可以通过编程、在GPU上实现不同的算法、
另一方面: 现在的深度学习计算、都是超大的向量和矩阵、海量的训练样本的计算、整个过程没有复杂的逻辑和分支、非常适合GPU这样并行、计算能力强的架构