跳到主要内容

Power Capping

1. 概述

本文档介绍 MTT E300 DTS 启动时 Power Capping 相关参数的作用,以及如何修改和应用。Power Capping架构如下图所示:

Power Capping 示意图

功率采集

Power Capping 使用的功率来自于功率计总功耗一路电流的值,包含整个soc的功率合。

温度采集

Power Capping 使用的温度来自于 7 个 PVT 温度传感器的最大值。

可分配功率

Pallocatable=TDPKP(PPcontrol)KIPaddP_{allocatable} = TDP - K_P(P - P_{control}) - K_I P_{add}

2. 可调参数

参数默认值可调范围含义
enable1/是否启用 Power Capping,1 为启用并应用 DTB 中配置的参数,0 为关闭,其余值为启用并应用默认参数
tdp65000/最大释放功率,单位:mW
switch_on20[10, 30]Power Capping 开始工作的功率,单位:W
control_performance45(switch_on, 60]电源模式为性能模式时 Power Capping 需要限制的功率,单位:W
cutoff20(0, 60]功率误差的限制,小于该值的功率误差才会被累积,单位:W
max2000[100, 10000]功率误差累积的最大值,单位:W
under_shoot100[10, 1000]当前功率小于 control 时的 Kp 参数,不建议改动
over_shoot600[100, 1000]当前功率大于 control 时的 Kp 参数,决定了允许超过的功率大小。Kp 较小时,对刚超过设定功率时的功率限制较小,可以超过限制功率较多,使误差累计更快,更快到达稳态;Kp 较大时,会较快地使功率降低,但会使稳态到达变慢,且增加稳态震荡。参考当前标准差:1000-1500 mW
intergral80[10, 200]Ki 参数,值越大则限制功率速度越快,但会使功率震荡增加。参考当前标准差:1000-1500 mW
control_normal45(switch_on, 60]电源模式为平衡或节电模式时 Power Capping 需要限制的功率,单位:W
temp_switch_on60[50, 90]Power Capping 开始工作的温度,单位:°C
temp_control80(switch_on, 99]Power Capping 需要限制的温度,单位:°C
temp_cutoff10(1, 20]温度误差的限制,小于该值的温度误差才会被累积,单位:°C
temp_max400[100, 500]温度误差累积的最大值,单位:°C
temp_under_shoot1[1, 10]当前温度小于 control 时的 Kp 参数,不建议改动
temp_over_shoot3000[1000, 5000]当前温度大于 control 时的 Kp 参数,决定了允许超过的温度大小。Kp 较小时,对刚超过设定温度时的功率限制较小,可以超过限制温度较多,使误差累计更快,更快到达稳态;Kp 较大时,会较快地使温度降低,但会使稳态到达变慢,且增加稳态震荡。参考当前标准差:1000-1500 mW
temp_intergral100[100, 1000]Ki 参数,值越大则限制温度速度越快,但会使功率震荡增加。参考当前标准差:1000-1500 mW
weightcpu02[1, 5]功率分配时,CPU cluster 0 的权重,权重越大则对该组件的功率限制越小
weightcpu12[1, 5]功率分配时,CPU cluster 1 的权重,权重越大则对该组件的功率限制越小
weightcpu22[1, 5]功率分配时,CPU cluster 2 的权重,权重越大则对该组件的功率限制越小
weightgpu2[1, 5]功率分配时,GPU 的权重,权重越大则对该组件的功率限制越小
weightnpu1[1, 5]功率分配时,NPU 的权重,权重越大则对该组件的功率限制越小
weightvpu1[1, 5]功率分配时,VPU 的权重,权重越大则对该组件的功率限制越小

3. 修改参数

3.1 修改 DTS 参数

修改 /linux-mthreads/arch/arm64/boot/dts/m1000/m1000-aimodule.dts 中对应的参数:

DTS 参数示意图

3.2 编译 DTB

dts=/linux-mthreads/arch/arm64/boot/dts/m1000/m1000-aimodule.dts

cpp -nostdinc -I ~/sources/linux-mthreads/include \
-I ~/sources/linux-mthreads/arch \
-undef -x assembler-with-cpp \
$dts \
m1000-aimodule.preprocessed

dtc -I dts -O dtb -o m1000-aimodule.dtb m1000-aimodule.preprocessed

3.3 更新 DTB

# 查看是否包含 boot 分区
lsblk

