AMDGPU

来自 Arch Linux 中文维基

AMDGPUGraphics Core Next 系列 AMD Radeon 图形卡的开源图形驱动程序。

选择正确的驱动[编辑 | 编辑源代码]

请根据您的显卡,参考Xorg#AMD选择合适的显卡驱动。目前驱动支持从 Southern Islands (SI) 到最新的显卡,而AMD没有计划支持 GCN 架构之前的显卡。如果您使用的是 AMD 不支持的显卡,可以选择使用开源的 ATI 驱动。

安装[编辑 | 编辑源代码]

安装这个mesa 软件包,它提供用于3D加速的DRI驱动程序。

想要开启硬件视频加速,可以安装libva-mesa-driverlib32-libva-mesa-driver软件包来支持 VA-API,安装mesa-vdpaulib32-mesa-vdpau软件包支持VDPAU。

实验版本[编辑 | 编辑源代码]

对于某些用户来说使用 mesa 的上游实验构建可能是值得的。

安装 mesa-gitAUR 软件包,它提供用于3D加速的DRI驱动程序。

  • 对于32位程序支持,请从 AUR 或者 mesa-git 仓库安装 lib32-mesa-gitAUR
  • 对于 DDX 驱动支持(可提供对Xorg的2D加速),安装xf86-video-amdgpu-gitAUR软件包。
  • 如果您使用 mesa-git 仓库并且要启用 Vulkan 支持,请安装 vulkan-radeon-git 软件包。可选安装 lib32-vulkan-radeon-git 来支持32位应用程序。如果您用的是来自 AUR 的 mesa-gitAUR 软件包,则不需要进行该操作。
提示:如果您不想用 mesa-gitAUR 编译安装驱动(很耗时),您也可以使用 mesa-git 这个非官方用户仓库

开启 Southern Islands (SI) 和 Sea Islands (CIK) 支持[编辑 | 编辑源代码]

linux 软件包 可以让 AMDGPU 支持 the Southern Islands(HD 7000 系列,也被称作SI,比如 GCN1)和 Sea Islands (HD 8000 系列,也被称作CIK,比如 GCN2)显卡。amdgpu 内核驱动程序需要在radeon之前加载。可以通过运行lspci -k来检查加载了哪个内核驱动程序。示例输出如下:

$ lspci -k | grep -A 3 -E "(VGA|3D)"
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

指定正确的模块加载顺序[编辑 | 编辑源代码]

当内核启用 AMDGPU 对 SI/CIK 显卡的支持时,radeon驱动可能会在amdgpu驱动之前加载。

确保amdgpuMkinitcpio#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 添加到 HOOKS 数组中在 /etc/mkinitcpio.confMkinitcpio#创建和启用镜像

编译支持 amdgpu 驱动的内核[编辑 | 编辑源代码]

在构建或者编译内核的时候,需要在配置中设置 CONFIG_DRM_AMDGPU_SI=Y 和/或者 CONFIG_DRM_AMDGPU_CIK=Y

在系统启动时候完全禁用 radeon 内核驱动模块[编辑 | 编辑源代码]

内核可能仍会根据涉及的具体图形芯片探测并加载 radeon 模块,但在确认 amdgpu 正常工作后,radeon 模块就不需要加载了。 在每个步骤之间重新启动以确认它在移动到下一步之前有效:

  1. 在内核命令行添加模块参数以确保 amdgpu 按预期工作,
  2. 使用 MODULES=(amdgpu) mkinitcpio 方法但不要将 radeon 添加到配置中,
  3. 在登录桌面后测试 modprobe -r radeon 命令确保能够在卸载 radeon 内核模块后不影响系统图形界面的运行,
  4. radeon 模块列入黑名单,以免在第二阶段启动期间被内核探测:
/etc/modprobe.d/radeon.conf
blacklist radeon

