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

倚天 710 是由阿里巴巴集团的芯片开发业务 T-Head 定制开发的,它实现了 uncore PMU,用于性能和功能调试,以方便系统维护。

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

倚天 710 采用八个 DDR5/4 通道,每个芯片上有四个。每个 DDR5 通道与其他通道独立,以服务系统内存请求。一个 DDR5 通道被分成两个独立的子通道。DDR 子系统 Driveway 为每个子通道实现了单独的 PMU,以监控各种性能指标。

Driveway PMU 设备命名为 ali_drw_<sys_base_addr> with perf。例如,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 groups 的总访问次数,或者在第一个 4 个计数器中单独计算四个 ranks。基本传输单元为 64B。

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

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

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

DDR 控制器 (DDRCTL) 和 DDR PHY 结合在一起,为将 SoC 应用总线连接到 DDR 内存设备创建了一个完整的解决方案。DDRCTL 接收主机接口 (HIF) 的事务,这是 Synopsys 自定义的。这些事务在内部排队并安排访问,同时满足 SDRAM 协议时序要求、事务优先级以及事务之间的依赖关系。DDRCTL 反过来在 DDR PHY 接口 (DFI) 上向 PHY 模块发出命令,该模块启动并将数据捕获到 SDRAM 以及从 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 带宽的计算方式如下

  • 读取带宽 = perf_hif_rd * DDRC_WIDTH * DDRC_Freq / DDRC_Cycle

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

这里,DDRC_WIDTH = 64 字节。

当前的驱动程序不支持采样。因此不支持 “perf record”。由于事件都是 uncore,因此也不支持附加到任务。