13.1.18. コードプロファイラ¶
Window → Show Code Profiler は、接続されたカメラ上で動作するファームウェアの関数レベルのプロファイラを開きます。どの C 関数がどのくらいの頻度で実行され、どこにマイクロ秒が費やされたかを、スクリプトの実行中にライブでストリーミングします。これは FPS カウンターが提起する疑問、つまりなぜこのパイプラインが遅いのかという疑問に、カメラ自身のコードのレベルで答えます。
プロファイリングのサポートはファームウェアにコンパイルされており、常に存在するわけではありません。カメラは PROFILE_ENABLE=1 でビルドされたファームウェアを実行している必要があり、そうでなければメニュー項目は無効のままです。そのようなファームウェアのビルドは、ファームウェアのビルド で扱われるカスタムビルドのワークフローの一部です。
スクリプトの実行を監視するプロファイラ。関数ごとの呼び出し、タイミング、合計時間に対するパーセンテージが表示され、最も右の列に2つのハードウェアイベントカウンター、その下に合計行があります。¶
このウィンドウは、関数とその呼び出し回数、最小・最大・合計・平均のマイクロ秒、平均サイクル数、合計時間に対するパーセンテージをソート可能なテーブルにしたもので、下部に合計行、名前で関数を見つけるためのフィルターボックスがあります。関数名はファームウェアの ELF ファイルから取得されます。ウィンドウのファームウェアパスフィールドをビルドで生成された .elf に指定すると、アドレスが名前に解決されます。
2つのビューコントロールがデータを整理します。Flat はすべての関数を独立してランク付けします。これは「最も負荷の高い単一の関数は何か」を見るビューです。Tree は呼び出し先を呼び出し元の下にネストし、コールチェーンを下るにつれて時間がどのように分解されるかを示します。これとは独立して、Inclusive はある関数が呼び出したすべての処理に費やされた時間をその関数に計上し、一方 Exclusive はその関数自身の本体のみをカウントします。inclusive は負荷の高いサブシステムを見つけ、exclusive は負荷の高いループを見つけます。Reset はカウンターをゼロにします。これがパイプラインの1つのステージを単独で測定する方法です。リセットし、実行させ、読み取ります。
プロファイラはハードウェアイベントカウンター(キャッシュミス、分岐予測ミス、その他プロセッサがカウントできるイベント)をタイミングの列と並べて表示することもできます。サポート付きでビルドされたファームウェアでは、同じウィンドウでそれらを選択できます。
参考
openmv パッケージの CLI は、コマンドラインからライブストリームに同じプロファイリングデータをオーバーレイできます。openmv CLI を参照してください。