プロファイリングツールが使用できない場合、プログラムのパフォーマンスを最適化するにはどうすればよいですか?


8

現在、パフォーマンスを改善したいOpenGlプログラムに取り組んでいます。パフォーマンスは大丈夫ですが、強力な専用GPUでは理想的ではありませんが、統合グラフィックス(<10 fps)ではひどいです。通常のプログラム(CPUベース、OpenGlまたは他のGPU APIなし)では、プログラムでプロファイラー(おそらくCLionに組み込まれているもの)を実行し、ほとんどの時間を費やしている場所を確認してから、より良いアルゴリズムで作業しますそれらのエリアの場合、またはそのエリアが呼び出される量を減らす方法を見つけます。

OpenGlプログラムでこの手法を使用すると、メインスレッド(最適化したいスレッド)でのプログラムの時間の大部分(約86%)がOpenGlドライバーの.soファイルに費やされていることがわかります。さらに、プログラムの実行中のCPU使用率は非常に低いですが、GPU使用率は95%から100%の間で停止します。これらの情報を総合すると、ボトルネックがGPUにあるため、最適化する必要があることがわかります。

ここで問題が発生します。ただし、プロファイラーを使用して私の最適化を導く通常のテクニックは、特定のGPUプロファイラーがないと機能しません。そのため、GPU処理時間が費やされている場所を教えてくれるプロファイラーを見つけるために、いくつかの調査を行いました。リモートで使用できるものは何も見つかりませんでした。すべてがWindowsのみ(Linuxのみを実行しており、プログラムはまだWindowsに移植されていません-ずっと先までは移植されません)であるか、更新されていないか、および/またはこのプロジェクトです。

そのため、私は質問します。関連するプロファイラーが存在しない場合、プログラムのパフォーマンスをどのように最適化できますか?問題がどこにあるのかを推測し、そこから最適化を試みましたが、最適化(錐台カリング)によってGPUの作業が約半分になっていることが確認できたとしても、違いはありませんでした。良い答えは、Linux上のOpenglに適用可能なプロファイリング手法を提供するか、プロファイラーなしで機能する手法を提供することです。


あなたが遅いビットを見つけるまで、コメントアウトの大胆なやり方
ユアン

@ewanレンダラーは非常に最小限です。コメントをコメントアウトすると機能しなくなります。
john01dav

「コメント」の部分については、コードをセクションに分割し、最初のセクションを除くすべてをコメント化できます。これらのセクションには、期待どおりに動作することを確認するための出力が含まれているはずです。それができたら、セクションをステップ実行して、そのピースが潜在的なボトルネックであるかどうかを確認できます。このアプローチでは、基本的な試行錯誤のスタイルのテストが必要になります。
eparham7861

GPUのハードウェアピンにアクセスできる場合は、関数の開始時と終了時に切り替えることができます。オシロスコープは、時間その関数に費やした時間と頻度、それはなどと呼ばれて示します
Antの

回答:


7

関連するプロファイラーが存在しない場合、プログラムのパフォーマンスを最適化するにはどうすればよいですか?

コードを自分でプロファイリングする。GPUのボトルネックを見つけることは特に難しくありません。

OpenGLの下位バージョン(タイマークエリは使用できません)があるとすると、長年人々が行ってきたことを実行します。何かを変更し、それがどのように機能するかを確認します。

レンダリングのボトルネックには3つの基本的な場所があります。CPU(つまり、非効率的なデータ送信)、頂点T&L、およびフラグメントごとの処理です。どちらがボトルネックであるかを判別することは、何かを変更したときのパフォーマンスへの影響を確認するだけの問題です。

たとえば、フラグメントごとの処理がボトルネックであるかどうかを確認する場合は、生成されるフラグメントの数(つまり、画面の解像度)を減らします。画面解像度のピクセル数に関して線形速度でパフォーマンスが向上する場合は、それがボトルネックでした。

頂点処理がボトルネックであるかどうかを知りたい場合は、同じオブジェクトを複数回(次々に)レンダリングします。深度テストがアクティブであり、ブレンドを実行していない場合、フラグメントシェーダーを呼び出す前に、後続のレンダリングからのフラグメントを間引く必要があります。したがって、すべてのオブジェクトを繰り返しレンダリングすることでパフォーマンスが直線的に低下する場合は、頂点処理のボトルネックがあります。

そして、これらのいずれもがボトルネックでない場合、除去のプロセスによって、CPUが問題になります。

タイマークエリにアクセスできる場合は、GPUオペレーションを直接計時できます。特定のステージの時間を計測することはできませんが、GPUコマンドが完了するまでの時間を決定することができます。GPUコマンドが完了してから、CPUスレッドがそれらのコマンドの送信を終了するまでのレイテンシも確認できます。全体として、これらは、GPUがデータを送信するCPUと比較して、GPUがデータを処理するのにかかる時間を知るのに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.