メモリ効率を分析する

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

Adreno デバイス

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

使用率のトラックが、その下の関連するカウンタと一致している
図 1. 利用状況トラックと、その下の関連するカウンタ

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

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

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

Vertex Memory Read (Bytes/Second) カウンタと Texture Memory Read (Bytes/Second) カウンタを調べて、頂点データとテクスチャ データに使用される帯域幅の割合を特定することもできます。

Vertex + Texture Memory Read Counters
図 3. 頂点とテクスチャのメモリ読み取りカウンタ

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

フェッチ ストール

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

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

Mali デバイス

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

使用率のトラックが、その下の関心のあるカウンタと一致している
図 5. 利用状況トラックと、その下の関心のあるカウンタ

外部出力の合計

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

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

内部入力の合計

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

入力内部カウンタートラック
図 7. 内部入力カウンタ トラック

フェッチ ストール

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

Fetch Stalls カウンタ トラック
図 8. フェッチ ストール カウンタ トラック