GPU 功耗/散热控制和监控¶
HWMON 接口¶
amdgpu 驱动程序公开了以下传感器接口
GPU 温度(通过片上传感器)
GPU 电压
北桥电压(仅限 APU)
GPU 功耗
GPU 风扇
GPU gfx/计算引擎时钟
GPU 内存时钟(仅限 dGPU)
GPU 温度的 hwmon 接口
temp[1-3]_input:片上 GPU 温度,单位为千分之一摄氏度 - 只有 SOC15 dGPU 支持 temp2_input 和 temp3_input
temp[1-3]_label:温度通道标签 - 只有 SOC15 dGPU 支持 temp2_label 和 temp3_label
temp[1-3]_crit:温度临界最大值,单位为千分之一摄氏度 - 只有 SOC15 dGPU 支持 temp2_crit 和 temp3_crit
temp[1-3]_crit_hyst:临界限制的温度滞后,单位为千分之一摄氏度 - 只有 SOC15 dGPU 支持 temp2_crit_hyst 和 temp3_crit_hyst
temp[1-3]_emergency:温度紧急最大值(ASIC 关机),单位为千分之一摄氏度 - 只有 SOC15 dGPU 支持这些值
GPU 电压的 hwmon 接口
in0_input:GPU 上的电压,单位为毫伏
in1_input:北桥上的电压,单位为毫伏
GPU 功耗的 hwmon 接口
power1_average:SoC 使用的平均功耗,单位为微瓦。 在 APU 上,这包括 CPU。
power1_input:SoC 使用的瞬时功耗,单位为微瓦。 在 APU 上,这包括 CPU。
power1_cap_min:支持的最小上限,单位为微瓦
power1_cap_max:支持的最大上限,单位为微瓦
power1_cap:选定的功耗上限,单位为微瓦
GPU 风扇的 hwmon 接口
pwm1:脉冲宽度调制风扇级别 (0-255)
pwm1_enable:脉冲宽度调制风扇控制方法(0:无风扇速度控制,1:使用 pwm 接口手动风扇速度控制,2:自动风扇速度控制)
pwm1_min:脉冲宽度调制风扇控制最低级别 (0)
pwm1_max:脉冲宽度调制风扇控制最高级别 (255)
fan1_min:最小值,单位:转/分钟 (RPM)
fan1_max:最大值,单位:转/分钟 (RPM)
fan1_input:风扇转速,单位为 RPM
fan[1-*]_target:所需风扇转速,单位:转/分钟 (RPM)
fan[1-*]_enable:启用或禁用传感器。1:启用 0:禁用
- 注意:请勿同时通过“pwm1”和“fan[1-*]_target”接口设置风扇速度。
这将导致前者被覆盖。
GPU 时钟的 hwmon 接口
freq1_input:gfx/计算时钟,单位为赫兹
freq2_input:内存时钟,单位为赫兹
您可以使用像 sensors 这样的 hwmon 工具来查看系统上的此信息。
GPU sysfs 电源状态接口¶
GPU 电源控制通过 sysfs 文件公开。
power_dpm_state¶
power_dpm_state 文件是一个遗留接口,仅用于向后兼容。 amdgpu 驱动程序提供了一个 sysfs API,用于调整某些与电源相关的参数。 power_dpm_state 文件用于此目的。 它接受以下参数
battery (电池)
balanced (平衡)
performance (性能)
battery (电池)
在较旧的 GPU 上,vbios 为电池操作提供了一个特殊的电源状态。 选择电池切换到此状态。 较新的 GPU 不再提供此功能,因此该选项在这种情况下不起作用。
balanced (平衡)
在较旧的 GPU 上,vbios 为平衡操作提供了一个特殊的电源状态。 选择平衡切换到此状态。 较新的 GPU 不再提供此功能,因此该选项在这种情况下不起作用。
performance (性能)
在较旧的 GPU 上,vbios 为性能操作提供了一个特殊的电源状态。 选择性能切换到此状态。 较新的 GPU 不再提供此功能,因此该选项在这种情况下不起作用。
power_dpm_force_performance_level¶
amdgpu 驱动程序提供了一个 sysfs API,用于调整某些与电源相关的参数。 power_dpm_force_performance_level 文件用于此目的。 它接受以下参数
auto (自动)
low (低)
high (高)
manual (手动)
profile_standard (标准配置文件)
profile_min_sclk (最小 sclk 配置文件)
profile_min_mclk (最小 mclk 配置文件)
profile_peak (峰值配置文件)
auto (自动)
选择 auto 时,驱动程序将尝试动态选择驱动程序中当前状况的最佳功耗配置文件。
low (低)
选择 low 时,时钟将被强制设置为最低功耗状态。
high (高)
选择 high 时,时钟将被强制设置为最高功耗状态。
manual (手动)
选择 manual 时,用户可以通过 sysfs pp_dpm_mclk、pp_dpm_sclk 和 pp_dpm_pcie 文件手动调整每个时钟域启用的电源状态,并通过 pp_power_profile_mode sysfs 文件调整电源状态转换启发法。
profile_standard profile_min_sclk profile_min_mclk profile_peak
选择分析模式时,时钟和功耗门控将被禁用,并且时钟将设置为不同的分析案例。 建议使用此模式来分析特定的工作负载,在这种情况下,您不希望时钟或功耗门控的时钟波动干扰您的结果。 profile_standard 将时钟设置为一个固定的时钟级别,该级别因 ASIC 而异。 profile_min_sclk 强制 sclk 达到最低级别。 profile_min_mclk 强制 mclk 达到最低级别。 profile_peak 将所有时钟(mclk、sclk、pcie)设置为最高级别。
pp_table¶
amdgpu 驱动程序提供了一个 sysfs API,用于上传新的 powerplay 表。 pp_table 文件用于此目的。 读取该文件将转储当前的 power play 表。 写入该文件将尝试上传一个新的 powerplay 表,并使用该新表重新初始化 powerplay。
pp_od_clk_voltage¶
amdgpu 驱动程序提供了一个 sysfs API,用于调整电源状态中每个功率级别的时钟和电压。 pp_od_clk_voltage 用于此目的。
请注意,实际公开的是内存控制器时钟频率,而不是 DRAM 的有效内存时钟频率。 要转换它,请使用以下公式
时钟转换 (Mhz)
HBM:effective_memory_clock = memory_controller_clock * 1
G5:effective_memory_clock = memory_controller_clock * 1
G6:effective_memory_clock = memory_controller_clock * 2
DRAM 数据速率 (MT/s)
HBM:effective_memory_clock * 2 = data_rate
G5:effective_memory_clock * 4 = data_rate
G6:effective_memory_clock * 8 = data_rate
带宽 (MB/s)
data_rate * vram_bit_width / 8 = memory_bandwidth
一些例子
RX460 上的 G5
memory_controller_clock = 1750 Mhz
effective_memory_clock = 1750 Mhz * 1 = 1750 Mhz
数据速率 = 1750 * 4 = 7000 MT/s
内存带宽 = 7000 * 128 位 / 8 = 112000 MB/s
RX5700 上的 G6
memory_controller_clock = 875 Mhz
effective_memory_clock = 875 Mhz * 2 = 1750 Mhz
数据速率 = 1750 * 8 = 14000 MT/s
内存带宽 = 14000 * 256 位 / 8 = 448000 MB/s
< 对于 Vega10 和以前的 ASIC >
读取该文件将显示
引擎时钟级别和电压列表,标记为 OD_SCLK
内存时钟级别和电压列表,标记为 OD_MCLK
sclk、mclk 和电压的有效范围列表,标记为 OD_RANGE
要手动调整这些设置,首先使用 power_dpm_force_performance_level 选择手动模式。 通过向文件写入包含“s/m level clock voltage”的字符串,为每个级别输入一个新值。 例如,“s 1 500 820”会将 sclk 级别 1 更新为 500 MHz,电压为 820 mV; “m 0 350 810”会将 mclk 级别 0 更新为 350 MHz,电压为 810 mV。 在根据需要编辑了所有状态后,向该文件写入“c”(提交)以提交您的更改。 如果您想重置为默认的功率级别,请向该文件写入“r”(重置)以重置它们。
< 对于 Vega20 和更新的 ASIC >
读取该文件将显示
标记为 OD_SCLK 的最小和最大引擎时钟
标记为 OD_MCLK 的最小(Vega20 和 Navi1x 不可用)和最大内存时钟
标记为 OD_VDDC_CURVE 的三个 <频率,电压> 点。 它们可用于校准 sclk 电压曲线。 这适用于 Vega20 和 NV1X。
应用于目标电压计算的电压偏移(以 mV 为单位)。 这适用于 Sienna Cichlid、Navy Flounder、Dimgrey Cavefish 和一些后来的 SMU13 ASIC。 对于这些 ASIC,目标电压计算可以通过“电压 = 根据 v/f 曲线计算的电压 + 过驱动 vddgfx 偏移”来说明
sclk、mclk、电压曲线点或电压偏移的有效范围列表,标记为 OD_RANGE
< 对于 APU >
读取该文件将显示
标记为 OD_SCLK 的最小和最大引擎时钟
标记为 OD_RANGE 的 sclk 的有效范围列表
< 对于 VanGogh >
读取该文件将显示
标记为 OD_SCLK 的最小和最大引擎时钟
标记为 OD_CCLK 的最小和最大核心时钟
标记为 OD_RANGE 的 sclk 和 cclk 的有效范围列表
要手动调整这些设置
首先使用 power_dpm_force_performance_level 选择手动模式
对于时钟频率设置,通过向文件写入包含“s/m index clock”的字符串来输入新值。 如果要设置最小时钟,则索引应为 0。 如果要设置最大时钟,则索引应为 1。 例如,“s 0 500”会将最小 sclk 更新为 500 MHz。 “m 1 800”会将最大 mclk 更新为 800Mhz。 对于 VanGogh 上的核心时钟,该字符串包含“p core index clock”。 例如,“p 2 0 800”会将核心 2 上的最小核心时钟设置为 800Mhz。
对于 Vega20 和 NV1X 支持的 sclk 电压曲线,通过向文件写入包含“vc point clock voltage”的字符串来输入新值。 这些点由 0、1 和 2 索引。 例如,“vc 0 300 600”会将 point1 更新为时钟设置为 300Mhz,电压为 600mV。 “vc 2 1000 1000”会将 point3 更新为时钟设置为 1000Mhz,电压为 1000mV。
对于 Sienna Cichlid、Navy Flounder、Dimgrey Cavefish 和一些后来的 SMU13 ASIC 支持的电压偏移,通过写入包含“vo offset”的字符串来输入新值。 例如,“vo -10”会将应用于整个 v/f 曲线线的额外电压偏移更新为 -10mv。
在根据需要编辑了所有状态后,向该文件写入“c”(提交)以提交您的更改
如果您想重置为默认的功率级别,请向该文件写入“r”(重置)以重置它们
pp_dpm_*¶
amdgpu 驱动程序提供了一个 sysfs API,用于调整给定电源状态启用的功率级别。 文件 pp_dpm_sclk、pp_dpm_mclk、pp_dpm_socclk、pp_dpm_fclk、pp_dpm_dcefclk 和 pp_dpm_pcie 用于此目的。
pp_dpm_socclk 和 pp_dpm_dcefclk 接口仅适用于 Vega10 和更新的 ASIC。 pp_dpm_fclk 接口仅适用于 Vega20 和更新的 ASIC。
读取文件将显示电源状态中可用的功率级别以及这些级别的时钟信息。 如果深度睡眠应用于时钟,则该级别将用特殊级别“S:”表示。 例如,
S: 19Mhz *
0: 615Mhz
1: 800Mhz
2: 888Mhz
3: 1000Mhz
要手动调整这些状态,首先使用 power_dpm_force_performance_level 选择手动模式。 其次,通过输入包含“echo xx xx xx > pp_dpm_sclk/mclk/pcie”的字符串来为每个级别输入一个新值。 例如,
echo "4 5 6" > pp_dpm_sclk
将启用 sclk 级别 4、5 和 6。
注意:现在不支持更改为 dcefclk 最大 dpm 级别
pp_power_profile_mode¶
amdgpu 驱动程序提供了一个 sysfs API,用于调整与电源状态中电源级别之间切换相关的启发法。 pp_power_profile_mode 文件用于此目的。
读取此文件会输出所有预定义的功率配置文件以及该配置文件的相关启发法设置的列表。
要选择一个配置文件或创建一个自定义配置文件,首先使用 power_dpm_force_performance_level 选择手动模式。 将预定义配置文件的编号写入 pp_power_profile_mode 将启用这些启发法。 要创建一组自定义启发法,请向该文件写入一个以自定义配置文件编号开头的数字字符串,以及每个启发法参数的设置。 由于 ASIC 系列之间的差异,启发法参数因系列而异。 此外,您可以将自定义启发法应用于不同的时钟域。 每个时钟域都被视为一个不同的操作,因此如果您修改了 gfxclk 启发法,然后又修改了 memclk 启发法,则所有自定义启发法都将被保留,直到您切换到另一个配置文件为止。
pm_policy¶
某些 SOC 可以支持不同的电源策略来优化应用程序性能。 但是,此策略仅在 SOC 级别提供,而不是在每个进程级别提供。 这在整个 SOC 用于专用工作负载时尤其有用。
amdgpu 驱动程序提供了一个 sysfs API,用于选择策略。 目前,此接口仅支持两种类型的策略。
Pstate 策略选择 - 这是为了选择不同的 Pstate 配置文件,这些配置文件决定了时钟/节流首选项。
XGMI PLPD 策略选择 - 当多个设备通过 XGMI 连接时,这有助于选择应用于每个链路断电的策略。
可用的策略和策略级别因 SOC 而异。 它们可以在 pm_policy 节点目录下查看。 如果 SOC 不支持任何策略,则此节点将不可用。 支持的不同策略将作为 pm_policy 下的单独节点提供。
cat /sys/bus/pci/devices/.../pm_policy/<policy_type>
读取策略文件会显示支持的不同级别。 当前应用的级别用 *(星号)表示。 例如,
cat /sys/bus/pci/devices/.../pm_policy/soc_pstate
0 : soc_pstate_default
1 : soc_pstate_0
2 : soc_pstate_1*
3 : soc_pstate_2
cat /sys/bus/pci/devices/.../pm_policy/xgmi_plpd
0 : plpd_disallow
1 : plpd_default
2 : plpd_optimized*
要应用特定的策略
“echo <level> > /sys/bus/pci/devices/.../pm_policy/<policy_type>”
对于上面示例中列出的级别,要为 XGMI 选择“plpd_optimized”,为 soc pstate 策略选择“soc_pstate_2” -
echo "2" > /sys/bus/pci/devices/.../pm_policy/xgmi_plpd
echo "3" > /sys/bus/pci/devices/.../pm_policy/soc_pstate
*_busy_percent¶
amdgpu 驱动程序提供了一个 sysfs API,用于读取 GPU 的繁忙程度(以百分比表示)。 gpu_busy_percent 文件用于此目的。 SMU 固件基于 IP 核心中的聚合活动级别来计算负载百分比。
amdgpu 驱动程序提供了一个 sysfs API,用于读取 VRAM 的繁忙程度(以百分比表示)。 mem_busy_percent 文件用于此目的。 SMU 固件基于 IP 核心中的聚合活动级别来计算负载百分比。
gpu_metrics¶
amdgpu 驱动程序提供了一个 sysfs API,用于检索当前的 gpu 指标数据。 gpu_metrics 文件用于此目的。 读取该文件将转储所有当前的 gpu 指标数据。
这些数据包括温度、频率、引擎利用率、功耗、节流器状态、风扇转速和 cpu 核心统计信息(仅适用于 APU)。 也就是说,它将同时提供所有传感器的快照。
fan_curve¶
amdgpu 驱动程序提供了一个 sysfs API,用于检查和调整风扇控制曲线线。
读回该文件会显示应用于曲线线上每个锚点的当前设置(以摄氏度为单位的温度和以 pwm 为单位的风扇速度)以及它们的可更改的允许范围(如果可更改)。
通过将所需的字符串(格式如“anchor_point_index temperature fan_speed_in_pwm”)写入该文件,相应地更改特定锚点的设置。
完成编辑后,向该文件写入“c”(提交)以提交您的更改。
如果您想重置为默认值,请向该文件写入“r”(重置)以重置它们
支持两种风扇控制模式:自动和手动。 在自动模式下,PMFW 处理风扇速度控制(风扇速度如何响应 ASIC 温度)。 在手动模式下,用户可以设置自己的风扇曲线线,如本文所述。 通常,ASIC 以自动模式启动。 通过此接口进行的任何设置都将隐式地将风扇控制切换到手动模式。
acoustic_limit_rpm_threshold¶
amdgpu 驱动程序提供了一个 sysfs API,用于检查和调整风扇控制的 RPM 声学限制。
读回该文件会显示当前的设置以及可更改的允许范围(如果可更改)。
通过向该文件写入一个整数,相应地更改该设置。
完成编辑后,向该文件写入“c”(提交)以提交您的更改。
如果您想重置为默认值,请向该文件写入“r”(重置)以重置它们
此设置仅在自动风扇控制模式下有效。 它调整 PMFW 关于风扇可以旋转的最大 RPM 速度的行为。 通过此接口进行的设置将隐式地将风扇控制切换到自动模式。
acoustic_target_rpm_threshold¶
amdgpu 驱动程序提供了一个 sysfs API,用于检查和调整风扇控制的 RPM 声学目标。
读回该文件会显示当前的设置以及可更改的允许范围(如果可更改)。
通过向该文件写入一个整数,相应地更改该设置。
完成编辑后,向该文件写入“c”(提交)以提交您的更改。
如果您想重置为默认值,请向该文件写入“r”(重置)以重置它们
此设置仅在自动风扇控制模式下有效。 它可以与其他也可以在自动模式下工作的设置共存。 它调整 PMFW 关于当 ASIC 温度不高于目标温度时风扇可以旋转的最大 RPM 速度的行为。 通过此接口进行的设置将隐式地将风扇控制切换到自动模式。
fan_target_temperature¶
amdgpu 驱动程序提供了一个 sysfs API,用于检查和调整风扇控制的目标温度(以摄氏度为单位)。
读回该文件会显示当前的设置以及可更改的允许范围(如果可更改)。
通过向该文件写入一个整数,相应地更改该设置。
完成编辑后,向该文件写入“c”(提交)以提交您的更改。
如果您想重置为默认值,请向该文件写入“r”(重置)以重置它们
此设置仅在自动风扇控制模式下有效。 它可以与其他也可以在自动模式下工作的设置共存。 与 acoustic_target_rpm_threshold 设置配对,它们定义了当 ASIC 温度不高于目标温度时风扇可以旋转的最大 RPM 速度。 通过此接口进行的设置将隐式地将风扇控制切换到自动模式。
fan_minimum_pwm¶
amdgpu 驱动程序提供了一个 sysfs API,用于检查和调整 PWM 中的最小风扇速度。
读回该文件会显示当前的设置以及可更改的允许范围(如果可更改)。
通过向该文件写入一个整数,相应地更改该设置。
完成编辑后,向该文件写入“c”(提交)以提交您的更改。
如果您想重置为默认值,请向该文件写入“r”(重置)以重置它们
此设置仅在自动风扇控制模式下有效。 它可以与其他也可以在自动模式下工作的设置共存。 它调整 PMFW 关于风扇应旋转的 PWM 中的最小风扇速度的行为。 通过此接口进行的设置将隐式地将风扇控制切换到自动模式。
fan_zero_rpm_enable¶
amdgpu 驱动程序提供了一个 sysfs API,用于检查和调整零 RPM 功能。
读回该文件会显示当前的设置以及可更改的允许范围(如果可更改)。
通过向该文件写入一个整数,相应地更改该设置。
完成编辑后,向该文件写入“c”(提交)以提交您的更改。
如果您想重置为默认值,请向该文件写入“r”(重置)以重置它们。
fan_zero_rpm_stop_temperature¶
amdgpu 驱动程序提供了一个 sysfs API,用于检查和调整零 RPM 停止温度功能。
读回该文件会显示当前的设置以及可更改的允许范围(如果可更改)。
通过向该文件写入一个整数,相应地更改该设置。
完成编辑后,向该文件写入“c”(提交)以提交您的更改。
如果您想重置为默认值,请向该文件写入“r”(重置)以重置它们。
此设置仅在启用零 RPM 设置时有效。 它调整风扇可以停止的最低温度。
GFXOFF¶
GFXOFF 是大多数最新 GPU 中发现的一项功能,可在运行时节省电量。 当 gfx 或计算管道上没有工作负载时,该卡的 RLC(运行列表控制器)固件会动态关闭 gfx 引擎。 在受支持的 GPU 上,默认情况下 GFXOFF 处于启用状态。
用户空间可以通过 debugfs 接口与 GFXOFF 交互(所有值均为 uint32_t,除非另有说明)
amdgpu_gfxoff
¶
使用它来启用/禁用 GFXOFF,并检查它当前是否启用/禁用
$ xxd -l1 -p /sys/kernel/debug/dri/0/amdgpu_gfxoff
01
写入 0 以禁用它,写入 1 以启用它。
读取 0 表示它已禁用,1 表示它已启用。
如果已启用,则表示 GPU 可以根据需要自由进入 GFXOFF 模式。 禁用表示它永远不会进入 GFXOFF 模式。
amdgpu_gfxoff_status
¶
读取它以检查 GPU 的当前 GFXOFF 状态
$ xxd -l1 -p /sys/kernel/debug/dri/0/amdgpu_gfxoff_status
02
0:GPU 处于 GFXOFF 状态,gfx 引擎已断电。
1:退出 GFXOFF 状态
2:不在 GFXOFF 状态
3:进入 GFXOFF 状态
如果启用了 GFXOFF,则该值将在 [0, 3] 范围内转换,尽可能进入 0。 禁用时,它始终为 2。 如果不支持,则返回 -EINVAL
。
amdgpu_gfxoff_count
¶
读取它以获取自系统启动以来查询时 GFXOFF 进入的总计数。 该值是 uint64_t 类型,但是,由于固件的限制,它当前可以作为 uint32_t 溢出。 *仅在 vangogh 中受支持*
amdgpu_gfxoff_residency
¶
写入 1 到 amdgpu_gfxoff_residency 以开始记录,写入 0 以停止。读取它可以获得上一个记录间隔期间 GFXOFF 驻留百分比的平均值乘以 100。例如,7854 的值表示在上一个记录间隔期间,GPU 有 78.54% 的时间处于 GFXOFF 模式。仅在 vangogh 中支持