图解GPU

时间:2022-04-09

这是图解系列之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

关注阅读更多图解

相关文章

作者介绍

精选专题

活动推荐

【推荐】 一文详解GPU结构及工作原理
【推荐】 关于深度学习,这可能是你最容易读进去的科普贴了(三)
【推荐】 不服跑个分 手机/笔记本/台式机性能大混战
【推荐】 机器学习、深度学习电脑显卡配置指南