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