前々回
・Direct3D 10 Shader4.0 ループと最適化
で行ったテストを、GeForce8800GTX でも試してみました。
テストしたのは、逆転して [loop] の方が高速になる 3番目の
shader です。GeForce8800GTX の傾向は GTS とまったく同じで、
loop 120 回以上で速度低下が顕著になります。
・縦軸は実行にかかった時間(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 の方が高速に動作している計算です。
こんなに差があったかな・・と思ってスペックを確認してみました。
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倍に近いスループットが期待できそうです。