返回列表 发帖

PCWatch) G70 & R520等次世代GPU、將Multi-threadin標準化 翻译 by eji

http://pc.watch.impress.co.jp/docs/2005/0713/kaigai198.htm
% M7 x1 Y# y! v) Z0 ]$ Y: ~( J' w3 a, ?5 x6 Q, g
這篇有個有趣的地方,就是第一個R520確實的spec出現了:4 k+ c+ i; I/ |; }6 s
128 way multi-thread。. E% R- k+ n( J' K; j+ c
同樣的算法是C1 (64threads) 的兩倍。8 e1 c* F/ g- b0 v2 B
) x) b8 a/ J$ {. ?& s: Z1 K2 z
這有兩個方向:3 E  N5 }, }& j$ {! n4 \
1 ~$ D$ [( O, v1 ?) a4 |2 q
1. 和C1同樣7 C5 A' J8 N: L
16ALU per bank,然後兩倍大(6bank?)3 }2 T4 b  f" O) s0 A, L7 }
* H! d& P: C* v. `, }! r$ E% V* B
2. 每個bank小很多,
0 `1 }; i- R1 |! `" G3 x8 C所以每個bank可以要在更多thread之間跳,
% j; @/ L4 P: ]) j用來爭取效率。" g* b0 \. a$ a- j
+ |$ _7 {% F4 A
7 `7 h7 O7 x, V- D, M% g
G70 与 R520、下一世代的GPU将Multi-threading列为标准) B! Z0 ~& i! s$ ^
7 r. P5 j4 A4 K+ u7 f! e* R
> NV40/G70视Shader种类而实作不同的Multi-threading。- k. H: n# |+ a- f
8 l3 _; o3 J8 U0 }5 H5 G
目前已知有Multi-Threading的GPU,NVIDIA有NV40系列、G70系列、还有PS3所装载的RSX。) E/ {0 |" Y$ h
ATI的化则有次世代GPU的R520。不过Multi-threading并不是GPU两强的独占技术,而是整个业界的趋势。比方说S3 Graphics的次世代产品「Destination」等,也提到会实装类似的Multi-threading技术。看来,未来的GPU而言Multi-threading将会成为标准功能吧。  c& B6 j5 q9 k- A. ?$ A' N4 k3 ^0 z
# m, e: S) B$ E3 [* m! U2 v9 \: \, t! Z2 X
至于各公司又如何实作这个功能呢?% Z/ o, i2 f4 b# J  K0 O
! m6 Y) U6 I3 U' @
由NVIDIA的GPU结构设计师John Montrym去年夏天于HotChips的简报所提到的数据,NV40的VS每个单元可以有最大3个thread实行的能力。NVIDIA的David B. Kirk针对这部份(每个VS有3way的 multi-threading)也是直接肯定了这个部份。NV40有6个VS,就是共计18threads。而且据Kirk先生所说,G70与NV40在这方面是相同的,所以RSX应该也是相同。+ A; x. s" o" {; _1 b9 I& B9 S2 g8 Z
( a  n/ W; B9 a4 O2 l8 X
而根据Kirk先生所说,NV40的PS也进行了Multi-threading。可是到底有能够处理多少数量的thread则没有明确公布出来。NVIDIA的论文(「The GeForce 6800」,John Montrym & Henry Moreton, IEEE MICRO MARCH-APRIL 2005)则提到「为了隐藏对存取外部内存而带来的延迟,各个Fragment Processor(PS)能够维持住100个in-flight thread(正在执行的thread)的stage(信息)」。而在去年秋天的访谈中,Kirk先生则做了下列的说明。
9 R" _/ `7 O+ s" c5 U( R- U( p; w( m; a
「Shader在对每个pixel执行过指令1后,会对别的pixel执行指令1。也就是说,对一开始的第一个pixel执行指令2,有可能是在100个cycle之后的事情了。」: N. U  C2 ]+ k1 n
9 N( j$ f! I5 e$ _  g3 O8 w/ G" g
常识上来说,比VS还要有更多texture fetch的PS,理所当然会在更多的thread间做平行处理。NV40/G70的Pixel shader实际上到底有多少的平行度并不清楚,但是应该至少比VS的平行度更宽广。8 N1 C# a" C4 e, t8 H
1 I) H( ]& I3 i& u" v: _
% |" m: ?  d( Y
9 k) R3 }2 ~3 C9 Q3 G# \  Z' D' j
> 对Unified Shader进行Multi-threading的ATI& s8 j! d, p5 q2 O; `' I* A- W8 n
4 R8 Y4 K* Y2 L" T4 L3 X
由于ATI开发的XBox360GPU是Unified Shader结构的关系,并没有VS与PS的分别。XBOX360的Shader全部总共可以控制64个in-flight thread。「我们在芯片里面准备了state buffer。所以可以on-the-fly 切换64个thread。」(Robert Feldstein、ATI Technologies, Vice President - Engineering)# L. K$ p) s2 w6 T& r
9 K. i  U0 T9 J( Z' T0 n
从Feldstein先生的说法,48个XBox360的Shader,每16个分成一个群组,并且以threading来控制。「我们将处理器每16个分成一个单元,共分割成三个。并且每个单元(16个shader)各自执行不同的thread。所以(没有进行threading变换)的状况下,即使有一个单元停滞了,另外两个thread、32个shader仍然会继续动作。」Feldstein先生如是说。4 b/ t8 X: X  _+ _8 W; i
. G- r5 R7 i0 W
也就是说,每个单元(16 shader)共执行三个threrad,然后可以在共计64个thread上切换。在这边虽然对NVIDIA与ATI两家公司彼此的「对thread的定义」是否相同抱持着疑问,但是至少可以知道,ATI也有宽广的平行度。, E) z; |: C+ v3 e

8 I4 R5 g! \# F+ x
" t; \' k) _* I, w$ Q  z) P1 w  K: E& }" @5 f. u6 B! @
此外,ATI的PC用新GPU R520,能进行总共128way的 Multi-threading。也就是说,它能够控制Xbox 360约两倍的thread。由某位PC业界人士所说,ATI对顾客表示R520的结构上Multi-threading是非常重要的部份。1 U6 G2 N8 H) X, M2 C
" F9 A, t" z, g
其它GPU厂商的Multi-threading的部分虽然都还不清楚,但是到了Unified-Shader世代之后,应该所有厂商都会使用Multi-threading。由与GPU相关的情报来源指出,某个GPU厂商,将Unified Shader里面的每个Shader都设置了 thread queue,并且在每个queue之中存放了多个thread的stage,然后在thread之间切换。也就是说,通常都是每个shader各自分配到一个thread,然后做multi-threading(切换),是一般的控制方法。: @3 O7 @+ E; P$ ]

- e- m8 U% W9 P> 将SRAM分散到各个Shader,来作为state的保存- m: J  p- d7 M
! j* i1 x9 o7 Q6 Z; ~
GPU整体来说大约有数十到上百的多thread。如果是CPU的话,各个CPU能做的Multi-thread也不过是每core约2way~4way的程度,相对于CPU而言,GPU做的Multi-threading的平行度都要大得多。9 c3 V3 ~, T+ Q  z, K- z
9 U9 D5 ^( ~+ D
不过,不可避免地总是要做取舍。为了处理作业中的thread,各个thread的的stage(如Register file与各种控制的现况)都必须保存下来。
: Q2 `) @5 _1 ^1 q: h0 o- l4 C! K' e) m7 k/ V; D
「各个pixel thread在做完shading之前,所有必要的state都需要在芯片内储存起来。有几个pixel,就会有几个thread要保存。」Kirk先生如是说。9 `' x8 p2 C1 m; R- M5 G$ Z# u
7 P+ W! x" J4 k5 [% u
为此,想要实作宽广的Multi-threading,等于就需要更多的晶体管数(芯片面积)。2004年8月召开的GPU通用运算会议(GP2),史丹佛大学的Bill Dally先生(Computer Systems Laboratory, Stanford University)提到这个问题时说。Multi-threading由于必须保存所有的state信息,成本非常地高昂。(「Stream Processors vs. GPUs」, Bill Dally, GP2, August 8, 2004): W+ _( {. G6 b/ s; @$ K+ p
2 ]& k1 K" K3 W
*:过去曾经引用过内文3 Y2 \# {, Y+ \/ {
5 o6 a& \1 o4 p6 M3 x. y1 e) v
不过,NVIDIA的Kirk先生表示,对GPU来说,即使这样(Multi-threading)仍然值得采用。
; t4 r/ s: l5 _/ H) v  I! X7 y0 n' b
「NV40有着大量的晶体管。GPU Shader的结构上,不需要存在像是CPU那样极为庞大的Cache。所以可以将(本来会使用在Cache上的份量)的海量存储器,分散配置到管在线。而透过分散配置的内存来保持state内容,来确保Shader Core不会stall、而能够持续维持有效率的运作。! r: X3 O1 j/ v/ ]; _. w. O+ A
5 l# |+ @: @/ @- d4 w8 s
现在的CPU可能有几个MB等级的cache,但是GPU的cache并没有那么大。反过来说,由于将SRAM分散配置到流水线的许多个地方,并透过SRAM来储存state,来实现相当大量的multi-threading。也就是说,可以选择把SRAM分配在Cache容量上,来提高Cache的hit rate、减少存取DRAM的机会;或者把是SRAM拿来储存thread的state、提高thread的平行度,来隐藏存取内存的延迟,防止stall.... 整理起来就会像下面这样:& y* a/ S$ g) w: X
* s  ]2 E, i/ d" T2 m- X
CPU--大容量SRAM用在Cache--Cache hitrate提高--减少DRAM存取--减少stall0 F4 D$ j7 K1 y5 t5 z
GPU--大容量SRAM用在维持state--thread平行度提高--DRAM存取延迟的隐蔽--减少stall8 g' J2 G1 L5 f
, b$ n, S$ D4 _1 N: X: D( I+ M
所以,针对必然发生的cache miss来设计的GPU,实作的方向很明显地会趋向后者。2 g1 p$ Z; u% A$ E7 U

% G, O8 ]  K2 q1 ?& k6 `4 D> GPU的 state 内容维持0 u% W' W  f/ \. _/ x% T& P2 I
! ~: O  t' G! C( n
说起来,GPU到底将哪些state用怎样的形式来保存起来,并没有被公开。CPU的状况就狠单纯地,将生成thread的母程序所占有的内存空间,整个thread持有的数据state与控制state都加以复制。4way multithread的话,就会维持完整的四份register file。/ p3 u4 y, D* p4 L4 I& k
9 t' z, a& u, h  m! x; V
但是,向GPU这样的stream processor的话,有可能有不同的设计方法。比方说,史丹佛大学的Dally先生研究的Stream Processor的状况,就是将Register File透过阶层化的方式来管理。: h2 W. p/ {0 n' n
9 X: j  q- S/ C5 B6 @0 g  i9 [
而且,GPU的Register结构和CPU有很大的差异。以逻辑上来说,Shader有Temp、Input、Output的Register,以及Constant Register、Instruction Slot等。其中,以Temp、Input、Output这三个是每个Thread独立的。+ ?, Q4 _2 B- K) b% u8 w: k4 w: s
; p4 e$ ~+ u+ e: j$ C. P2 u# _
存放指令slot的物理内存,是存放Shader Program的地方,以Shader来说不见得会有I-cache(当然也是有可能有),而也有可能是存放在内存上。虽然有许多种不同的Stream Processor存在,不过GPU大部分的状况是程序固定而数据不同、也就是Program(Shader code)固定、而处理的不同数据(pixel or vertex)较多的状态。所以Instruction RAM不会随着处理的pixel、vertex不同而切换,或者也有可能是Shader之间共享同一份内存。
. _/ ^2 c& h4 M: n$ [+ N% \0 S  A% H0 W7 F  b- Z' Q
这部份的控制方法、state的保存方法都还没有被详细提及。' Q6 V0 ]5 a) e- g& P& Y
  D5 x1 Y, d+ R) m
> GPU 是采用细单位的threading
2 `4 \5 F8 F- `6 G9 {" j/ w0 [; Q) l
Multi-threading的控制法有下列几个方法:
8 G9 ^) ^$ y  C' n9 {3 C0 J' h# d' J7 H* @0 a7 b- `
SMT(Simultaneous Multi-threading)
6 d" [  I$ Q: h  B+ b0 FFine-Grained Multi-threading! u4 A% P+ S! K: r9 J6 m
Coarse-Grained Multi-threading
1 }2 v" p0 U4 m: x% d0 b& C' V* I/ u. ?
SMT是类似Pentium-4的Hyper Threading那样,在同一个cycle内可以执行不只一个的指令的结构。并不是切换thread,而是可以同时执行完全不同的两个thread。8 U$ p. S2 k2 K. V

; B# ?8 N: Q/ `# e/ o0 ]7 c相比之下,Fine-Grained Multi-threading则不会在一个cycle里面同时执行两个指令。而是可以以cycle为单位切换执行不同的thread。Cell 的 PPE 的Multi-threading属于这种结构。4 `) a+ Q/ Y) P+ @7 j# u! ^/ N2 x
5 ]' M8 S: i$ U5 m8 V5 M* V
Crarse-Grained Multi-threading的话,只支持用更大的来切换thread。没办法在每个cycle里面切换thread,而只有在延迟相当大的事件发生时,才会切换thread。虽然切换thread本身也会有一定程度的延迟,但是至少会比将context switch回内存要来得快。
9 D' D1 E' C8 l
. k7 l. L4 T( W: A1 i至于GPU所采用的,全部都是Fine-Grained Multi-threading。3 a# h! T( r! l+ n. ?3 v
/ W0 Z) i  {+ g* Q* ?/ B, n$ v0 B
「NV40的threading是Fine-Grained Multi-threading」(Kirk)1 ?1 ]: N: B# v$ u- _! R9 g
「(XBox360 GPU)以小单位来做threading,可以在每个cycle切换thread。」(Feldstein)8 d# h  C& j; m& ~$ q) f- `: W6 J

