活动监视器(Activity Monitors,简称AMU)是Armv8.4-A架构引入的关键性能监控组件,与传统的性能监控单元(PMU)相比,AMU更专注于系统级功耗管理和长期性能分析。C1-Nano核心作为Arm最新一代嵌入式处理器,完整实现了AMU扩展规范。
AMU的核心价值在于:
在C1-Nano中,AMU实现分为两组计数器:
关键设计要点:当C1-Nano配置了C1-SME2单元时,Group 1会启用额外的两个计数器(AMEVCNTR14-15),专门用于监控CME相关事件。
AMU寄存器主要通过AArch64系统寄存器接口访问,使用MRS/MSR指令。关键控制寄存器包括:
assembly复制; 示例:读取Group 0计数器0的值
MRS X0, AMEVCNTR00_EL0
; 示例:配置计数器使能
MSR AMCNTENSET0_EL0, #0xF ; 启用Group 0所有计数器
访问权限通过多级控制:
C1-Nano还提供Utility Bus内存映射访问方式,基地址为0x
| 寄存器类型 | 偏移量范围 | 访问特性 |
|---|---|---|
| 计数器值寄存器 | 0x0-0x128 | 只读,64位对齐 |
| 事件类型寄存器 | 0x400-0x494 | 只读,32位 |
| 控制寄存器 | 0xC00-0xE04 | 读写,32位 |
内存映射访问的特点:
C1-Nano的Group 0实现四个标准事件:
| 计数器 | 事件编号 | 描述 |
|---|---|---|
| AMEVCNTR00 | 0x0011 | CPU_CYCLES - 核心时钟周期数(随DVFS变化) |
| AMEVCNTR01 | 0x4004 | CNT_CYCLES - 固定频率时钟周期数(不受DVFS影响) |
| AMEVCNTR02 | 0x0008 | INST_RETIRED - 架构执行指令数(包括条件不满足的指令) |
| AMEVCNTR03 | 0x4005 | STALL_BACKEND_MEM - 因末级缓存缺失导致的后端停顿周期 |
关键指标计算公式:
code复制IPC(每周期指令数) = INST_RETIRED / CPU_CYCLES
内存停顿占比 = STALL_BACKEND_MEM / CPU_CYCLES
Group 1事件与具体实现相关,C1-Nano扩展了以下关键事件:
| 计数器 | 事件编号 | 描述 |
|---|---|---|
| AMEVCNTR10 | 0x0300 | MPMM_THRESHOLD_GEAR0 - MPMM Gear 0活动周期阈值触发次数 |
| AMEVCNTR13 | 0x0310 | CPU_ACTIVITY - CPU活动度累计值(定期更新) |
| AMEVCNTR14 | 0x3200 | STALL_BACKEND_BUSY_CME - CME执行单元繁忙导致的停顿周期(C1-SME2专有) |
实用技巧:AMEVCNTR13的CPU_ACTIVITY值可通过定期采样计算平均活动率:
code复制活动率 = (CNT2 - CNT1) / (TIMESTAMP2 - TIMESTAMP1)
通过AMU计数器可建立精确的功耗模型:
c复制// 伪代码:基于AMU的DVFS决策
void adjust_frequency() {
uint64_t inst_retired = read_amevcntr02();
uint64_t cpu_cycles = read_amevcntr00();
uint64_t mem_stall = read_amevcntr03();
double ipc = (double)inst_retired / cpu_cycles;
double stall_ratio = (double)mem_stall / cpu_cycles;
if (ipc < threshold_low && stall_ratio < threshold_high) {
// 降低频率以节省功耗
set_dvfs(LOW_POWER);
} else {
// 保持或提高性能
set_dvfs(HIGH_PERF);
}
}
C1-Nano的MPMM利用AMEVCNTR10-12实现三级功率控制:
配置示例:
assembly复制; 设置MPMM Gear 0阈值
MOV X0, #1000000
MSR MPMM_GEAR0_THRESHOLD, X0
; 启用MPMM监控
MSR AMCNTENSET1_EL0, #0x7 ; 启用计数器10-12
主流Linux内核已支持AMU,关键驱动路径:
code复制drivers/perf/arm_amu.c
使用示例:
bash复制# 启用AMU计数器
echo 1 > /sys/bus/event_source/devices/armv8_pmu_amu/enable
# 读取计数器值
perf stat -e armv8_pmu_amu/cpu_cycles/ -e armv8_pmu_emu/inst_retired/
问题1:计数器读数异常
问题2:内存映射访问失败
问题3:计数器溢出处理
由于AMU不提供溢出中断,建议采用以下模式:
c复制// 伪代码:安全计数器读取
uint64_t safe_read_counter(uint32_t counter_id) {
uint64_t cnt1 = read_counter(counter_id);
uint64_t cnt2 = read_counter(counter_id);
return (cnt1 > cnt2) ? cnt2 : cnt1; // 处理溢出回绕
}
通过AMU实现的核心利用率监控算法:
python复制# 伪代码:多核负载计算
def get_core_util(core_id):
cyc0 = read_core_counter(core_id, "CPU_CYCLES")
act0 = read_core_counter(core_id, "CPU_ACTIVITY")
time.sleep(interval)
cyc1 = read_core_counter(core_id, "CPU_CYCLES")
act1 = read_core_counter(core_id, "CPU_ACTIVITY")
delta_act = act1 - act0
delta_cyc = cyc1 - cyc0
return delta_act / delta_cyc
C1-Nano的TRBE可与AMU联动,实现带上下文的性能分析:
配置示例:
assembly复制; 设置TRBE触发条件
MOV X0, #AMEVCNTR03_EL0 ; 内存延迟计数器
MSR TRBSELR_EL1, X0
MOV X1, #0x1000 ; 阈值
MSR TRBTRG_EL1, X1
在实际项目调试中,AMU数据需要结合以下维度分析: