AMDGPU - Arch Linux 中文维基

跳至內容

# AMDGPU

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 AMDGPU，最近一次同步於 2025-01-22，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- ATI
- Xorg
- Vulkan
- AMDGPU PRO

AMDGPU 是 Graphics Core Next 系列 AMD Radeon 圖形卡的開源圖形驅動程序。

## 選擇正確的驅動

請根據您的顯卡，參考Xorg#AMD選擇合適的顯卡驅動。目前驅動支持從 Southern Islands（GCN 1，發布於2012年） 到最新的顯卡，而AMD沒有計劃支持 GCN 架構之前的顯卡。如果您使用的是 AMD 不支持的顯卡，可以選擇使用開源的 ATI 驅動。

## 安裝

安裝 mesa包 軟體包，它提供用於3D加速的DRI驅動程序和用於加速視頻解碼的 VA-API/VDPAU 驅動。

- 對於32位程序，請從 multilib 倉庫中安裝 lib32-mesa包 軟體包以獲得支持。
- 對於 DDX 驅動支持(可提供對 Xorg 的 2D 加速)，可以安裝 xf86-video-amdgpu包 軟體包。
- 對於 Vulkan 支持：
  - 安裝 vulkan-radeon包 驅動：儘管vulkan-driver 提供的第一個選擇不是它（因為可選按照字母順序排序）。
  - 對應安裝的原生驅動，可選擇性安裝 lib32-vulkan-radeon包 軟體包來獲得32位應用程式支持。

### 實驗版本

對於某些用戶來說使用 mesa 的上游實驗構建可能是值得的。

安裝 mesa-gitAUR 軟體包，它提供用於3D加速的DRI驅動程序。

- 對於32位程序支持，請從 AUR 或者 mesa-git 倉庫安裝 lib32-mesa-gitAUR
- 對於 DDX 驅動支持(可提供對 Xorg 的2D加速)，安裝 xf86-video-amdgpu-gitAUR軟體包。
- 如果您使用 mesa-git 倉庫並且要啟用 Vulkan 支持，請安裝 amdonly-gaming-vulkan-radeon-gitAUR 軟體包。可選安裝 lib32-amdonly-gaming-vulkan-radeon-gitAUR來支持32位應用程式。如果您用的是來自 AUR 的 mesa-gitAUR 軟體包，則不需要進行該操作。

提示：如果您不想用 mesa-gitAUR 編譯安裝驅動（很耗時），您也可以使用 mesa-git 這個非官方用戶倉庫

### 啟用 Southern Islands (SI) 和 Sea Islands (CIK) 支持

官方支持的內核啟用了 AMDGPU 驅動，支持 Southern Islands（GCN 1，發布於2012年）和 Sea Islands （GCN 2，發布於2013年）顯卡。`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 版本。

如果不確定您擁有的是哪個版本的顯卡，那麼也可以同時使用這兩個參數。

提示：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`驅動之前加載。

確保`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` 添加到 `HOOKS` 數組中在 `/etc/mkinitcpio.conf` 和 Mkinitcpio#創建和啟用鏡像。

#### 編譯支持 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

當上面的配置生效之後，命令 `lsmod` 和 `dmesg` 的輸出現在應該只會顯示 amdgpu 驅動模塊被加載的消息，不會存在 radeon 驅動模塊的消息。系統中的 `/sys/module/radeon` 目錄應該也不存在。如果存在，則說明配置沒有生效，radeon 驅動模塊仍然被系統加載了。

### ACO編譯器

ACO編譯器是一個由 Valve Corporation開發的開源著色器（shader）編譯器，可直接與 LLVM編譯器 以及 Windows 10 競爭。與 LLVM 相比，它提供更短的編譯時間，並且在玩遊戲時表現更好。

一些基準性能測試可以在 GitHub 和 Phoronix (1) (2) (3)中看到。

從 mesa包20.2 版本開始, ACO 是默認著色器編譯器。

## 加載

應該會在系統啟動時自動加載。

如果沒有自動加載:

- 如果需要的話，確保 #開啟 Southern Islands (SI) and Sea Islands (CIK) 支持。
- 確保你已經安裝最新的 linux-firmware包 軟體包。
- 確保你沒有將 `nomodeset` 或 `vga=` 作為內核參數，因為`amdgpu` 需要內核級顯示模式設置。
- 確保你沒有禁用 `amdgpu` 通過使用內核模塊黑名單。

儘管驅動有可能自動加載，但是加載可能會發生在 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會被啟用，其他情況下默認關閉。你可以通過指定`true`或`false`來控制此配置保持啟用/關閉：

    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_延遲來降低顯示延遲。

注意：設置這些選項可能會導致出現撕裂和短暫的瑕疵。

## 特性

### 視頻加速

