5870性能評価(2)
そういえば、なぜか前回の日記のソースコードに「/pp」って謎の文字列が入っているのは何なんだろう…プレビュー画面だと何もないんだけど。
まぁ、それはさておき。
前回は5870のコンピューティング性能を見たので、今回からはボトルネックを探る旅に出ようかと思う。まずはVRAMアクセスのread性能を評価する。
前回のBasicHLSL11_PS.hlslをさらに改造して無駄にテクスチャreadを増やしてみる。
#define NUM_LOOP 400 #define NUM_DIV 32 #define CYCLE_UNIT (NUM_LOOP/NUM_DIV) float4 PSMain( PS_INPUT Input ) : SV_TARGET { float4 vDiffuse = g_txDiffuse.Sample( g_samLinear, Input.vTexcoord ); float fLighting = saturate( dot( g_vLightDir, Input.vNormal ) ); fLighting = max( fLighting, g_fAmbient ); float4 tmp = g_fAmbient; [unroll] for(int i=0;i0)? vDiffuse * fLighting : tmp; }
forループ中にifを追加して、ループの中で合計NUM_DIV回テクスチャアクセスするように変更してみた。テクスチャアドレスはできるだけキャッシュの影響を受けないように離れた場所を指定。テクスチャサイズをNUM_DIVで分割したサイズ分アドレスがずれるように調整した。(offset変数の計算が該当部分)
ちなみにunrollしているせいか、ifの処理は展開されて分岐命令は入らないので処理的には遅くならないはず。
ちなみに実行する際にはテクスチャアクセス分だけ命令数が増えるのでNUM_LOOP値を減らして合計2000命令程度になるように調整する。
モデルデータは前回のままで、テクスチャファイルをフルHD画像に差し替えて実験してみた。
結果はNUM_DIV=32ごときではまったくFPSに変化なし(^^;
う〜ん。速い。スペック上はGDDR5で100GB/secを超えてる(153.6GB/sec)から、フルHD 60FPSで1.3KB/pixel・frameくらいはアクセスできるからねぇ。
さすがにNUM_DIV=360くらいにするとFPSが落ち始めるけど、32bit Colorのテクスチャだから32bit×1920×1080×60×360=167GB/secでスペックを超えちゃうからこれは納得。てか、ここでもカタログスペックが出てるってことか。
この数値ならSDRの32bitテクスチャなら16x16と8x8のフィルタをポストプロセスとしてかけられる数値だねぇ。HDRの128bitだと8x81つしかかけられないのか。全画面にフィルタをかけることを考えちゃうと足りない感じか。実際はキャッシュが効くように組むだろうからもうちょっと頑張れるかもしれないけど。
ちなみに画面に表示されるpixel数が減るように板きれモデル全体が画面上で小さく表示される位置に調整しても、FPSは落ちたままなのでプログラムはちゃんと動いていそう。(コンピューティングパワー的には表示pixel数が減っているので負荷が下がっているが、FPSが上がらないということはコンピューティングパワー以外の部分、つまりテクスチャreadがネックになっているということなので)
ただ、気になるのは逆にモデルをどアップで表示するとFPSが90くらいになってしまうという点。だいたい2000命令になるようにしているので60FPS以上にはならないはずなのに…テクスチャアクセスはキャッシュが効いて速くなるとしてもpixel処理の命令数は減ってないから60FPSを超えないはずなんだけどなぁ。ま、いっか。
あとは、テクスチャwriteがどうなのかってところだけど、マルチレンダーターゲットに対応したDirectX11のサンプルが見当たらない(見落としじゃないよね…)ので自分でプログラムを作らないと評価できないなぁ。ってことでwriteの方は後回し。どうせ、8ターゲットくらいまでしかwriteできないしねぇ。