跳转至内容

AMDGPU

来自 ArchWiki
(重定向自 Radeon)

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 位应用程序。
提示 不想手动编译 mesa-gitAUR 包的用户可以使用 mesa-git 非官方仓库。

启用 Southern Islands (SI) 和 Sea Islands (CIK) 支持

本文或本节正考虑移除。

原因:上游更改将 AMDGPU 设为默认值并进入 linux-lts 时,将不再需要记录此内容。(在 Talk:AMDGPU 中讨论)

官方支持的内核 为 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 驱动

amdgpuradeon 模块的 模块参数cik_support=si_support=

它们需要设置为内核参数或在 modprobe 配置文件中设置,并且取决于显卡的 GCN 版本。

如果您不确定拥有哪个内核卡,可以使用这两个参数。

提示 dmesg 可能会显示要使用的正确内核参数:[..] 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)

设置内核模块参数

本文或本节正考虑移除。

原因:上游更改使 AMDGPU 针对 SI 和 CIK 启用时,本节仅适用于 6.19 内核之前的版本。在 6.19 发布时添加一个注释。(在 Talk:AMDGPU 中讨论)

对于 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.confHOOKS 数组中,并 重新生成 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 内核模块应该在系统启动时自动加载。

如果它没有自动加载

它有可能加载了,但加载得很晚,在 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 将处于禁用状态。或者,您可以分别使用 truefalse 将其配置为始终开启或始终关闭。

Option "TearFree" "true"

您也可以暂时使用 xrandr 启用 TearFree

$ xrandr --output output --set TearFree on

其中 output 应该类似于 DisplayPort-0HDMI-A-0,可以通过运行 xrandr -q 获取。

DRI 等级

DRI 设置要启用的最大 DRI 等级。有效值为 2 表示 DRI2 或 3 表示 DRI3。如果 Xorg 版本 >= 1.18.3,默认值为 3 表示 DRI3,否则使用 DRI2。

Option "DRI" "3"

可变刷新率

请参阅 Variable refresh rate

10 位颜色

警告 启用 10 位颜色时,许多应用程序可能会出现图形伪影或崩溃。这尤其包括 Steam,它会因 X 错误而崩溃。

较新的 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-F1Ctrl-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))"

手动

注意 在 sysfs 中,类似 /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
注意 上述过程已在 Polaris RX 560 显卡上进行测试。不同 GPU 可能存在不同的行为或错误。

辅助

如果您不愿意完全手动超频您的 GPU,社区提供了一些超频工具来帮助您超频和监控您的 AMD GPU。

命令行工具
  • amdgpu-clocks — 一个可用于监控和设置 AMD GPU 自定义电源状态的脚本。它还提供了一个 Systemd 服务,可在启动时自动应用设置。
https://github.com/sibradzic/amdgpu-clocks || amdgpu-clocks-gitAUR
  • ruby-amdgpu_fan — 一个用 Ruby 编写的与 amdgpu Linux 驱动程序交互的 CLI。
https://github.com/HarlemSquirrel/amdgpu-fan-rb || ruby-amdgpu_fanAUR
GUI 工具
  • TuxClocker — 一个 Qt5 监控和超频工具。
https://github.com/Lurkki14/tuxclocker || tuxclockerAUR
  • CoreCtrl — 一个具有类似 WattMan UI 的 GUI 超频工具,支持每个应用程序的配置文件。
https://gitlab.com/corectrl/corectrl || corectrl
  • LACT — 一个 GTK 工具,用于查看和控制您的 AMD GPU 信息。
https://github.com/ilya-zlobintsev/LACT || lact
  • Radeon Profile — 一个 Qt5 工具,用于读取和更改 AMD Radeon 显卡的当前时钟。
https://github.com/emerge-e-world/radeon-profile || radeon-profile-gitAUR

启动时自动运行

一种方法是使用 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
注意 性能等级的更改应在每次启动时重新应用,请参阅 #Startup on boot 以自动化此过程。

电源配置

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

注意 电源配置的更改应在每次启动时重新应用,请参阅 #Startup on boot 以自动化此过程。

启用 GPU 显示缩放

本文档或本节可能是合并到 xrandr 的候选。

注意: 不特定于 AMDGPU。(在 Talk:AMDGPU#Moving "Enable GPU display scaling" to xrandr 中讨论)

要避免使用显示器内置的缩放器,而是使用 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 中描述的 highlow 性能等级。

更改内核版本也有助于消除此问题。例如,它似乎在 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=0x10amdgpu.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 时钟导致多种问题

本文或本章节的准确性存在争议。

原因
  • 用户提供的报告不可靠,且基于错误假设。请参阅 解释
  • 如果您仔细阅读了相关问题,问题似乎是由 GPU 功耗配置的内部设置引起的。这意味着着色器时钟频率不是真正的问题,降低它更像是一种解决方法,并且会降低性能。
  • 几个主要内核版本之前已经合并了解决该问题的补丁。
  • 如果您仍然遇到带有类似 dmesg 日志的崩溃,请考虑禁用 GFXOFF(参见 [20])。
(请在 Talk:AMDGPU 中讨论)

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 冻结问题

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 杂乱无章的漫谈,没有清晰的解释说明做了什么或为什么。未链接任何错误报告或论坛帖子。如果这是一个特定型号的问题,它应该记录在专用笔记本电脑页面上,例如 ASUS ROG Zephyrus G14 (2022) GA402。(请在 Talk:AMDGPU 中讨论)

例如,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-daemontuned 等省电应用程序已开始 启用 称为面板省电 (PPS) 的功能。

PPS 是笔记本电脑支持的一项功能,指示笔记本电脑的 GPU 为了节省电量而降低色彩准确度。然而,这会导致在上述 power-profiles-daemon 和 tuned 上选择更具侵略性的省电模式时,颜色会显得暗淡无光。因此,人们有兴趣完全禁用此功能。

可以通过将以下 内核参数 设置为零来完成。

amdgpu.abmlevel=0

系统空闲时冻结或重启

某些 PowerPlay 功能(例如 GFXOFF)的问题可能导致频繁且无法恢复的驱动程序崩溃 [24]。它们与多显示器设置下的空闲 GPU 使用率以及从睡眠模式唤醒时同时发生。

一个众所周知的解决方案是附加一个内核参数(如 #启动参数 中所述),该参数禁用 PP_GFXOFF_MASK,例如 amdgpu.ppfeaturemask=0xffff7fff - 这个参数保留了所有其他(已实现和未实现的)PowerPlay 功能。

替代解决方案依赖于禁用比 GFXOFF 更多的功能。

您可以创建自己的功能掩码,从 amdgpu.ppfeaturemask=0x 开始,后面跟一个使用 十六进制按位计算器 计算出的八字符掩码(包含示例)。掩码以 ffffffff(所有位都启用)开始,**异或** 要掩码的功能。您可以将更多功能“异或”到结果中。您可以跳过第一个非零字符之前的零:例如,0x8000 等同于 0x00008000。

确保在内核更新期间不会移除该参数。

HDMI 4K 限制在 120Hz

由于 许可问题mesa 驱动程序不支持 HDMI 2.1。您必须使用 DisplayPort。如果您的显示器不支持 DisplayPort,一些用户 报告使用转换器设备成功,这些设备接收 DisplayPort 输入并输出 HDMI 2.1 信号。

参见