引用:
Originally posted by 屋頂上的弓箭手
所以, 意思是說R300/R350有可能經由driver有更多的performance boost嗎?
(我是說理論上啦...)
|
可以這麼說. R300系本身的處理單元的確比較多, 只要沒有發生structure Hazard的話, 光數量上來看應該是可以Tune得比較高; 當然, 這大多是因為
R300系內部精確度是24bit的關係, 以及NV3x的指令複雜度的關係.
不過相對地, NV3x在架構上似乎極力地在試圖避免Structure Hazard, 所以一般認為NV3x可以Tune出來的幅度會遠比想像中來得高. 比如說先前AA/AF一開, NV30會被R300/R350慘電一倍以上; 但是新的Driver出來之後, NV30和R300已經沒有太大的差距, 如果說完全是因為128bit與256bit之間的差距, 顯然不應該會有這樣的狀況.
這樣講吧, 雖然 "觀念上" NV3x是以16bit的Shader Unit為主, 但是單單只是把兩個16bit FP給合起來絕對不會變成一個32bit FP, 實際狀況比這個複雜太多了. (ex: 32bit運算可能需要2cycle)
所以, 我們可以看到強化過的NV35, 主要就是加強FP32的速度, 讓它不會輸FP16太多; 而雖然還沒有試新的Driver在NV30/31/34上的表現, 不過應該可以預測FP32應該還是開不起來.
至於R300系的處理單元, 就比較"傳統"一點了.... 這邊解釋一下R300的處理單元吧.
在PS 2.0規格中, 每個指令理論上都是一個4D運算.
比如說,
add r0, r1, r2
意義上相當於
r0.r = r1.r + r2.r
r0.g = r1.g + r2.g
r0.b = r1.b + r2.b
r0.a = r1.a + r2.a
本來, "理論上" PS2.0的color unit是一個4D vector unit; 當然, A(Alpha, 透明度)常常會拿來作一些其他的運算, 所以我們把管線作成一個3D Vector Unit 和一個Scaler Unit, 以把Alpha值分開處理. (一個4D Vector 等價於4個Scaler)
於是,把一開始的那一行指令寫成
add r0.rgb, r1, r2
mul r0.a, r3, r4
剛好可以讓R300/R350在一個時脈內完成; 而如果照原來那樣的4D Vector的話, 就會變成有部分運算資源閒置了; 以上是R300的Pixel Shader Unit把4D Vector -> 3D Vector + 1 Scaler的理由. (這只是Pixel Shader Unit部分, R300/R350的每條Vertex Shader pipeline各有一個4D Vector 和1個Scaler)
所以回頭講到上回的fillrate測試用Shader:
ps_1_1
def c0, 0.5, 0.25, 0.3, 0.4
def c1, 0.1, 0.2, 0.3, 0.2
tex t0
mov r1, c1
mad r0, v0, c0, r1
mad r0, r0, c1, r0
mul r0, r0, t0
R300/R350的Pixel Shader Pipeline有一個Texture Unit, 一個Texture Addressing Unit, 與一個Color Unit, 在上面的這個Shader裡面只有一個Texutre OP( tex t0), 接下來Texture Unit就閒著了.
然後,
mad r0, v0, c0, r1
mad r0, r0, c1, r0
mul r0, r0, t0
這三個指令, 都把color unit(分成3D Vector + 1Scaler)的4個運算用光了.
所以整個Shader的5個指令中, Texture OP可以和其他指令並行, 另外4個指令則各需要自己的cycle, 因此理應需要4個cycle; 但是實測結果出來是3.2 cycle, 所以只能猜測mov指令上ATi有做過最佳化.
----
不過, 本來PS1.1~1.3就已經有這樣的功能(稱為instruction paring), 但是因為這樣子限制太多了, PS2.0之後已經不強制這樣規定這樣的寫法要在一個時脈中完成, 而讓廠商自己去做optimization, 而這是指令相同的狀況; 實際上CineFX的指令和DX9規模根本不一樣, 因此詳細的狀況只有廠商自己明瞭了, 真的要挖的話可能可以寫成一整套書也說不定.
簡單講的話, R300/R350可能就是可以最佳化"擠"出來的程度不如NV3x, 於是就會變成即使真正的處理單元多, 但是實際上指令有可能會互相打架, 而讓真正能tune出來的效能比較低.
比如說, 雖然總量是A+B+C+D+E, 但是A不能和C同時用, B不能和D同時用, 所以就會變成A+B+E or A+C+E, 總量只有3; 但是如果架構不同的話, 雖然另一方可能只有A+B+C+D, 但是也許它可以做到A+C+D, 或者A+B+D, 甚至A+B+C+D都可以同時用, 那麼就會造成差異了.
實際上雖然沒這麼簡單, 不過朝這個方向去想, 就可以知道這個真的是很大的學問.
舉個有趣的數字, 記得nVIDIA全球的一千四百多名雇員中, 比例最高的可是佔了六成的博士, 反倒是碩士和學士的比例比較低....