AMD 处理器性能分析单元
简介
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 性能监控中,主要有三类寄存器,包括:
- 核心事件(Core event)寄存器 - RDPMC[5:0]
- 数据结构事件(data fabric event)寄存器 - RDPMC[9:6]
- 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 寄存器具体介绍,可以获得以下内容:
- 此 msr 寄存器所有线程和核心内共享,这说明单个 CPU 内所有线程/核心访问此内存地址都是唯一的;
- 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 通道。
- 在 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)。
{ #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 平台核心性能监控功能中,常用的性能事件包括:
- InstructionRetired - 执行完指令个数;
- CpuClockUnhalted - 核心频率;
- RETIRED_SSE_AVX_GFLOPS_ALL - 执行浮点计算总数;
在 AMD 平台,无法区分 SSE 和 AVX 不同指令执行浮点速度,其中 RETIRED_SSE_AVX_GFLOPS_ALL
只能反应总浮点计算总量。
此外,对于单个周期计数器事件递增值超过 15,例如浮点计数事件(Core::X86::Pmc::Core::FpRetSseAvxOps),需要在另外一个计数器中定义 MergeEvent
,保证性能事件监控准确。