TypeZ性能評価(3)

で、前回の続きでMap()しない版での測定結果。(単位はGB/sec)

項目 5870 7670M 内臓グラ
read 148.1 62.5 6.6
write 209.9 339.0 1.8
RW 166.9 329.9 2.0

てな感じで明らかにおかしい。意図した動作をしていないっぽい。
まず5870。明らかにD3D11_USAGE_STAGINGがVRAMに割あたってる。これじゃVRAM同士の帯域幅を測定してる状態だよ。数値的にも153.6に近いのでほぼ間違いない。153より数値が大きいのはたぶんデータ転送終了前に戻ってきちゃってるっぽいなぁ。Flush()から戻ってもまだGPU側では処理が継続してるっぽいね。たぶんDMAにキューイングとかだけやって戻ってくるんだろうね。何とかして転送完了を待たないとダメだね。
7670Mにいたってはいったい何の数値が出てるのやら。RadeonのドライバはSTAGINGもVRAMに持ってっちゃうのかな。そうだとしてもおかしい。
Ivyの内臓グラはちょっとよくわからない。いったいどこの経路を通るとこんな数値に…内臓グラ用のメモリ帯域幅に制限でもかかってるのかな?確かE-350にそんな話があったのでIvyにも同じような話があるのかも。

とりあえずテクスチャを実際にどこに割り当てるのかはドライバしだいのはずなので、STAGINGがVRAMに配置されちゃっても文句は言えないし、Flush()以降も待ちが必要なので両方を解決するためにSTAGINGをMap()して無理やりシステムメモリへ転送してくることにした。(前回の修正版ソース)
VRAM同士のCopyResource()分だけ余分に処理をやっているけど仕方が無い。Map()するためには必ずシステムメモリにデータを持ってこないとダメだし、Map()から戻ってくるってことはデータも到着済みってことで問題が両方とも解決できるはず。きっと。

測定結果はこんな感じ。内臓グラは2GB分の転送時間だと微妙に計測値が安定しないので徐々に増やしていって値が収束したとおぼしき16GBで計測した。データ量が少ないと効率的に転送できないのかな。う〜ん???

項目 5870 7670M 内臓グラ
read 1.8 0.5 2.0
write 4.6 0.3 2.5
RW 2.3 0.4 2.1

ってあれー?期待値より小さいぞ。んー?
というか、7670Mがおかしい。小さすぎだろ・・・測定コードとドライバの相性が悪いのかな。
5870の環境にはPIX先生が入っているのでAPI呼び出しをログってみた。
CopyResource()の呼び出し時間はこんな感じ。縦軸がかかった時間、横軸が1回ごとの呼び出しになるように散布図にプロットしてみた。呼び出し回数は1024回になる。たぶん縦軸の単位はnsecかと。

やっぱりすぐに処理が返ってきてる。


それからMap()はこんな感じ。こちらの意図としてはMap()で強制的にVRAMからデータを読み戻してるつもりなんだが。

こっちもなぜか大半はすぐ返ってきてる。定期的にmsec単位で時間がかかっている。ドライバが裏で何か気を利かせてプリフェッチ的なことをやっているとか?
readとwriteで結果が違いすぎるのも気になるなぁ。今回の測定コードだとこちらの意図する動作にならないのかな。
とにかく現象面だけだと何ともいえないなぁ。とほほ。
一応は7670Mが遅いことになってるけど、測定結果と机上検証に差がありすぎるので測定結果を信用できないし。
PCIeのバスモニタ的なものでGPU関連のコマンドだけトレースでもできれば何が起きているか推測もできるのになぁ。