AMDGPU
AMDGPU 是自 Graphics Core Next 系列以来,AMD Radeon 显卡的开源图形驱动程序。
选择合适的驱动程序
通过阅读 Graphics processing unit#Installation 来识别您的硬件并找到合适的驱动程序。此驱动程序支持 Southern Islands (GCN 1,2012 年发布) 及更晚的显卡。AMD 没有计划支持 GCN 之前的 GPU。
不支持的 GPU 的用户可以使用开源的 ATI 驱动程序。
安装
安装 mesa 包,它提供了用于 3D 加速的 DRI 驱动程序以及用于 加速视频解码的 VA-API/VDPAU 驱动程序。
- 为了支持 32 位应用程序,请从 multilib 仓库安装 lib32-mesa 包。
- 为了在 Xorg 下进行 2D 加速,您可以选择安装 xf86-video-amdgpu 包,它提供了 AMD 特定的 DDX 驱动程序。大多数使用
amdgpu内核驱动程序的 Xorg 系统都可以正确使用 xorg-server 中内置的通用 modesetting DDX。然而,对于TearFree等功能,或者为了解决某些 AMD 硬件(例如 Southern Islands)上的硬件特定问题,可能需要 xf86-video-amdgpu。请参阅 Intel graphics#Installation 中的注意事项。 - 为了支持 Vulkan,请安装 vulkan-radeon(对于 32 位应用程序,请安装 lib32-vulkan-radeon)。
实验性
对于某些用户来说,使用 mesa 的上游实验性构建可能是有益的。
安装 mesa-gitAUR 包,它提供了用于 3D 加速的 DRI 驱动程序。
- 为了支持 32 位应用程序,请从 mesa-git 仓库或 AUR 安装 lib32-mesa-gitAUR 包。
- 为了支持 DDX 驱动程序(在 Xorg 中提供 2D 加速),请安装 xf86-video-amdgpu-gitAUR 包。
- 为了支持使用 mesa-git 仓库的 Vulkan,请安装 vulkan-radeon-git 包。如果从 AUR 构建 mesa-gitAUR,则可选安装 lib32-vulkan-radeon-git 包以支持 32 位应用程序。
启用 Southern Islands (SI) 和 Sea Islands (CIK) 支持
官方支持的内核 为 Southern Islands (GCN 1,2012 年发布) 和 Sea Islands (GCN 2,2013 年发布) 的显卡启用了 AMDGPU 支持。amdgpu 内核驱动程序需要先于 radeon 加载。您可以通过运行 lspci -k 来检查正在使用的内核驱动程序。它应该如下所示
$ lspci -k -d ::03xx
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Curacao PRO [Radeon R7 370 / R9 270/370 OEM] Subsystem: Gigabyte Technology Co., Ltd Device 226c Kernel driver in use: amdgpu Kernel modules: radeon, amdgpu
如果未使用 amdgpu 驱动程序,请按照下一节的说明进行操作。
加载 amdgpu 驱动
amdgpu 和 radeon 模块的 模块参数是 cik_support= 和 si_support=。
它们需要设置为内核参数或在 modprobe 配置文件中设置,并且取决于显卡的 GCN 版本。
如果您不确定拥有哪个内核卡,可以使用这两个参数。
[..] amdgpu 0000:01:00.0: Use radeon.cik_support=0 amdgpu.cik_support=1 to override。在内核命令行设置模块参数
设置以下 内核参数之一
- Southern Islands (SI):
radeon.si_support=0 amdgpu.si_support=1 - Sea Islands (CIK):
radeon.cik_support=0 amdgpu.cik_support=1
此外,如果您使用的是带有集成 Sea Island (GCN 1.1) 显卡的 AMD A10 APU,您可能需要禁用 Radeon 动态功耗管理才能正常启动。此功能可以动态地重新调整图形核心的时钟以使 APU 保持凉爽和安静,但此功能可能会导致您陷入无限重启循环。要禁用它,请按照上述说明,在启动选项中添加 radeon.dpm=0。
指定正确的模块顺序
确保 amdgpu 已在 Mkinitcpio#MODULES 数组中设置为第一个模块,例如 MODULES=(amdgpu radeon)。
设置内核模块参数
对于 Southern Islands (SI),请使用 si_support=1 内核模块参数,对于 Sea Islands (CIK),请使用 cik_support=1。
/etc/modprobe.d/amdgpu.conf
options amdgpu si_support=1 options amdgpu cik_support=1
/etc/modprobe.d/radeon.conf
options radeon si_support=0 options radeon cik_support=0
确保 modconf 在 /etc/mkinitcpio.conf 的 HOOKS 数组中,并 重新生成 initramfs。
编译支持 amdgpu 驱动的内核
在构建或编译 内核时,应在配置中设置 CONFIG_DRM_AMDGPU_SI=Y 和/或 CONFIG_DRM_AMDGPU_CIK=Y。
ACO 编译器
ACO 编译器是一个开源着色器编译器,由 Valve Corporation 创建和开发,旨在直接与 LLVM 编译器以及 Windows 10 竞争。它具有较短的编译时间和比 LLVM 更好的游戏性能。
一些基准测试可以在 GitHub 和 Phoronix [1] [2] 上看到。
自 mesa 版本 20.2 以来,ACO 是默认的着色器编译器。
加载
amdgpu 内核模块应该在系统启动时自动加载。
如果它没有自动加载
- 请确保 #启用 Southern Islands (SI) 和 Sea Islands (CIK) 支持(如果需要)。
- 确保您已安装最新的 linux-firmware-amdgpu 包。此驱动程序需要每个型号的最新固件才能成功启动。
- 确保您没有将
nomodeset或vga=作为 内核参数,因为amdgpu需要 KMS。 - 检查您没有通过任何 内核模块黑名单来禁用
amdgpu。
它有可能加载了,但加载得很晚,在 X 服务器需要它之后。在这种情况下,请参阅 Kernel mode setting#Early KMS start。
Xorg配置
Xorg 会自动加载驱动程序,并使用您的显示器的 EDID 来设置原生分辨率。仅在调整驱动程序设置时才需要配置。
如果您想要手动配置,请创建 /etc/X11/xorg.conf.d/20-amdgpu.conf,并添加以下内容
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "OutputClass"
Identifier "AMD"
MatchDriver "amdgpu"
Driver "amdgpu"
EndSection
使用此部分,您可以启用功能并调整驱动程序设置,在设置驱动程序选项之前,请先参阅 amdgpu(4)。
防止画面撕裂渲染
TearFree 通过硬件页面翻转机制控制防止画面撕裂。默认情况下,对于旋转的输出、已应用 RandR 变换的输出以及 RandR 1.4 从属输出,TearFree 将处于启用状态,而对于其他所有情况,TearFree 将处于禁用状态。或者,您可以分别使用 true 或 false 将其配置为始终开启或始终关闭。
Option "TearFree" "true"
您也可以暂时使用 xrandr 启用 TearFree
$ xrandr --output output --set TearFree on
其中 output 应该类似于 DisplayPort-0 或 HDMI-A-0,可以通过运行 xrandr -q 获取。
DRI 等级
DRI 设置要启用的最大 DRI 等级。有效值为 2 表示 DRI2 或 3 表示 DRI3。如果 Xorg 版本 >= 1.18.3,默认值为 3 表示 DRI3,否则使用 DRI2。
Option "DRI" "3"
可变刷新率
10 位颜色
较新的 AMD 显卡支持 10bpc 颜色,但默认是 24 位颜色,30 位颜色必须明确启用。如果应用程序也支持,启用它可以减少渐变中可见的色带/伪影。要检查您的显示器是否支持,请在您的 Xorg 日志文件(例如 /var/log/Xorg.0.log 或 ~/.local/share/xorg/Xorg.0.log)中搜索“EDID”。
[ 336.695] (II) AMDGPU(0): EDID for output DisplayPort-0 [ 336.695] (II) AMDGPU(0): EDID for output DisplayPort-1 [ 336.695] (II) AMDGPU(0): Manufacturer: DEL Model: a0ec Serial#: 123456789 [ 336.695] (II) AMDGPU(0): Year: 2018 Week: 23 [ 336.695] (II) AMDGPU(0): EDID Version: 1.4 [ 336.695] (II) AMDGPU(0): Digital Display Input [ 336.695] (II) AMDGPU(0): 10 bits per channel
要检查当前是否已启用,请搜索“Depth”。
[ 336.618] (**) AMDGPU(0): Depth 30, (--) framebuffer bpp 32 [ 336.618] (II) AMDGPU(0): Pixel depth = 30 bits stored in 4 bytes (32 bpp pixmaps)
使用默认配置时,它将显示深度为 24,并将 24 位存储在 4 个字节中。
要检查 10 位是否有效,请退出正在运行的 Xorg,然后运行 Xorg -retro,它将显示一个黑白网格,然后按 Ctrl-Alt-F1 和 Ctrl-C 退出 X,然后运行 Xorg -depth 30 -retro。如果这能正常工作,那么 10 位就有效。
要通过 startx 以 10 位启动,请使用 startx -- -depth 30。要永久启用它,请创建或添加到
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "Screen" Identifier "asdf" DefaultDepth 30 EndSection
降低输出延迟
如果您想尽量减小延迟,可以禁用页面翻转和防止画面撕裂。
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "OutputClass"
Identifier "AMD"
MatchDriver "amdgpu"
Driver "amdgpu"
Option "EnablePageFlip" "off"
Option "TearFree" "false"
EndSection
请参阅 Gaming#Reducing DRI latency 以进一步减少延迟。
特性
视频加速
请参阅 Hardware video acceleration#AMD/ATI。
监控
监控 GPU 通常用于检查温度和 GPU 的 P 状态。有关 CLI 和 GUI 工具列表,请参阅 Graphics processing unit#Monitoring。
如果您想手动监控各个元素,例如在脚本中使用它们,所有信息都可在 /sys/ 中找到。
要检查 GPU 的 P 状态,请执行
$ cat /sys/class/drm/card0/device/pp_od_clk_voltage
要监控 GPU,请执行
# watch -n 0.5 cat /sys/kernel/debug/dri/0/amdgpu_pm_info
要检查 GPU 利用率,请执行
$ cat /sys/class/drm/card0/device/gpu_busy_percent
要检查 GPU 频率,请执行
$ cat /sys/class/drm/card0/device/pp_dpm_sclk
要检查 GPU 温度,请执行
$ cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input
要检查 VRAM 频率,请执行
$ cat /sys/class/drm/card0/device/pp_dpm_mclk
要检查 VRAM 使用情况,请执行
$ cat /sys/class/drm/card0/device/mem_info_vram_used
要检查 VRAM 大小,请执行
$ cat /sys/class/drm/card0/device/mem_info_vram_total
超频
从 Linux 4.17 开始,一旦您在下面启用了启动时的功能,就可以通过 /sys/class/drm/card0/device/pp_od_clk_voltage 来调整显卡的时钟和电压。
启动参数
通过附加 内核参数 amdgpu.ppfeaturemask=0xffffffff 来解锁对 sysfs 中时钟和电压的访问是必需的。
并非所有位都已定义,并且可能会随着时间的推移添加新功能。设置所有 32 位可能会启用不稳定的功能,从而导致屏幕闪烁或恢复暂停中断等问题。仅设置 PP_OVERDRIVE_MASK 位 0x4000 结合默认的 ppfeaturemask 应该就足够了。要为您的系统计算一个合理的参数,请执行
$ printf 'amdgpu.ppfeaturemask=0x%x\n' "$(($(cat /sys/module/amdgpu/parameters/ppfeaturemask) | 0x4000))"
手动
/sys/class/drm/... 的路径只是符号链接,在重启之间可能会发生变化。持久位置可以在 /sys/devices/ 中找到,例如 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/。相应地调整命令以获得可靠的结果。有关所有可能选项的深入信息,请阅读内核文档 amdgpu thermal control。
要启用手动超频,请按照 #Performance levels 中的说明选择 manual 性能等级。
例如,要将 Polaris GPU 的 GPU 时钟设置为最大 P 状态 7,使其达到 1209MHz 和 900mV 电压,请运行
# echo "s 7 1209 900" > /sys/class/drm/card0/device/pp_od_clk_voltage
可以对 VRAM 应用相同的过程,例如,Polaris 5xx 系列显卡的 VRAM 最大 P 状态 2
# echo "m 2 1850 850" > /sys/class/drm/card0/device/pp_od_clk_voltage
要应用,请运行
# 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 状态的问题,如闪烁伪影或卡顿。要强制显卡使用最高的 VRAM P 状态,同时仍允许 GPU 本身以较低的时钟运行,请先找到最高可能的 P 状态,然后设置它
$ cat /sys/class/drm/card0/device/pp_dpm_mclk
0: 96Mhz * 1: 456Mhz 2: 675Mhz 3: 1000Mhz
# echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level # echo "3" > /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
辅助
如果您不愿意完全手动超频您的 GPU,社区提供了一些超频工具来帮助您超频和监控您的 AMD GPU。
命令行工具
- amdgpu-clocks — 一个可用于监控和设置 AMD GPU 自定义电源状态的脚本。它还提供了一个 Systemd 服务,可在启动时自动应用设置。
- ruby-amdgpu_fan — 一个用 Ruby 编写的与 amdgpu Linux 驱动程序交互的 CLI。
GUI 工具
- TuxClocker — 一个 Qt5 监控和超频工具。
- CoreCtrl — 一个具有类似 WattMan UI 的 GUI 超频工具,支持每个应用程序的配置文件。
- LACT — 一个 GTK 工具,用于查看和控制您的 AMD GPU 信息。
- Radeon Profile — 一个 Qt5 工具,用于读取和更改 AMD Radeon 显卡的当前时钟。
启动时自动运行
一种方法是使用 systemd units。如果您希望您的设置在启动时自动应用,请考虑查看此 Reddit 帖子以配置和应用您的启动设置。
另一种方法是使用 udev 规则来设置某些值,例如,设置一个低性能等级以节省能源
/etc/udev/rules.d/30-amdgpu-low-power.rules
ACTION=="add", SUBSYSTEM=="drm", DRIVERS=="amdgpu", ATTR{device/power_dpm_force_performance_level}="low"
性能等级
AMDGPU 提供多种性能等级,文件 power_dpm_force_performance_level 用于此目的,可以从中选择这些等级。
- auto: 动态选择驱动程序中当前条件的最佳电源配置。
- low: 时钟被强制设置为最低功耗状态。
- high: 时钟被强制设置为最高功耗状态。
- manual: 用户可以手动调整每个时钟域启用的电源状态(用于设置 #Power profiles)。
- profile_standard, profile_min_sclk, profile_min_mclk, profile_peak: 禁用时钟和电源门控,并将时钟设置为用于不同的配置案例。建议在此模式下分析特定的工作负载。
要将 AMDGPU 设备设置为使用低性能等级,可以执行以下命令
# echo "low" > /sys/class/drm/card0/device/power_dpm_force_performance_level
电源配置
AMDGPU 通过电源配置提供多种优化,其中最常用的是用于 OpenCL 密集型应用的计算模式。可以通过以下方式列出可用的电源配置
$ cat /sys/class/drm/card0/device/pp_power_profile_mode
NUM MODE_NAME SCLK_UP_HYST SCLK_DOWN_HYST SCLK_ACTIVE_LEVEL MCLK_UP_HYST MCLK_DOWN_HYST MCLK_ACTIVE_LEVEL 0 BOOTUP_DEFAULT: - - - - - - 1 3D_FULL_SCREEN: 0 100 30 0 100 10 2 POWER_SAVING: 10 0 30 - - - 3 VIDEO: - - - 10 16 31 4 VR: 0 11 50 0 100 10 5 COMPUTE *: 0 5 30 10 60 25 6 CUSTOM: - - - - - -
card0 标识您机器中的特定 GPU。如果有多张 GPU,请确保指定正确的 GPU。要使用特定的电源配置,您应该首先通过以下命令启用对其的手动控制
# echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level
然后通过写入与之关联的 NUM 字段来选择一个电源配置,例如,要启用 COMPUTE,请运行
# echo "5" > /sys/class/drm/card0/device/pp_power_profile_mode
电源配置的确切值和限制通过 powerplay table 系统进行管理。使用 upliftpowerplayAUR 来修改受支持型号(Polaris 到 Navi2x;Navi3x 和 Navi4x 在内核端有 bug)的 powerplay table。
启用 GPU 显示缩放
要避免使用显示器内置的缩放器,而是使用 GPU 自身的缩放器(当未使用显示器的原生分辨率时),请执行
$ xrandr --output output --set "scaling mode" scaling_mode
"scaling mode" 的可能值为: None, Full, Center, Full aspect。
- 要显示可用的输出和设置,请执行
$ xrandr --prop
- 要为所有可用输出设置
scaling mode = Full aspect,请执行$ for output in $(xrandr --prop | grep -E -o -i "^[A-Z\-]+-[0-9]+"); do xrandr --output "$output" --set "scaling mode" "Full aspect"; done
无头设置下的虚拟显示
AMDGPU 为无头设置提供了 GPU 加速的虚拟显示器,无需使用虚拟插件。这对于 RDP 和游戏流媒体软件(如 sunshineAUR)非常有用。
选择要使用的 AMD GPU
$ lspci -Dd ::03xx
1234:56:78.9 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] CommercialModelName
为 amdgpu 模块添加 virtual_display=1234:56:78.9,x 内核模块参数,其中 1234:56:78.9 是 GPU 的 PCI 地址,x 是要暴露的 crtc(虚拟显示器)数量。使用此参数还会禁用物理输出。[3]
也可以通过用分号(;)分隔 PCI 地址来使用多个 GPU,如下所示
amdgpu.virtual_display=1234:56:78.9,x;9876:54:32.1,y
用户队列
AMDGPU 驱动程序支持用户队列,这允许作业直接提交到 GPU 硬件,而无需通过内核驱动程序的命令提交 ioctl。启用此功能可以减少延迟并提高效率,因为它绕过了部分内核驱动程序的开销。
要启用用户队列,请设置以下环境变量
export AMD_USERQ=1
故障排除
模块参数
amdgpu 模块在掩码中存储了几个配置参数(modinfo amdgpu | grep mask),这些参数仅在 内核源代码中进行了文档记录。
Xorg 或应用程序无法启动
- 打开 glxgears 后出现 "(EE) AMDGPU(0): [DRI2] DRI2SwapBuffers: drawable has no back or front?" 错误,可以打开 Xorg 服务器但 OpenGL 应用程序崩溃。
- 出现 "(EE) AMDGPU(0): Given depth (32) is not supported by amdgpu driver" 错误,Xorg 无法启动。
将 Xorg 下的屏幕深度设置为 16 或 32 会导致问题/崩溃。为避免这种情况,您应该使用标准的 24 位屏幕深度,方法是在您的 "screen" 部分添加以下内容
/etc/X11/xorg.conf.d/10-screen.conf
Section "Screen"
Identifier "Screen"
DefaultDepth 24
SubSection "Display"
Depth 24
EndSubSection
EndSection
屏幕伪影和频率问题
动态功耗管理可能会在显示到高刷新率(高于 60Hz)的显示器时出现屏幕伪影,这是由于 GPU 时钟速度管理方式存在问题[4][5]。
解决方法 [6] 是设置 #Performance levels 中描述的 high 或 low 性能等级。
更改内核版本也有助于消除此问题。例如,它似乎在 6.12.9 中已修复。
Chromium 中的伪影
如果您在 Chromium 中看到伪影,强制使用基于 Vulkan 的后端可能有助于解决。转到 chrome://flags 并启用 #ignore-gpu-blocklist 和 #enable-vulkan。
R9 390 系列性能低下和/或不稳定
如果您在使用 AMD R9 390 系列显卡时遇到问题[7],请将 radeon.cik_support=0 radeon.si_support=0 amdgpu.cik_support=1 amdgpu.si_support=1 amdgpu.dc=1 设置为 内核参数,以强制使用 amdgpu 驱动程序而不是 radeon。
如果仍然无效,禁用 DPM 可能会有帮助,请将 radeon.cik_support=0 radeon.si_support=0 amdgpu.cik_support=1 amdgpu.si_support=1 添加到 内核参数中。
冻结伴随 "[drm] IP block:gmc_v8_0 is hung!" 内核错误
如果在 GPU 密集型任务期间遇到冻结和内核崩溃,并伴随内核错误 " [drm] IP block:gmc_v8_0 is hung!" [8],一个解决方法是设置 amdgpu.vm_update_mode=3 作为 内核参数,以强制使用 CPU 进行 GPUVM 页表更新。缺点在此处列出 [9]。
屏幕闪烁白/灰色
当您更改分辨率或连接到外部显示器时,如果屏幕闪烁或保持白色,请将 amdgpu.sg_display=0 添加为 内核参数。
Vega 显卡游戏时系统冻结或崩溃
动态电源管理 可能由于 GPU 时钟速度管理问题导致游戏时系统完全冻结。 [10] 一个解决方法是设置 high 性能级别,如 #性能级别 中所述。
WebRenderer (Firefox) 损坏
当用户强制启用 WebRenderer 时,可能会出现伪影和其他异常(例如,无法选择扩展选项)。解决方法是回退到 OpenGL 合成。
连接 4K@60Hz 设备时双速或“芯片munk”音频,或无音频
这有时是由 AMDGPU 设备与通过 HDMI 连接的 4K 显示器之间的通信问题引起的。一种可能的解决方法是通过显示器的内置设置启用 HDR 或“超高清深度色彩”。在许多基于 Android 的电视上,这意味着将其设置为“标准”而不是“优化”。
电源管理/独立 amdgpu 显卡动态重新激活问题
如果您遇到内核驱动程序已加载,但独立显卡仍无法用于游戏或在使用过程中被禁用(类似于 [11])的问题,则可以通过设置 内核参数 amdgpu.runpm=0 来解决此问题,这可以防止 dGPU 在运行时被动态关闭电源。
显示器冻结或无响应(flip_done 超时)
amdgpu 驱动程序中的一个错误可能会导致显示器停止更新 [12]。建议将 amdgpu.dcdebugmask=0x10 或 amdgpu.dcdebugmask=0x12 内核参数 添加为解决方法。
kfd 初始化失败
kfd 的初始化可能会因 GPU 的架构而失败。gfx803 (GCN 4) 需要 PCIe 原子操作支持,而 gfx9xx (Vega) 及更高版本设备不需要 PCIe 原子操作。kfd 不支持 GCN 3 或更早的设备。
如果您不打算使用 ROCm,这些错误可以安全地忽略。
“[GPU Core Name] 在 kfd 中不受支持”
在系统日志或内核消息密钥环中,可能会出现与 kfd 相关的严重级别错误消息。
# dmesg | grep kfd
kfd kfd: amdgpu: BONAIRE not supported in kfd
(将 BONAIRE 替换为您 GPU 的核心名称,例如 TOPAZ、HAWAII 等。您可以通过查找您的 GPU 或使用 GPU 诊断实用程序(如 amdgpu_top)来查找核心名称)
这意味着您的 GPU 在 kfd 中不受支持,并且将无法与 ROCm 一起使用。[13][14]
“PCI 拒绝原子操作”
在 GCN 4 GPU 上,您的 CPU 必须支持 PCIe 原子操作,并且 GPU 所插入的插槽至少支持 PCIe 3.0。[15] 如果不满足这些要求,您将遇到此消息。
# dmesg | grep kfd
kfd kfd: amdgpu: skipped device 1002:67e3, PCI rejects atomics 730<0
您可以通过运行此命令来检查您的 CPU 是否支持 PCIe 原子操作。
grep flags /sys/class/kfd/kfd/topology/nodes/*/io_links/0/properties
如果您的 CPU 支持 PCIe 原子操作(结果为 1),请更换 GPU 所插入的插槽,它可能来自芯片组而不是 CPU。
由于 MCLK 锁定在 MAX (1000MHz) 或 MIN (96MHz) 导致高空闲功耗,游戏性能低下(在 6.4 内核上)
在高分辨率和刷新率下,MCLK(显存/内存时钟)可能被锁定在最高时钟速率 (1000MHz) [16] [17],导致 GPU 空闲功耗升高。在 Linux 内核 6.4.x 中,MCLK 以最低频率 (96MHz) 运行,导致游戏性能低下 [18] [19]。
这可能是由于监视器未使用具有低 V-Blank 值的协同视频定时 (CVT) 来处理受影响的分辨率和刷新率,请参阅 此 gist 获取解决方法。
无法挂起到 RAM
amdgpu 内核模块尝试在系统进入 S3 时将 VRAM 缓冲到 RAM 中,以防止 VRAM 因刷新不足而衰减导致内存丢失。
如果您使用大量 VRAM 并且可用 RAM 不足,这可能会失败,尽管有足够的 SWAP 内存可用,因为 IO 子系统可能在此之前已被挂起。
您将看到类似以下内容:
kernel: systemd-sleep: page allocation failure: order:0, mode:0x100c02(GFP_NOIO|__GFP_HIGHMEM|__GFP_HARDWALL), nodemask=(null),cpuset=/,mems_allowed=0 kernel: Call Trace: kernel: <TASK> kernel: dump_stack_lvl+0x47/0x60 kernel: warn_alloc+0x165/0x1e0 kernel: __alloc_pages_slowpath.constprop.0+0xd7d/0xde0 kernel: __alloc_pages+0x32d/0x350 kernel: ttm_pool_alloc+0x19f/0x600 [ttm 0bd92a9d9dccc3a4f19554535860aaeda76eb4f4]
作为解决方法,用户空间服务可以确保分配足够的 RAM 来缓冲 VRAM,方法是在系统挂起前交换出足够的 RAM。
错误的 GPU 时钟导致多种问题
amdgpu 模块中存在一个错误,导致视频核心频率可能高于制造商声明的频率,这可能在游戏时、从睡眠唤醒时、重启时导致系统不稳定。
该问题已在 RDNA 3 GPU(7XXX 型号)上注意到 [21] [22] [23]。
在 dmesg 中,您可以看到类似以下的日志:
amdgpu: [gfxhub] page fault (src_id:0 ring:40 vmid:6 pasid:32830) amdgpu: in process GameThread pid 100056 thread vkd3d_queue pid 100468) amdgpu: in page starting at address 0x0000000218a36000 from client 10 amdgpu: GCVM_L2_PROTECTION_FAULT_STATUS:0x00641051 amdgpu: Faulty UTCL2 client ID: TCP (0x8) amdgpu: MORE_FAULTS: 0x1 amdgpu: WALKER_ERROR: 0x0 amdgpu: PERMISSION_FAULTS: 0x5 amdgpu: MAPPING_ERROR: 0x0 amdgpu: RW: 0x1
如果您遇到类似的问题,请检查系统中视频核心的最大频率与制造商声明的频率。要降低最大频率,请参阅 #超频。
Wayland 下 AMD 独立 GPU HDMI 冻结问题
例如,ASUS G14 2022 笔记本电脑,它同时拥有 AMD CPU 和独立 AMD GPU。最成功的方法是在 Windows 上使用 Armor Crate 来强制 dGPU 的 Ultimate 电源选项。它会切换 GPU 顺序和笔记本内部电源策略。自那以后,HDMI 应该能工作,但用户会遇到集成 GPU(SDDM 和 Wayland 以某种方式默认选择)和独立 GPU 的分离渲染。用户当然可以在启动任何应用程序之前添加 DRI_PRIME=0,但这很不方便。扩展配置到已呈现的配置可以带来无缝体验,但代价是电池续航时间缩短。
/etc/sddm.conf.d/hardware.conf
[General] DisplayServer=wayland [Wayland] CompositorCommand=kwin_wayland --drm --no-lockscreen --no-global-shortcuts Environment=DRI_PRIME=0
此外,内核命令行应扩展为
amdgpu.runpm=0 amdgpu.modeset=1
笔记本电脑上的颜色显得暗淡无光
诸如 power-profiles-daemon 和 tuned 等省电应用程序已开始 启用 称为面板省电 (PPS) 的功能。
PPS 是笔记本电脑支持的一项功能,指示笔记本电脑的 GPU 为了节省电量而降低色彩准确度。然而,这会导致在上述 power-profiles-daemon 和 tuned 上选择更具侵略性的省电模式时,颜色会显得暗淡无光。因此,人们有兴趣完全禁用此功能。
可以通过将以下 内核参数 设置为零来完成。
amdgpu.abmlevel=0
系统空闲时冻结或重启
某些 PowerPlay 功能(例如 GFXOFF)的问题可能导致频繁且无法恢复的驱动程序崩溃 [24]。它们与多显示器设置下的空闲 GPU 使用率以及从睡眠模式唤醒时同时发生。
一个众所周知的解决方案是附加一个内核参数(如 #启动参数 中所述),该参数禁用 PP_GFXOFF_MASK,例如 amdgpu.ppfeaturemask=0xffff7fff - 这个参数保留了所有其他(已实现和未实现的)PowerPlay 功能。
替代解决方案依赖于禁用比 GFXOFF 更多的功能。
- 使用
0xfffd7fff禁用 PP_GFXOFF_MASK 和 PP_STUTTER_MODE; - 使用
0xfffd3fff禁用 PP_GFXOFF_MASK、PP_STUTTER_MODE 和 PP_OVERDRIVE_MASK; - 使用
0xfff73fff禁用 PP_GFXOFF_MASK、PP_GFX_DCS_MASK 和 PP_OVERDRIVE_MASK; - 使用
0(或0x0)禁用所有功能。如果驱动程序崩溃的原因未知,可以使用此选项。
您可以创建自己的功能掩码,从 amdgpu.ppfeaturemask=0x 开始,后面跟一个使用 十六进制按位计算器 计算出的八字符掩码(包含示例)。掩码以 ffffffff(所有位都启用)开始,**异或** 要掩码的功能。您可以将更多功能“异或”到结果中。您可以跳过第一个非零字符之前的零:例如,0x8000 等同于 0x00008000。
确保在内核更新期间不会移除该参数。
HDMI 4K 限制在 120Hz
由于 许可问题,mesa 驱动程序不支持 HDMI 2.1。您必须使用 DisplayPort。如果您的显示器不支持 DisplayPort,一些用户 报告使用转换器设备成功,这些设备接收 DisplayPort 输入并输出 HDMI 2.1 信号。