預估 CPU 和 GPU 影格的處理時間

估算 CPU 和 GPU 的影格處理時間 (影格時間),有助於瞭解應用程式的效能並找出瓶頸。使用 AGI 剖析應用程式時,System Profiler 會提供追蹤資料,可用於估算影格時間。

CPU 時間

在 AGI 中,您可以在系統設定檔的 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.dequeueBuffereglSwapBuffer 事件期間,CPU 大量閒置。

CPU 活躍時間

CPU 處於非閒置狀態時,會執行應用程式程式碼,這段時間就是 CPU 活躍時間。

如要評估 CPU 作用時間,請查看 CPU 事件正上方的「執行中」切片。計算兩個影格提交事件之間,處於「執行中」Running狀態的所有追蹤部分。請務必加入可用的執行緒。

這張螢幕截圖顯示兩個時間段的 CPU 時間,可用於評估 CPU 運作時間。
圖 5. 兩個 CPU 時間週期,可用於測量 CPU 的活動時間。


螢幕截圖:多執行緒應用程式在主執行緒閒置時,有其他執行緒正在運作。
圖 6. 多執行緒應用程式,主執行緒閒置時有其他工作執行緒。

如要測量 CPU 作用時間,也可以查看 CPU 軌中的應用程式切片。這些切片表示 CPU 正在執行,且對應至「執行中」切片。

螢幕截圖:顯示與 CPU 軌跡相符的已釘選執行緒執行狀態。
圖 7. 已釘選執行緒的執行狀態與 CPU 軌跡相符。

如要協助識別應用程式切片,可以將 ATrace 標記新增至應用程式。這樣一來,系統分析器 CPU 軌跡就會顯示這些標記。

螢幕截圖:CPU 軌上顯示的 ATrace 切片。
圖 8.CPU 軌上顯示的 ATrace 切片。

估算 GPU 影格時間

如要估算 GPU 影格時間,您可以使用 System Profiler 中的 GPU 切片或 GPU 計數器。使用 GPU 切片時,預估結果會更準確。

GPU 切片

如果系統設定檔提供 GPU 切片資訊,您就可以測量應用程式處理與單一影格相關聯工作所花費的總時間,取得非常準確的 GPU 影格時間資訊。

馬利裝置

在 Mali 裝置上,GPU 切片有片段非片段,以及偶爾的補充非片段軌。對於較不複雜的影格,片段和非片段工作是循序進行,因此只要查看 GPU 作用中工作之間的間隔,即可區分不同影格的工作。

或者,如果您熟悉提交至 GPU 的工作,識別提交的算繪通道模式可提供影格開始和結束時間的相關資訊。

依序執行多個影格的螢幕截圖。
圖 9.依序執行多個影格。
螢幕截圖:AGI 放大顯示個別影格的作業。
圖 10. 放大檢視個別影格的工作。

如果應用程式的 GPU 工作流程平行處理程度較高,您可以在每個切片的「選取」窗格中,找出具有相同 submissionID 的所有影格,即可取得 GPU 影格時間。

對於以 Vulkan 為基礎的應用程式,可使用多項提交內容來組成影格。使用「Vulkan Events」軌跡追蹤提交 ID,其中包含每個提交內容的切片。選取提交內容切片後,系統會醒目顯示與提交內容對應的所有 GPU 活動切片。

螢幕截圖:平行處理的 GPU 工作負載,其中一個影格的工作可能會與另一個影格重疊。
圖 11. 平行化 GPU 工作負載,其中一個影格的工作可與另一個影格重疊。


螢幕截圖:選取影格的多個 Vulkan 事件。
圖 12. 已為影格選取多個 Vulkan 事件。

Adreno 裝置

在 Adreno 裝置上,GPU 切片會顯示在「GPU Queue 0」軌中,且一律依序呈現,因此您可以查看代表影格轉譯階段的所有切片,並用來測量 GPU 影格時間。

依序執行多個影格的螢幕截圖。
圖 13.依序執行多個影格。
螢幕截圖:AGI 放大顯示含有多個算繪通道的影格。
圖 14. 放大特定影格,顯示多個算繪階段。

與先前說明的 Mali 情況類似:如果應用程式使用 Vulkan,Vulkan 事件軌跡會提供提交執行影格的工作相關資訊。如要醒目顯示算繪通道,請按一下與影格相關聯的「Vulkan Events」切片。

螢幕截圖:以 Vulkan 為基礎的應用程式,其中選取了影格的 Vulkan 事件。
圖 15. 以 Vulkan 為基礎的應用程式,其中選取了影格的 Vulkan 事件。

在某些情況下,由於應用程式大量使用 GPU,因此較難區分 GPU 影格的界線。在這些情況下,如果您熟悉提交至 GPU 的工作,可以找出執行算繪傳遞的模式,並根據該資訊判斷影格界線。

螢幕截圖:GPU 負載過重的應用程式,其中顯示有助於識別影格邊界的算繪傳遞模式。
圖 16. GPU 負載極高的應用程式,具有可協助識別影格邊界的轉譯傳遞模式。

GPU 計數器

如果追蹤記錄中沒有 GPU 切片資訊,可以使用 GPU 計數器軌跡估算 GPU 影格時間。

馬利裝置

在 Mali 裝置上,您可以透過 GPU 使用率軌跡,估算非 GPU 密集型應用程式的 GPU 影格時間。如果應用程式的 GPU 密集程度較低,GPU 活動會定期出現高低起伏,而不是持續處於高活動狀態。如要使用 GPU 使用率軌跡估算 GPU 影格時間,請測量軌跡中高活動期間的長度。

Mali 裝置的 GPU 使用率和 GPU 佇列軌跡螢幕截圖。
圖 17. Mali 裝置上的 GPU 使用率和 GPU 佇列軌跡。

如果應用程式更耗用 GPU 資源,GPU 使用率可能會持續維持在非常高的水準。在這種情況下,您可以使用「片段佇列使用率」和「非片段佇列使用率」軌跡,監控 GPU 活動並估算 GPU 影格時間。透過尋找片段非片段軌跡中的模式,您可以大致估算影格的邊界,並使用該邊界測量 GPU 影格時間。

片段和非片段軌的螢幕截圖。
圖 18. 片段非片段軌。

Adreno 裝置

在 Adreno 裝置上,如果應用程式並未大量使用 GPU,您可以按照上一節中Mali 裝置的估算方式,估算 GPU 影格時間。

Adreno 裝置的 GPU 使用率百分比和 GPU 佇列軌跡螢幕截圖。
圖 19. Adreno 裝置上的 GPU 使用率百分比和 GPU 佇列軌跡。

如果應用程式更耗用 GPU,且應用程式的 GPU 使用率百分比持續偏高,您可以透過「每秒的 Vertex 指令」和「每秒的片段指令」軌跡,估算 GPU 影格時間。透過尋找這些軌跡活動層級的模式,您可以大致估算影格的邊界位置,並用來測量 GPU 影格時間。

Vertex 指示 / 第二軌的螢幕截圖。
圖 20. Vertex 指示 / 秒軌。

其他軌跡可能提供類似資訊:

  • 每秒著色頂點數
  • 片段 (陰影)/秒
  • % Time Shading Vertices
  • 時間陰影片段百分比