思考: 如何統計Trustedfirmware的性能數據? tee的呢?uboot的呢?
如何統計cache命令率?
如何計算 IPC:Instructions Per Cycle?
Armv8-A CPU 中的性能監控單元 (PMU) 提供硬件級性能監控和分析功能。PMU 通過計數器收集硬件事件計數。計數器包括周期計數器和事件計數器。您可以配置:
*每個事件計數器對指定的硬件事件進行計數。
*每個計數器從各種 CPU 異常級別和狀態的工作負載收集硬件事件。
perf 等工具使用 PMU 來分析在 Armv8-A CPU 上運行的 Linux 應用程序。然而,沒有通用的方法來使用 PMU 來分析固件,因為它運行在裸機環境中。
要使用 PMU 分析固件,一種簡單的方法是以庫的形式添加 PMU 支持。在這篇博文中,我們提供了一個 PMU 庫作為參考實現。該庫已在基于Armv8.0-A CPU的平臺上得到驗證。我們還描述了如何在固件中添加 PMU 支持以及如何使用 PMU 分析固件。Trusted Firmware-A (TF-A) 和 U-Boot 用作示例固件。
下表列出了 PMU 庫的組件
第 1 階段: 向固件添加 PMU 支持
使用以下命令將PMU庫的所有文件解壓到固件 lib/pmu 中的 路徑。 unzip armv8_pmuv3_library.zip-d ${FIRMWARE_PATH}/lib/pmu
根據您使用的固件,您需要對文件進行如下特定更改。Makefile
(1)、TF-A
Makefile 如下修改位于 TF-A 根路徑中的現有文件。
1.BL_COMMON_SOURCES += lib/pmu/armv8_pmuv3_fn.c lib/pmu/armv8_pmuv3_events.c
2.INCLUDES += -Ilib/p
(2)、uboot
修改Makefile U-Boot 根路徑下的現有文件,如下所示。
1.UBOOTINCLUDE += -Ilib/pmu
Makefile 在與 PMU 庫相同的目錄中創建一個文件。按如下方式填寫文件。
1.obj-y += armv8_pmuv3_fn.o armv8_pmuv3_events.o
現在,您可以重建固件。如果構建成功,請進入第 2 階段。
第 2 階段:選擇 PMU 事件進行分析
首先,獲取運行固件的 Armv8-A CPU 的支持 PMU 事件。有關 PMU 事件,請參閱 CPU 技術參考手冊 (TRM)。
jevents.py在 PMU 庫中,您還可以使用按以下步驟命名的 Python 腳本。
(1)、獲取指定CPU支持的PMU事件 GitHub Machine-readable data 維護每個 Arm CPU 支持的 PMU 事件。它采用JSON格式存儲PMU事件的事件助記符、事件編號等信息。該信息與CPU TRM中的信息一致。
jevents.pyPMU 庫中 命名的 Python 腳本克隆 Machine-readable data
, 將 JSON 格式轉換為 C 格式,并生成名為armv8pmuv3events.c. 您可以按如下方式使用它。
首先,使用以下命令列出所有支持轉換的CPU名稱。
python3 jevents.py--list
然后,使用以下命令指定要轉換的CPU的名稱。該命令將生成名為armv8pmuv3events.c. 該文件包含兩種類型的數組。一種是針對指定CPU的支持PMU事件。另一個是針對選定的 PMU 事件進行分析。 python3 jevents.py--cpu
armv8_pmuv3_events.c生成的文件示例 jevents.py 如下。我們將 cpu 名稱指定為cortex-a53。名為的數組pmu_events_map包含 Cortex-A53 的所有支持 PMU 事件。這與 Cortex-A53 TRM 相同。您可以從此處選擇 PMU 事件并將所選事件放入名為 的數組中evt_select。
(2)、選擇 PMU 事件進行分析 在初始分析中,通常您需要選擇各種 PMU 事件。這將使您全面了解要分析的代碼。
對于 Armv8-A CPU,每個 CPU 的可用事件計數器是有限的。您可以參考 CPU TRM 以獲取該編號。如果所需的 PMU 事件數量超過可用計數器,可以使用以下方法。
- 將所有要選擇的 PMU 事件分組。每組中的事件數量不得超過 PMU 的可用計數器。
- 創建多個pmu_event_selected 結構數組并將每一組放入一個數組中。
- 多次分析相同的代碼,一次選擇一個陣列,然后重復該過程,直到測量所有事件。
例如,我們 在.c文件中創建兩個名為 和 的pmu_event_selected 結構體數組。對于 Cortex-A53,可使用 1 個周期計數器和 6 個事件計數器。每個數組中的 PMU 事件數量不超過此數量。此外,在每個陣列中,PMU 事件都是相關的,以確保分析數據具有可比性。
我們將這兩個數組用于以下分析示例。
第 3 階段: 使用 PMU 分析固件
現在,您可以使用 PMU 來分析固件。對要分析的固件中的特定代碼使用以下過程。
- 將開始分析點放在代碼之前。這將配置、啟用并讀取每個 PMU 計數器的當前值作為預分析值。
- 將停止分析點放置在代碼后面。這將禁用每個 PMU 計數器值并將其讀取為分析后值。
- 重建固件并再次運行代碼。計算每個 PMU 計數器的分析前值和分析后值之間的差異。這將收集統計分析結果。
在PMU庫中,armv8pmuv3fn.c 提供了參考實現。
(1)、將分析點放置在固件中
您只需在要分析的代碼之間添加兩個名為pmuv3startProfiling 和的函數即可。pmuv3stopProfiling對于每個分析,傳遞一個pmueventselected 結構數組作為參數。
根據您想要分析的 PMU 事件數量,您需要分析一次或多次。以下是兩個分析示例。
例一
要分析 TF-A 中的函數并重點關注緩存行為,您只能選擇 為單個分析命名enablemmuel3 的數組 。evtselectcache
例二
要了解U-Boot 中的工作負載特征,您可以選擇名為 和 的crc32 陣列 。這樣,您需要對同一代碼進行多次分析才能收集所有分析數據。evtselectcacheevtselectwlc
由于該domemcrc 函數是通過命令調用的,因此您可以對固件進行一次編程,然后通過多次輸入相同的命令來重復分析。
(2)、了解 PMU 分析的實現
該函數startProfiling 執行以下操作。
- 為 PMU 執行必要的初始化。它檢查CPU PMU 支持的事件計數器數量是否適合所選事件。然后,它設置MDCREL2 或 MDCREL3 以在當前異常級別啟用 PMU 分析。這是因為固件通常在 EL2/EL3 或安全狀態下運行,其中禁止分析以防止信息泄漏。
- 配置每個 PMU 計數器以分析當前異常級別和選定的 PMU 事件。
- 啟用每個 PMU 計數器。
- 讀取每個 PMU 計數器的當前值作為預分析值。
該函數stopProfiling 執行以下操作。
- 禁用每個 PMU 計數器。
- 讀取每個 PMU 計數器的當前值作為分析后值。
- 轉儲此分析的結果。
- 對 PMU 執行必要的去初始化。這會禁用工作在 EL2/EL3 或安全狀態的 PMU。
對于上一部分提到的示例,在 Juno r2 平臺上執行分析。分析的輸出如下。
例一
從輸出中可以看到,它記錄了此分析中每個選定 PMU 事件和周期的預分析和后分析值。此外,它還計算差異,并將它們記錄在名為 的列中DELTA。
對于 Cortex-A53 CPU,PMU 事件L1DTLBREFILL 包含在 的計數中L1DCACHEREFILL。因此,您可能會發現 的計數值L1DCACHEREFILL 大于 的計數值L1D_CACHE。
示例二
正如您在上面看到的,cycles 兩個分析會話的結果幾乎相同。
從第一個分析結果中,您可以參考Arm架構參考手冊來抽象出一些有意義的指標,如下所示。
根據第二個分析結果,您可以計算 Instructions Per Cycle (IPC) as follows.
IPC = INST_RETIRED / CYCLES
The IPC of this workload is 0.23. This is caused by many MEM_ACCESS operations. You might determine the workload as the computation-intensive one.
-
計數器
+關注
關注
32文章
2278瀏覽量
95644 -
PMU
+關注
關注
1文章
109瀏覽量
21915 -
ARMv8
+關注
關注
1文章
35瀏覽量
14322 -
Cortex-A53
+關注
關注
0文章
33瀏覽量
21493 -
TRM
+關注
關注
0文章
13瀏覽量
3374
發布評論請先 登錄
相關推薦
紫金橋組態軟件新的功能_運行時組態

評論