分析記憶體效率

應用程式的記憶體用量特性是效能的基本要素。您可以透過系統剖析器查看可用的 GPU 計數器資訊,分析這些特徵。

Adreno 裝置

在 Adreno 裝置上,請先醒目顯示與單一 GPU 影格一致的時間範圍,如「估算 CPU 和 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 + 紋理記憶體讀取計數器
圖 3 頂點 + 紋理記憶體讀取計數器

您認為這些值「良好」的程度,取決於應用程式中顯示的工作負載類型。舉例來說,2D 應用程式可能會使用相對較大的紋理記憶體讀取頻寬 (約 2 GB/s 以上),但頂點記憶體頻寬可能非常小 (約 50 MB/s)。詳情請參閱「分析頂點記憶體頻寬」和「分析紋理記憶體頻寬用量」說明文件。

擷取攤位

請查看「% Vertex Fetch Stall」、「% Texture Fetch Stall」和「% Stall on System Memory」計數器,因為這些計數器會提供應用程式整體記憶體效能的提示。如果值大約高於 5%,表示應用程式可能未以有效率的方式在記憶體中配置資料,或是未以有效率的方式存取資料來善用快取。如要瞭解如何改善這類資產的記憶體用量,請參閱「分析頂點記憶體頻寬」和「分析紋理記憶體頻寬用量」。

記憶體停滯計數器
圖 4:記憶體停滯計數器

馬利裝置

在 Mali 裝置上,請先醒目顯示與單一 GPU 影格一致的時間範圍,如「估算 CPU 和 GPU 影格處理時間」一文所述。請使用該頁面所述的技術,包括使用 GPU 使用率百分比或類似的計數器追蹤影格時間界限,因為計數器追蹤作業都使用相同的計時技術,因此與使用從 GPU 切片取得的影格時間界限相比,可更準確地估算記憶體使用率 (這些資料是獨立於計數器追蹤資料收集)。

下方是您感興趣的計數器,上方則是相應的用量軌跡
圖 5 使用率軌與下方您感興趣的計數器對齊

輸出外部總計

在「系統分析器」中醒目顯示單一影格後,請先查看「輸出外部讀取位元組」和「輸出外部寫入位元組」計數器。這些計數器可提供單一影格期間,記憶體匯流排傳輸資料量的整體概況。請盡量減少透過匯流排傳送的資料量,因為記憶體頻寬是行動裝置耗電的主要原因。

輸出外部計數器軌
圖 6:輸出外部計數器軌跡

輸入內部總計

此外,還有一些計數器可提供快取本身的相關資訊。您感興趣的計數器是「輸入內部 [讀取|寫入] 停滯週期」。這些值越高,表示您成功命中快取,但發出的讀取要求過多,導致著色器程式碼停滯,等待存取記憶體。

輸入內部計數器軌
圖 7:輸入內部計數器軌跡

擷取攤位

接下來可以查看 Vertex Prefetcher Stall CyclesTexture Fetch Stall 計數器,這些計數器會提供應用程式整體記憶體效能的提示。如果看到的值高於約 5%,表示您可能未以有效率的方式在記憶體中配置資料,或未以有效率的方式存取資料來善用快取。如要瞭解如何改善這類資產的記憶體用量,請參閱「分析 [Vertex|Texture] 記憶體頻寬」一文

擷取「Fetch Stalls」計數器軌跡
圖 8:Fetch Stalls 計數器會追蹤