oV>AFs6 #aY<J:Nx Radeon是一款好显卡,但不是颗好GPU y6jmn1K &d3 '{~: 作为显卡来说,AMD的Radeon自HD4000时代以来为游戏玩家提供了众多优秀的产品,HD5000/HD6000系列丝毫不输给NVIDIA同级产品,性能、功能、价格、功耗等各方面表现得都很不错。对于AMD下代HD7000系列,我们毫不怀疑它在3D游戏中会有更出色的表现。
MI'l4<>u \}QuNwc 但作为GPU来说,AMD的产品显然要逊色很多,不支持物理加速、Stream通用计算性能不如CUDA,支持GPU加速的软件也屈指可数,这已经成为AMD最大的软肋,并且成了NVIDIA和NFan们攻击的对象。
VfqY_NmgC kJi&9
]!G>8Rc J:Y|O-S! 随着时间的推移,保守的AMD终于尝到了固步自封的苦果:当NVIDIA的CUDA计算课程进入高校学堂、Tesla杀进超级计算市场、Quadro拿下95%的专业卡市场份额之时,AMD的Radeon还只能游弋在3D游戏领域,苦守来之不易的半壁江山。
m4U+,|Fa 3J~kiy.nfW 想当年AMD率先提出GPU通用计算的概念,但最终却在NVIDIA的CUDA手中发扬光大。很多人以为这是AMD收购ATI后自顾不暇的关系,其实根本 原因还在于GPU的架构——传统基于3D图形处理的GPU不适合于进行大规模并行计算,AMD的GPU拥有恐怖的理论运算能力却无从释放。而NVIDIA 则从G80时代完成了华丽的转身,逐步完善了硬件和软件的协同工作,使得GPU成为高性能计算必不可少的配件。
e$+f~~K %_R|@cyD Xe3z6 A='+tJa 俗话说的好:苦海无涯、回头是岸,亡羊补牢、为时不晚。AMD终于在代号为Southern Islands(南方群岛)的新一代GPU中,启用的全新的架构,AMD称之为“Graphics Core Next”(GCN,次世代图形核心),并冠以革命性的称号。这是AMD收购ATI之后的近5年来第一次对GPU架构进行“伤筋动骨”的“手术”,而架构 调整的核心内容则是为并行计算优化设计。
d3=6MX[c f@Rpb}zg+C 那AMD的“次世代图形核心”相比沿用了五年之久的架构到底有何改进?其并行计算性能相比对手NVIDIA有无优势?3D游戏性能会否受到影响呢?本文将 为大家做一个全方位的解析,文中会穿插一些3D渲染原理以及显卡基础知识,并谈谈GPU图形与计算的那些事儿……
&Dg)"Xji 9#T%bB"J 成也微软败也微软:XBOX360阻碍显卡/游戏发展 l&??2VO/t )
~)SCN>- 微软的DirectX 9.0C是一个神奇的图形API,自2004年首款DX9C显卡GeForce 6800 Ultra问世以来,至今已有将近8年时间,之后虽然微软发布了DX10、DX10.1、DX11、还有现在的DX11.1等多个新版本,但DX9C游戏 依然是绝对主流,DX10以后的游戏全部加起来也不过几十款而已!
/z)3gsF h9BD
^j 因此,当年的DX9C显卡之战,很大程度上决定了此后很多年的显卡研发策略。从最开始X800不支持DX9C对抗6800失利,到X1800支持DX9C 却性能不济,再到X1900登上顶峰,还有半路杀出来XBOX360这个程咬金,ATI被AMD收购前的经历犹如过山车般惊险刺激!
pG F5aF7T AK
s39U' [zTYiNa ^o6)[_L DXC如此长寿的原因,相信游戏玩家们已经猜到了,那就是游戏主机太长寿了——微软XBOX360以及后来索尼PS3使用的GPU都是DX9C时代的产 品。游戏开发商的主要盈利来源在主机平台,所以根本没心思把PC游戏做好,尤其对提高PC游戏的画面及引擎优化提不起兴趣,个别以高画质而著称的PC游戏 倍受打击,很多DX10游戏续作倒退到DX9C就是很好的证明。
Bw]L2=d .W@4vrp@ 可以说,这么多年来PC 3D游戏图形产业的发展,成也微软、败也微软。
HEB/\ ;;w6b:}-c =SK+\j$ "gbnLKs XBOX360的GPU——Xenos,由ATI设计
Fi?Q
4b *0&4mi8 *pb:9JKi 3:~l2KIP4 Xenos的核心架构图
9oje`Ay >^H'ZYzw 微软XBOX360的成功,给GPU供应商ATI发出了一个信号,那就是今后N年内的游戏都将基于XBOX360的硬件而开发。当时ATI与Xenos同 时研发的一颗GPU代号为R580,俩者拥有相似的架构,而R580在当年也成为DX9C显卡的王者,这就让ATI更加坚定了维持现有架构不变的决心。
(U(/C5' Z.aLk4QO@ 从X1900XTX谈起:用3:1黄金架构做计算 ]D?# \| 9QOr,~~s 下面我们就来看看R580的核心架构,也就是当年的王者X1900XTX/X1950XTX所使用的GPU,后来次高端RV570核心(X1950Pro)的架构也类似。
bQXc IIa{ xgtJl}L cVB|sYdf M2;%1^ R580:8个顶点着色单元、48个像素着色单元、16个纹理单元
'Vm5Cs$ !v-w6WG" DX9C显卡还没有统一渲染架构的概念(XBOX360的Xenos是个特例),所以R580依然是顶点与像素分离式的设计。当时的GPU核心部分被称为 管线,比如7800GTX拥有24条像素渲染管线,但X1900XTX却不能称为拥有48条像素渲染管线,因为它的像素与纹理单元数量不对等。
i?a,^UM5n[ 1#>&p%P! GPU的工作原理:
rq<`(V'2 q ab)
1ft Ws^+7u Mt[Bq6}ZD 显卡的渲染流程是通过顶点单元构建模型骨架,纹理单元处理纹理贴图,像素单元处理光影特效,光栅单元负责最终的像素输出。
BN\fv, H5AK n*'7 GPU的管线是什么? !B [1zE ?jNF6z*M6 在R580之前,GPU的像素单元与纹理单元还有光栅单元是绑定在一起的,数量一样多,整个渲染过程就是流水线作业,因此像素与纹理加起来称为一条管线。
qPXANx<^ hF7V !*5 什么是3:1架构? X"hOHx5P eW%L$I R520核心(X1800XT)的像素与纹理都是16个,但R580核心在纹理单元维持16个不变的情况下,把像素单元扩充了3倍达到了48个之多。 ATI研发工程师发现新一代游戏中使用像素着色单元的频率越来越高,各种光影特效(尤其HDR)吃掉了像素着色单元的所有资源,而纹理单元的负载并不高, 继续维持像素与纹理1:1的设计就是浪费资源,于是ATI根据3D游戏引擎的发展趋势做出了改变,并把R580这种不对等的架构称之为3:1黄金架构,管 线的概念至此消失。
~:/%/-^ W>p\O9BG LKR= =;qn 3AdP^B< 像素(算数)与纹理的比例逐年提高
%r M-"6Q JdaFY+f: 当年ATI前瞻性的架构在部分新游戏中得到了应验,比如在极品飞车10、细胞分裂4、上古卷轴4等游戏中X1900XTX的性能远胜7900GTX。此外ATI专为HDR+AA优化的架构与驱动也让ATI风光无限。
",~ b2]ym 6-*~t8 但事实上,从1:1大跃进到3:1有点太激进了,在包括新游戏在内的绝大多数主流游戏中,都无法充分利用多达48个像素着色单元的能力。于是ATI的工程 师们又有了新的想法:何不用这些像素单元来做一些非图形渲染的计算呢?像素单元的核心其实就是ALU(算术逻辑单元),拥有十分可观的浮点运算能力。
O%YjWb \g~ws9'~ 蛋白质折叠分布式计算开启GPU计算大门: 4r_!>['`" W:VW_3 Nl~Z,hT$* =gW"#ZjL){ 2006年9月,在X1900XTX发布半年之后,ATI与斯坦福大学相关科研人员合作,开发了首款使用GPU浮点运算能力做非图形渲染的软件——Folding @ Home第一代GPU运算客户端。
H/^~<U#p ((-aC` %$/=4f.j DgDSVFk
~ Folding@home是一个研究蛋白质折叠、误折、聚合及由此引起的相关疾病的分布式计算工程。最开始F@H仅支持CPU,后来加入了对PS3游戏机的支持,但同样是使用内置的CELL处理器做运算。F@H因ATI的加入为GPU计算翻开了新的一页,当然F@H加入了对NVIDIA DX10 GPU的支持那是后话。
*4|9&PNLE J*}VV9H 什么是通用计算? r@|R-Binz ,]f) ,;= 当时的GPU计算被称为GPGPU(General Purpose GPU),传统的图形处理器可以被用来做通用目的计算项目。所谓通用计算的大体流程就是:待处理的数据—〉转换成图形数据—〉GPU处理—〉处理后的图形 数据—〉转换成所需数据。其实通用计算就是把数据转换为GPU能够“看懂”的图形数据,实际上是作为虚拟硬件层与GPU通讯,由于需要前后两次编译的过 程,因此想要利用GPU强大的浮点运算能力,需要很强大的编译器,程序员的开发难度可想而知,CPU的运算量也比较大。
e.h~[^zg h^%GE;N [img]http://news.mydrivers.com/img/20120106/11100133.jpg[/img]
D",A$(lG *w=z~Jq^R" 除了蛋白质折叠分布式计算外,当年ATI还开发了AVIVO Video Converter这款使用GPU加速视频转码的小工具,虽然效果一般,但也算是开了个好头。
AiY|O S3R a;56k 虽然GPU通用计算的实现难度很大,但至少GPU实现了非图形计算的目的,而且其性能确实要比当时的CPU快十几倍。小有所成的ATI被胜利冲昏了头脑, 他们认为自己研发出了最先进的、最有前瞻性的GPU架构,还找到了让GPU进行通用计算的捷径、还有了AMD这座靠山……最终促使AMD-ATI做出了保守的决定——下代GPU继续沿用R580的架构,不做深层次的改动。
>oe4mW GMEw HD2900XT走向不归路:超长指令集的弊端 0FG5_t"",\ j'k8^*M6 R520->R580的成功,多达48个着色单元功不可没,这让ATI对庞大的ALU运算单元深信不疑。ATI认为只要继续扩充着色单元,就能满足新一代DX10及Shader Model 3.0的要求。
Xf6fH O dj3|f{kg{ 着色单元的结构: ''_,S,.a20 Er`TryN|} 在图形处理中,最常见的像素都是由RGB(红黄蓝)三种颜色构成的,加上它们共有的信息说明(Alpha),总共是4个通道。而顶点数据一般是由XYZW 四个坐标构成,这样也是4个通道。在3D图形进行渲染时,其实就是改变RGBA四个通道或者XYZW四个坐标的数值。为了一次性处理1个完整的像素渲染或 几何转换,GPU的像素着色单元和顶点着色单元从一开始就被设计成为同时具备4次运算能力的运算器(ALU)。
)qbI{^_g ~@xT]D!BQ [img]http://news.mydrivers.com/img/20120106/11100134.jpg[/img]
U%Dit ~GSpl24W< 数据的基本单元是Scalar(标量),就是指一个单独的值,GPU的ALU进行一次这种变量操作,被称做1D标量。由于传统GPU的ALU在一个时钟周期可以同时执行4次这样的并行运算,所以ALU的操作被称做4D Vector(矢量)操作。一个矢量就是N个标量,一般来说绝大多数图形指令中N=4。所以,GPU的ALU指令发射端只有一个,但却可以同时运算4个通 道的数据,这就是SIMD(Single Instruction Multiple Data,单指令多数据流)架构。
)i&%cyZw )y6QAp [img]http://news.mydrivers.com/img/20120106/11100136.png[/img]
=\M)6"}y} 3b#L17D3_ R580的Shader单元结构
>g=^,G}y yU *u 显然,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在矢量处理方面高效能的优势将会被损失殆尽。
&xgZFSq eUYZxe :6 DX10时代,混合型指令以及分支预测的情况更加频繁,传统的Shader结构必须做相应的改进以适应需求。NVIDIA的做法是将4D ALU全部打散,使用了MIMD(Multi Instruction Multiple Data,多指令多数据流),而AMD则继续沿用SIMD架构,但对Shader微架构进行了调整,称为超标量架构。
2>g^4( 6j_ 678 R600的5D超标量流处理器架构: 9p5= _ iA]DE`S [img]http://news.mydrivers.com/img/20120106/11100139.jpg[/img]
%yeu" 6Ux[,]GK 作为ATI的首款DX10 GPU,架构上还是有不少改进的,DX10统一渲染架构的引入,让传统的像素渲染单元和顶点渲染单元合二为一,统称为流处理器。R600总共拥有64个 Shader单元,每个Shader内部有5个ALU,这样总计就是320个流处理器。
`4_c0q)N4 nQ|GqU\oA [img]http://news.mydrivers.com/img/20120106/11100142.jpg[/img]
?fB5t;~E L,#^&9bHa# R600的Shader单元结构
L"4]Tm>zq ;3mL^ R600的Shader有了很大幅度的改进,总共拥有5个ALU和1个分支执行单元,这个5个ALU都可以执行加法和乘加指令,其中1个"胖"的ALU除了乘加外之外还能够进行一些函数(SIN、COS、LOG、EXP等)运算,在特殊条件下提高运算效率!
^s=*J=k
\/n+j! [img]http://news.mydrivers.com/img/20120106/11100143.jpg[/img]
f#1/}Hq/I /\d(c/, 4 与R580不同的是,R600的ALU可以在动态流控制的支配下自由的处理任何组合形式的指令,诸如1+1+1+1+1、2+2+1、2+3、4+1等组 合形式。所以AMD将R600的Shader架构称作Superscalar(超标量),完美支持Co-issue(矢量指令和标量指令并行执行)。
kY=rz&?U {aoMJJq R600超长指令集的弊端: l(#1mY5!q8 -'j7SOGk 从Shader内部结构来看,R600的确是超标量体系,但如果从整个GPU宏观角度来看,R600依然是SIMD(单指令多数据流)的VLIW(超长指 令集)体系:5个ALU被捆绑在一个SIMD Shader单元内部,所有的ALU共用一个指令发射端口,这就意味着Shader必须获得完整的5D指令包,才能让内部5个ALU同时运行,一旦获得的 数据包少于5条指令,或者存在条件指令,那么R600的执行效率就会大打折扣。
v_.HGGS Oc#>QZ3 例如:指令一:a=b+c;指令二:d=a*e。这两条指令中,第二条指令中的a必须等待第一条指令的运算结果,出现这样的情况时候,两条指令大多数情况下就不能实现超标量执行了。
J||E;=%f-Q 7H4L-J3 显然,想要完整发挥R600的性能必须满足苛刻的条件,这个条件不仅对驱动和编译器提出了额外的要求,而且要求程序必须让条件指令不存在任何关联性,难度可想而知。最终结果就是绝大多数情况下R600都无法发挥出的理论性能,而且其执行效率会因为复杂指令的增多而不断下降。
*<7l!# Q<1L`_.> HD4870的救赎:暴力扩充流处理器 F.68iN} rmsQt
HD2900XT的失败来自于很多方面,GPU核心架构只是冰山一角,就算保守的AMD沿用了DX9C时代的老架构,性能也不至于如此不济。但无奈GPU 架构已经定型,短期内是无法改变了,HD2000和HD3000一败涂地,AMD咬牙硬抗了两年之久。就在大家为R600的架构争论不休,大谈VLIW指 令集的弊端有多么严重时,AMD终于迎来了翻身之作——RV770核心。
7|Xe&o<n pcnl0o~ RV770核心:暴力扩充流处理器 =MxpH+spI "-P/jk RV770相比R600/RV670,核心部分依然没有任何变化,沿用了之前的Shader单元设计,只是将数量扩充了2.5倍,流处理器达到了800个之多!
V3Yd&HVWNQ nZxSMN0] [img]http://news.mydrivers.com/img/20120106/11100147.jpg[/img]
?~Pv3'%d 6Kp}_^|z RV670/R600是4组SIMD,每组16个Shader,每个Shader 5个流处理器;RV770是10组SIMD,每组16个Shader,每个Shader 5个流处理器。流处理器部分直接扩充了2.5倍!
F_v-}bbcFQ @y5= J`@= 虽然对流处理器部分没有改动,但AMD对流处理器以外的几乎所有模块都进行了改进,从而使得性能和效率有了质的提升,具体改动如下:
x)_r@l`$ix sBU_Ft 抗锯齿算法改变,性能大幅提升 6A?8tm/0 ]+ZM/'X 纹理单元和光栅单元部分,和流处理器一样都是数量翻了2.5倍,但值得一提的是,抗锯齿算法已经由R600/RV670的流处理器部分转移至光栅单元部分,因此RV770的AA效率大幅提高,一举超越了N卡重现X1000时代的辉煌,这也就是RV770表现令人惊异的主要原因。
ke\[wa_!6b gHZqA_*T8U [img]http://news.mydrivers.com/img/20120106/11100154.jpg[/img]
Y&5.9 s@' Mb.4J2F ? 在纹理单元与显存控制器之间设有一级缓存,RV770核心相比RV670,L1 TC容量翻倍,再加上数量同比增加2.5倍,因此RV770的总L1容量达到了RV670/R600的五倍之多!
Yz\
N&0" p?kvW42/ 放弃环形显存总线,改用交叉总线 `;cz;" {[P!$
/ RV770还放弃了使用多年的环形显存总线,估计是因为高频率下数据存取命中率的问题,回归了交叉总线设计,有效提高了显存利用率,并节约了显存带宽。还有GDDR5显存的首次使用,瞬间将显存位宽翻倍,256Bit GDDR5的带宽达到了当时N卡512Bit GDDR3的水平。
vY_eDJ~' -?z\5z 总的来说,虽然流处理器部分没有做改动,但RV770的非核心架构部分有了很大的改良,上代产品许多设计失误得到了纠正,在流处理器数量暴增运算能力大大加强的情况下,消除了功能模块的瓶颈,从而使得性能有了大幅改进。
QZ~0o7 3ev -Iqz VLIW并未降低3D效率,只是妨碍了GPU计算 zSXA=
"mA1H]r3 HD4870/HD4850打了一场漂亮的翻身仗,也让唱衰VLIW的人看傻了眼,之前大家普遍认为R600/RV670失败的主要原因是VLIW的低下 效率,事实证明VLIW并没有错,其效率问题并没有严重到失控的地步,毕竟DX9C游戏还是主流,顶点与像素操作指令还是大头。AMD只是错误的判断了抗锯齿的算法和效率,导致第一代DX10 GPU性能不如预期。
qnXTNs
?b >vAN(3Idu 但最关键的问题不在3D游戏性能方面,AMD对GPU并行计算依然没有投入足够多的重视,AMD一方面在鼓吹自家Stream通用计算并不输给CUDA, 各种商业软件未来将会加入支持,另一方面GPU架构未做任何调整,API编程接口支持也举步维艰。结果就是Stream软件无论数量、质量、性能还是发布时间都要远远落后于CUDA软件。
~b6GrY"vB O:YJ%;w HD5870的辉煌:在错误的道路上越走越远 =?/&u< SY T$3|a R600的失败让AMD明白了一个道理:从哪跌倒要从哪爬起来;RV770的成功让AMD坚信:我们的架构是没有问题的,以前的失败只是一个小小的失误,R600的架构前途无量,应该加快脚步往前冲……于是乎RV870诞生了。
>f@ G>H)+ \=fh-c(J, 如果说RV770是翻身之作,那么RV870(Cypress)就是反攻之作,AMD抢先推出DX11显卡,在NVIDIA GF100陷入大核心低良率的泥潭时,大举收复失地。
PIxjM> 4.w"(v9 V RV870是AMD近年来最成功的一颗GPU核心,但它的成功是拜NVIDIA的失误所赐,RV870核心本身可以说是毫无新意,因为它完全就是 RV770的两倍规格,除了显存控制器以外的所有模块统统翻倍,AMD沿用RV770暴力扩充流处理器的路线,继续提高运算能力,抢滩登陆DX11。
U=QA e |r !G, [img]http://news.mydrivers.com/img/20120106/11100158.jpg[/img]
yWY|]Pp M*`hDdS RV870核心架构图
FM\[]. V|: qow:F 把RV870与RV770的架构图放一起的话,可以发现其外围周边模块几乎完全相同,而流处理器部分是一分为二的设计,其中的一半正好就是RV770的规格。
H=<LutnZ Y.-S=Y 除了加入DX11、ShaderModel 5.0的支持,赋予Eyefinity 6屏输出的功能外,RV870与RV770相比并没有本质改进。
EO:avH.*0 ix*muVBj. 既然流处理器部分还是维持R600的设计,那就不用期待它在并行计算方面能有什么改进。AMD依然我行我素的在搞通用计算,支持的软件还是那么几款。 RV870理论浮点运算能力再创新高,但却没什么人用,中国最强的超级计算机天河一号曾经使用的是HD4870X2,但后来升级成天河一号A之后改用了NVIDIA的Tesla,就是活生生的例子。
K*+6`z#fMF [K:29N9~4 HD6870的一小步:双超线程分配处理器 t!qwxX*$T QBihpA1; 也许有人会问,如此暴力的扩充流处理器规模而不更改架构,R600架构会成为AMD的常青树吗?难道不会有什么瓶颈吗?当然会有,AMD也发现了,所以从 HD6000系列开始又进行了一轮架构的微调,透过AMD架构微调这一结果,我们可以了解出现问题原因到底是什么?
vRr9%zx I`^Y Abnb HD6870的一小步:两个超线程分配处理器 {[^#h|U Uk'U?9O Barts核心的HD6870率先问世,这颗核心定位中端,所以流处理器从Cypress的1600个精简到了1120个,流处理器结构依然没有任何变化,但是前端控制模块一分为二:
S>t>6&A niWx^gKb$ [img]http://news.mydrivers.com/img/20120106/11100161.jpg[/img]
J-XTN"O k|B2@{ 相信大家应该注意到了,以往AMD的SIMD架构则是整颗GPU共享单一的控制单元,自R600以来都是如此。
u)~s4tP4 lT,+bU [img]http://news.mydrivers.com/img/20120106/11100164.jpg[/img]
39D } 8x{Hg9 Cypress的单一图形装配引擎
Uw <{i c-*2dV[@ 但随着晶体管规模和流处理器数量的迅速膨胀,单一的控制单元已经无法满足大规模并行指令分配的需要,因此从Cypress开始,AMD采用了“双核心”的设计,将SIMD阵列一分为二,也就是类似于NVIDIA GPC的设计。与此相对应的,图形装配引擎虽然只有一个,内部却设计了两个Hierarchical Z(分层消影器)和Rasterizer(光栅器),但是其它的特殊功能模块均只有一个。
(h,Ws-O QO,+ps< Barts和Cypress一样,依然保持了双核心设计,图形引擎也只有一个,内部的功能模块并没有太多变化。但是Ultra-Treaded Dispatch Processor(超线程分配处理器)却变成了两个,相对应的,超线程分配处理器的指令缓存也变成了两份。
i0ybJOa4 }0{B [img]http://news.mydrivers.com/img/20120106/11100165.jpg[/img]
AP w6 e{!vNJ0` Barts的图形装配引擎
r/PKrw sC 2C1+_IL 我们知道,Barts的流处理器数量是Cypress的70%,按理说线程分配压力有所下降,那么设计两个线程分配处理器的目的只有一个,那就是提升效率。在DX11时代,几何着色再加上曲面细分单元引入之后,图形装配引擎会产生更多的并行线程及指令转交SIMD进行处理,因此指令派发效率成为了新的瓶 颈。
c#pj :f*H XA3s],Rk SIMD架构的优势就是可以用较少的晶体管制造成庞大的流处理器规模,拥有恐怖的理论运算能力;但缺点就是流处理器执行效率比MIMD架构低,其效率高低完全依赖于分配单元的派发效率。因此Barts这种双线程分配处理器的设计意义重大。
Dl A Z"C K\^&+7&zVg 双超线程分配处理器的意义:曲面细分性能翻倍 &yLc1#H _9kIRmT{ HD6000系列可以说是半代改进的架构,既然数量上维持不变,就只能从改进效率的方面考虑了。而改进的内容就是加强线程管理和缓冲,也就是“双倍的超线程分配处理器和指令缓存”。
j@ v-| 2 ~-( A [img]http://news.mydrivers.com/img/20120106/11100167.jpg[/img]
w1i?#!| 4bI*jEc\[ 根据AMD官方提供的数据来看,HD6870的曲面细分性能最多可达HD5870的两倍,这种情况出现在10级左右的中等细分程度,当曲面细分达到20级以上的时候,那么它们的性能就基本上没有区别了。
F$yeF^\g . r`[ 由此可见,Barts核心当中的Tessellator单元本身在性能方面应该没有改进,其性能提升主要源于两颗超线程分配处理器。中等级别的曲面细分在 指令分配方面是瓶颈,Barts改进的架构消除了这一瓶颈,所以性能提升十分显著,但如果细分级别特别高时,Tessellator本身的运算能力将成为瓶颈,此时线程派遣器的效率再高,也无济于事。
^'W%X v}P!HczmMP 看起来,AMD迫切的想要改进指令派发效率,以满足庞大规模流处理器的胃口,并且有效的提升备受诟病的曲面细分性能。AMD的做法就是继续保持现有架构不变,发现瓶颈/缺陷然后消除瓶颈/缺陷,这让笔者想起了一段老话:“新三年旧三年,缝缝补补又三年”。
E}$V2ha0zu {^m5#f 0" HD6970昙花一现:北方群岛5D改4D返璞归真 sTOFw;v% bl.EIyG> 相信有些读者很早就想问这样一个问题了:既然图形渲染的主要指令是4D矢量格式,那为什么R600要设计成5D的流处理器结构呢?还沿用了5代之久?有结果就有原因,通过对Cayman核心的分析,我们可以找到答案。
U~/ID b:Dg}
R600为什么是5D VLIW结构? (\&
62B1 SRWg[H 在5D VLIW流处理器中,其中的1个比较“胖”的ALU有别于其它4个对等的ALU,它负责执行特殊功能(例如三角函数)。而另外4个ALU可以执行普通的加、乘、乘加或融合指令。
or.\)(m#( o#}mkE87 [img]http://news.mydrivers.com/img/20120106/11100170.jpg[/img]
}
07r <Uwwux<v Barts核心的流处理器结构
s<VJ`Ur oHsP?%U 从R600开始的Shader是4D+1D的非对等设计,ATI这样做的目的是为了让顶点着色器更有效率,以便能同时处理一个4D矢量点积(比如w、x、y、z)和一个标量分量(比如光照)。
PL@7KDQ XhA4:t Cayman核心返璞归真,改用4D结构 $W, zO|- Z =
ik{/ 随着DX10及DX11大行其道,AMD通过自己长期内部测试发现,VLIW5架构的五个处理槽中平均只能用到3.4个,也就是在游戏里会有1.6个白白 浪费了。显然,DX9下非常理想的VLIW5设计已经过时,它太宽了,必须缩短流处理器单元(SPU),重新设计里边的流处理器(SP)布局。
0WXVc FG#nap{ [img]http://news.mydrivers.com/Img/20120106/2012010611145478.png[/img]
vJThU$s- rKIRNc#d Cayman核心的流处理器结构
fTgbF{?xh +{*)}[w{x 于是Cayman核心诞生了,胖ALU下岗,只保留了剩下4个对等的全功能ALU。裁员归裁员,原来胖ALU的工作还得有人干,Cayman的4D架构在执行特殊功能指令时,需要占用3个ALU同时运算。
?i%nMlcc r=\P!`{5 5D改4D之后最大的改进就是,去掉了体积最大的ALU,原本属于它的晶体管可以用来安放更多的SIMD引擎,据AMD官方称流处理器单元的性能/面积比 可以提升10%。而且现在是4个ALU共享1个指令发射端口,指令派发压力骤减,执行效率提升。双精度浮点运算能力也从原来单精度的1/5提高到了1 /4。
JMePI%#8 A^L?_\e6 效率更进一步:双图形引擎 6sy,A~e H &fTh 前面介绍过,从RV770到Cypress核心,图形引擎和超线程分配处理器都只有一个,但图形引擎内部的Hierarchical Z(分层消影器)和Rasterizer(光栅器)分为两份。
nX 8B;*p6b }5hZo%w[n 到了Barts核心,超线程分配处理器从一个变成两个。现在的Cayman核心则更进一步,图形引擎也变成了两个,也就是除了分层消影器和光栅器外,几何着色指令分配器、顶点着色指令分配器、还有曲面细分单元都变成了两份:
D6:DrA: )Y8qWJU [img]http://news.mydrivers.com/Img/20120106/2012010611145484.png[/img]
#G~wE*VR$ 3P`WPph 两个曲面细分单元再加上两个超线程分配处理器,AMD官方称HD6970的曲面细分性能可以达到HD6870的两倍、HD5870的三倍。其它方面比如顶点着色、几何着色性能都会有显著的提升。
s9 &)Fv-#V <M305BH 通用计算效能也有改进 /N%zwj/* Hh\
4MNl 和Cypress、Barts相比,Cayman在通用计算方面也有一定程度的改进,主要体现在具备了一定程度的多路并行执行能力;双路DMA引擎可以同 时透过外部总线和本地显存读写数据;改进的流控制提高了指令执行效率和运算单元浪费;当然双精度运算能力的提高对于科学计算也大有裨益。
PJ;.31u :mn(0
R~ 不过,这些改进都是治标不治本,VLIW架构从5D到4D只是一小步,只能一定程度上的提高指令执行效率,而无法根治GPU编程困难、复杂指令和条件指令 的兼容性问题。总的来说,Cayman核心依然只是单纯为游戏而设计的GPU,AMD把5D改为4D也是基于提升3D渲染性能的考虑。
$E @ouX? 8W@dtZ,d GPU的一大步:NVIDIA G80图形架构解析 ?-S8yqe OQ,}/ AMD的GPU架构介绍了这么多,对于其优缺点也心知肚明了,之前笔者反复提到了“效率”二字,其参照物当然就是NVIDIA的GPU,现在我们就来看看NVIDIA的GPU架构有什么特点,效率为什么会比较高?为什么更适合并行计算?
X&.:H~xS+ GI?PGAT SIMD效率不高的根本原因 6N?#b66 ?N`qLGRm 无论AMD怎么调整架构,5D还是4D的结构都还是SIMD,也就是这4-5个ALU要共用一个指令发射端口,这样就对GPU指令派发器提出了很高的要 求:如果没有把4-5个指令打包好发送到过来,那么运算单元就不会全速运行;如果发送过来的4-5个指令当中包含条件指令,但运行效率就会降至连50%都 不到,造成灾难性的资源浪费。
]2PQ X4t0 ETxp#PZ 解决方法也不是没有,但都治标不治本,需要对游戏/程序本身进行优化,尽量避免使用标量指令、条件指令和混合指令,驱动为程序专门做优化,难度可想而知。
@wMQC\Z },v&rkwR 而治本的方法就是抛弃SIMD架构,从源头上解决指令组合预分配的问题。
F$[)Bd /" W
w^7^q& G80革命性的MIMD架构 dDo6fP2 6N&|2: U NVIDIA的科学家对图形指令结构进行了深入研究,它们发现标量数据流所占比例正在逐年提升,如果渲染单元还是坚持SIMD设计会让效率下降。为此 NVIDIA在G80中做出大胆变革:流处理器不再针对矢量设计,而是统统改成了标量ALU单元,这种架构叫做MIMD(Multiple Instruction Multiple Data,多指令多数据流)
z>7=k`x`: w"BIv9N [img]http://news.mydrivers.com/img/20120106/11100173.jpg[/img]
\FVNXUMU tg3zXJ4k_ G80核心架构,每个流处理器就是一个标量ALU
z+ uL "PG[ qg|Ox*_od" 如此一来,对于依然占据主流的4D矢量操作来说,G80需要让1个流处理器在4个周期内才能完成,或者是调动4个流处理器在1个周期内完成,那么G80的执行效率岂不是很低?没错,所以NVIDIA大幅提升了流处理器工作频率(两倍于核心频率),扩充了流处理器的规模(128个),这样G80的128个标量流处理器的运算能力就基本相当于传统的64个(128×2?)4D矢量ALU。大家应该知道R600拥有64个5D矢量ALU,最终的性能G80要远胜 R600。
?THa5%8f [#IBYJ.6 当然这只是在处理4D指令时的情形,随着图形画面越来越复杂,1D、2D、3D指令所占比例正在逐年增多,而G80在遇到这种指令时可说是如鱼得水,与 4D一样不会有任何效能损失,指令转换效率高并且对指令的适应性非常好,这样G80就将GPU Shader执行效率提升到了新的境界!
KM 5jl9Vv Qg[heND MIMD架构的劣势 7&h\l6}Yh
d3og?{i<}&
6={IMkmA 1>hb-OMX G80的架构听起来很完美,但也存在不可忽视的缺点:根据前面的分析可以得知,4个1D标量ALU和1个4D矢量ALU的运算能力是相当的,但是前者需要 4个指令发射端和4个控制单元,而后者只需要1个,如此一来MIMD架构所占用的晶体管数将远大于SIMD架构!
akMJ4EF/ gAj0ukX5 所以AMD的SIMD架构可以用较少的晶体管造出庞大数量的流处理器、拥有恐怖的理论浮点运算能力;而NVIDIA的MIMD架构必须使用更多的晶体管制 造出看似比较少的流处理器,理论浮点运算能力相差很远。双方走的都是极端路线,AMD以数量弥补效率的不足,而NVIDIA以效率弥补数量的劣势。
o1Ne+Jt cD5w| rm?i 真正的并行计算架构:GT200只为计算优化 vf6`s\6 9z+vFk` G80的MIMD架构开了一个好头,128个流处理器虽然听起来虽然没有AMD 320个那么多,但这些流处理器是可以媲美真正的CPU核心,在执行任何指令时都能发挥出接近理论值的性能,这样高效率的核心如果只是用来玩游戏岂不太可惜了?
vz- 9<w;>a Ob7zu"zr 于是在游戏市场大获全胜的NVIDIA并没有止步于此,而是将目光放在了更长远的高性能计算领域,一边着手开发基于GPU计算的应用程序中间件,帮助程序 员以更高效的方式开发基于GPU硬件加速的软件,另一方面在G80的基础上继续优化核心架构,将MIMD架构高效率的优势发挥到极致!
p@vpd =sxkr ih GT200核心:真正的并行计算架构 LFl2uV" @8QFP3\1 G80依然只是为DX10 3D渲染而设计的,虽然MIMD架构本身能够胜任并行数据计算的需要,但NVIDIA发现图形架构还有继续改进的余地,只要在核心内部设计全新的控制模块,并对微架构进行专门的优化,就能将GPU的图形架构改造成更加适合非图形领域的并行数据处理架构。
(qJIu Rk}\)r\ [img]http://news.mydrivers.com/Img/20120106/2012010611155854.jpg[/img]
D% oueW n/xXQ7y 第一代统一渲染架构的主要目的是把原本像素着色、顶点着色以及新增的几何着色,统一交给流处理器来处理。而NVIDIA的GT200核心则被称为第二代统 一渲染架构,其主要含义就是将图形处理架构和并行计算架构完美的结合起来,成为一颗真正意义上的通用处理器,超越图形处理器的概念!
qi(&8in ~u};XhZ [img]http://news.mydrivers.com/img/20120106/11100175.jpg[/img]
>Dk1axZ!>/ Tnf&pu#5 GT200相对于G80,不止是把流处理器数量从128个扩充到240个这么简单,其实最关键之处是对TPC(线程处理器簇)和SM(流处理器簇)的改进:
=g/4{IL% `Q:de~+AM{ 新增Atomic原子操作:透过原子操作,硬粒化之后的线程操作管理将更加 有序和具体,这也就意味着像素或者其他类型如通用计算应用的Thread的生成、仲裁、泵送、内存位置确定和执行过程都将变得更加精确和高效,Atomic单元和原子操作的引入也为未来NVIDIA构架最终实现并行化设计起到了关键的先导作用。
DxE(9j J>&[J!>r 每个SM可执行线程上限提升:G80/G92核心每个SM(即不可拆分的8核心流处理器)最多可执行768条线程,而GTX200核心的每个SM提升至1024条,而且GTX200拥有更多的SM,芯片实力达到原来的2.5倍!
z`c%?_EK yb[{aL^4% [img]http://news.mydrivers.com/img/20120106/11100176.jpg[/img]
s.f`.o N<p5p0 每个SM的指令寄存器翻倍:GTX200与G80核心在SM结构上基本相同的,但功能有所提升,在执行 线程数增多的同时,NVIDIA还将每个SM中间的Local Memory容量翻倍(从16K到32K)。Local Memory用于存储SM即将执行的上千条指令,容量增大意味着可以存储更多的指令、超长的指令、或是各种复杂的混合式指令,这对于提高SM的执行效能大 有裨益。
eL<m.06cfY ~C%2t{" DX10游戏会越来越多的使用复杂的混合式Shader指令,一旦排队中的超长指令溢出或者在N个周期内都排不上队,那么就会造成效率下降的情况,此时双倍寄存器容量的优势就体现出来了。由于Local Memory并不会消耗太多晶体管,因此将其容量翻倍是很合算的。
1,m\Q_ 1[26w_B3 纹理单元数量提升,比率下降,达到了ATI当年鼓吹的3:1水平
,Y`'myL8W M' &J_g [img]http://news.mydrivers.com/img/20120106/11100178.jpg[/img]
2 9&sydu GwTT+ 其它改进还有:
几何着色性能提升,提高双指令执行(Dual-Issue)效率,达到93%-94%之多,支持双精度64Bit浮点运算,运算能力为单精度的1/8。 AQE
eIFH (J6"
; 综合来看,GT200除了流处理器、纹理单元、光栅单元这些硬货数量增多对游戏性能大有裨益以外,其它细节部分的优化跟游戏关系不大。因为GT200是为 并行计算而设计的,从GT200开始,GPU计算变得更加实用和普及,NVIDIA的Tesla开始进入科学实验室,并杀进超级计算机市场。
r~8D\_=s h`z2!F4 DX11与并行计算的完美结合:GF100/110的野心 ck(CA(_ 59&T