びわの家ブログ

MetalのGPU処理負荷計測について(CPUについても軽く触れる)

まず、CPUに関しての処理負荷計測は概ね以下のページを見ればできた。
【Unity】XCodeでCPUの処理負荷を計測する

ここに書いていないことで知っている便利なことは

  • CallTreeをクリックしてHide Systemなんちゃら〜みたいなのをクリックすると自分が書いたコードのみにしぼることができる
  • option押しながら改装を開くと一気に開ける

くらいかないまのところ

GPUについては実行中に下の方のカメラマークを押せばそのままキャプチャできる
※Edit Scheme… → option → GPU Frame CaptureをAutoかMetalに設定されていなければする
※アイコンがグレーアウトして押せないというときがあるのでそのときはxcodeを再起動したりデバイスを再接続しているとできるようになったりする。謎。
※シュミレーターでは動作しない

キャプチャができると以下のようになる。
今回はAppleのDeferredLightingのサンプルをキャプチャしてみた。

この画像で一番処理負荷が高そうなDraw Point Lights(1.29ms)のところを詳しくみてみる。
もしかしたら%で表示されるかもしれないので切り替えは右クリック→show performace as timeで切り替える。

更にグループを展開して、drawIndexedPrimitivesを選択するとおそらくBounds Resourcesが表示される。画像の部分あたりのBounds Resourcesを左クリックすると別のカテゴリの表示ができるのでPerformanceをみてみる。

Performanceを開くと、fragment shaderのtimeが66%もしめていることがわかる。fragment shaderの小さい矢印の部分(赤でかこった囲った部分)をクリックするとシェーダーのコードが開き行ごとにどのくらいの処理がかかっているかどうかが確認できる。

オフラインでビルドされたシェーダーを使っている場合はxcrunのmetalのビルドにオプションで'-gline-tables-only' と'-MO’をつけてビルドしないと使えない。(If building with the 'metal' command line tool, add the options '-gline-tables-only' and '-MO' to your compilation step.というメッセージがでるはず)また、ビルドターゲットのOSが実機より低いとシェーダーは開くが%が表示されない。(これも上部にそういう感じのメッセージがでる)

こうして無事にどこの行がボトルネックになっているかを確認することができる。

あとは他の手段として、Xcode → Open Developer tool → InstrumentsにMetal GPU Traceというものがありそれでも色々調査できるのだがまだきちんと使いこなせていないので便利な使い方が見つかればまた書く。
とりあえず公式のドキュメントをメモ↓
https://developer.apple.com/documentation/metal/using_metal_system_trace_in_instruments_to_profile_your_app