计算机组成原理学习笔记——GPU

316 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

GPU

GPU是用来渲染计算机中三维图形的,也可以用来深度学习。

图形渲染的流程

Snipaste_2022-04-03_18-35-44.jpg

渲染的过程可以被分解成这五个步骤

  1. 顶点处理
  2. 图元处理
  3. 栅格化
  4. 片段处理
  5. 像素操作

顶点处理

多边形建模每一个多边形,都有多个顶点。这些顶点都在三维空间坐标。我们的屏幕是二维的,所以我们需要把这些顶点在三维空间里的位置,转化成二维空间的位置。这个转化的过程就是顶点处理。每一个顶点位置的转化,互相之间没有依赖,可以并行独立计算

图元处理

就是把顶点处理完的顶点连接起来,变成多边形。然后把多边形中不在屏幕中的部分去掉

栅格化

做完图元处理的多边形,我们需要把它转换成屏幕里的一个个像素点。这个操作就是栅格化。和顶点处理一样,每个多边形可以独立的栅格化。

Snipaste_2022-04-03_18-58-55.jpg

片段处理

栅格化之后,我们的图是没有颜色的。我们需要计算每一个像素的颜色,透明度等,给像素点上色。这个过程就是片段处理。每个片段也可以单独进行。

像素操作

最后我们把不同多边形重合的像素点再进行运算,得到新的颜色。最终输出到显示设备。

整个渲染过程,顶点处理,图元处理,栅格化,片段处理,像素操作,也被称之为图形流水线或者渲染管线

可编程图形处理器

早期我们图形渲染的整个过程都是硬件中固定的管线来完成的,有的渲染效果达不到。所以出现了可编程图形处理器,这里的可编程不同于CPU可以通过指令来实现任何操作,它只是在特定的步骤程序员可以自己定义处理数据的算法和操作。

比如最开始的可编程GPU,它只有顶点处理和片段处理的编程接口,我们称Shader(着色器)。

Snipaste_2022-04-04_11-29-24.jpg

我们可以发现上述可编程GPU,有两类着色器(顶点着色器和片段着色器),这两类着色器都有各自独立的硬件,不能互相使用。所以这两类着色器肯定会有空闲的时候。这样就会有性能浪费。

很快我们发现,这两类可编程接口,用的指令集是一样的。那我们就可以把Shader硬件电路统一化,然后通过调度,把顶点处理,图元处理,片段处理这些任务交给这些一样的Shader去处理。这样就能让整个GPU忙起来。这样的设计,就是统一着色器架构,也是我们现代GPU的设计。

Snipaste_2022-04-04_12-45-40.jpg

现代GPU

“瘦版”CPU

GPU相对于CPU没有那么多复杂的指令。而CPU为了提升性能,对冒险问题做了很多的优化,但是GPU是用不到这些优化的,我们就可以把这部分砍掉。

Snipaste_2022-04-04_13-01-47.jpg

多核并行和SIMT

GPU的运算都是独立进行的,所以我们添加多核就可以做到并行加速。

Snipaste_2022-04-04_14-50-57.jpg

类似于CPU中的SIMD技术,SIMT也是一条指令取多个数据,然后将数据交给后面多个ALU进行并行运算。这样来提升GPU的算力。

Snipaste_2022-04-04_15-03-03.jpg

GPU中的“超线程”

和CPU中的超线程类似,也是在流水线停顿的时候,去调度一个不同的任务,让空闲的ALU跑起来