海思 SoC Uncore 效能監控單元 (PMU)

海思 SoC 晶片包含各種獨立的系統裝置 PMU,例如 L3 快取 (L3C)、Hydra Home Agent (HHA) 和 DDRC。 這些 PMU 是獨立的,並具有硬體邏輯來收集統計資料和效能資訊。

海思 SoC 封裝了多個 CPU 和 IO 晶片。 每個 CPU 叢集 (CCL) 由 4 個共享一個 L3 快取的 CPU 核心組成; 每個 CPU 晶片稱為超級 CPU 叢集 (SCCL),由 6 個 CCL 組成。 每個 SCCL 分別有兩個 HHA (0 - 1) 和四個 DDRC (0 - 3)。

海思 SoC uncore PMU 驅動程式

每個裝置 PMU 都有單獨的暫存器用於事件計數、控制和中斷,PMU 驅動程式應註冊 perf PMU 驅動程式,例如 L3C、HHA 和 DDRC 等。 可用事件和配置選項應在 sysfs 中描述,請參閱

/sys/bus/event_source/devices/hisi_sccl{X}_<l3c{Y}/hha{Y}/ddrc{Y}>。“perf list”命令應列出 sysfs 中的可用事件。

每個 L3C、HHA 和 DDRC 都註冊為 perf 的單獨 PMU。 PMU 名稱將在事件列表中顯示為 hisi_sccl<sccl-id>_module<index-id>。 其中“sccl-id”是 SCCL 的識別符號,“index-id”是模組的索引。

例如 hisi_sccl3_l3c0/rd_hit_cpipe 是 SCCL ID #3 中 L3C 索引 #0 的 READ_HIT_CPIPE 事件。

例如 hisi_sccl1_hha0/rx_operations 是 SCCL ID #1 中 HHA 索引 #0 的 RX_OPERATIONS 事件。

該驅動程式還提供了一個“cpumask”sysfs 屬性,顯示用於計算 uncore PMU 事件的 CPU 核心 ID。“associated_cpus”sysfs 屬性也用於顯示與此 PMU 關聯的 CPU。“cpumask”指示開啟事件的 CPU,通常作為 perf 等使用者空間工具的提示。它只包含來自“associated_cpus”的一個關聯 CPU。

perf 的示例用法

$# perf list
hisi_sccl3_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl3_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------

$# perf stat -a -e hisi_sccl3_l3c0/rd_hit_cpipe/ sleep 5
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02/ sleep 5

對於識別符號為 0x30 的海思 uncore PMU v2,拓撲結構與 PMU v1 相同,但硬體中添加了一些新功能。

1. L3C PMU 支援按叢集中的核心/執行緒進行過濾,可以將其指定為點陣圖

$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_core=0x3/ sleep 5

這將僅計算此叢集中核心/執行緒 0 和 1 的操作。

2. Tracetag 允許使用者選擇僅透過 perf 中的 tt_req 引數來計數讀取、寫入或原子操作。 預設值計算所有操作。 tt_req 是 3 位,3’b100 表示讀取操作,3’b101 表示寫入操作,3’b110 表示原子儲存操作,3’b111 表示原子非儲存操作,其他值保留

$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_req=0x4/ sleep 5

這將僅計算此叢集中的讀取操作。

3. Datasrc 允許使用者檢查資料來自何處。 它是 5 位。 一些重要的程式碼如下

  • 5’b00001:來自此晶片中的 L3C;

  • 5’b01000:來自跨晶片的 L3C;

  • 5’b01001:來自另一個插槽中的 L3C;

  • 5’b01110:來自本地 DDR;

  • 5’b01111:來自跨晶片 DDR;

  • 5’b10000:來自跨插槽 DDR;

等等,這主要有助於找到資料來源離 CPU 核心最近。 如果在多晶片中使用 datasrc_cfg,則應在 perf 命令中配置 datasrc_skt

$# perf stat -a -e hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xE/,
hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xF/ sleep 5

4. 一些海思 SoC 封裝了多個 CPU 和 IO 晶片。 每個 CPU 晶片包含多個計算叢集 (CCL)。 I/O 晶片稱為超級 I/O 叢集 (SICL),包含多個 I/O 叢集 (ICL)。 SoC 中的每個 CCL/ICL 都有一個唯一的 ID。 每個 ID 都是 11 位,包括一個 6 位 SCCL-ID 和一個 5 位 CCL/ICL-ID。 對於 I/O 晶片,ICL-ID 後跟

  • 5’b00000: I/O_MGMT_ICL;

  • 5’b00001: Network_ICL;

  • 5’b00011: HAC_ICL;

  • 5’b10000: PCIe_ICL;

5. uring_channel:UC PMU 事件 0x47~0x59 支援按 tx 請求 uring 通道進行過濾。 它是 2 位。 一些重要的程式碼如下

  • 2’b11:計算傳送到 uring_ext (MATA) 通道的事件;

  • 2’b01:與 2’b11 相同;

  • 2’b10:計算傳送到 uring(非 MATA)通道的事件;

  • 2’b00:預設值,計算傳送到 uring 和 uring_ext 通道的事件;

使用者可以透過設定 srcid_cmd & srcid_msk 來配置 ID 以計算來自特定 CCL/ICL 的資料,並透過設定 tgtid_cmd & tgtid_msk 來配置用於特定 CCL/ICL 的資料。 srcid_msk/tgtid_msk 中的設定位表示 PMU 在與 srcid_cmd/tgtid_cmd 匹配時不檢查該位。

如果停用所有這些選項,它可以按預設值工作,該預設值不區分過濾器條件和 ID 資訊,並將返回 PMU 計數器中的總計數器值。

當前驅動程式不支援取樣。 因此不支援“perf record”。 也不支援附加到任務,因為事件都是 uncore。

注意:如果需要,請聯絡維護者以獲取 SoC 中 PMU 裝置支援的完整事件列表及其資訊。