海思 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 都作为单独的 PMU 注册到 perf。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。
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 设备支持的事件的完整列表及其信息。