參考硬體視頻加速#AMD/ATI.

### 性能監控

GPU性能監控通常用於檢查溫度以及 GPU 的 P-states。

#### 命令行界面

- amdgpu_top — 顯示AMDGPU使用率的工具

  https://github.com/Umio-Yasuno/amdgpu_top || amdgpu_top包

- 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

#### 開機自動修改

一種辦法是使用system的單元，如果希望設置在開機時自動應用修改，可以參考這個 Reddit 帖子來實現開機時自動配置和啟用設定。

另一種辦法是使用udev規則，例如要設置為低性能等級來延長續航：

    /etc/udev/rules.d/30-amdgpu-low-power.rules

    SUBSYSTEM=="pci", DRIVER=="amdgpu", ATTR{power_dpm_force_performance_level}="low"

### 性能等級

AMDGPU 提供了不同的性能等級，可以使用power_dpm_force_performance_level 調節，有下列參數可供選擇：

- auto: 驅動根據當前情況動態選擇最佳電源配置。
- low: 時鐘頻率強制設置為最低功耗狀態。
- high: 時鐘頻率強制設置為最高功耗狀態。
- manual: 用戶可以為不同的時鐘頻率區間手動調整功耗狀態（用於#電源配置）。
- 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，要確保找到正確的路徑。

要使用特定的電源配置文件，首先應該啟用對它們的手動控制：

    # 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` 設置為 `high` 或 `low`

要使設置持久化生效，可以創建一個 udev 規則：

    /etc/udev/rules.d/30-amdgpu-pm.rules

    KERNEL=="card0", SUBSYSTEM=="drm", DRIVERS=="amdgpu", ATTR{device/power_dpm_force_performance_level}="high"

執行下面的命令檢查 KERNEL 參數名稱：

     $ find /sys/class/drm/ -regextype awk -regex '.+/card[0-9]+' -printf '%f\n'

另一個圖形界面的解決方案 [3]是用 radeon-profile-gitAUR 和 radeon-profile-daemon-gitAUR 來管理 power_dpm。

更換內核版本也可能解決這個問題，該問題看起來已在6.12.9版本修復。

#### 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]。

### 屏幕閃爍或出現白/灰屏

當改變解析度或連接外接顯示器時屏幕出現閃爍或白屏，在內核參數中加入`amdgpu.sg_display=0`。

### 在 Vega 顯卡上玩遊戲時系統凍結或崩潰

由於 GPU 核心頻率的管理方式存在問題，使用顯卡驅動的動態電源管理可能會導致系統在玩遊戲時完全凍結。[7] 一個規避方法是禁用動態電源管理, 更多細節可以參考 ATI#動態電源管理。

### 火狐瀏覽器 WebRenderer 損壞

當用戶強制啟用 WebRenderer 時，可能會出現偽影和其他異常（例如無法選擇擴展選項）。解決方法是回退到 OpenGL 合成。

### 兩倍速或花栗鼠（chipmunk）音頻，或連接 4K@60Hz 設備時無音頻

這有時是由 AMDGPU 設備和通過 HDMI 連接的 4K 顯示器之間的通信問題引起的。一種可能的規避方法是通過顯示器的內置設置啟用 HDR 或「超高清深色」。在許多基於 Android 的電視上，這對應著將相關選項設置為「標準」（Standard）而不是「最佳」（Optimal）。

### 獨立顯卡的電源管理/動態重新激活問題

如果遇到內核驅動已經加載，但遊戲時獨立顯卡不可用或在使用時獨立顯卡被禁用（類似於 [8]） 的問題，可以通過設置內核參數 `amdgpu.runpm=0` 來防止獨顯在運行時動態斷電。

### kfd: amdgpu: TOPAZ not supported in kfd

在系統日誌或內核消息密鑰環中列印危急級別的錯誤消息

    kfd: amdgpu: TOPAZ not supported in kfd

如果沒有使用 Radeon Open Compute 的計劃，可以安全的忽略這個問題。因為舊顯卡不支持 TOPAZ。[9] [10]

### MCLK鎖定在最大（1000MHz）或最小（96MHz）頻率導致的高待機功耗或低遊戲性能問題（6.4內核）

在高解析度和刷新率的設置下，MCLK（vram，顯存頻率）可能會鎖定在最高值（1000MHz）[11] [12] ，造成GPU待機功耗過高。使用Linux 6.4.x內核，MCLK鎖定在最低頻率（96MHz）影響遊戲性能[13] [14]。

這可能是因為顯示器沒有為受影響的解析度和刷新率設置使用一個低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

## 參考資料

- Gentoo:AMDGPU

分類：​

- 圖形
- X 伺服器

隱藏分類：​

- 使用「模板:合併」標記的頁面或章節

AMDGPU
新增話題