/ C3 X2 j0 D. c3 u( v5 g0 l- TSMT对计算资源的利用虽然有效,但是控制相当复杂,而且如果计算资源本身的平行化不足的话就没有意义。如果只是为了隐藏内存存取的延迟,Fine-Grained Multi-threading已经相当有效。: R- Z+ [4 Y: d' g* G' G
  b7 z' N/ i  B) p3 A( W
> 如何触发thread切换  X" m9 c  n3 L5 i
6 v% A6 k# w( q0 j5 x9 S' X
基本上,实际上的threading的话,应该会在发生较长延迟的状况才会进袭。6 [6 k" |/ d4 P! O; P4 l5 c5 G- n  F
; U+ |- p0 m8 Z# F
「包含Texture cache miss在内,有很多状况都会触发thread切换。某个thread在遇到阻碍它执行完毕的因素之前会执行到结束。在阻碍执行的因素里面,可能包含了cache miss、或者是需要的资源目前被其它的thread占用之类,有可能遇到很多种状况。条件分支也可能造成stall与thread切换。因为所需的数据是不是在cache里面,是受到分支的区域性来影响的。」(Kirk): C* K  o5 J& ]# T- I; S
# e2 e4 N& h4 u6 U  n
ATI也表示朝内存存取Texture的动作会启动threading,可是「分支(方向)执行错误(而stall)的状况,不会更换成其它thread。」(Robert先生)。可以看出在thread的上仍然有些落差。
" F7 l9 L# h$ o! J3 R; ]
! b/ S2 c7 q: B此外,Shader program也和CPU上的program一样,都会进行比方说尽早提出Texture load之类的最佳化方法,来帮助隐藏内存存取延迟。Multi-threading乍看之下是与指令层级的静态排程(scheduling)结合,但是并非如此。推测应该是与CPU一样基本上在cache hit的时候以排程隐蔽较小的延迟,而在cache miss的时候透过multi-threading来隐蔽较大的延迟。6 K- |# B8 v" y8 z  P

) e/ _' r$ ?, J2 |4 ]& X6 a% u静态的排程与多执行绪的关系,其实与CPU是一样的。以IA-64为例,IA-64透过compiler,将load、store、还有分支之类的指令都往前排的手法,透过指令排程来隐蔽内存延迟。可是在此同时 Montecito 还引入了 Coarse-Grained multitheading,在发生更长的延迟的时候会进一步来切换thread。, `& v8 P6 _4 c2 O: Z4 v

0 ?( V* [3 Y# C& MShader的Multi-thread举例* ~# l" F9 {0 y9 h, Q" v

$ l8 S8 l! x- ]! f. U  `+ o& w. k/ E: P7 @0 R" d
为了处理内存的延迟而朝multi-thread前进的GPU。由于Multi-thread会成为影响Shader效率的重要关键,而被视为未来GPU效率的重大影响因素。GPU的性能越来越不再是只单纯地受到流水线数量、Shader数量或是时脉等的因素影响,而越来越难以判断了。比方说,即使说「理论效能OOGFLOPS」有高有低,实际上因为Multi-thread之类的Shader控制结构的不同会影响效率的原因,实际上的性能高下可能又是另外一回事了。
“They’re the world’s leading designers and manufacturers of CPUs – how hard could it be to build a GPU? I mean, come on, how hard could it be? That crummy little company down the road builds them – we could build them in our sleep. Come on, how hard could it be?” ——NVIDIA David Kirk

不太懂,有些问题请指教。- R( }6 B0 Q8 o- W5 ?# g- Y
如果一段PS代码里使用了Texture A,编译器会创建另外一个thread,在VS代码执行的时候就把A提前load进来?9 F. @' u  C6 T  d8 r
驱动是怎么给VS,PS单元分配任务的?比如我现在调一个SetVertexShader(),会在哪个VS单元上执行?

TOP

GPU流水线式作业, 不可能说先执行VS, 等VS执行完了再执行PS之类。所有的VS, PS分别执行同一段shader, 以MIMD或者SIMD的方式. 但就算是MIMD的方式, 也是同一代码, 不同分支而已. GPU的thread仅仅是硬件处理以隐藏数据延迟之用, 而不是CPU thread那样属于OS调度的资源, 独立拥有数据和代码.

TOP

原帖由 RacingPHT 于 2006-8-17 21:40 发表6 `8 N  O) J0 [! a, @6 F" ^! W1 U
GPU流水线式作业, 不可能说先执行VS, 等VS执行完了再执行PS之类。所有的VS, PS分别执行同一段shader, 以MIMD或者SIMD的方式. 但就算是MIMD的方式, 也是同一代码, 不同分支而已. GPU的thread仅仅是硬件处理以隐藏数 ...
, s2 p# X/ y0 d! b8 B; Q2 U6 t
先感谢你的回复。8 w8 @: b- r) X! d
对,GPU都是流水线式作业,现在我理解了,以前想岔了。GPU的MultiThread只是一个Thread如果需要等待就切换到另外的Thread执行,不要干等。
7 L! l& s+ M% ^8 K7 j7 r- |不过我觉得还是应该有个调度问题,比如调用一个DrawPrimitive()就只渲染一个三角形,也要每个VS单元都执行?每个VS单元能执行的最小粒度应该是一个三角形。如果只有一个三角形选一个执行,其他的VS单元空着,如果有多个三角形,平均分到不同的VS单元执行?是这样吗?1 A' T5 o- f* y* X+ X
还有SIMD的结构如何执行条件语句了?4 d2 p% g% u* r: H7 Y2 c
我问的问题可能有点初级,还希望各位多多指教。谢谢。
+ n& X' {- Z" H6 I9 _' U% |1 H# `
[ 本帖最后由 chena_cpp 于 2006-8-19 01:17 编辑 ]

TOP

VS执行的是单位是Vertex, Triangle属于Setup单元的工作(Setup目前应该是一个串行的部件). 三个Vertex可以使用三个VS单元来做, 至于其他的VS在做什么, 无所谓; 反正不影响结果就行. 不过要发挥GPU的性能, 产品级的代码没有人会这样做. 比如XBox360的C1, Thread执行单位是64个Vertex或者Pixel.4 T: Z0 S& q0 ^

/ _; A$ X- E9 C8 o  R# p5 ySIMD有一个Thread block, 这个SM3出来的时候应该已经讨论得够多了...

TOP

原帖由 chena_cpp 于 2006-8-17 20:40 发表8 U$ h- b* w% K, V1 J
不太懂,有些问题请指教。
1 S6 B" r2 F/ t如果一段PS代码里使用了Texture A,编译器会创建另外一个thread,在VS代码执行的时候就把A提前load进来?+ _0 S1 A! H( V
驱动是怎么给VS,PS单元分配任务的?比如我现在调一个SetVertexShader(),会 ...

. Q0 [6 l7 w. W7 y; c3 D
8 e- n: T! u& f) e要看你前面的代码,自己看看DX文档吧,我去年学的都忘了, p4 y+ M8 s" ]( P# ?, B* L, A
这里研究编程的很少,这种问题可以去CSDN:sweatingbullets:

TOP

原帖由 RacingPHT 于 2006-8-19 13:16 发表7 H2 b; X. S) P/ c6 |. X6 n
VS执行的是单位是Vertex, Triangle属于Setup单元的工作(Setup目前应该是一个串行的部件). 三个Vertex可以使用三个VS单元来做, 至于其他的VS在做什么, 无所谓; 反正不影响结果就行. 不过要发挥GPU的性能, 产品级的 ...
# C' M' ?% G0 O" ]. ]
谢谢。

