ID3D11QueryでGPUパフォーマンス測定

GPUが描画したポリゴン数や処理した頂点数などをID3D11Queryを使用して測定してみます。並列動作しているGPUの処理結果を取得するため、結果取得にちょっとした工夫が必要になります。単純な取得ではCPUとGPUの並列動作を止めてしまい、プログラムのパフォーマンスが悪化します。

ID3D11Queryの使い方

単純な測定方法です。GPUは並列動作しているため、結果を取得するためにはGPUの処理終了を待つ必要があります。待つ間CPUが停止してしまうため、処理時間が増加し、プログラムの性能が悪化します。状況によって変わりますが、検証用のプログラムでは30%ほど増加しました。

CPUを停止させない測定方法

スレッドを使わずに対処する方法です。測定結果の取得を遅延させて、GPU処理終了待ちが発生しないようにします。結果取得が数フレーム遅れるため厳密な測定はできません。

ゲームプログラムであればPerfQueryNum=3ぐらい、というよりこれが3以上必要になるということはCPU(操作)とGPU(画像)のずれが大幅に発生、キー入力の反応が遅れすぎて操作性が悪くなります。CPUとGPUの同期にはIDXGISwapChain1::PresentやID3D11Query(D3D11_QUERY_EVENTで作成)などを使います。

広告