当上面的配置生效之后,命令 lsmoddmesg 的输出现在应该只会显示 amdgpu 驱动模块被加载的消息,不会存在 radeon 驱动模块的消息。系统中的 /sys/module/radeon 目录应该也不存在。如果存在,则说明配置没有生效,radeon 驱动模块仍然被系统加载了。

ACO编译器[编辑 | 编辑源代码]

ACO编译器 是一个由 Valve Corporation开发的开源着色器(shader)编译器,可直接与LLVM编译器AMDVLK 驱动程序以及Windows 10竞争。与 LLVM 和 AMDVLK 相比,它提供更短的编译时间,并且在玩游戏时表现更好。

一些基准性能测试可以在GitHub和 Phoronix (1) (2) (3)中看到。

mesa20.2版本开始, ACO是默认着色器编译器。

加载[编辑 | 编辑源代码]

应该会在系统启动时自动加载。

如果没有自动加载:

尽管驱动有可能自动加载,但是加载可能会发生在 X 服务器需要它的时间点之后。这种情况下请参考 内核级显示模式设置#KMS 早启动

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会被启用,其他情况下默认关闭。你可以通过指定truefalse来控制此配置保持启用/关闭:

Option "TearFree" "true"

DRI 级别[编辑 | 编辑源代码]

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

Option "DRI" "3"

可变刷新率[编辑 | 编辑源代码]

参考可变刷新率

10-bit 色深[编辑 | 编辑源代码]

警告: 当启用 10 位深度颜色时,许多应用程序可能会出现图形瑕疵或崩溃。尤其是 Steam,它因 X 错误而崩溃。

较新的 AMD 卡支持 10bpc 颜色,但默认为 24 位颜色,必须明确启用 30 位颜色。 如果应用程序也支持,启用它可以减少渐变中的可见条带/伪影。 要检查您的显示器是否支持它,请在您的 Xorg 日志文件中搜索“EDID”(例如 /var/log/Xorg.0.log~/ .local/share/xorg/Xorg.0.log):

[   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)

使用默认配置,log 会显示 depth 为 24,并且 24 位色彩存储在 4 个字节中。