# 包含 boot 分区的 rootfs
sudo mount /dev/nvme0n1p1 /mnt
sudo cp m1000-aimodule.dtb /mnt/
sudo umount /mnt

# 不含 boot 分区的 rootfs
sudo cp m1000-aimodule.dtb /usr/lib/linux-image-6.6.10/m1000/

# 复位后生效
sudo reboot

4. 系统接口

4.1 DTS接口

# 查询power capping对应的接口
cat sys/class/hwmon/hwmon*/name

# 若sys/class/hwmon/hwmon1/name是ina3221-mt,则以下命令都使用hwmon1

# 开启或关闭power capping
echo 1 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon1/powercapping_disable # 关闭
echo 0 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon1/powercapping_disable # 开启

# 调整功率阈值,单位mW
echo 50000 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon1/power_cap_limit

# 查询温度
cat /sys/devices/virtual/thermal/thermal_zone0/temp
cat /sys/devices/virtual/thermal/thermal_zone1/temp
cat /sys/devices/virtual/thermal/thermal_zone2/temp
cat /sys/devices/virtual/thermal/thermal_zone3/temp
cat /sys/devices/virtual/thermal/thermal_zone4/temp
cat /sys/devices/virtual/thermal/thermal_zone5/temp
cat /sys/devices/virtual/thermal/thermal_zone6/temp

# 查询功率
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_all
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_others
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_cpu
cat /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/power_gpu

4.2 ACPI接口

# 开启或关闭power capping
echo 1 > /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/powercapping_disable # 关闭
echo 0 > /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/powercapping_disable # 开启

# 调整功率阈值,单位mW
echo 50000 > /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/power_cap_limit

# 查询温度
cat /sys/class/thermal/thermal_zone0/temp
cat /sys/class/thermal/thermal_zone1/temp
cat /sys/class/thermal/thermal_zone2/temp
cat /sys/class/thermal/thermal_zone3/temp
cat /sys/class/thermal/thermal_zone4/temp
cat /sys/class/thermal/thermal_zone5/temp
cat /sys/class/thermal/thermal_zone6/temp

# 查询功率
cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:00/power1_average # others
cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:01/power1_average # CPU
cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/MI2C0001:18/ACPI000D:02/power1_average # GPU

5. 寄存器分布

# PowerMeter区域
0x280FD290 # PowerAll
0x280FD294 # PowerOther
0x280FD298 # PowerCPU
0x280FD29C # PowerGPU
0x280FD2A0 # PowerLimit
0x280FD2A4 # PowerMode (0 性能 1平衡 2节电)

# 利用率区域
0x280FD2A8 # CPU_clus0
0x280FD2AC # CPU_clus1
0x280FD2B0 # CPU_clus2
0x280FD2B4 # GPU
0x280FD2B8 # NPU
0x280FD2BC # VPU

# UpdateBaseAddr 区域
0x280FD2C0 # ScpPowerCappingEnable
0x280FD2C4 # PowerCappingTdp

# 0x280FD2C8 - 0x280FD2E3 PowerPidControlAddr 区域 (28 bytes)
0x280FD2C8 # PowerCappingSwitchOn
0x280FD2CC # PowerCappingControlPerformance
0x280FD2D0 # PowerCappingCutoff
0x280FD2D4 # PowerCappingMax
0x280FD2D8 # PowerCappingUndershoot
0x280FD2DC # PowerCappingOvershoot
0x280FD2E0 # PowerCappingIntegral
0x280FD2EC # PowerCappingControlNormal

# 0x280FD2F0 - 0x280FD30B TempPidControlAddr 区域 (24 bytes)
0x280FD2F0 # PowerCappingTempSwitchOn
0x280FD2F4 # PowerCappingTempControl
0x280FD2F8 # PowerCappingTempCutoff
0x280FD2FC # PowerCappingTempMax
0x280FD300 # PowerCappingTempUndershoot
0x280FD304 # PowerCappingTempOvershoot
0x280FD308 # PowerCappingTempIntegral

# 0x280FD30C - 0x280F313 WeightBaseAddr 区域 (8 bytes)
0x280FD30C # PowerCappingWeightcpu0
0x280FD30D # PowerCappingWeightcpu1
0x280FD30E # PowerCappingWeightcpu2
0x280FD30F # PowerCappingWeightgpu
0x280FD310 # PowerCappingWeightnpu
0x280FD311 # PowerCappingWeightvpu