TOP

原帖由 Prometheas 于 2006-8-19 17:17 发表
& h9 _( V* H+ V4 l1 O; m' \9 s- m! N3 M8 r, b. Q1 A
5 m7 z0 q# f! {' U5 m) j
要看你前面的代码,自己看看DX文档吧,我去年学的都忘了8 v; F, v4 }6 T( ?* V
这里研究编程的很少,这种问题可以去CSDN:sweatingbullets:
+ s2 t+ x5 l' e/ s1 t) E) }
DX的文档没说这个问题吧。

TOP

原帖由 Prometheas 于 2006-8-19 17:17 发表
3 i) [! F9 e9 d( t) J+ _5 j' J2 P5 |& _2 D2 {
  ], r4 N$ y( [: _+ J+ m
要看你前面的代码,自己看看DX文档吧,我去年学的都忘了( `' W" d  V% @
这里研究编程的很少,这种问题可以去CSDN:sweatingbullets:
6 Z" K  h$ j: G0 l( w6 f0 c; k, T
这个东西不是DX能够控制的

TOP

原帖由 ayanamei 于 2006-8-20 00:08 发表2 B; Z" `) R/ P& Y0 P/ C
( a  g% r- Z2 L3 m9 w0 m3 v4 S
这个东西不是DX能够控制的
4 D$ ^) Y, X. w" }$ D! c
6 {2 L; o: ~: p) B) E0 j7 v3 b3 @
(_(DX9 HLSL中需要指定VS和PS版本,就像Cg的Profile一样* b2 O" n" Z1 l( ^& u/ }+ p
2 y" O0 k% I! K; _" b; j0 B- T9 L
:sweatingbullets:可怜的Cg现在只能用于PS2了

TOP

Cg很早就已经可以用DX 9.0c,指定ps3/vs3 profile。
“They’re the world’s leading designers and manufacturers of CPUs – how hard could it be to build a GPU? I mean, come on, how hard could it be? That crummy little company down the road builds them – we could build them in our sleep. Come on, how hard could it be?” ——NVIDIA David Kirk

TOP

原帖由 Prometheas 于 2006-8-20 00:12 发表! ^' J) a) s% \$ ^" V- M
+ ~0 x1 Z- i- `4 K- u7 p

, t4 |2 |6 F* N  h; T3 e( k" d0 t(_(DX9 HLSL中需要指定VS和PS版本,就像Cg的Profile一样" w' k3 K# ?0 A4 W  r' I- v4 t

6 \: e* w; r& w% f# G' i/ N: f:sweatingbullets:可怜的Cg现在只能用于PS2了
5 \' U( _6 _: t& ^* `( J: J
上面说的是具体操作GPU thread情况吧?

TOP

返回列表