=p+y$ ,NSf Radeon是一款好显卡,但不是颗好GPU U1[)e D` Cn{Hk)6 作为显卡来说,AMD的Radeon自HD4000时代以来为游戏玩家提供了众多优秀的产品,HD5000/HD6000系列丝毫不输给NVIDIA同级产品,性能、功能、价格、功耗等各方面表现得都很不错。对于AMD下代HD7000系列,我们毫不怀疑它在3D游戏中会有更出色的表现。
\|]mClj# |$RNY``J 但作为GPU来说,AMD的产品显然要逊色很多,不支持物理加速、Stream通用计算性能不如CUDA,支持GPU加速的软件也屈指可数,这已经成为AMD最大的软肋,并且成了NVIDIA和NFan们攻击的对象。
f"ZlJV a IH]9%d) z3oi( %#HU~X: 随着时间的推移,保守的AMD终于尝到了固步自封的苦果:当NVIDIA的CUDA计算课程进入高校学堂、Tesla杀进超级计算市场、Quadro拿下95%的专业卡市场份额之时,AMD的Radeon还只能游弋在3D游戏领域,苦守来之不易的半壁江山。
{& o^p! L:z0cvn" 想当年AMD率先提出GPU通用计算的概念,但最终却在NVIDIA的CUDA手中发扬光大。很多人以为这是AMD收购ATI后自顾不暇的关系,其实根本 原因还在于GPU的架构——传统基于3D图形处理的GPU不适合于进行大规模并行计算,AMD的GPU拥有恐怖的理论运算能力却无从释放。而NVIDIA 则从G80时代完成了华丽的转身,逐步完善了硬件和软件的协同工作,使得GPU成为高性能计算必不可少的配件。
;cor\R JMb_00r s]arNaaA JU 9GJ" 俗话说的好:苦海无涯、回头是岸,亡羊补牢、为时不晚。AMD终于在代号为Southern Islands(南方群岛)的新一代GPU中,启用的全新的架构,AMD称之为“Graphics Core Next”(GCN,次世代图形核心),并冠以革命性的称号。这是AMD收购ATI之后的近5年来第一次对GPU架构进行“伤筋动骨”的“手术”,而架构 调整的核心内容则是为并行计算优化设计。
}E'0vf/ l/eF
P 那AMD的“次世代图形核心”相比沿用了五年之久的架构到底有何改进?其并行计算性能相比对手NVIDIA有无优势?3D游戏性能会否受到影响呢?本文将 为大家做一个全方位的解析,文中会穿插一些3D渲染原理以及显卡基础知识,并谈谈GPU图形与计算的那些事儿……
"6B7EH )t6]F6!_ 成也微软败也微软:XBOX360阻碍显卡/游戏发展 mk-{@$Q Jb _?{7%(C 微软的DirectX 9.0C是一个神奇的图形API,自2004年首款DX9C显卡GeForce 6800 Ultra问世以来,至今已有将近8年时间,之后虽然微软发布了DX10、DX10.1、DX11、还有现在的DX11.1等多个新版本,但DX9C游戏 依然是绝对主流,DX10以后的游戏全部加起来也不过几十款而已!
C?PQ>Q!f- U7r8FL l 因此,当年的DX9C显卡之战,很大程度上决定了此后很多年的显卡研发策略。从最开始X800不支持DX9C对抗6800失利,到X1800支持DX9C 却性能不济,再到X1900登上顶峰,还有半路杀出来XBOX360这个程咬金,ATI被AMD收购前的经历犹如过山车般惊险刺激!
k]b*&.EY1 >=~\b }3pM,. ]%Q!%uTh DXC如此长寿的原因,相信游戏玩家们已经猜到了,那就是游戏主机太长寿了——微软XBOX360以及后来索尼PS3使用的GPU都是DX9C时代的产 品。游戏开发商的主要盈利来源在主机平台,所以根本没心思把PC游戏做好,尤其对提高PC游戏的画面及引擎优化提不起兴趣,个别以高画质而著称的PC游戏 倍受打击,很多DX10游戏续作倒退到DX9C就是很好的证明。
\br!77 -d ntV= 可以说,这么多年来PC 3D游戏图形产业的发展,成也微软、败也微软。
e#"h@kZP Knq9"k / f%mYL %uW=kr XBOX360的GPU——Xenos,由ATI设计
K,b
M9>} 8{ zX= baxZ>KNi 80xr zv Xenos的核心架构图
+7Ws`qhEe %fS9F^AK 微软XBOX360的成功,给GPU供应商ATI发出了一个信号,那就是今后N年内的游戏都将基于XBOX360的硬件而开发。当时ATI与Xenos同 时研发的一颗GPU代号为R580,俩者拥有相似的架构,而R580在当年也成为DX9C显卡的王者,这就让ATI更加坚定了维持现有架构不变的决心。
v^|U? +-9vrEB 从X1900XTX谈起:用3:1黄金架构做计算 )uPJ?
2S9 mU'<:gL+ 下面我们就来看看R580的核心架构,也就是当年的王者X1900XTX/X1950XTX所使用的GPU,后来次高端RV570核心(X1950Pro)的架构也类似。
X>q`F;W l_B735 G\.~/<Mg+ Z;0~f<e%
R580:8个顶点着色单元、48个像素着色单元、16个纹理单元
_|k$[^ln^ /{M<FVXK+| DX9C显卡还没有统一渲染架构的概念(XBOX360的Xenos是个特例),所以R580依然是顶点与像素分离式的设计。当时的GPU核心部分被称为 管线,比如7800GTX拥有24条像素渲染管线,但X1900XTX却不能称为拥有48条像素渲染管线,因为它的像素与纹理单元数量不对等。
&|v) .*O*@)}Ud GPU的工作原理:
Epzg|L1) x4_IUIgh }@DCc f$< MKK ^-T 显卡的渲染流程是通过顶点单元构建模型骨架,纹理单元处理纹理贴图,像素单元处理光影特效,光栅单元负责最终的像素输出。
aDlp>p^E> X.]I4O&_ GPU的管线是什么? exRw, Nk4 2YD\KXDo 在R580之前,GPU的像素单元与纹理单元还有光栅单元是绑定在一起的,数量一样多,整个渲染过程就是流水线作业,因此像素与纹理加起来称为一条管线。
]#/nn),Z Y&|Z*s+
+} 什么是3:1架构? z8kO)' :]3X Ez R520核心(X1800XT)的像素与纹理都是16个,但R580核心在纹理单元维持16个不变的情况下,把像素单元扩充了3倍达到了48个之多。 ATI研发工程师发现新一代游戏中使用像素着色单元的频率越来越高,各种光影特效(尤其HDR)吃掉了像素着色单元的所有资源,而纹理单元的负载并不高, 继续维持像素与纹理1:1的设计就是浪费资源,于是ATI根据3D游戏引擎的发展趋势做出了改变,并把R580这种不对等的架构称之为3:1黄金架构,管 线的概念至此消失。
rd <m:r \Z{tC$|H {X{R] WQ|:TLQ 像素(算数)与纹理的比例逐年提高
qwTz7r {UiSa'TR1b 当年ATI前瞻性的架构在部分新游戏中得到了应验,比如在极品飞车10、细胞分裂4、上古卷轴4等游戏中X1900XTX的性能远胜7900GTX。此外ATI专为HDR+AA优化的架构与驱动也让ATI风光无限。
u{1R=ML =SDex.ZK] 但事实上,从1:1大跃进到3:1有点太激进了,在包括新游戏在内的绝大多数主流游戏中,都无法充分利用多达48个像素着色单元的能力。于是ATI的工程 师们又有了新的想法:何不用这些像素单元来做一些非图形渲染的计算呢?像素单元的核心其实就是ALU(算术逻辑单元),拥有十分可观的浮点运算能力。
So%X(,
| }F08o,`? 蛋白质折叠分布式计算开启GPU计算大门: }\_.Mg^y r>mBe;[TX Mz+I
YP`L ,EqQU| 2006年9月,在X1900XTX发布半年之后,ATI与斯坦福大学相关科研人员合作,开发了首款使用GPU浮点运算能力做非图形渲染的软件——Folding @ Home第一代GPU运算客户端。
UpoSC 4jT6h9% _~FfG!H ^X mF~T?L" Folding@home是一个研究蛋白质折叠、误折、聚合及由此引起的相关疾病的分布式计算工程。最开始F@H仅支持CPU,后来加入了对PS3游戏机的支持,但同样是使用内置的CELL处理器做运算。F@H因ATI的加入为GPU计算翻开了新的一页,当然F@H加入了对NVIDIA DX10 GPU的支持那是后话。
S
?Zh#`(* vu0Ql1 什么是通用计算? W'G|sk *)^6'4= 当时的GPU计算被称为GPGPU(General Purpose GPU),传统的图形处理器可以被用来做通用目的计算项目。所谓通用计算的大体流程就是:待处理的数据—〉转换成图形数据—〉GPU处理—〉处理后的图形 数据—〉转换成所需数据。其实通用计算就是把数据转换为GPU能够“看懂”的图形数据,实际上是作为虚拟硬件层与GPU通讯,由于需要前后两次编译的过 程,因此想要利用GPU强大的浮点运算能力,需要很强大的编译器,程序员的开发难度可想而知,CPU的运算量也比较大。
)"x6V""Rb D?Oe";"/ [img]http://news.mydrivers.com/img/20120106/11100133.jpg[/img]
uHbg&eW n,T
&n 除了蛋白质折叠分布式计算外,当年ATI还开发了AVIVO Video Converter这款使用GPU加速视频转码的小工具,虽然效果一般,但也算是开了个好头。
lZzW-
%K y6 (L=$+B 虽然GPU通用计算的实现难度很大,但至少GPU实现了非图形计算的目的,而且其性能确实要比当时的CPU快十几倍。小有所成的ATI被胜利冲昏了头脑, 他们认为自己研发出了最先进的、最有前瞻性的GPU架构,还找到了让GPU进行通用计算的捷径、还有了AMD这座靠山……最终促使AMD-ATI做出了保守的决定——下代GPU继续沿用R580的架构,不做深层次的改动。
&1\/B q ` S
~w HD2900XT走向不归路:超长指令集的弊端 *tjaac;z<J :s)cTq| 3 R520->R580的成功,多达48个着色单元功不可没,这让ATI对庞大的ALU运算单元深信不疑。ATI认为只要继续扩充着色单元,就能满足新一代DX10及Shader Model 3.0的要求。
R~<N*En~ @52#ZWy 着色单元的结构: vNi;)"&* A%w9Da?B 在图形处理中,最常见的像素都是由RGB(红黄蓝)三种颜色构成的,加上它们共有的信息说明(Alpha),总共是4个通道。而顶点数据一般是由XYZW 四个坐标构成,这样也是4个通道。在3D图形进行渲染时,其实就是改变RGBA四个通道或者XYZW四个坐标的数值。为了一次性处理1个完整的像素渲染或 几何转换,GPU的像素着色单元和顶点着色单元从一开始就被设计成为同时具备4次运算能力的运算器(ALU)。
?XKX&ws *qpFtBg [img]http://news.mydrivers.com/img/20120106/11100134.jpg[/img]
py6<QoGV
gUiO66#x 数据的基本单元是Scalar(标量),就是指一个单独的值,GPU的ALU进行一次这种变量操作,被称做1D标量。由于传统GPU的ALU在一个时钟周期可以同时执行4次这样的并行运算,所以ALU的操作被称做4D Vector(矢量)操作。一个矢量就是N个标量,一般来说绝大多数图形指令中N=4。所以,GPU的ALU指令发射端只有一个,但却可以同时运算4个通 道的数据,这就是SIMD(Single Instruction Multiple Data,单指令多数据流)架构。
q<AnWNheE Y S3~sA [img]http://news.mydrivers.com/img/20120106/11100136.png[/img]
, ['}9:f9 QQ?t^ptv R580的Shader单元结构
Om.%K>V n7> |$2Y 显然,SIMD架构能够有效提升GPU的矢量处理性能,由于VS和PS的绝大部分运算都是4D Vector,它只需要一个指令端口就能在单周期内完成4倍运算量,效率达到100%。但是4D SIMD架构一旦遇到1D标量指令时,效率就会下降到原来的1/4,3/4的模块被完全浪费。为了缓解这个问题,ATI和NVIDIA在进入DX9时代后相继采用混合型设计,比如R300就采用了3D+1D的架构,允许Co-issue操作(矢量指令和标量指令可以并行执行),NV40以后的GPU支持 2D+2D和3D+1D两种模式,虽然很大程度上缓解了标量指令执行效率低下的问题,但依然无法最大限度的发挥ALU运算能力,尤其是一旦遇上分支预测的 情况,SIMD在矢量处理方面高效能的优势将会被损失殆尽。
dv+Gv7&2/ .!1[I{KU DX10时代,混合型指令以及分支预测的情况更加频繁,传统的Shader结构必须做相应的改进以适应需求。NVIDIA的做法是将4D ALU全部打散,使用了MIMD(Multi Instruction Multiple Data,多指令多数据流),而AMD则继续沿用SIMD架构,但对Shader微架构进行了调整,称为超标量架构。
@9^OHRZX iEn:Hh) R600的5D超标量流处理器架构: o
Mz{j: "#)|WVa=BM [img]http://news.mydrivers.com/img/20120106/11100139.jpg[/img]
Kp7DI0~ Wvl~|Sx] 作为ATI的首款DX10 GPU,架构上还是有不少改进的,DX10统一渲染架构的引入,让传统的像素渲染单元和顶点渲染单元合二为一,统称为流处理器。R600总共拥有64个 Shader单元,每个Shader内部有5个ALU,这样总计就是320个流处理器。
NQD5=/o ?}`-?JB1 [img]http://news.mydrivers.com/img/20120106/11100142.jpg[/img]
$9%F1:u Zk`y"[ J R600的Shader单元结构
X~IilGL8: 'VVU-)(8 R600的Shader有了很大幅度的改进,总共拥有5个ALU和1个分支执行单元,这个5个ALU都可以执行加法和乘加指令,其中1个"胖"的ALU除了乘加外之外还能够进行一些函数(SIN、COS、LOG、EXP等)运算,在特殊条件下提高运算效率!
Tm^kZuT{ Y"
=8wNbr [img]http://news.mydrivers.com/img/20120106/11100143.jpg[/img]
G#[A'tbKk -1Tr!I:1 与R580不同的是,R600的ALU可以在动态流控制的支配下自由的处理任何组合形式的指令,诸如1+1+1+1+1、2+2+1、2+3、4+1等组 合形式。所以AMD将R600的Shader架构称作Superscalar(超标量),完美支持Co-issue(矢量指令和标量指令并行执行)。
E6 oC^,ZRy #ss/mvc3 R600超长指令集的弊端: :uo)-9_ K/9Jx(I,qL 从Shader内部结构来看,R600的确是超标量体系,但如果从整个GPU宏观角度来看,R600依然是SIMD(单指令多数据流)的VLIW(超长指 令集)体系:5个ALU被捆绑在一个SIMD Shader单元内部,所有的ALU共用一个指令发射端口,这就意味着Shader必须获得完整的5D指令包,才能让内部5个ALU同时运行,一旦获得的 数据包少于5条指令,或者存在条件指令,那么R600的执行效率就会大打折扣。
8SpG/gl" VL)<u"d4 例如:指令一:a=b+c;指令二:d=a*e。这两条指令中,第二条指令中的a必须等待第一条指令的运算结果,出现这样的情况时候,两条指令大多数情况下就不能实现超标量执行了。
0SvPr[ > 0n:cmML)D 显然,想要完整发挥R600的性能必须满足苛刻的条件,这个条件不仅对驱动和编译器提出了额外的要求,而且要求程序必须让条件指令不存在任何关联性,难度可想而知。最终结果就是绝大多数情况下R600都无法发挥出的理论性能,而且其执行效率会因为复杂指令的增多而不断下降。
|ufL s =rymd3/ HD4870的救赎:暴力扩充流处理器 *=i&n> P;"moluE; HD2900XT的失败来自于很多方面,GPU核心架构只是冰山一角,就算保守的AMD沿用了DX9C时代的老架构,性能也不至于如此不济。但无奈GPU 架构已经定型,短期内是无法改变了,HD2000和HD3000一败涂地,AMD咬牙硬抗了两年之久。就在大家为R600的架构争论不休,大谈VLIW指 令集的弊端有多么严重时,AMD终于迎来了翻身之作——RV770核心。
-]wEk%j U4*u|A RV770核心:暴力扩充流处理器 lU
62$2 A6[FH\f RV770相比R600/RV670,核心部分依然没有任何变化,沿用了之前的Shader单元设计,只是将数量扩充了2.5倍,流处理器达到了800个之多!
u7mPp3ZYK }E ]l4N2 [img]http://news.mydrivers.com/img/20120106/11100147.jpg[/img]
U[MeK)* 'IY?=#xr'` RV670/R600是4组SIMD,每组16个Shader,每个Shader 5个流处理器;RV770是10组SIMD,每组16个Shader,每个Shader 5个流处理器。流处理器部分直接扩充了2.5倍!
e1g3a1tnWl frUs'j/bZ 虽然对流处理器部分没有改动,但AMD对流处理器以外的几乎所有模块都进行了改进,从而使得性能和效率有了质的提升,具体改动如下:
zG$5g^J #OPEYJ;*9d 抗锯齿算法改变,性能大幅提升 eP"B3Jw .1TuHC\mC 纹理单元和光栅单元部分,和流处理器一样都是数量翻了2.5倍,但值得一提的是,抗锯齿算法已经由R600/RV670的流处理器部分转移至光栅单元部分,因此RV770的AA效率大幅提高,一举超越了N卡重现X1000时代的辉煌,这也就是RV770表现令人惊异的主要原因。
Iuz_u2"C ^"O>EY': [img]http://news.mydrivers.com/img/20120106/11100154.jpg[/img]
=Rx4ZqTI| JXL?.{'A 在纹理单元与显存控制器之间设有一级缓存,RV770核心相比RV670,L1 TC容量翻倍,再加上数量同比增加2.5倍,因此RV770的总L1容量达到了RV670/R600的五倍之多!
\(Oc3+n6 T/E=?kBR 放弃环形显存总线,改用交叉总线 m"rht:v5 XfE0P(sE RV770还放弃了使用多年的环形显存总线,估计是因为高频率下数据存取命中率的问题,回归了交叉总线设计,有效提高了显存利用率,并节约了显存带宽。还有GDDR5显存的首次使用,瞬间将显存位宽翻倍,256Bit GDDR5的带宽达到了当时N卡512Bit GDDR3的水平。
@\nQ{\^; hlL$3.] 总的来说,虽然流处理器部分没有做改动,但RV770的非核心架构部分有了很大的改良,上代产品许多设计失误得到了纠正,在流处理器数量暴增运算能力大大加强的情况下,消除了功能模块的瓶颈,从而使得性能有了大幅改进。
|l8=z*v<