|
    
- UID
- 107530
- 帖子
- 7514
- i贡献值
- 41 点
- We用劵
- 0 张
- 注册时间
- 2006-3-14
- 最后登录
- 2009-11-7
|
当然是基于现在已经公开的资料之上的评价 :p 1 X1 O+ e- l, W* {
I \' ^0 @/ y2 z. K$ `- u/ X
本来我是想只写自己看法的,但为了照顾一些初级GZer,带上了比较长的解释,请各位老大自行跳过就是 :) 0 V- x1 S1 z4 n1 I3 N; E3 H" G
* ]$ I0 m5 E, _9 WG80架构在我个人看来,根本就不适合游戏) J6 P- R. S; ?" [' u
( y' `: G' u7 c& J2 M
个人认为,对于图形渲染,如果只考虑效率,G80当然是最好的体系。但效率不等于效能,效能是综合个方面因素,尤其是当前半导体工制造艺水平之后的一个综合性的结果,综合从效能上来看,G80并不是最优的体系。也就是说,如果NV需要一款拥有跟G80类似的图形渲染效能的GPU,完全可以用更少的代价(晶体管)办到。我只能猜测,NV这次的野心不只在图形领域。: h/ s/ H9 V; k o; g- v4 F: |
R600相比之下就务实得多,它是一款实实在在为游戏而生的GPU,虽然AMD肯定不会止步于此,诸如CTM之类的一些东西很快就会被推到应用层面,但从目前已经透露的R600架构来看,R600的首要设计目标就是为了3D渲染。让游戏跑得更绚更快是这个架构最主要的任务。# j! L/ Q8 e3 t) X4 r( d% x" S
( P4 n' ^; P" p那么,让我们来稍微详细的看一下G80与R600设计侧重点之间的区别
, w( }1 @. s2 p4 {! j$ {9 P; t5 U( |3 p% W" X/ x
1 u9 `: X |, l9 e: m: I+ d: w+ e F- q
G80与以前的GPU,最大的区别就是标量化渲运算单元和多执行诸架构,这两点是G80最引以为傲的革新,但也是争论最大的改进。8 U9 z- Z9 H1 B* l; b# ~- u( w
/ {# e0 W9 A) p- o; g+ [
所谓标量化(scalar)运算单元,是相对于之前GPU的矢量化(vector)运算单元而言的。- i* S" G7 y* z# O
我们知道,在图形处理中,最常见的像素都是由RGB三种颜色构成的,加上它们共有的信息说明(Alpha),就一共是4个通道。Vertex数据也一般是由x,y,z,w四个坐标构成,这样一共也是4个通道。对3D图形进行渲染,其实就是改变RGBA四个通道或者x,y,z,w四个坐标的数值。所以,为了方便,GPU的基本渲染单元从一开始就被设计为能同时完成一个象素渲染或者几何转换。数据的基本单元是scalar(标量),就是指一个单独的值,GPU的ALU里进行的一次这种变量操作,被称做1D scalar操作。由于GPU的一个ALU在一个时钟周期执行了4次这样的并行的运算,所以ALU的操作被称做4D vector操作,也就是矢量操作。一个vector(矢量)就是n个scalar(标量),一般来说n=4。所以,GPU的ALU指令发射端只有一个,但却可以同时计算4个通道的数据(在GPU上一般是3D+1D),这就是SIMD(单指令多数据流)的意思了。/ s7 G! [* c' ~9 A) E+ y
. B! R6 L; o; G2 R' d% t
对于图形渲染来说,这种SIMD的设计真是再好不过了,因为VS和PS部分进行的大部分运算都是4D vector(3D+1D),它只要用一个指令端口,就能单周期完成4倍的运算量,所以自打GPU诞生开始,基本的运算单元就一直是这种vector SIMD设计。
* ]! w8 L( b) U4 o但G80却打破了这种传统,将最基本运算单元统统改成了scalar,也就是标量ALU。这样对于基本的vector操作,就需要多个周期,或者将它们拆分后用更多的运算单元才能完成。有什么样的东西值得NV这样冒险呢?3 i% |8 Q" v: k% ~) J+ k
! e. E' g$ ?0 U! s0 X4 U! @* I
原来,NV认为,现在的GPU指令,长度并不一致,对于add,mul这样的指令,GPU能单周期完成,但对于诸如sqr这样的复杂指令也需要多个周期才能完成,对于这些需要多个执行周期的指令,过“大”的4D ALU显然“不合算”。而GPU的编译器即使经过大量优化,编译出来的shader也指令也会长短不一,五花八门,操作数既有4D,也有1D、2D、3D。对于通常执行能力为4D的ALU来说,让它跑1D或者2D指令,而由于SIMD天生的单发射端口限制,不可能同时跑两个或多个,而跑一个单周期内它的运算能力就填不饱。这样就很“划不来”了。这就是SIMD的指令并行性问题。在GPU中,如果标量和矢量指令能够并行,比如3D+1D,那么这被称做co-issue。但正如上面所说,面对复杂的shader环境,co-issue不可能是每时每刻都有效的,因此通常的4D ALU在这里就存在一个浪费问题。而对于1D ALU,就不存在上述问题了。如果把1个4D ALU分成4个小的1D ALU放在一起进行图形渲染,因为各自都有自己的指令发射端口和控制资源,所以能保证理论上100%的运行效率。 在G80上,NV率先引入了这种纯标量的渲染单元,所以G80的底层执行单元被称做MIMD(多指令多数据流)架构。
! E1 x3 u S+ Z C G80的每个ALU的计算能力都不强,但它们不存在“浪费”问题,效率很高。然后通过增加运算单元的数量(128SP),提高频率(shader 1.35GHz)来增加运算能力。% N/ K; m$ Y7 D/ x2 N, M
$ T- k4 O, i! d# k$ H% d/ ]" M! Z, i 这样的做法,看上去一切都完美,既有高效率,又有强运算能力,但真的是这样吗?* S9 I3 ^5 O& a X9 A' n
在能够co-issue的程序中,4个1D Scalar ALU与4D Vector ALU的运算能力是一样的,但1D Scalar ALU因为有4个发射端口,4份控制单元,其占用的晶体管数量将远远超过4D Vector ALU。按照EJI的说法,算上ALU的其他辅助资源,4个1D ALU的体积将是1个4D ALU的2-3倍,对于GPU而言,这是一个灾难性的数字。或者有人会说,那无所谓,在运算能力相同的情况下,1D ALU效率高啊。但你是否有想过,与其做一堆庞大臃肿的1D标量ALU,不如干脆用同样的晶体管,做它一半数量运算能力超过它一倍的4D ALU不是更合算! 而实际上,R600就是这么做的...
7 c3 Z% I6 v- h6 t( i) a! q& j5 o) E* V/ d/ b
Q5 d' N5 G0 V3 G6 s1 A- a
再来看G80的多执行诸体系(Multi-Threading)9 Q4 a) e- z; F$ v( o9 d: @% Q+ V$ x
- p0 c6 j% _' z3 z+ F
实际上这个并不能算G80的首创(我觉得,第一块能够真正称得上Multi-Threading的GPU,应该是Nvidia NV40,虽然还很简陋,但它有完善的控制体系和threading资源,整个流水线的工作也通过线程分发器来管理。R4XX只支持SM2.0,也只针对线性shader而设计,纵然它也通过threading来掩盖延迟,但并不能算),但G80却是最完善的Multi-Threading GPU,它有极为庞大的register资源,能维持4096个平行线程(看看你的CPU,4核心QX6700也不过是4线程而已),甚至引入了整数指令集来方便管理。当数据送至G80图形核心的流水线之后,会首先被送入一个叫做Thread Control Unit的地方,相当于G80图形核心整个流水线的仲裁和控制机构。这个类似于处理器的线程管理单元会将所有的着色单元的数据平行的拆成超过4000个平行的Threading(线程),并动态监测整个shader array流水线的工作状况。一旦它发现其下某个着色单元由于等待数据或工作完成而处于闲置状态,就会马上递交一个新的线程供其执行。这样让整个流水线保持极高的运行效率。
: d i% T1 c5 A, q3 Y* T
; M/ H& ]% @1 y 而且,富裕的Threading对于掩盖流水线延迟和动态分支都有极为重要的意义,详细介绍请看Eji兄的这篇文章,字太多不打了。:wacko: http://we.pcinlife.com/thread-506629-1-1.html$ |4 Y) C+ U# t3 @' b$ l' v
, F7 A1 f& U4 N- R4 U, l# o: X
相比之下,R600依然维持512-1024之间的一个Thread数目。0 m: W% d* ?; w$ b4 O( m. v& O
6 e: ]% ~! m# Z; o" B
一直到这里,我们发现Multi-Threading又是一个几乎完美的东西,它对GPU的任何一个部件的效率提升都有帮助,而且给予了GPU克服存储器延迟的力量,那么,我到底要说什么呢?, [8 n9 D2 @. n' f7 E
: o& v" ^. R X) J) ]( a5 k
实际上,跟标量化渲染单元一样,Multi-Threading确实是提高GPU运行效率的好东西,而我认为它的不足之处也跟标量渲染单元一样:实现起来代价太带,将用来实现它的资源花到别的地方,对于游戏来说效果可能更明显。; Y& Z$ a; w+ j( {( A. i+ _6 z/ _
0 t2 l$ \! w' j
想想看吧,我们能从G80如此多的Thread中得到什么?流水线效率?别扯谈了,效率高怎么了,R520具备512threading,低延迟的硬件化线程分配器,支持batch為單位的threading交换,效率还不高?同频下还不照样被200多threading,分配管理体系也不完善,延迟大得多,每threading能抓到的资源也少的G70打得满地找牙。G70不过是多装了8个Pixel Shader而已。不过后来R580 ATI也清醒了,Threading资源没有任何变化,依然是512个,但PS增加3倍,从16到48,现在同频下轮到G71满地找牙了,呵呵。7 B' {2 E+ m! d( h
OK,我知道到这里那些天骄党们回贼心不死,拿R520的分支性能来说事,那么就彻底讲清楚。流水线平行度的问题已经是老生长谈,动态分支(Dynamic Branch)可以用来融合Shader,但不代表其他提高平行度的途径已经完蛋。一个充满分支和跳转的Shader对游戏的帮助理论意义大于实际意义。在3DMark06这种已经有用到相当复杂的Shader的程序中,Dynamic Branch也只是当作调味剂而不是主菜来用的。至于Branch在shadow filter的edge soft中的应用...恩,我想说的是,绝大部分情况下edge所占的部分都不多,而且随着分辨率的提升,这个部分的比例会越来越小。引用RacingPHT兄的话来说,也许我们还得感谢Branch-----它让一个只能跑15FPS的DEMO提速到了30FPS-----虽然它之前能跑300FPS。问题是:Filter一定要这么做吗?我想FEAR的SoftShadow已经给了一个表率。( C9 g5 |. s" L4 u$ J9 `2 q% ?
* K9 z5 y; i' [* e. W7 E7 H9 P. b; E; w# C. M
补上G80 VS R600(传言)的数据对比(统统根据官方材料而订) :huh: & n& m) G' T* T, p
shader吞吐能力: G80 1350MHz*128*3flops(mul+mad并行)=519GFlops VS R600 1000MHz*64*12Flop=(mad+add并行)=768GFlops( @+ P9 }; L; |' J* z7 [
显存带宽: G80 86.4GB/S(384bit GDDR4) VS R600 over140 GB/s (GDDR4 over 1.1GHz)# i6 e4 m/ D, l4 c7 M5 b% G' E
x3 K2 k( X; X+ u; L: \
( A4 q( k% @5 i4 M* I y$ @ c( o! }) { w1 b& w0 C
7 u' Z8 T" d0 m7 z" t
综上所述,G80不可谓不先进,效率不可谓不高,但他面对"暴力"的R600(说得好听点就是“将每一个晶体管都用于游戏”的R600),胜算实在不高。2 I4 S/ L" ]7 O- D
& M9 `1 E$ ], g: t
不过,大家就此认为NV是白痴设计了这么一个过于理想化的架构,就错了。NV从来都是实用至上。这些在游戏里很难被用到的“高级东西”,将会用到哪呢,嘿嘿,我现在打字也打得手痛了,容许我打一下广告,过几天会某网站有一篇文章,虽然并不完全是我写的,但我参与了其中,到时候我再来顶贴 :loveliness:& }: l1 k a# O5 A1 T
. Y( M! c* M8 I; u
[ 本帖最后由 来不及思考 于 2007-1-1 06:42 编辑 ] |
|