简介

AMD 平台处理器性能监控可以参考软件开发手册 PPR(Processor Programming Reference),需要注意的是,对于不同型号处理器(Model),其性能监控事件和寄存器会有所不同,需要查看对应版本手册。 针对 AMD Rome 7742平台,可以参考《Processor Programming Reference (PPR) for AMD Family 17h Model 18h, Revision B1 Processors (PUB)》。

AMD 平台性能监控分类

在 AMD 性能监控中,主要有三类寄存器,包括:

  1. 核心事件(Core event)寄存器 - RDPMC[5:0]
  2. 数据结构事件(data fabric event)寄存器 - RDPMC[9:6]
  3. L3 缓存事件(L3 cache event)寄存器 - RDPMC[F:A]

在性能监控过程中,存在常规性能事件,如缓存命中率等。在 AMD 平台可以通过多种事件结合获得常见事件监控结果,如下表所示。 此表{@tbl:perf_event}来源于监控手册中 Table 25,下面将详细介绍表中对应内容。

性能事件 监控事件
All L2 Cache Accesses Event[0x43F960] + Event[0x431F70] + Event[0x431F71] + Event[0x431F72]
All L2 Cache Misses Event[0x430964] + Event[0x431F71] + Event[0x431f72]
All L2 Cache Hits Event[0x43f664] + Event[0x431f70]
L3 Cache Accesses L3Event[0x0300C0000040FF04]
L3 Miss (includes cacheline state change requests) L3Event[0x0300C00000400104]
Macro-ops Retired Event[0x4300C1]
Approximate: Outbound data bytes for all Remote Links for a node (die) (DfEvent[0x00000007004002C7] + DfEvent[0x0000000800400207] + DfEvent[0x0000000800400247] + DfEvent[0x0000000800400287]) * 32B
Approximate: Combined DRAM bytes of all channels on a NPS1 node (die) (DfEvent[0x0000000000403807]+ DfEvent[0x0000000000403847]+ DfEvent[0x0000000000403887]+ DfEvent[0x00000000004038C7]+ DfEvent[0x0000000100403807]+ DfEvent[0x0000000100403847]+ DfEvent[0x0000000100403887]+ DfEvent[0x00000001004038C7]) * 64B

