CPU と GPU のフレーム処理時間を見積もる

CPU と GPU のフレーム処理時間(フレーム時間)の見積もりは、アプリのパフォーマンスを把握し、ボトルネックを特定するうえで不可欠です。AGI を使用してアプリをプロファイリングすると、System Profiler からトレースデータが提供され、それを使用してフレーム時間を推定できます。

CPU 時間

AGI では、システム プロファイルの CPU トラックで、合計 CPU フレーム時間とアクティブな CPU フレーム時間を確認できます。

合計 CPU 時間

費やされた合計 CPU 時間を測定するには、連続するフレーム送信イベントの間隔を含む時間範囲を選択します。フレーム送信イベントは eglSwapBuffers(OpenGL の場合)と vkQueuePresentKHR(Vulkan の場合)です。

いくつかの eglSwapBuffer イベントのスクリーンショット。
図 1. 複数の eglSwapBuffer イベント。


vkQueuePresentKHR イベントのスクリーンショット。
図 2. vkQueuePresentKHR イベント

この測定値は合計 CPU 時間の推定値ですが、必ずしもアクティブな CPU 時間を示しているわけではありません。たとえば、GPU にバインドされたアプリでは、CPU は GPU が作業を完了するまで待ってから新しいフレームを送信することができます。これは、dequeueBuffereglSwapBuffer(OpenGL の場合)、vkQueuePresent(Vulkan の場合)のイベントが CPU 時間の大部分を占める場合によく発生します。待機時間は合計 CPU 時間に含まれますが、アクティブな CPU 時間は含まれません。

dequeueBuffer イベントと eglSwapBuffer イベント中の大量のアイドル状態を示すスクリーンショット。
図 3. dequeueBuffer イベントと eglSwapBuffer イベント中の大量のアイドリング。

アクティブな CPU 時間

アクティブな CPU 時間は、CPU がアイドル状態でアプリコードを実行している時間を決定します。

アクティブな CPU 時間を測定するには、CPU イベントのすぐ上に [Running] スライスを表示します。Running 状態の 2 つのフレーム送信イベント間のトレースのすべての部分をカウントします。作業スレッドが含まれていることを確認してください。

アクティブな CPU 時間の測定に使用できる CPU 時間の 2 つの期間のスクリーンショット。
図 5. アクティブな CPU 時間の測定に使用できる 2 期間分の CPU 時間。


メインスレッドがアイドル状態のときに、動作中のスレッドを持つマルチスレッド アプリのスクリーンショット。
図 6. メインスレッドがアイドル状態のときに作業スレッドを持つマルチスレッド アプリ。

アクティブな CPU 時間を測定するもう 1 つの方法は、CPU トラックでアプリスライスを表示することです。これらのスライスは CPU の実行中であり、Running スライスに対応しています。

CPU トラックに一致する固定されたスレッドの実行状態を示すスクリーンショット。
図 x.固定されたスレッドの実行状態が CPU トラックと一致する。

ATrace マーカーをアプリに追加すると、アプリスライスを識別しやすくなります。これにより、System Profiler の CPU トラックにマーカーが表示されます。

CPU トラック内の ATrace マーカーのスクリーンショット。
図 8. CPU トラック内の ATrace マーカー

GPU フレーム時間を見積もる

GPU フレーム時間を推定するには、System Profiler で GPU スライスまたは GPU カウンタを使用します。GPU スライスを使用すると、より正確な推定値が得られます。

GPU スライス

System Profiler に使用可能な GPU スライス情報がある場合、単一フレームに関連付けられたタスクにアプリが費やした合計時間を測定することで、非常に正確な GPU フレーム時間情報を取得できます。

Mali デバイス

Mali デバイスでは、GPU スライスにフラグメント トラック、非フラグメント トラックがあります。また、場合によっては、非フラグメント トラックの補助トラックもあります。より複雑でないフレームの場合、フラグメントの処理と非フラグメントの処理は順次行われるため、アクティブな GPU 処理間のギャップを探すことでフレームの処理を区別できます。

別の方法として、GPU に送信される処理に精通している場合は、送信されたレンダリングパスのパターンを特定することで、フレームの開始時点と終了時点に関する情報を得ることができます。

順番に実行される複数のフレームのスクリーンショット。
図 9. 複数のフレームが順番に実行される。
各フレームの作業を拡大して AGI を拡大したスクリーンショット。
図 10.個々のフレームの作品にズームインします。

