GPU 功耗/散热控制和监控

HWMON 接口

amdgpu 驱动程序公开以下传感器接口

  • GPU 温度(通过芯片上的传感器)

  • GPU 电压

  • 北桥电压(仅限 APU)

  • GPU 功耗

  • GPU 风扇

  • GPU gfx/计算引擎时钟

  • GPU 内存时钟(仅限 dGPU)

GPU 温度的 hwmon 接口

  • temp[1-3]_input:芯片上的 GPU 温度,单位为毫摄氏度 - temp2_input 和 temp3_input 仅在 SOC15 dGPU 上受支持

  • temp[1-3]_label:温度通道标签 - temp2_label 和 temp3_label 仅在 SOC15 dGPU 上受支持

  • temp[1-3]_crit:温度临界最大值,单位为毫摄氏度 - temp2_crit 和 temp3_crit 仅在 SOC15 dGPU 上受支持

  • temp[1-3]_crit_hyst:临界极限的温度滞后,单位为毫摄氏度 - temp2_crit_hyst 和 temp3_crit_hyst 仅在 SOC15 dGPU 上受支持

  • 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

  • profile_min_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

data rate = 1750 * 4 = 7000 MT/s

memory_bandwidth = 7000 * 128 bits / 8 = 112000 MB/s

RX5700 上的 G6

memory_controller_clock = 875 Mhz

effective_memory_clock = 875 Mhz * 2 = 1750 Mhz

data rate = 1750 * 8 = 14000 MT/s

memory_bandwidth = 14000 * 256 bits / 8 = 448000 MB/s

< 对于 Vega10 及更早版本的 ASIC >

读取该文件将显示

  • 一个标记为 OD_SCLK 的引擎时钟级别和电压列表

  • 一个标记为 OD_MCLK 的内存时钟级别和电压列表

  • 一个标记为 OD_RANGE 的 sclk、mclk 和电压的有效范围列表

要手动调整这些设置,请首先使用 power_dpm_force_performance_level 选择 manual。通过向文件写入包含“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,目标电压计算可以通过 “voltage = 从 v/f 曲线计算的电压 + 过载 vddgfx 偏移”来表示

  • 一个标记为 OD_RANGE 的 sclk、mclk、电压曲线点或电压偏移的有效范围列表

< 对于 APU >

读取该文件将显示

  • 标记为 OD_SCLK 的最小和最大引擎时钟

  • 一个标记为 OD_RANGE 的 sclk 有效范围列表

< 对于 VanGogh >

读取该文件将显示

  • 标记为 OD_SCLK 的最小和最大引擎时钟

  • 标记为 OD_CCLK 的最小和最大核心时钟

  • 一个标记为 OD_RANGE 的 sclk 和 cclk 有效范围列表

要手动调整这些设置

  • 首先使用 power_dpm_force_performance_level 选择 manual

  • 对于时钟频率设置,通过向文件写入包含“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

向 amdgpu_gfxoff_residency 写入 1 以开始记录,写入 0 以停止记录。读取它以获取在上次记录间隔期间 GFXOFF 平均驻留率 % 乘以 100。例如,值 7854 表示在上次记录间隔中,GPU 有 78.54% 的时间处于 GFXOFF 模式。仅在 vangogh 中受支持