Table: AMD Family 17h Model 18h PPR 中主要性能监控事件及对应监控寄存器值 {#tbl:perf_event}

天眼在 AMD 平台微架构监控事件

目前天眼通过增加 AMD 平台核心监控,L3 缓存监控,Data Fabric 模块监控等功能,增加了多种微架构监控事件,如表{@tbl:amd_perf_event}所示。

性能事件 硬件设备 说明
ActualCoreClks Core 内核处于C0状态周期数
MaxCoreClks Core 内核处于C0状态P0频率周期数
InstructionRetired Core 完成指令数
CpuClockUnhalted Core CPU核心执行周期数
RETIRED_SSE_AVX_GFLOPS_ALL Core 完成浮点计算总数
CPI Core Cycle Per Instruction
DF_CH0_RD_BW_GB Socket 内存通道 0 读数据总量 GB
…… Socket ……
DF_CH7_RD_BW_GB Socket 内存通道 7 读数据总量 GB
DF_CH0_WR_BW_GB Socket 内存通道 0 写数据总量 GB
…… Socket ……
DF_CH7_WR_BW_GB Socket 内存通道 7 写数据总量 GB
L3_Cache_Access CCD L3缓存访问总数
L3_Cache_Miss CCD L3缓存未命中总数
L3_Cache_Miss_Ratio CCD L3缓存未命中比率

Table: 天眼在 AMD 平台微架构监控事件 {#tbl:amd_perf_event}

DFEvent 监控

Data Fabric(DF)简介

DF(Data Fabric)是 AMD CPU 的数据通信平面。所有从核心到核心以及到其他外围设备(如内存控制器和I/O集线器)的数据都通过 DF 进行路由。 在 DF 监控平台,共有 4 组 msr 寄存器 Core::X86::Msr::DF_PERF_CTL 和 Core::X86::Msr::DF_PERF_CTR 可以对性能事件进行监控。

参考手册中 2.1.16.3 章节对此 MSR 寄存器具体介绍,可以获得以下内容:

  1. 此 msr 寄存器所有线程和核心内共享,这说明单个 CPU 内所有线程/核心访问此内存地址都是唯一的;
  2. Core::X86::Msr::DF_PERF_CTL 寄存器需要指定 event 和 umask code 内容。对于内存访问,umask code 是固定的 0x38h,而 event code(长度 13:0)分为两部分,前 event[5:0] 为固定值 0x07h,后 event[13:6] 分别为 0x00h 至 0x07h,代表监控不同的 DRAM 通道。
  3. 在 Core::X86::Msr::DF_PERF_CTL 寄存器中,各位值表示含义如下:
    • DF_PERF_CTL[7:0] 为 event[7:0];
    • DF_PERF_CTL[15:8] 为 umask code;
    • DF_PERF_CTL[22] 为 enable 位,设置为 1 时开始监控;
    • DF_PERF_CTL[35:32] 为 event[11:8]
    • DF_PERF_CTL[60:59] 为 event[13:12]

根据以上内容可以得知,对于 DF_PERF 事件监控需要使用 event 和 umask code 进行指定,其中通过 event code 对不同 DRAM 通道进行区分。 将不同事件对应的 event code 和 umask 相结合,并按照要求写入 Core::X86::Msr::DF_PERF_CTL 寄存器内。对应不同 DRAM 通道时,Core::X86::Msr::DF_PERF_CTL 寄存器值为:

监控内容 event umask CTL
DRAM Channel Controller 0 0x007h 0x38h 0x000403807h
DRAM Channel Controller 1 0x047h 0x38h 0x000403847h
DRAM Channel Controller 2 0x087h 0x38h 0x000403887h
DRAM Channel Controller 3 0x0C7h 0x38h 0x0004038C7h
DRAM Channel Controller 4 0x107h 0x38h 0x100403807h
DRAM Channel Controller 5 0x147h 0x38h 0x100403847h
DRAM Channel Controller 6 0x187h 0x38h 0x100403887h
DRAM Channel Controller 7 0x1C7h 0x38h 0x1004038C7h

Table: Core::X86::Msr::DF_PERF_CTL 寄存器值及对应监控事件 {#tbl:event_code}

表{@tbl:event_code}中对应 CTL 值即可与表{@tbl:perf_event}中对应起来。每个 Socket 内将此 8 个事件相加即可获得总内存带宽监控结果。 需要注意的是,由于 DF 寄存器只有 4 个,无法一次完成所有内存带宽监控,因此必须使用 multiplex 实现此功能。

L3 complex 监控

在 AMD 17h 平台,每个处理器共有 8 个 CCD,每个 CCD 内包含单个 L3 缓存,如图{@fig:ccd}所示。 在每个 CCD 中,共包含 6 个事件选择和计数寄存器(Core::X86::Msr::ChL3PmcCfg 和 Core::X86::Msr::ChL3Pmc)。

AMD SP3 Platform 架构示意图{ #fig:ccd width=500px }

根据表{@tbl:perf_event},对于 L3 缓存监控主要包括 L3 Cache Accesses(0x0300C0000040FF04) 和 L3 Miss(0x0300C00000400104) 两个事件,并在此基础上可以进一步计算出 L3 缓存 Miss 比率等性能事件。 因此在 AMD 平台 L3 缓存监控中,只需使用 2 个事件选择和计数寄存器,不需要寄存器多路复用功能。

核心监控

在 AMD 平台,每个线程共有 2 个固定事件性能计数器和 6 个通用事件性能计数器。

固定监控事件

在 AMD 平台固定事件监控通过固定 MSR 寄存器实现。 固定事件包括两个,其使用寄存器

| 固定监控事件 | MSR寄存器 | 事件说明 | | :———-: | :——-: | :——- | | APERF(Actual Performance Frequency Clock Count) | 0x000000E8 | 当内核处于C0时,该寄存器与内核时钟周期的实际数量成比例递增。 | | MPERF(Max Performance Frequency Clock Count) | 0x000000E7 | 当内核处于C0时,硬件以P0频率递增。| Table: AMD 平台核心固定性能事件 {#tbl:amd_core_fixed_event}

通用性能监控事件

在 AMD 平台核心性能监控功能中,常用的性能事件包括:

  1. InstructionRetired - 执行完指令个数;
  2. CpuClockUnhalted - 核心频率;
  3. RETIRED_SSE_AVX_GFLOPS_ALL - 执行浮点计算总数;

在 AMD 平台,无法区分 SSE 和 AVX 不同指令执行浮点速度,其中 RETIRED_SSE_AVX_GFLOPS_ALL 只能反应总浮点计算总量。 此外,对于单个周期计数器事件递增值超过 15,例如浮点计数事件(Core::X86::Pmc::Core::FpRetSseAvxOps),需要在另外一个计数器中定义 MergeEvent,保证性能事件监控准确。