前々回
Direct3D 10 Shader4.0 ループと最適化
で行ったテストを、GeForce8800GTX でも試してみました。

テストしたのは、逆転して [loop] の方が高速になる 3番目の
shader です。GeForce8800GTX の傾向は GTS とまったく同じで、
loop 120 回以上で速度低下が顕著になります。

Unrollと速度

・縦軸は実行にかかった時間(usec)。位置が低い方が高速。
・横軸はループ回数

GeForce8800GTX
loop回数  time    GTS比
    40     371     1.52
    60     570     1.52
    80     962     1.55
   100    1752     1.51
   120    2120     1.57
   140    3870     1.50
   160    5620     1.50
   180    7200     1.49
   200    8780     1.45

このデータを見る限り、temporary register の割り当てに関しては
特に GTS と GTX で差がないように見えます。つまりシェーダー
ユニットに対する、割り当て可能な register pool の割合はおそらく
同率になっているのでしょう。
GTS はシェーダーユニット数が少ないけれど、その分潤沢にレジスタを
使えるわけではありませんでした。


数値を取っていて気になったのは、思った以上に GTX が速いという
ことです。上のグラフには前々回の GTS の結果も重ねており、また
表には GTS 比でどれくらい速いのかも書き込んでみました。

だいたい 1.5倍程度 GTX の方が高速に動作している計算です。
こんなに差があったかな・・と思ってスペックを確認してみました。

DirectX10 GPU メモ

              stream processor  shader clock  memory clock  mem-bus
GeForce8800Ultra    128sp         1500MHz       1080MHz      384bit
GeForce8800GTX      128sp         1350MHz        900MHz      384bit
GeForce8800GTS       96sp         1200MHz        800MHz      320bit

Stream Processor の数で 約1.33 倍
Shader Clock の差で 1.125 倍

1.33 × 1.125 ≒ 1.50

ぴったり計算どおりでした。

シェーダーの実行速度に対して、メモリ速度は clock で 1.125倍、
bus 幅で 1.2倍、あわせて 1.35 倍です。

シェーダーの演算ではなくメモリが足を引っ張る状況では、GTS と
GTX の速度差はもっと小さくなります。
普段体感している速度差は、おそらくこちらの方が近いのではない
でしょうか。


例えば前回(昨日)
Direct3D 10 Shader4.0 補間レジスタ数と速度の関係
のグラフをもう一度じっくり見てみます。

出力レジスタの個数と速度

出力数が 11以上の右側では、GTS と GTX の差を計算してみると
ちょうど 1.5倍前後になっていることがわかります。
ここは上と同じで計算どおりなので、純粋にシェーダーの演算能力
で頭打ちになっているといえるでしょう。


それに比べて左側、11未満の結果では、GTS と GTX の差がほとんど
ありません。GTX の速度は GTS 比でわずか 1.06~1.1 倍程度です。

ほぼこれは Core や Shader、Memory 等の Clock 比 1.125倍に相当
すると考えられます。

つまりここでのボトルネックは、core か Shader Unit 内部に存在
する固定ユニットの実行速度なのでしょう。GTS でも GTX でも GPU
内にたぶん同一個数実装されていると推測できます。

もし仮にこれが 1.35倍に開いていたら、それはおそらくメモリが
足を引っ張っている部分です。


これらの結果から GTX は GTS と比較して、状況によって
1.125~1.5 倍高速に実行できます。メモリ速度を考えると、本当に
1.5倍の速度差がでるようなケースはそれほど多くないと思います。


また同じように GeForce8800Ultra で計算すると、GTS 比で次のよう
になります。

Shader 1.66倍
Memory 1.62倍
Clock 1.224~1.35

これは速いですね。メモリ速度も Shader 並みの比率を保っているので、
比較的1.6倍に近いスループットが期待できそうです。