GPU工作原理简介
-花蒜
GPU
工作原理简介
计算机
0601
沈凯杰
【引言】
在
GPU
出现以前,显卡和
CPU
的关系
有点像“主仆”
,简单地说这时的显卡就是画笔,根据各种有
C
PU
发出
的指令和数据进行着色,材质的填充、渲染、输出等。
较早的娱乐用的
3D
显卡又称“
3D
加速卡”
,由
于大部分坐标处理的工作及光影特效需要由
CPU
亲自处理,<
/p>
占用了
CPU
太多的运算时间,从而造成
整体画面不能非常流畅地表现出来。
例如,渲染一个复杂的三
维场景,需要在一秒内处理几千万个三角形顶点和光栅化几十亿的像素。早期的
3D
p>
游戏,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由
CPU
单独完成。图形渲染适合
并行处理,擅长于执行串行
工作的
CPU
实际上难以胜任这项任务。所以,那时在
PC
上实时生成的三维图像
都很粗糙。不过在某
种意义上,当时的图形绘制倒是完全可编程的,只是由
CPU
来
担纲此项重任,速度上
实在是达不到要求。
< br>随着时间的推移,
CPU
进行各种光影运算的速度变得越
来越无法满足游戏开发商的要求,更多多边形以及
特效的应用榨干了几乎所有的
CPU
性能,矛盾产生了·
·
< br>·
·
·
·
【目录】
第一章.
GPU
的诞生
3.1 GPU
中数据的处理流程
3.2 CPU
与
GPU
的数据处理关系
3.3
传统
GPU
指令的执行
3.4 GPU
的多线程及并行计算
3.4.1
多线程机制
3.4.2
并行计算
第二章.
GPU
的结构
<
/p>
第三章.
GPU
的工作原理
第四章.
GPU
未来的展
望
4.1
GPU
能否包办一切
4.2
GPU
时代即将到来
【正文】
第一章.
< br>GPU
的诞生
NVIDIA<
/p>
公司在
1999
年
8
月
31
日发布
GeForce 256
图形处理芯片时首先提出
GPU<
/p>
的概念。
GPU
之所以被称为图形处理器,最主要的原因是因为它可以进行几乎全部与计算机图形有关的数据运
算,而这些在过去是
CPU
的专利。
< br>
目前,计算机图形学正处于前所未有的发展时期。近年来,
GPU
技术以令人惊异的速度在发展。渲染
速率每
6
个月就翻一番。性能自
99
< br>年,
5
年来翻番了
10
次,也就是(
2
的
10
次方比
2
)提高了上千倍!
与此同时,不仅性能得到了提高,计算质量和图形编程的灵活性也逐渐得以改善。
< br>
以前,
PC
和计算机工作站只
有图形加速器,没有图形处理器(
GPU
),而图形加速器只能
简单的加速
图形渲染。而
GPU
取代了
图形加速器之后,我们就应该摒弃图形加速器的旧观念。
第二章.
GPU
的结构
GPU
全称是
GraphicProcessing
Unit
--图形处理器,其最大的作用就是进行各种绘制计算机图形所
需的运算,包括顶点设置、光影、像素操作等。
GPU
实际上是一组图形函数的集合,而这些函数有硬件实
现,只要用于
3D
游戏中物体移动时的坐标转换及光源处理。以前,这些工作都是有
CPU
配合特定软件进行
的,
GPU
从某种意义上讲就是为了在图形处理过程中充当主角而出现的。
< br>
下图就是一个简单的
GPU
结
构示意图,一块标准的
GPU
主要包括
2D Engine
、
3D
Engine
、
Video
Processing
Engine
、
FSAA
Engine
、显存管理单元等。其中,
3D
p>
运算中起决定作用的是
3DEngine
,
这是现
代
3D
显卡的灵魂,也是区别<
/p>
GPU
等级的重要标志。
3DEngln
e
在各公司的产品中都是宣传攻势的重点照顾
对象,名字一个比
一个响,像
NVIDIA
的
nFjnj
tFX
系列、
CineFX
系列,
p>
ATI
的
SmoothVision
系列。一个
3DEngine
通常包含着
p>
T&L
单元、
VertexProeess
ingEngine
、
SetupEngine
、
PiexlShader
等部分。
< br>
第三章.
GPU
的工作原理
3.1 GPU
中数据的处理流程
<
/p>
现在让我们来看看第二代
GPU
是如何完
整处理一个画面的吧!
首先,
来自
CP
U
的各种物理参数进入
GPU
,
Vertex shader
将对顶点数据进行基本的判断。如果没有
需要处理的
Vertex
效果,则顶点数据直接进入
T&L Unit
进行传统的
T&L
操作以节约时间提高效率。如果需要
处理各种
Vertex
效果,则
Vertex
shader
将先对各种
Vertex
Programs
的指令进行运算,一般的
Vertex Pr
ograms
中往往包含了过去转换、剪切、
光照运算等所需要
实现的效果,故经由
Vertex shader
处理的效果一
般不需要再进行
T&L
操作。另外,当
遇到涉及到曲面镶嵌
(
把曲面,比如弓形转换成为多边形或三角
形
)
的场合时。
CPU
可以直接将数据交给
Vertex
shader
进行处理。
另外,在<
/p>
DireetX8.0
的
Transfo
rm
过程中,
Vertex shader
可以完成
Z
值的剔除,也就是
Ba
ck Face
Culling
――阴面隐去。这就意味粉除
了视野以外的顶点,视野内坡前面项点遮住的顶点也会被一并剪除,
这大大减轻了需要进
行操作的顶点数目。
接下来,经由
V
ertexShader
处理完成的各种数据将流入
Setup
Engine
,在这里,运算单元将进行三角形的
设置工作,这
是整个绘图过程中最重要的一个步骤,
Setup Engine
甚至直接影响着一块
GPU
的执行效能。
三角形的设置过程是由一个个多边形组成的,或者是用更好的三角形代替原来的三角形。在三维图象中可 p>
能会有些三角形被它前面的三角形挡住,
但是在这个阶段
3D
芯片还不知道哪些三角形会被挡住,
所以三角
形建立单元接收到是一个个由
3
个顶点
组成的完整三角形。三角形的每个角
(
或顶点
< br>)
都有对应的
X
轴、
Y
轴、
Z
轴坐标值,这些
坐标值确定了它们在
3D
景物中的位置。同时,三角形的设置也
确定了像素填充的范
围。,至此,
VertexShader
的工作就完成了。
< br>
过去
[
第一代
]
,
设置好的三角形本来应该带着各自所有的参数进入
像素流水线内进行纹理填充和演染,
但现在则不同,在填充之前我们还播要进行
PiexlShader
的操作。其实,
Pie
XIShader
并非独立存在的,
它位于纹理填
充单元之后
,数据流
入像紊流水
线后先进入
纹理填充
单元进行纹
理
填充,
然后便是
Piex!Shader
单元,经由
PiexlShader
单元进行各种处理运算之
后再进入像素填充单元进行具体的粉色,
再经由雾化等操作后,一个完整的画面就算完成
了。值得注意的是,第二代
GPU
中普遮引入了独立的显示
p>
数据管理机制,它们位于
VertexShader
、
SetuPEngine
以及像素流水线之间,负资
数据更有效率地传输和
组合、各种无效值的剔除、数据的压缩以及寄存器的管理等工作,
这个单元的出现对整个
GPU
工作效率的
保证起到了至关重要的作用。
简
而言之,
GPU
的图形(处理)流水线完成如下的工作:(并不
一定是按照如下顺序)
顶点处理:
这阶段
GPU
读取描述
3D
图形外观的顶点数据并根据顶点数据确定
3D
图形
的形状及位置关
系,建立起
3D
图形的
骨架。在支持
DX8
和
DX9
规格的
GPU
中,这些工作由硬件实现的
Vertex
Shader
(定
点着色器)完成。
光栅化计算:
显示器实际显示的图像是由像素组成的,我们需要
将上面生成的图形上的点和线通过一
定的算法转换到相应的像素点。
把一个矢量图形转换为一系列像素点的过程就称为光栅化
。例如,一条数
学表示的斜线段,最终被转化成阶梯状的连续像素点。
纹理帖图:顶点单元生成的多边形只构成了
3D
物体的
轮廓,而纹理映射(
texture mapping
)工作完
成对
多变形表面的帖图,通俗的说,
就是将多边形的表面贴上相
应的图片,从而生成
“真实”的图形。
TMU
< br>(
Texture mapping
unit
)即是用来完成此项工作。
像素处理:
这阶段(在对每个像素进行光栅化处理期间)
GP
U
完成对像素的计算和处理,从而确定每
个像素的最终属性。在
支持
DX8
和
DX9
< br>规格的
GPU
中,这些工作由硬件实现的
Pixel
Shader
(像素着色器)
完成。
最终输出:由
ROP
(光栅化引擎)最终完成像素的输出,
1
帧渲染完毕后,被送到显存帧缓冲区。
总结:
GPU
的工作通俗的来说就是完成
3D
图形的生成,将图形映射到相应的像素点上,对每个像素进
行计算确定最终颜色并完成输出。
-――
G
PU
流程示意图
3.2 CPU
p>
与
GPU
的数据处理关系
< br>
如今的游戏,单单从图象的生成来说大概需要下面四个步骤:
1
、
Homogeneous
coordinates
(齐次坐标)
2
、
Shading
models
(阴影建模)
3
p>
、
Z-Buffering
(
Z-
缓冲)
4
、
Texture-
Mapping
(材质贴图)
在这
些步骤中,显示部分(
GPU
)只负责完成第三、四步,而前两
个步骤主要是依靠
CPU
来完成。而
且,这还仅仅只是
3D
图象的生成,还没有包括游戏中复杂的
AI
运算。场景切换运算等等„„无疑,这些
< br>元素还需要
CPU
去完成,这就是为什么在运行《魔兽世
界》的时候,当场景切换时再强劲的显卡都会出现
停顿的现象。
接下来,让我们简单的看一下
CPU
和
GPU
之间的数据是如何交互的。
首先从硬盘中读取模型,
CPU
分类
后将多边形信息交给
GPU
,
GPU<
/p>
再时时处理成屏幕上可见的多边形,
但是没有纹理只有线框。
p>
模型出来后,
GPU
< br>将模型数据放进显存,显卡同时也为模型贴材质,给模型上颜色。
CPU
相应从显存中
获取多边形的信息。然后
CPU<
/p>
计算光照后产生的影子的轮廓。等
CPU
计算出后,显卡的工作又有了,那就
是为影子中填充深的颜色
这一点要注意的是,无论多牛的游戏家用显卡,光影都是
CPU
计算的,
GPU
只有
< br>2
个工作,
1
多边形生
成。
2
为多边形上颜色。
3.3
传统
GPU
指令的执行
传统的<
/p>
GPU
基于
SIMD
的架构。
SIMD
即
Single
Instruction Multiple
Data
,单指令多数据。
其实这
很好理解,传统的
VS
和
PS
中的
ALU
(算术逻辑单元,通常每个
VS
或
PS
中都会有一
个
ALU
,但这不是一
定的,例如
p>
G70
和
R5XX
有两个)都能够在一个周期内(即同时)完成对矢量
4
个通道的
运算。比如执行一条
4D
指令,
PS<
/p>
或
VS
中的
AL
U
对指令对应定点和像素的
4
个属性数
据都进行了相应的计算。这便是
SIMD
的由来。
这种
ALU
我们暂且称它为
4D ALU
。
需要注意的是,
4D SIMD
架构虽
然很适合处理
4D
指令,但遇到
1D<
/p>
指令的时候效率便会降为原来的
1/4
。
此时