我如何减少 Linux 上最近开源 AMDGPU 支持的 GPU 的瓦数(这是一个词吗?)?
这里的目标是降低功耗并接近性能/瓦特最佳点,即比卡附带的功耗更低。
理想情况下,这将是使用 debian 打包的软件。谢谢!
答案1
介绍
为了减少功耗,您需要“降压”,降低 GPU 的电压或限制 GPU 的电源状态。
使用现代(4.17 或更高版本)内核以及amdgpu
2015 年或更新版本的 Radeon GPU 的最新驱动程序可以让您对显卡进行超频(从而降低电压,减少功耗(瓦))。
我将链接到我在该主题上找到的几个资源,但在此答案中包含相关信息的片段。第一部分假设您已经满足了先决条件只是想进入并降低电压并继续前进。剩下的答案将作为AMD GPU调优资源的集合,提供给有需要的人。
作为预警、降低 GPU 电压(或以其他方式超频)可能会带来稳定性问题。在更改任何电压和时钟设置后,您需要测试 GPU 的稳定性,以确保它仍然以“安全”方式运行(例如GpuTest
使用 FurMark 是测试性能和稳定性的好方法。另外还有Phoronix 测试套件在 Linux 中对您的计算机进行基准测试)。在努力降低功耗的过程中,您最不想做的就是导致崩溃、故障、伪影或其他性能下降。
快速简单的欠压
遵循 Wiki 指南LinuxReviews.org您可以通过执行以下操作来更改性能级别(以及功耗):
在进行任何更改之前,您需要做的第一件事就是设置
/sys/class/drm/card0/device/power_dpm_force_performance_level
为manual
启用手动控制。当你写时钟值时你会得到write error: Invalid argument errors
你不知道的值。echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level
power_dpm_force_performance_level
除以下之外的可用设置manual
:
auto
驱动程序自动选择low
强制尽可能低的时钟并将 GPU 锁定在那里high
强制尽可能最高的时钟并将 GPU 锁定在那里
profile_standard
profile_min_sclk
profile_min_mclk
profile_peak
“选择分析模式后,时钟和电源门控将被禁用,时钟将针对不同的分析情况进行设置。此模式是建议用于分析特定的工作负载,其中您不希望时钟波动干扰您的结果,profile_standard
将时钟设置为固定的时钟级别,该级别会强制profile_min_sclk
sclk 达到最低级别。将所有时钟(mclk、sclk、pcie)设置为最高级别。profile_min_mclk
”profile_peak
只需将值设置为low
或profile_min_sclk
profile_min_mclk
级别即可分别降低核心时钟和内存时钟,以减少功耗。
如果您需要比本文其余部分更精细的控制,那么这篇文章应该可以满足您的需求。
先决条件
您需要确保安装版本 4.17 或更高版本的内核以及最新支持的AMDGPU
驱动程序。如有必要,您需要将 Debian 安装更新到 Debian 10 (Buster) 或添加buster-backports
存储库。
要添加向后移植,您需要编辑您的文件/etc/apt/sources.list
以包含如下行:
deb http://deb.debian.org/debian buster-backports
然后运行apt update
以完成向后移植存储库的添加。
通过执行以下操作安装新内核:
apt-cache search linux-image #Find the kernel and kernel headers available to you.
apt install linux-image-<flavor> #Use `apt-get -t buster-backports <package>` if necessary
重新启动,然后安装xserver-xorg-video-amdgpu libgl1-mesa-dri libglx-mesa0 mesa-vulkan-drivers xserver-xorg-video-all
软件包。
如果您需要启用对南部岛屿或海岛的支持(GCN 1/GCN 2 AMD GPU),关注这个 ArchWiki 页面。
最后,需要通过附加内核参数来解锁调整 sysfs 中时钟和电压的访问权限amdgpu.ppfeaturemask=0xffffffff
(注意:根据测试和具体更改,该值最终可能会有所不同,这只是完全解锁卡)。
将以下行编辑/etc/default/grub
为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amdgpu.ppfeaturemask=0xffffffff"
然后跑sudo update-grub
。
通过检查此处来验证重新启动后的当前功能掩码:
printf "0x%08x\n" $(cat /sys/module/amdgpu/parameters/ppfeaturemask)
超频/降压
警告:仔细检查输入的值,因为错误可能会立即导致致命的硬件损坏!
一切设置完毕后,您可以通过两种方式调整时钟和电压:手动或工具辅助。
手动
Reddit 用户 Pannuba 概述了如何超频 AMD GPU这个帖子。
您需要编辑以下内容/sys/class/drm/card0/device/pp_od_clk_voltage
找到要编辑的位置readlink -f /sys/class/drm/card0/device
我们想要编辑核心的 P 状态 #7 和 VRAM 的 P 状态 #2,因为这些是我们的 GPU 在负载下运行时的值。
sudo sh -c "echo 's 7 1450 1150' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage" sudo sh -c "echo 'm 2 2065 950' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage"
请注意,文件路径是他们的GPU。使用前面的命令来发现路径你的。您想要的时钟速度和电压值也会有所不同。要降低电压,请将内核和 VRAM 的每个 P 状态电压更改为小于默认值。您也许能够保持时钟速度相同,但在某些情况下,您还必须降低这些值。这就是 GPU 稳定性测试和基准测试发挥作用的地方
正如在建筑维基百科,您可以运行以下命令来应用、验证、强制某些 P 状态并重置:
要申请,请运行
echo "c" > /sys/class/drm/card0/device/pp_od_clk_voltage
要检查它是否有效,请读出 3D 负载下的时钟和电压:
watch -n 0.5 cat /sys/kernel/debug/dri/0/amdgpu_pm_info
您可以使用以下命令重置为默认值:
echo "r" > /sys/class/drm/card0/device/pp_od_clk_voltage
还可以禁止驱动程序切换到某些 P 状态,例如解决深度节能 P 状态的问题,例如闪烁伪影或卡顿。要在 Polaris RX 5xx 卡上强制使用最高 VRAM P 状态,同时仍允许 GPU 本身以较低时钟运行,请运行:
echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level echo "2" > /sys/class/drm/card0/device/pp_dpm_mclk
仅允许三个最高的 GPU P 状态:
echo "5 6 7" > /sys/class/drm/card0/device/pp_dpm_sclk
要将 GPU 允许的最大功耗设置为 50 瓦,请运行
echo 50000000 > /sys/class/drm/card0/device/hwmon/hwmon0/power1_cap
在 Linux 内核 4.20 之前,该值只能减小,而不能增大。
为了使这些更改能够在启动过程中延续,您需要创建一个脚本和systemd
服务。您的脚本应使用您已经测试过的工作值以及 GPU 的文件路径。
将此脚本保存在/usr/bin/
系统范围脚本的安全位置:
#!/bin/sh
sudo sh -c "echo 's 7 <Your desired values here>' > /sys/devices/Your/Path/Here/pp_od_clk_voltage"
sudo sh -c "echo 'm 2 <Your desired values here' > /sys/devices/Your/Path/Here/pp_od_clk_voltage"
sudo sh -c "echo 'c' > /sys/devices/Your/Path/Here/pp_od_clk_voltage"
/etc/systemd/system/
创建一个类似undervolt.service
以下内容的文件:
[Unit]
Description=Undervolting GPU
[Service]
Type=oneshot
ExecStart=/Path/To/Script.sh
[Install]
WantedBy=multi-user.target
运行sudo systemctl enable undervolt.service
以启用。重新启动后,通过运行进行验证cat /sys/devices/Your/Path/Here/pp_od_clk_voltage
。
用户 Pannuba 还建议制作一个脚本将内容恢复为默认值。这不一定是 SystemD 服务。
工具辅助
有多种工具可以帮助 AMD GPU 超频:
AMDGPU 时钟,一个命令行工具。
核心控件,用于整个系统调整的 GUI 工具。
瓦特曼GTK,一个在 Linux 上重新创建 Wattman 功能的 GTK GUI。
TuxClocker,一款适用于 Linux 上 Nvidia 和 AMD GPU 的 Qt5 GUI 超频工具。
每个都有特定的先决条件和设置,可以单独发布。请参考他们的指南,了解如何设置和调整您的系统。
结论
正如您所看到的,AMD GPU Linux 调优正在成为一流的体验。 Windows 用户可用的许多功能现在也可供 Linux 用户使用,甚至也可以使用开源驱动程序。您可以进行许多调整和选择。我将把具体细节留给你。如果您想减少功耗,可以降低 P 状态的电压,甚至限制卡的功率。确保在更改任何内容后测试卡和计算机的稳定性。阅读有关 Radeon 开源驱动程序功能的更多信息这里。
如果您对此答案有任何疑问或疑问,请发表评论。我强烈建议您在尝试命令之前仔细阅读我提供的每个链接。我感谢您提供反馈来纠正任何误解并改进我的帖子。我可以根据需要更新我的答案。
祝你好运!
资源
答案2
我来补一下凯莫特普的结合我的观察回答。
一个小前言:英语不是我的母语。请忽略语义、语法错误和错误选择的单词。
首先,要限制卡的最大消费水平,需要更改星 号为数字的power1_cap
路径下的文件,通常是0到9。在同一目录下,可以调整卡的电压,查看/sys/class/drm/card0/device/hwmon/hwmon*/
该卡的最大允许消费限额等等。
更多详细信息可以在以下链接中找到: https://docs.kernel.org/gpu/amdgpu/Thermal.html
第二,要写入值,最好使用以下类型的命令:
echo "10000000" | sudo tee /sys/class/drm/card0/device/hwmon/hwmon*/power1_cap
让我解释一下我为什么这么认为。当执行以下脚本时:
sudo sh -c "{your_commands and/some/random/path*/}"
星号不会被名称中缺失的部分替换,但会被视为目录名称。问题在于,在第一个hwmon
文件夹内,下一个嵌套文件夹的名称中有一个随机数字(例如:hwmon0
、hwmon3
等)。因此,星号作为命令而不是文本非常重要。
第三,kemotep 描述的保存更改的方法可能有错误。
当使用示例中给出的选项运行 systemd 单元时,脚本不会被执行。在我看来,脚本是在系统中的视频适配器初始化之前触发的,这就是为什么指定的路径根本不存在。或者,还有另一种不可抗拒的力量,导致脚本拒绝执行,我不是专家。
我将给出我的单元文件的示例,然后我将解释参数:
[Unit]
Description=Limit GPU Wattage
[Service]
Type=idle
ExecStart=/usr/bin/my_script.sh
ExecStartPost=/usr/bin/my_another_script.sh
Restart=on-failure
RestartSec=5
TimeoutSec=300
[Install]
WantedBy=multi-user.target
- Type 参数的“空闲”值如 DigitalOcean 网站上所述 -https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
[服务]部分
Type= 指令可以是以下之一:
... 闲置的:这表明在分派所有作业之前,该服务不会运行。
我把它理解为“当系统的所有元素都加载时,您的单元将被执行”。我可能是错的,但它有效。
- ExecStartPost - 我在调查单元执行错误的原因时添加的。我将脚本分成两个文件,在这里我指出了第二个文件的路径。所有命令都可以放在一个脚本中,但我决定保留所有内容不变。
- 重新启动 - 负责重新启动脚本。以防万一我误解了“idle”参数的含义,此选项应该在失败时重新启动设备。可以指定其他重新启动条件 - 请在上面的链接中了解更多信息。
- RestartSec - 这指定执行重新启动之前等待的时间。
- TimeoutSec - 如果我理解正确的话,这里指示了单元的生命周期。我指定了300秒。如果在此时间内未成功,该单元的执行将中止。
最后,我将描述我所做的事情。
设置 amdgpu.ppfeaturemask 后(更多信息可以在互联网上找到),在/usr/bin/
目录中,我创建了两个文件:
my_script.sh
#!/bin/sh
sudo sh -c "echo 'low' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/power_dpm_force_performance_level"
my_another_script.sh
#!/bin/bash
echo "6000000" | sudo tee /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/hwmon/hwmon*/power1_cap
在/etc/systemd/system/
目录中,我创建了my-gpu-setup.service
文件(内容如上所示)。
然后,我使用以下命令启动该服务(只需激活一次):
sudo systemctl enable my-gpu-setup.service
并重新启动电脑。
就这样。
要查看有关单元执行的信息,可以键入命令:
sudo systemctl status my-gpu-setup.sevice
要回滚更改并禁用该服务:
输入命令
sudo systemctl disable my-gpu-setup.service
从目录中删除文件
/etc/systemd/system/
(此操作是可选的)。重新启动计算机。
我不认为创建脚本来回滚更改有什么意义,因为如果您不在每次系统启动时执行新的设置,设置无论如何都会在重新启动时重置。