0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PMU : TrustedFirmware運(yùn)行時(shí)的性能數(shù)據(jù)的統(tǒng)計(jì)方法

冬至子 ? 來(lái)源:Arm精選 ? 作者:baron ? 2023-12-06 16:34 ? 次閱讀

思考: 如何統(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ù)的組件

image.png

第 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。

image.png

(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ù)組用于以下分析示例。

image.png

第 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

image.png

例二

要了解U-Boot 中的工作負(fù)載特征,您可以選擇名為 和 的crc32 陣列 。這樣,您需要對(duì)同一代碼進(jìn)行多次分析才能收集所有分析數(shù)據(jù)。evtselectcacheevtselectwlc

由于該domemcrc 函數(shù)是通過(guò)命令調(diào)用的,因此您可以對(duì)固件進(jìn)行一次編程,然后通過(guò)多次輸入相同的命令來(lái)重復(fù)分析。

image.png

(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í)行分析。分析的輸出如下。

例一

image.png

從輸出中可以看到,它記錄了此分析中每個(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。

示例二

image.png

正如您在上面看到的,cycles 兩個(gè)分析會(huì)話的結(jié)果幾乎相同。

從第一個(gè)分析結(jié)果中,您可以參考Arm架構(gòu)參考手冊(cè)來(lái)抽象出一些有意義的指標(biāo),如下所示。

image.png

根據(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.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2241

    瀏覽量

    93977
  • PMU
    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
    TRM
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    3285
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何縮短Vivado的運(yùn)行時(shí)

    在Vivado Implementation階段,有時(shí)是有必要分析一下什么原因?qū)е?b class='flag-5'>運(yùn)行時(shí)間(runtime)過(guò)長(zhǎng),從而找到一些方法來(lái)縮短運(yùn)行時(shí)間。
    的頭像 發(fā)表于 05-29 14:37 ?1.4w次閱讀
    如何縮短Vivado的<b class='flag-5'>運(yùn)行時(shí)</b>間

    紫金橋組態(tài)軟件新的功能_運(yùn)行時(shí)組態(tài)

    運(yùn)行時(shí)組態(tài)是組態(tài)軟件新近提出的新的概念。運(yùn)行時(shí)組態(tài)是在運(yùn)行環(huán)境下對(duì)已有工程進(jìn)行修改,添加新的功能。它不同于在線組態(tài),在線組態(tài)是在工程運(yùn)行的同時(shí),進(jìn)入組態(tài)環(huán)境,在組態(tài)環(huán)境中對(duì)工程進(jìn)行修改
    發(fā)表于 10-13 16:17 ?2次下載
    紫金橋組態(tài)軟件新的功能_<b class='flag-5'>運(yùn)行時(shí)</b>組態(tài)

    利用StopWatch監(jiān)控Java代碼運(yùn)行時(shí)間和分析性能

    利用StopWatch監(jiān)控Java代碼運(yùn)行時(shí)間和分析性能。
    的頭像 發(fā)表于 07-21 16:51 ?2637次閱讀

    Go運(yùn)行時(shí):4年之后

    自 2018 年以來(lái),Go GC,以及更廣泛的 Go 運(yùn)行時(shí),一直在穩(wěn)步改進(jìn)。近日,Go 社區(qū)總結(jié)了 4 年來(lái) Go 運(yùn)行時(shí)的一些重要變化。
    的頭像 發(fā)表于 11-30 16:21 ?691次閱讀

    什么是Kubernetes容器運(yùn)行時(shí)CRI

    起初,Docker是事實(shí)上的容器技術(shù)標(biāo)準(zhǔn),Kubernetes v1.5之前的代碼中直接調(diào)用Docker API,實(shí)現(xiàn)容器運(yùn)行時(shí)的相關(guān)操作。
    的頭像 發(fā)表于 02-20 16:22 ?1336次閱讀
    什么是Kubernetes容器<b class='flag-5'>運(yùn)行時(shí)</b>CRI

    AN021 測(cè)量MCU代碼運(yùn)行時(shí)間的幾種方法

    AN021 測(cè)量MCU代碼運(yùn)行時(shí)間的幾種方法
    發(fā)表于 02-27 18:23 ?0次下載
    AN021 測(cè)量MCU代碼<b class='flag-5'>運(yùn)行時(shí)</b>間的幾種<b class='flag-5'>方法</b>

    怎樣避免電力電容器運(yùn)行時(shí)漏油

    電力電容器運(yùn)行中,會(huì)因?yàn)楦鞣N因素出現(xiàn)故障。在電力電容器運(yùn)行時(shí)遇到的故障中,出現(xiàn)滲油和漏油的概率非常大。那么如何避免電力電容器運(yùn)行時(shí)漏油呢?庫(kù)克庫(kù)伯電氣會(huì)在接下來(lái)的文章中,針對(duì)電力電容器漏油的原因進(jìn)行分析,提出解決電容器漏油的
    的頭像 發(fā)表于 04-07 16:01 ?735次閱讀

    優(yōu)化HBM2E運(yùn)行時(shí)性能

    性能仍然是任何復(fù)雜片上系統(tǒng) (SoC) 設(shè)計(jì)的關(guān)鍵因素。此外,復(fù)雜性每天都在增加,這給工程師跟蹤設(shè)計(jì)性能帶來(lái)了挑戰(zhàn),但他們的任務(wù)是不斷提高芯片性能。在運(yùn)行時(shí)
    的頭像 發(fā)表于 05-26 10:17 ?535次閱讀
    優(yōu)化HBM2E<b class='flag-5'>運(yùn)行時(shí)</b><b class='flag-5'>性能</b>

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)之堆內(nèi)存

    說(shuō)一下 JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)吧,都有哪些區(qū)?分別是干什么的?
    的頭像 發(fā)表于 08-19 14:35 ?587次閱讀
    JVM<b class='flag-5'>運(yùn)行時(shí)數(shù)據(jù)</b>區(qū)之堆內(nèi)存

    ch32v307記錄程序運(yùn)行時(shí)

    ch32v307記錄程序運(yùn)行時(shí)間 在程序開(kāi)發(fā)中,很重要的一項(xiàng)任務(wù)就是對(duì)程序的運(yùn)行時(shí)間進(jìn)行評(píng)估。對(duì)于大型的程序系統(tǒng)來(lái)說(shuō),它們通常需要處理大量的數(shù)據(jù)或進(jìn)行復(fù)雜的計(jì)算操作。因此,如果程序的運(yùn)行時(shí)
    的頭像 發(fā)表于 08-22 15:53 ?730次閱讀

    Xilinx運(yùn)行時(shí)(XRT)發(fā)行說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《Xilinx運(yùn)行時(shí)(XRT)發(fā)行說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 10:01 ?0次下載
    Xilinx<b class='flag-5'>運(yùn)行時(shí)</b>(XRT)發(fā)行說(shuō)明

    如何保證它們?nèi)萜?b class='flag-5'>運(yùn)行時(shí)的安全?

    緊密耦合的容器運(yùn)行時(shí)繼承了主機(jī)操作系統(tǒng)的安全態(tài)勢(shì)和攻擊面。運(yùn)行時(shí)或主機(jī)內(nèi)核中的任何漏洞及其利用都會(huì)成為攻擊者的潛在切入點(diǎn)。
    的頭像 發(fā)表于 11-03 15:24 ?534次閱讀

    jvm運(yùn)行時(shí)內(nèi)存區(qū)域劃分

    JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,它是Java編程語(yǔ)言的運(yùn)行環(huán)境。JVM的主要功能是將Java源代碼轉(zhuǎn)換為機(jī)器代碼,并且在運(yùn)行時(shí)管理Java程序的內(nèi)存。JVM
    的頭像 發(fā)表于 12-05 14:08 ?414次閱讀

    jvm管理的內(nèi)存包括哪幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存

    JVM(Java虛擬機(jī))是Java程序的運(yùn)行環(huán)境,它提供了內(nèi)存管理機(jī)制來(lái)管理Java程序所需的運(yùn)行時(shí)數(shù)據(jù)內(nèi)存。這些運(yùn)行時(shí)數(shù)據(jù)內(nèi)存包括堆內(nèi)存、棧內(nèi)存、方法區(qū)(元
    的頭像 發(fā)表于 12-05 14:09 ?423次閱讀

    三菱plc累計(jì)運(yùn)行時(shí)間怎么編程

    具有重要意義。本文將詳細(xì)介紹如何使用三菱PLC編程實(shí)現(xiàn)累計(jì)運(yùn)行時(shí)間的統(tǒng)計(jì)功能。 一、概述 累計(jì)運(yùn)行時(shí)間是指設(shè)備或系統(tǒng)在一定時(shí)間內(nèi)的總運(yùn)行時(shí)間。在工業(yè)生產(chǎn)中,對(duì)設(shè)備的累計(jì)
    的頭像 發(fā)表于 06-20 11:31 ?1360次閱讀