阿里巴巴 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 设备命名为 ali_drw_<sys_base_addr> 并带有 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 组的总访问次数,或前 4 个计数器中分别计算四个 rank 的总访问次数。 基本传输单位为 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 之间的数据。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,因此不支持附加到任务。