Shader入门(1.1)GPU的高并行结构和为什么可以有渲染流水线

基础知识点

1.CPU和GPU都可以从逻辑上划分为3个模块:控制模块、运算模块、储存模块。

2.控制模块由指令寄存器、指令译码器、操作控制器组成。CPU工作时从内存中读取指令,存放在指令寄存器中,指令译码器分析寄存器的指令如何操作,然后由操作控制器向相应的部件发出控制信号。

3.运算模块接收控制模块的命令执行各种运算,有算数运算(比如加减乘除等基本运算)和逻辑运算(比如逻辑测试或比较两个值)。运算模块的所有动作都是由控制单元的控制信号来进行的,它是个执行部件。

4.储存模块是cpu中暂时存放数据的地方,里面保存着所有未处理和处理过的数据。寄存器可以减少CPU读取内存的作用,因此提高CPU的运算速度。

5.RAM指的是内存,DRAM指的是动态内存,SDRAM指的是静态内存,也就是内存条。而GPU所使用的内存叫做显存VRAM。

GPU的高并行结构

Shader入门(1.1)GPU的高并行结构和为什么可以有渲染流水线

这是一张非常多人使用的示意图,可以很好的解释CPU和GPU之间的区别。

*上图中黄色方块Control指的是控制模块,绿色ALU指的是运算模块,橙色Cache指的是储存模块,而DRAM指的的动态内存。

*CPU执行计算的时候,一个时刻只能处理一个数据,但是可以对这个数据进行非常复杂的运算。因为CPU对每个数据的处理方式都是不一样的,这就像是在搞创作,你画的上一幅画和这一幅画不能是一个样子,否则没人看,你画上一张的时候可能画的是鸟,而这次画的是花,这就需要不同的逻辑。难以并行运算。

*GPU执行计算的时候要处理的数据往往是同一个模型的数万个顶点的变换,同一个纹理的数万个像素的运算,这些计算中,往往除了顶点本身的位置不同,要执行的操作是一模一样的。写到这里忽然就联想到了一句话“你伸头也是一刀,缩头也是一刀。”

由于这种对一批数据进行一模一样的运算模式,就有了并行结构的产生基础。

*GPU绘制图像的方式其实一般是有个确定的起点和终点的,起点就是应用阶段准备好渲染数据传送到缓存中后,GPU开始计算,终点就是绘制完了一帧图像显示在屏幕上。在这个绘制阶段当中也有一定的顺序,比如正常来说要先完成几何阶段,再进行光栅化阶段。正是这种比较确定的流程给了GPU很大的计算优化空间。

上面的示意图中,GPU的计算模块要比CPU大很多,而控制模块要小很多,正是这种比较确定的计算流程导致的。可以这么说,CPU中的计算像是野外探险,道路曲折,终点不明,这就需要优秀的向导;而GPU中的中的计算像是田径场上的赛跑,终点明确,距离清晰,你只需要一把发令枪。

*再有一个方面是,GPU进行运算的时候有个概念叫做“对数据进行独立计算”,意思是同一阶段的运算过程中,任意元素的计算不依赖于其他同类型的数据。举例如:想要把一个顶点从模型空间变换到世界空间,只需要准备好变换矩阵和顶点数据,就可以进行计算了,在计算过程中不需要知道另一个顶点到底在哪里,也不需要去考虑我这个顶点和光源的位置关系。但是CPU他不同啊,有的人就想要先算一算你这个顶点和其他顶点的关系,再来做顶点空间变换,有的人他写的程序里又有了其他的奇思妙想,这就让一个普通的顶点表示压力很大。

渲染流水线

在了解了GPU有着什么样的结构之后,也就可以很快地理解为什么渲染可以是流水线,为什么这个渲染还必须要专门的硬件而不是直接拿CPU来算。

上面的文中我写到GPU有比较明确的计算流程,这个固定的计算流程就是渲染流水线。流水线的工序都是很明确很固定的,你只能对工序上的一些操作进行修改,而不能直接把流水线掀翻了重摆,关于流水线里到底有什么工序,则可以参考https://zhuanlan.zhihu.com/p/97498781