メモリ効率を分析する

アプリのメモリ使用特性は、パフォーマンスの基本的な側面です。System Profiler を使用して、使用可能な GPU カウンタ情報を確認することで、これらの特性を分析できます。

Adreno デバイス

Adreno デバイスでは、まず、CPU と GPU のフレーム処理時間を見積もるで説明されているように、単一の GPU フレームと一致する期間をハイライト表示します。そのページに記載されている、フレーム時間の境界での GPU 使用率(%)または同様のカウンタ トラックの使用に関する手法を使用してください。カウンタ トラックはすべて同じタイミング手法を使用し、(カウンタ トラック データとは独立してデータが収集される GPU スライスから得られるフレーム時間境界を使用する場合と比較して)メモリ使用量をより正確に推定できるためです。

使用率トラックとその下に関連するカウンタ
図 1. 使用率トラックとその下の関連するカウンタ

読み取り/書き込みの合計

プロファイラで 1 つのフレームをハイライト表示したら、まず [Read Total (Bytes/sec)] カウンタと [Write Total (Bytes/sec)] カウンタを確認します。これらのカウンタにより、1 フレームでメモリバスを通過するデータの量を全体的に把握できます。メモリ帯域幅はモバイル デバイスのバッテリー消耗の大きな原因であるため、バス経由で送信するデータの量を最小限に抑えるよう最善を尽くしてください。

読み取り + 書き込みの合計カウンタ
図 2. 読み取り + 書き込みの合計カウンタ

また、[Vertex Memory Read (Bytes/Second)] カウンタと [Texture Memory Read (Bytes/Second)] カウンタを確認して、頂点データとテクスチャ データに使用される帯域幅の割合を判断することもできます。

Vertex + テクスチャメモリ読み取りカウンタ
図 3. Vertex + テクスチャメモリ読み取りカウンタ

これらの値を「良好」と判断する基準は、アプリで発生するワークロードのタイプによって異なります。たとえば、2D アプリではテクスチャ メモリの読み取り帯域幅が比較的多く(約 2 GB/秒以上)使用されていますが、頂点メモリの帯域幅は非常に最小限(最大 50 MB/秒)である場合があります。詳しくは、頂点メモリ帯域幅の分析テクスチャのメモリ帯域幅の使用量の分析のドキュメントをご覧ください。

停止を取得する

[Vertex Fetch Stall]、[% Texture Fetch Stall]、[% Stall on System Memory] の各カウンタを確認します。これらのカウンタは、アプリケーションの全体的なメモリ パフォーマンスに関するヒントを提供します。値が約 5% を超えている場合は、アプリがメモリ内に効率的にデータをレイアウトしていないか、アプリがキャッシュを活用するために効率的な方法でデータにアクセスしていることを示しています。このようなアセットのメモリ使用量を改善する方法については、頂点のメモリ帯域幅の分析テクスチャのメモリ帯域幅の使用量の分析をご覧ください。

メモリストール カウンタ
図 4. メモリストール カウンタ

Mali デバイス

Mali デバイスでは、まず、CPU と GPU のフレームの処理時間を見積もるで説明されているように、単一の GPU フレームと一致する期間をハイライト表示します。そのページに記載されている、フレーム時間の境界での GPU 使用率(%)または同様のカウンタ トラックの使用に関する手法を使用してください。カウンタ トラックはすべて同じタイミング手法を使用し、(カウンタ トラック データとは独立してデータが収集される GPU スライスから得られるフレーム時間境界を使用する場合と比較して)メモリ使用量をより正確に推定できるためです。

使用率のトラックとその下に、対象のカウンタが並んでいる
図 5. 使用率トラックとその下に関心のあるカウンタが配置されている

出力外部合計

System Profiler でフレームを 1 つハイライト表示したら、まず [Output External Read bytes] の [Output External Write bytes] のカウンタを確認します。これらのカウンタにより、1 フレームでメモリバスを通過するデータの量を全体的に把握できます。メモリ帯域幅はモバイル デバイスでバッテリーを大量に消費するため、バス経由で送信するデータの量を最小限に抑えるよう最善を尽くしてください。

外部カウンタ トラックの出力
図 6. 外部カウンタ トラックの出力

内部合計を入力

キャッシュ自体に関する情報を提供するカウンタもあります。注目すべきカウンタは「Input internal [read|write] stall cycles」です。この値が大きいということは、キャッシュに正常にアクセスしているものの、実行されている読み取りリクエストが多すぎるため、シェーダー コードがメモリへのアクセスを待機してストールしていることを意味します。

入力内部カウンタ トラック
図 7. 内部カウンタ トラックを入力する

停止を取得する

次に確認できる一連のカウンタは、[Vertex Prefetcher Stall Cycles] カウンタと [Texture Fetch Stall] カウンタです。これらは、アプリケーションの全体的なメモリ パフォーマンスに関するヒントを提供します。5% を超える値が表示される場合は、メモリにデータを効率的にレイアウトしていないか、キャッシュを利用する効率的な方法でデータにアクセスしていないことを意味します。このようなタイプのアセットのメモリ使用量を改善する方法について詳しくは、[Vertex|テクスチャ] メモリ帯域幅の分析に関する記事を参照してください。

Stalls のカウンタ トラックの取得
図 8. ストールのカウンタ トラックを取得する