算是读书笔记吧
极客时间--深入浅出计算机组成原理
GPU 的历史进程
GPU 是随着我们开始在计算机里面需要渲染三维图形的出现,而发展起来的设备
90 年代中期,随着个人电脑的性能越来越好,PC 游戏玩家们开始有了“3D 显卡”的需求。
那个时代之前的 3D 游戏,其实都是伪 3D。比如,大神卡马克开发的著名Wolfenstein 3D(德军总部 3D),从不同视角看到的是 8 幅不同的贴图,实际上并不是通过图形学绘制渲染出来的多边形。
“古墓丽影”“最终幻想 7”,这些游戏都是在那个时代诞生的。
当时,很多国内的计算机爱好者梦寐以求的,是一块 Voodoo FX 的显卡。
三维图像的渲染流程
你在玩的各种游戏,里面的人物的脸,并不是那个相机或者摄像头拍出来的,而是通过多边形建模(Polygon Modeling)创建出来的。
图像进行实时渲染的过程,可以被分解成下面5 个步骤:顶点处理(Vertex Processing)、图元处理(Primitive Processing)、栅格化(Rasterization)、片段处理(Fragment Processing)、像素操作(Pixel Operations)。
- 顶点处理
把顶点在三维空间里面的位置,转化到屏幕二维空间里面
每一个顶点位置的转换,互相之间没有依赖,是可以并行独立计算的。
- 图元处理
将转化后的顶点连起来,剔除不在屏幕中的部分
- 栅格化
把处理好的多边形,转化成一个个像素点
栅格化操作,和顶点处理是一样的,每一个图元都可以并行独立地栅格化。
- 片段处理
计算每一个像素的颜色、透明度等信息,给像素点上色
这步操作,同样也可以每个片段并行、独立进行。
- 像素操作
把不同的多边形的像素点“混合(Blending)”到一起。
处理多边形间的遮挡,透明关系。造成的颜色变化。
图形流水线
上述顶点处理、图元处理、 栅格化、片段处理,以及最后的像素操作。这一连串的过程,也被称之为图形流水线或者渲染管线。
可编程管线
这个编程能力不是像 CPU 那样,有非常通用的指令,可以进行任何你希望的操作,而是在整个的渲染管线(Graphics Pipeline)的一些特别步骤,能够自己去定义处理数据的算法或者操作。
早期的GPU整个图形渲染过程都是在硬件里面固定的管线来完成的。
程序员们在加速卡上能做的事情呢,只有改配置来实现不同的图形渲染效果。如果通过改配置做不到,我们就没有什么办法了。
着色器
只能修改顶点处理和片段处理部分的程序逻辑。主要是光照、亮度、颜色等等的处理。
内部有两类Shader,分别用来进行顶点处理(多边形的顶点)和片段操作(像素点)。
统一着色器架构
GPU内部使用同一的通用Shader进行工作,同一调配。
虽然我们在顶点处理和片段处理上的具体逻辑不太一样,但是里面用到的指令集可以用同一套。
那不如就在 GPU 里面放很多个一样的 Shader 硬件电路,然后通过统一调度,把顶点处理、图元处理、片段处理这些任务,都交给这些 Shader 去处理,让整个 GPU 尽可能地忙起来。
GPGPU(General-Purpose Computing on Graphics Processing Units,通用图形处理器)
正因为 Shader 变成一个“通用”的模块,才有了把 GPU 拿来做各种通用计算的用法。也就是GPGPU。
现代 GPU 的三个核心创意
为什么现代的 GPU 在图形渲染、深度学习上能那么快。
芯片瘦身
剔除CPU上占据大量资源的各种预测以及IO加速逻辑。
GPU 的整个处理过程是一个流式处理(Stream Processing)的过程,并没有那么多的分支和依赖。
处理乱序执行、进行分支预测,以及高速缓存相关的电路都可以去掉,只保留必要的下取指令、指令译码、ALU 以及执行这些计算需要的寄存器和缓存就好了。
多核并行和 SIMT
相当于CPU的多核以及SIMT
和 CPU 不同的是,我们不需要单独去实现什么多线程的计算。因为 GPU 的运算是天然并行的。
在做向量计算的时候,我们要执行的指令是一样的,只是同一个指令的数据有所不同而已
在 SIMD 里面,CPU 一次性取出了固定长度的多个数据,放到寄存器里面,用一个指令去执行。
而 SIMT由于任务天然并行,可以把多条数据,交给不同的线程去处理。这样,我们的一个 GPU 的核里,就可以放下更多的 ALU,同时进行更多的并行运算了。
GPU 里的“超线程”
当流水线停顿时、调度一些别的计算任务给当前的 ALU
和超线程一样,既然要调度一个不同的任务过来,我们就需要针对这个任务,提供更多的执行上下文。所以,一个 Core 里面的执行上下文的数量,需要比 ALU 多。
深度学习中的GPU
随着 GPGPU 的推出,GPU 已经不只是一个图形计算设备,更是一个用来做数值计算的好工具了。同样,也是因为 GPU 的快速发展,带来了过去 10 年深度学习的繁荣。
1. GPU 是一个可以进行“通用计算”的框架,我们可以通过编程,在 GPU 上实现不同的算法。
2. 现在的深度学习计算,都是超大的向量和矩阵,海量的训练样本的计算。整个计算过程中,没有复杂的逻辑和分支,非常适合 GPU 这样并行、计算能力强的架构。
在实际进行深度学习的过程中,用 GPU 所花费的时间,往往能减少一到两个数量级。
而大型的深度学习模型计算,往往又是多卡并行,要花上几天乃至几个月。这个时候,用 CPU 显然就不合适了。
网友评论