阿里巴巴 T-Head SoC 片外(Uncore)性能监控单元 (PMU)

倚天 710 是由阿里巴巴集团旗下芯片研发部门 T-Head 定制开发的,它实现了片外(uncore)PMU,用于性能和功能调试,以促进系统维护。

DDR 子系统 Driveway (DRW) PMU 驱动程序

倚天 710 采用了八个 DDR5/4 通道,每个裸片(die)上有四个。每个 DDR5 通道彼此独立,用于服务系统内存请求。此外,一个 DDR5 通道被拆分为两个独立的子通道。DDR 子系统 Driveway 为每个子通道实现了独立的 PMU,以监控各种性能指标。

Driveway PMU 设备在 perf 中被命名为 ali_drw_<sys_base_addr>。例如,ali_drw_21000 和 ali_drw_21080 是 die 0 中同一通道的两个子通道的两个 PMU 设备。die 1 的 PMU 设备前缀为 ali_drw_400XXXXX,例如 ali_drw_40021000。

每个子通道总共有 36 个 PMU 计数器,分为四组

  • 第 0 组:PMU 周期计数器。该组包含一对计数器 pmu_cycle_cnt_low 和 pmu_cycle_cnt_high,用作基于 DDRC 核心时钟的周期计数。

  • 第 1 组:PMU 带宽计数器。该组有 8 个计数器,用于统计选定 Rank 中八个 Bank 组的总访问次数,或者前 4 个计数器分别统计四个 Rank 的访问次数。基础传输单位为 64B。

  • 第 2 组:PMU 重试计数器。该组有 10 个计数器,旨在统计每种类型的不可纠正错误的重试总次数。

  • 第 3 组:PMU 通用计数器。该组有 16 个计数器,用于统计通用事件。

目前,Driveway PMU 驱动程序仅使用第 0 组和第 3 组的计数器。

DDR 控制器 (DDRCTL) 和 DDR PHY 相结合,创建了一个将 SoC 应用总线连接到 DDR 存储设备的完整解决方案。DDRCTL 接收通过 Synopsys 自定义的宿主接口 (HIF) 发来的事务。这些事务在内部排队,并在满足 SDRAM 协议时序要求、事务优先级和事务间依赖关系的同时进行访问调度。DDRCTL 随后在 DDR PHY 接口 (DFI) 上向 PHY 模块发出命令,由 PHY 模块启动并捕获往返于 SDRAM 的数据。Driveway PMU 具有硬件逻辑,用于收集 HIF、DFI 等上的统计数据和性能日志信号。

通过统计通过 HIF 接口发送到 DDRC 的 READ、WRITE 和 RMW 命令,我们可以计算带宽。计算内存数据带宽的使用示例

perf stat \
  -e ali_drw_21000/hif_wr/ \
  -e ali_drw_21000/hif_rd/ \
  -e ali_drw_21000/hif_rmw/ \
  -e ali_drw_21000/cycle/ \
  -e ali_drw_21080/hif_wr/ \
  -e ali_drw_21080/hif_rd/ \
  -e ali_drw_21080/hif_rmw/ \
  -e ali_drw_21080/cycle/ \
  -e ali_drw_23000/hif_wr/ \
  -e ali_drw_23000/hif_rd/ \
  -e ali_drw_23000/hif_rmw/ \
  -e ali_drw_23000/cycle/ \
  -e ali_drw_23080/hif_wr/ \
  -e ali_drw_23080/hif_rd/ \
  -e ali_drw_23080/hif_rmw/ \
  -e ali_drw_23080/cycle/ \
  -e ali_drw_25000/hif_wr/ \
  -e ali_drw_25000/hif_rd/ \
  -e ali_drw_25000/hif_rmw/ \
  -e ali_drw_25000/cycle/ \
  -e ali_drw_25080/hif_wr/ \
  -e ali_drw_25080/hif_rd/ \
  -e ali_drw_25080/hif_rmw/ \
  -e ali_drw_25080/cycle/ \
  -e ali_drw_27000/hif_wr/ \
  -e ali_drw_27000/hif_rd/ \
  -e ali_drw_27000/hif_rmw/ \
  -e ali_drw_27000/cycle/ \
  -e ali_drw_27080/hif_wr/ \
  -e ali_drw_27080/hif_rd/ \
  -e ali_drw_27080/hif_rmw/ \
  -e ali_drw_27080/cycle/ -- sleep 10

按指标统计所有内存读/写带宽的使用示例

perf stat -M ddr_read_bandwidth.all -- sleep 10
perf stat -M ddr_write_bandwidth.all -- sleep 10

平均 DRAM 带宽计算如下

  • 读带宽 (Read Bandwidth) = perf_hif_rd * DDRC_WIDTH * DDRC_Freq / DDRC_Cycle

  • 写带宽 (Write Bandwidth) = (perf_hif_wr + perf_hif_rmw) * DDRC_WIDTH * DDRC_Freq / DDRC_Cycle

其中,DDRC_WIDTH = 64 字节。

当前驱动程序不支持采样。因此不支持“perf record”。此外,由于所有事件均为片外(uncore)事件,因此不支持附加到任务(attach to a task)。