より高度に並列化された GPU ワークフローを持つアプリでは、各スライスの [Selection] ペインで同じ submissionID を持つフレームをすべて検索することで、GPU フレーム時間を取得できます。

Vulkan ベースのアプリの場合、複数の送信を使用してフレームを作成できます。送信 ID をトラッキングするには、各送信のスライスを含む Vulkan イベント トラックを使用します。送信スライスを選択すると、送信に対応するすべての GPU アクティビティ スライスがハイライト表示されます。

並列 GPU ワークロードのスクリーンショット。あるフレームの作業が別のフレームと重なることがあります。
図 11. 並列化された GPU ワークロード。あるフレームの作業が別のフレームと重なることがあります。


選択したフレームでの複数の Vulkan イベントのスクリーンショット。
図 12. 選択したフレームに対する複数の Vulkan イベント

Adreno デバイス

Adreno デバイスでは、GPU スライスは GPU キュー 0 トラックに表示され、常に順番に表されます。これにより、フレームのレンダリングパスを表すすべてのスライスを確認し、GPU フレーム時間を測定できます。

順番に実行される複数のフレームのスクリーンショット。
図 13. 複数のフレームが順番に実行される。
複数のレンダリングパスがあるフレームで AGI を拡大したスクリーンショット。
図 14.複数のレンダリング パスがあるフレームを拡大しました。

前述のマリのシナリオと同様に、アプリが Vulkan を使用している場合、Vulkan イベント トラックは、フレームを実行するために送信される処理に関する情報を提供します。レンダリング パスをハイライト表示するには、フレームに関連付けられている Vulkan Events スライスをクリックします。

選択したフレームに関する Vulkan イベントがある Vulkan ベースのアプリのスクリーンショット。
図 15.選択したフレームに関する Vulkan イベントを持つ Vulkan ベースのアプリ

アプリが GPU に大きく依存するため、GPU フレーム境界の区別が難しい場合があります。このようなシナリオでは、GPU に送信される作業に精通していれば、レンダリングパスが実行されているパターンを特定し、その情報からフレーム境界を特定できます。

フレーム境界の特定に役立つレンダリング パス パターンを使用して、GPU に大きく依存するアプリのスクリーンショット。
図 16.フレーム境界の特定に役立つレンダリング パス パターンを備えた、GPU に大きく依存するアプリ

GPU カウンタ

トレースで GPU スライス情報が利用できない場合は、GPU カウンタ トラックを使用して GPU フレーム時間を推定できます。

Mali デバイス

Mali デバイスでは、[GPU 使用率] トラックを使用して、GPU を集中的に使用するアプリの GPU フレーム時間を推定できます。アプリの GPU 負荷が低い場合、一貫して高いアクティビティではなく、定期的に高いまたは低い GPU アクティビティが発生します。GPU 使用率トラックを使用して GPU フレーム時間を推定するには、トラック内でアクティビティが高い期間の継続時間を測定します。

Mali デバイスの GPU 使用率と GPU キューのトラックを示すスクリーンショット。
図 17.Mali デバイスでの GPU 使用率と GPU キューの追跡

アプリで GPU 負荷が高い場合は、フラグメント トラックと非フラグメント トラックを使用して、GPU フレーム時間を推定できます。フラグメント トラックと非フラグメント トラックのアクティビティ レベルのパターンを探すことで、フレームの境界位置を大まかに推定し、それを使用して GPU フレーム時間を測定できます。

フラグメント トラックと非フラグメント トラックのスクリーンショット。
図 18.フラグメント トラックと非フラグメント トラック

Adreno デバイス

Adreno デバイスでは、アプリが GPU を多用しない場合、前のセクションの Mali デバイスの場合と同じ方法で GPU フレーム時間を推定できます。

Adreno デバイスの GPU 使用率と GPU キュートラックのスクリーンショット。
図 19.Adreno デバイスでの GPU 使用率と GPU キューのトラッキング。

アプリの GPU 負荷が高い場合は、[Vertex Instructions / Second] トラックと [Fragment Instructions / Second] のトラックを使用して GPU フレーム時間を推定できます。これらのトラックのアクティビティ レベルでパターンを探すことで、フレームの境界の位置を大まかに推定し、それを使用して GPU フレーム時間を測定できます。

Vertex の手順 / 2 番目のトラックのスクリーンショット。
図 20. Vertex Instructions / Second トラック

以下の他のトラックでも同様の情報が得られます。

  • 頂点の色分け / 秒
  • シェーディングされたフラグメント / 秒
  • 時間シェーディングの頂点の割合(%)
  • 時間フラグメントの割合