这是图解系列之GPU
关注阅读更多图解
要说GPU就绕不开CPU。
以前CPU要做所有的工作,但是后来发现有一类工作,它比较简单并且需要大量的重复性操作,各操作之间又没有关联性。
于是CPU就找了一堆GPU来干这些大量重复性的简单工作。
由于图形渲染任务具有高度的并行性,所以GPU一开始就是做图形渲染的工作。
GPU内部有数量众多的计算单元,每个计算单元内只有非常简单的控制逻辑。尽管每一个单元的计算能力不如CPU,但人多力量大呀。
CPU是顺序执行的:
GPU是并行执行的:
下面我们看一下GPU的工作原理。
GPU的工作都是CPU安排的,包括图形渲染。
GPU从CPU那里得到渲染命令后,会进行一系列操作,最终把图像渲染到屏幕上,这个过程被称之为图形流水线(Graphic Pipeline)。
这个图形流水线简单说主要有以下几个过程:
顶点处理(vertex shader)
3D图形的顶点都有一个三维空间的坐标,但是我们的屏幕是二维的,GPU的计算过程实际上就是将三维的坐标数据绘制到二维屏幕上。
所以GPU需要把这些顶点在三维空间里面的位置,转化到屏幕这个二维空间里面。这个转换的操作,就被叫作顶点处理。
这样的转化都是通过线性代数的计算来进行的。这里每一个顶点位置的转换,互相之间没有依赖,可以进行并行计算。
图元组装(primitive assembly)
定点坐标映射到二维空间后,在这一步,根据这些顶点的原始连接关系还原出网格结构。
然后进行剪裁,例如如果一个三角形超出屏幕以外,例如两个顶点在屏幕内,一个顶点在屏幕外,这时我们在屏幕上看到的就是一个四边形。
最后把图元处理完成之后多边形各个顶点连起来,形成三角形面片。
栅格化(Rasterization)
显示器显示的图像是由像素组成的,GPU要将前面图元组装后的点和线转换到相应的像素点。
把一个矢量图形转换为一系列像素点的过程就称为栅格化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。
片元着色(Fragment Shader)
计算每一个像素的颜色、透明度等信息,给像素点上色。
像素操作pixel operation
像素操作阶段主要是进行一些优化处理,例如:
消除遮挡面:图像背对着我们的那些面就可以直接删除不处理了。
纹理处理:根据像素的纹理坐标和光线,查询对应的纹理值,纹理化后的图像会更加真实。
混合处理:这个就是常见的alpha blending,根据目前已经画好的颜色,与正在计算的颜色的alpha值混合,形成新的颜色。
该阶段之后,像素的颜色值被写入帧缓存中进入显示器了。
图形API
对于游戏开发人员来讲,这部分知识会被常常提及,像OpenGL、Direct3D等。
起初的GPU不可编程,只能按照固定管线执行,直到像OpenGL这种着色语言出现。
这些着色语言接口向下调用GPU驱动接口,向上为应用开发者提供API,这就是我们所熟知的:
从CPU到GPGPU
GPU起初是用来处理图像的,但是后来人们发现其并行运算原理不仅可以用在图形渲染上,也可以推广到一般的运算中。
于是GPU的功能就进行了升级,可以进行稍微复杂的工作了,并且可编程,也是就有了GPGPU,即通用图形处理器。
GPGPU其实是对GPU的一种优化,让GPU更加的具有易用性和通用型,GPU应用于AI就是GPU通用属性的一个方向,类似的方向有很多:挖矿、AI训练、HPC高性能计算等。
如果想用GPU做通用的计算,就要有更通用的编程工具。为此,很多针对GPGPU的并行计算架构就产生了,主要有两个CUDA和OpenCL。
这是图解系列之GPU
关注阅读更多图解