要检查 10 bits色深是否工作,请退出 Xorg(如果它正在运行)并运行 Xorg -retro 这将显示黑白网格,然后按 Ctrl-Alt-F1 和 { {ic|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

降低输出延迟[编辑 | 编辑源代码]

如果您想最大程度地减少延迟,您可以禁用翻页(page fliping)和无撕裂(tear free):

/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "OutputClass"
     Identifier "AMD"
     MatchDriver "amdgpu"
     Driver "amdgpu"
     Option "EnablePageFlip" "off"
     Option "TearFree" "false"
EndSection

参考游戏#降低_DRI_延迟来降低显示延迟。

注意: 设置这些选项可能会导致出现撕裂和短暂的瑕疵。

特性[编辑 | 编辑源代码]

视频加速[编辑 | 编辑源代码]

参考硬件视频加速.

性能监控[编辑 | 编辑源代码]

GPU性能监控通常用于检查温度以及 GPU 的 P-states。

命令行界面[编辑 | 编辑源代码]

  • amdgpu_top — 显示AMDGPU使用率的工具
https://github.com/Umio-Yasuno/amdgpu_top || amdgpu_topAUR
  • nvtop — AMD、Intel 和 NVIDIA 的 GPU 进程监控
https://github.com/Syllo/nvtop || nvtop
  • radeontop — GPU 利用率查看器,包括总活动百分比和单个块
https://github.com/clbr/radeontop || radeontop

图形用户界面[编辑 | 编辑源代码]

  • amdgpu_top — 显示AMDGPU使用率的工具
https://github.com/Umio-Yasuno/amdgpu_top || amdgpu_topAUR
  • AmdGuid — 完全用Rust编写的一个基本的图形用户界面风扇控制工具
https://github.com/Eraden/amdgpud || amdguid-wayland-binAUR, amdguid-glow-binAUR
  • TuxClocker — Qt5监控和超频工具。
https://github.com/Lurkki14/tuxclocker || tuxclockerAUR


手动[编辑 | 编辑源代码]

检查GPU的P-states,执行:

$ 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

检查显存频率,执行:

$ cat /sys/class/drm/card0/device/pp_dpm_mclk

检查显存占用,执行:

$ cat /sys/class/drm/card0/device/mem_info_vram_used

检查显存大小,执行:

$ 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 位可能会(在将来的更新中)启用不稳定的功能,这些功能可能会导致屏幕闪烁或无法从挂起中恢复等问题。结合默认的 ppfeaturemask 设置 PP_OVERDRIVE_MASK 位 0x4000 应该就足够了。 要为系统计算一个合理的参数,可以执行:

$ 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功耗与发热控制内核文档。

可以为最大 P-state 7 设置 GPU 核心频率, 以 Polaris GPU 为例可以执行下面的命令设置为 1209MHz 频率和 900mV 电压:

# echo "s 7 1209 900" > /sys/class/drm/card0/device/pp_od_clk_voltage

同样的操作可以应用于 VRAM,例如 Polaris 5xx 系列卡上的最大 P-state 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-states 引起的闪烁、伪影和卡顿之类的问题,也可以禁止驱动程序切换到某些 P-states。要让显卡强制使用最高的 VRAM P-state,同时允许 GPU 本身以较低的频率运行,首先找到最高的可用P-state,然后设置:

# 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 pstates:

# 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 显卡。

命令行工具[编辑 | 编辑源代码]
  • amdgpu-clocks — 用于监控和设置 AMD GPU 自定义电源状态的脚本。它还提供了一个 Systemd 服务,可以在系统启动时自动置。
https://github.com/sibradzic/amdgpu-clocks || amdgpu-clocks-gitAUR
图形界面工具[编辑 | 编辑源代码]
  • TuxClocker — Qt5 监控和超频工具。
https://github.com/Lurkki14/tuxclocker || tuxclockerAUR
  • CoreCtrl — 一个 GUI 超频工具,具有类似 WattMan 的 UI,支持每个应用程序配置文件。
https://gitlab.com/corectrl/corectrl || corectrl
  • LACT — 一个GTK工具,可显示信息和控制你的AMD GPU。
https://github.com/ilya-zlobintsev/LACT || lactAUR

开机启动[编辑 | 编辑源代码]

如果希望设置在开机时自动应用,可以参考这个 Reddit 帖子来实现开机时自动配置和启用设定。

电源配置[编辑 | 编辑源代码]

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,要确保找到正确的路径。

要使用特定的电源配置文件,首先应该启用对它们的手动控制:

# 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
注意: 电源配置改动要在每次启动时重新配置,参考 #开机启动 来自动化该过程

启用 GPU 显示缩放[编辑 | 编辑源代码]

本文或本章节可能需要合并到xrandr

附注: 不特定于 AMDGPU。(在 Talk:AMDGPU#将 "启用 GPU 显示缩放" 移动到 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模块含有一些使用掩码的配置参数(modinfo amdgpu | grep mask),这些参数文档请参阅内核源码

Xorg 或应用程序无法启动[编辑 | 编辑源代码]

  • "(EE) AMDGPU(0): [DRI2] DRI2SwapBuffers: drawable has no back or front?" error after opening glxgears, can open Xorg server but OpenGL apps crash.
  • "(EE) AMDGPU(0): Given depth (32) is not supported by amdgpu driver" error, Xorg won't start.

在 Xorg 下将屏幕颜色深度设置为 16 或 32 会导致异常或崩溃。为避免这种情况,可以通过往配置的Screen区块添加设置来使用标准的 24 位屏幕颜色深度:

/etc/X11/xorg.conf.d/10-screen.conf
Section "Screen"
       Identifier     "Screen"
       DefaultDepth    24
       SubSection      "Display"
               Depth   24
       EndSubSection
EndSection

屏幕伪影和频率问题[编辑 | 编辑源代码]

由于 GPU 时钟速度的管理方式存在问题,动态电源管理 可能会在显示器运行高刷新率(120+hz)时导致屏幕伪影 .org/show_bug.cgi?id=96868[1]

一个规避的办法 [2] 是手动将 /sys/class/drm/card0/device/power_dpm_force_performance_level 设置为 highlow

要使设置持久化生效,可以创建一个 udev 规则:

/etc/udev/rules.d/30-amdgpu-pm.rules
KERNEL=="card0", SUBSYSTEM=="drm", DRIVERS=="amdgpu", ATTR{device/power_dpm_force_performance_level}="high"

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

原因: 命令总是返回/sys/class/drm/card0的结果card0(或者由于没有对于设备返回结果为空)。下面的命令意义是什么?(在 Talk:AMDGPU 中讨论)


执行下面的命令检查 KERNEL 参数名称:

$ udevadm info --attribute-walk /sys/class/drm/card0 | grep "KERNEL="

另一个图形界面的解决方案 [3]是用 radeon-profile-gitAURradeon-profile-daemon-gitAUR 来管理 power_dpm

Chromium 伪影[编辑 | 编辑源代码]

如果在使用 Chromium 时看到伪影,可以尝试强制使用基于 vulkan 的后端。在 chrome://flags启用 #ignore-gpu-blocklist#enable-vulkan

R9 390 系列性能不佳或不稳定[编辑 | 编辑源代码]

如果在使用 AMD R9 390 系列显卡时遇到问题 [4],可以在内核参数中设置radeon.cik_support=0 radeon.si_support=0 amdgpu .cik_support=1 amdgpu.si_support=1 amdgpu.dpm=1 amdgpu.dc=1 来强制使用 amdgpu 驱动模块而不是 radeon 驱动模块。

如果还不起作用,请尝试通过在内核参数中设置:radeon.cik_support=0 radeon.si_support=0 amdgpu.cik_support=1 amdgpu.si_support=1 来禁用动态电源管理(DPM)。

因内核错误"[drm] IP block:gmc_v8_0 is hung!"画面冻结[编辑 | 编辑源代码]

如果在执行 GPU 密集型任务期间遇到冻结和内核崩溃,并出现内核错误"[drm] IP block:gmc_v8_0 is hung!" [5]时,一个规避的方法是在内核参数中设置 amdgpu.vm_update_mode=3 来强制使用 CPU 完成 GPUVM 页面表更新。 这里列出了这个方法的缺点 [6]

光标损坏[编辑 | 编辑源代码]

这一章节正在考虑移除。

原因: 光标颜色/伽马值错误已经在6.5-rc6修复[7]。 (在 Talk:AMDGPU 讨论)


如果遇到鼠标光标有时无法正确显示的问题,可以在 /etc/X11/xorg.conf.d/20-amdgpu.conf 配置文件的 "OutputClass"" 部分设置 Option "SWCursor" "True"。Wayland下设置环境变量KWIN_FORCE_SW_CURSOR=1

如果在使用 xrandr 进行缩放时光标闪烁或消失,可以通过设置 TearFree 属性来修复它:xrandr --output HDMI-A-0 --set TearFree on

在KDE中遇到白屏或闪烁[编辑 | 编辑源代码]

当改变分辨率或连接外接显示器时屏幕出现闪烁或白屏,在内核参数中加入amdgpu.sg_display=0

在 Vega 显卡上玩游戏时系统冻结或崩溃[编辑 | 编辑源代码]

由于 GPU 核心频率的管理方式存在问题,使用显卡驱动的动态电源管理可能会导致系统在玩游戏时完全冻结。[8] 一个规避方法是禁用动态电源管理, 更多细节可以参考 ATI#动态电源管理

火狐浏览器 WebRenderer 损坏[编辑 | 编辑源代码]

当用户强制启用 WebRenderer 时,可能会出现伪影和其他异常(例如无法选择扩展选项)。解决方法是回退到 OpenGL 合成。

两倍速或花栗鼠(chipmunk)音频,或连接 4K@60Hz 设备时无音频[编辑 | 编辑源代码]

这有时是由 AMDGPU 设备和通过 HDMI 连接的 4K 显示器之间的通信问题引起的。一种可能的规避方法是通过显示器的内置设置启用 HDR 或“超高清深色”。在许多基于 Android 的电视上,这对应着将相关选项设置为“标准”(Standard)而不是“最佳”(Optimal)。

独立显卡的电源管理/动态重新激活问题[编辑 | 编辑源代码]

如果遇到内核驱动已经加载,但游戏时独立显卡不可用或在使用时独立显卡被禁用(类似于 [9]) 的问题,可以通过设置内核参数 amdgpu.runpm=0 来防止独显在运行时动态断电。

kfd: amdgpu: TOPAZ not supported in kfd[编辑 | 编辑源代码]

在系统日志或内核消息密钥环中打印危急级别的错误消息

kfd: amdgpu: TOPAZ not supported in kfd

如果没有使用 Radeon Open Compute 的计划,可以安全的忽略这个问题。因为旧显卡不支持 TOPAZ。[10] [11]

MCLK锁定在最大(1000MHz)或最小(96MHz)频率导致的高待机功耗或低游戏性能问题(6.4内核)[编辑 | 编辑源代码]

在高分辨率和刷新率的设置下,MCLK(vram,显存频率)可能会锁定在最高值(1000MHz)[12] [13] ,造成GPU待机功耗过高。使用Linux 6.4.x内核,MCLK锁定在最低频率(96MHz)影响游戏性能[14] [15]

这可能是因为显示器没有为受影响的分辨率和刷新率设置使用一个低V-Blank值的协调视频时序(Coordinated Video Timings, CVT),参考这篇内容来解决。

未能挂起(suspend)到内存[编辑 | 编辑源代码]

当系统进入S3状态后,amdgpu内核模块会尝试缓存显存数据到内存中,以避免显存不能充分刷新,显存中的数据老化导致数据丢失。

如果你使用了大量显存而空闲内存不足,这会导致挂起失败。因为IO子系统可能会在此之前挂起,不论是否有足够的swap空间该问题都可能发生。

你可能会看到类似的消息:

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]

通过一个用户空间服务可解决该问题,该服务能够在系统挂起前将足够的内存交换到SWAP,确保能够申请到足够的内存用以显存缓存。

关机和挂起(suspend)失败[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因: 缺少内核信息和bug报告 (在 Talk:AMDGPU 中讨论)

hid_sensor_*_3d这类内核模块能够造成系统在启动、关机和挂起时死锁。进程列表里将会显示了多个udev-worker实例,导致系统睡眠时冻结。

你会看到类似消息:

kernel: PM: suspend entry (deep)
kernel: Filesystems sync: 0.002 seconds
kernel: Freezing user space processes
kernel: Freezing user space processes failed after 20.004 seconds (1 tasks refusing to freeze, wq_busy=0):
kernel: task:(udev-worker)   state:D stack:0     pid:479   tgid:479   ppid:422    flags:0x00004006
kernel: Call Trace:
kernel:  <TASK>
kernel:  __schedule+0x3db/0x1520
kernel:  ? srso_alias_return_thunk+0x5/0xfbef5
kernel:  ? __wake_up_common+0x78/0xa0
kernel:  ? srso_alias_return_thunk+0x5/0xfbef5

要解决该问题,将有问题的模块添加到黑名单中,创建配置文件如/etc/modprobe.d/blacklist-hid_sensors.conf

blacklist hid_sensor_accel_3d
blacklist hid_sensor_gyro_3d
blacklist hid_sensor_magn_3d

参考资料[编辑 | 编辑源代码]