AMDGPU
関連記事
AMDGPU は Graphics Core Next ファミリの AMD Radeon グラフィックカード向けのオープンソースグラフィックドライバです。
目次
- 1 適切なドライバーの選択
- 2 インストール
- 3 ロード
- 4 Xorg の設定
- 5 機能
- 6 トラブルシューティング
- 6.1 Xorg やアプリケーションが起動しない
- 6.2 スクリーンのアーティファクトと周波数の問題
- 6.3 R9 390 シリーズで悪いパフォーマンス/不安定
- 6.4 "[drm] IP block:gmc_v8_0 is hung!" カーネルエラーでフリーズ
- 6.5 カーソルの破損
- 6.6 Vega カード上でのゲーム中にシステムのフリーズ/クラッシュ
- 6.7 WebRenderer (Firefox) の破損
- 6.8 4K@60Hz のデバイスが接続されると音声の速度が2倍になる/音が高くなる/無音
- 6.9 ディスクリート amdgpu グラフィックカードにおける電源管理/動的再アクティブ化の問題
- 7 参照
適切なドライバーの選択
お持ちのカードに応じて、Xorg#AMD で適切なドライバーを見つけてください。今の所、Southern Islands (SI) から Arctic Islands (AI) カード向けの Xorg radeon ドライバサポートがあります。AMD には GCN 以前の GPU をサポートする計画はありません。 サポートされない GPU を持っているユーザはオープンソースの radeon ドライバを使用できます。
インストール
mesa パッケージをインストールしてください。3D アクセラレーションのための DRI ドライバーが含まれています。
- 32ビットアプリケーションのサポートに関しては、multilib リポジトリから lib32-mesa パッケージもインストールしてください。
- (Xorg での 2D アクセラレーションを提供する) DDX ドライバに関しては、xf86-video-amdgpu パッケージをインストールしてください。
- Vulkan のサポートに関しては、vulkan-radeon か amdvlk パッケージをインストールしてください。オプションで、32ビットアプリケーションのサポートのための lib32-vulkan-radeon か lib32-amdvlk パッケージをインストールしてください。wine/proton をつかって DirectX12 のゲームを実行する用途においては、vulkan-radeon を優先してください。amdvlk はその用途においては壊れているからです。
ビデオデコードのハードウェア支援のサポートは、VA-API に関しては libva-mesa-driver と lib32-libva-mesa-driver により提供されており、VDPAU に関しては mesa-vdpau と lib32-mesa-vdpau により提供されています。
実験的
一部のユーザーにとっては、 mesa のアップストリーム実験ビルドを使用して、標準の mesa パッケージに含まれていない AMD Navi の改善などの機能を有効にする価値があるかもしれません。
mesa-gitAUR パッケージをインストールします。これは 3D アクセラレーション用の DRI ドライバーを提供します。
- 32 ビットアプリケーションのサポートに関しては、mesa-git リポジトリ、または AUR から lib32-mesa-gitAUR もインストールしてください。
- (Xorg で 2D アクセラレーションを提供する) DDX ドライバに関しては、xf86-video-amdgpu-gitAUR パッケージをインストールしてください。
- 以下の mesa-git リポジトリを使用する Vulkan サポートに関しては、vulkan-radeon-git パッケージをインストールしてください。オプションで、32 ビットアプリケーションをサポートするために lib32-vulkan-radeon-git パッケージをインストールしてください。AUR から mesa-gitAUR をビルドする場合、これは必要ありません。
Southern Islands (SI) と Sea Islands (CIK) のサポートを有効化
linux パッケージは、Southern Islands(HD 7000 Series、SI、つまり GCN 1)と Sea Islands(HD 8000 Series、CIK、つまり GCN 2)のカードの AMDGPU サポートを有効にします。amdgpu
カーネルドライバは radeon より前にロードされる必要があります。どのカーネルドライバがロードされているかは lspci -k
で確認できます。以下のように出力されるはずです:
$ lspci -k | grep -A 4 -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 ドライバをロード
amdgpu
モジュールと radeon
モジュールの両方の モジュールパラメータ は cik_support=
と si_support=
です。
これらは、カーネルパラメータまたは modprobe 構成ファイルで設定する必要があり、カードの GCN バージョンによって異なります。
カーネルコマンドラインでモジュールパラメータを設定
次のいずれかのカーネルパラメータを設定してください:
- Southern Islands (SI):
radeon.si_support=0 amdgpu.si_support=1
- Sea Islands (CIK):
radeon.cik_support=0 amdgpu.cik_support=1
正しいモジュール順序を指定
amdgpu
が Mkinitcpio#MODULES 配列の最初のモジュールとして設定されていることを確認してください。
例えば MODULES=(amdgpu radeon)
modprobe.d でモジュールパラメータを設定
/etc/modprobe.d/
に構成 modprobe ファイルを作成します。構文の詳細については、 modprobe.d(5) を参照してください。
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
を config で設定する必要があります。
起動時の radeon のロードを完全に無効化
カーネルは、関連する特定のグラフィックチップに応じて radeon
を依然としてプローブ・ロードする場合がありますが、amdgpu
が期待通りに動作することを確認した後はこのモージュルをロードする必要はありません。それぞれのステップの間で再起動して、それが機能することを確認した後で次のステップに進んでください:
- カーネルコマンドラインの方法でモジュールパラメータを使い、
amdgpu
が期待通りに機能することを確認する MODULES=(amdgpu)
mkinitcpio の方法使う。ただし、radeon
をその設定に追加しない。- デスクトップにログインしたあとで、
modprobe -r radeon
が、対応するカーネルモジュールをきれいに削除することをテストする radeon
モジュールをブラックリスト化して、第2ステージの起動中にモジュールがカーネルによってプローブされないようにする:
/etc/modprobe.d/radeon.conf
blacklist radeon
これで、lsmod
と dmesg
は amdgpu ドライバのみがロードされていると出力するようになり、radeon が存在しないはずです。/sys/modules/radeon
ディレクトリも存在しないはずです。
ACO コンパイラ
ACO コンパイラはオープンソースのシェーダコンパイラで、LLVM コンパイラ や AMDVLK ドライバ、Windows 10 に直接対抗するために Valve Corporation によって作成・開発されました。LLVM と AMDVLK よりも短いコンパイル時間と、ゲーム中のより良いパフォーマンスを提供します。
いくつかのベンチマークは It's FOSS や Phoronix (1) (2) (3) で見られます。
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 "Device" Identifier "AMD" Driver "amdgpu" EndSection
このセクションを使って、ドライバーの設定を変更したり機能を有効にすることができます。ドライバオプションを設定する前に、まず amdgpu(4) を見てください。
TearFree レンダリング
TearFree は、ハードウェアのページめくりメカニズムを使用して、ティアリングを制御します。 このオプションが設定されている場合、プロパティのデフォルト値はそれに応じて オン または オフ になります。 このオプションが設定されていない場合、プロパティのデフォルト値は auto です。これは、回転出力、 RandR 変換が適用された出力、および RandR 1.4スレーブ出力の場合は TearFree がオンになり、それ以外の場合はオフになります。
Option "TearFree" "true"
xrandr を使用して TearFree を一時的に有効にすることもできます。
$ xrandr --output output --set TearFree on
output
は DisplayPort-0
または HDMI-A-0
のようになり、 xrandr-q
を実行して取得できます。
DRI レベル
DRI は、有効にする DRI の最大レベルを設定します。 有効な値は、DRI2 の場合は 2、 DRI3 の場合は 3 です。 Xorg バージョンが >= 1.18.3 の場合、 DRI3 のデフォルトは 3 です。それ以外の場合、 DRI2 が使用されます。
Option "DRI" "3"
可変リフレッシュレート
可変リフレッシュレート を参照してください。
10-bit カラー
新しい 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)
デフォルトの構成では、代わりに深さが24であり、24ビットが 4バイトに格納されていると表示されます。
10ビットが機能するかどうかを確認するには、 Xorg を実行している場合は終了し、 Xorg -retro
を実行して白黒のグリッドを表示し、 Ctrl-Alt-F1
と Ctrl-C
で X を終了し、 Xorg -depth 30 -retro
を実行します。 これが正常に機能する場合は、10ビットが機能しています。
startx
を介して10ビットで起動するには、 startx -- -depth30
を使用します。 永続的に有効にするには、以下を作成または追加します:
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "Screen" Identifier "asdf" DefaultDepth 30 EndSection
出力のレイテンシを減らす
レイテンシを最小化したい場合、ページフリッピングや TearFree を無効化することで可能です:
/etc/X11/xorg.conf.d/20-amdgpu.conf
Section "Device" Identifier "AMD" Driver "amdgpu" Option "EnablePageFlip" "off" Option "TearFree" "false" EndSection
連天使を更に減らしたい場合は en:Gaming#Reducing DRI latency を見てください。
機能
ビデオアクセラレーション
ハードウェアビデオアクセラレーション を見てください。
モニタリング
GPU の温度や P-state を確認したい場合に GPU のモニタリングはしばしば行われます。
CLI(デフォルト)
GPU の P-state を確認するには、以下を実行:
$ 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
radeontop ユーティリティを使えば、全体のアクティビティと個々のブロックの両方でGPU の使用率を表示できます。radeontop パッケージでインストールできます。ユーティリティが GPU を認識しない場合、radeontop-gitAUR を試してください。
GUI
- WattmanGTK — GPU の温度 P-state をモニタリングする GTK GUI ツール。
- TuxClocker — Qt5 のモニタリング・オーバークロックツール。
- AmdGuid — 完全に Rust で書かれた、基本的なファンコントロール GUI。
オーバークロック
Linux 4.17 以降、/sys/class/drm/card0/device/pp_od_clk_voltage
によりグラフィックカードのクロックと電圧を調整できます。
ブートパラメータ
amdgpu.ppfeaturemask=0xffffffff
カーネルパラメータ を追加して、sysfs でクロックと電圧を調整するアクセスをアンロックする必要があります。
手動(デフォルト)
例えば、Polaris GPU で GPU クロックを最大の P-state 7 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-state への切り替えを禁止することも可能です(例: チラツキやスタッタリングなどの深い省電力 P-state での問題を回避する)。Polaris RX 5xx カードで最も高い VRAM P-state を強制し、GPU 自体は低いクロックでの動作を許可するには:
# echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level # echo "2" > /sys/class/drm/card0/device/pp_dpm_mclk
上位3つの GPU P-state のみを許可するには:
# 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 以降、値を減らすことしかできず、増やすことはできませn。
アシスト付き
GPU を手動でオーバークロックしたくない場合、AMD GPU をオーバークロックしたりモニタリングしたりすることをアシストするツールがいくつかコミュニティによって提供されています。
CLI ツール
- amdgpu-clocks — AMD GPU のモニタリングやカスタムの P-state を設定するために使用できるスクリプト。起動時に自動的に設定を適用する systemd サービスもあります。
GUI ツール
- TuxClocker — Qt5 のモニタリング・オーバークロックツール
- CoreCtrl — アプリケーション毎のプロファイルをサポートする、WattMan ライクな UI の GUI オーバークロックツール。
ブート時のスタートアップ
起動時に設定を自動的に適用したい場合、起動時に設定を構成・適用することに関するこの 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: - - - - - -
特定の電源プロファイルを使用するには、まず 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 ディスプレイスケーリングを有効化
モニタのネイティブ解像度を使用しない場合、ディスプレイに内蔵されているスケーラを用いずに、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
トラブルシューティング
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 に設定すると問題/クラッシュを引き起こします。これを防ぐには、"screen" セクションに以下を追加して標準的なスクリーン色深度である 24 を使う必要があります:
/etc/X11/xorg.conf.d/10-screen.conf
Section "Screen" Identifier "Screen" DefaultDepth 24 SubSection "Display" Depth 24 EndSubSection EndSection
スクリーンのアーティファクトと周波数の問題
動的電源管理は、(60Hz以上の)高いリフレッシュレートでモニタを表示させた際にスクリーンのアーティファクトを発生させる場合があります。GPU のクロック速度の管理法に問題があるためです[1][2]。
回避策[3]は /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
の名前を判断するには以下を実行してください:
$ udevadm info --attribute-walk /sys/class/drm/card0 | grep "KERNEL="
GUI を用いる解決策もあります[4]: radeon-profile-gitAUR と radeon-profile-daemon-gitAUR で "power_dpm" を管理できます。
Chromium でアーティファクト
Chromium でアーティファクトが現れる場合、vulkan ベースのバックエンドの使用を強制してみてください。chrome://flags
を開き、#ignore-gpu-blacklist
と #enable-vulkan
を enable にしてください。
R9 390 シリーズで悪いパフォーマンス/不安定
AMD R9 390 シリーズのグラフィックカードで問題[5]が発生する場合、次のカーネルパラメータを設定して、radeon ではなく amdgpu ドライバの使用を強制してください: radeon.cik_support=0 radeon.si_support=0 amdgpu.cik_support=1 amdgpu.si_support=1 amdgpu.dc=1
これがうまく行かない場合、次のカーネルパラメータを設定して 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!" [6]、回避策は カーネルパラメータ amdgpu.vm_update_mode=3
を設定して GPUVM ページテーブルの更新を CPU を用いて行うように強制することです。デメリットはここにリストされています: [7]。
カーソルの破損
マウスカーソルが時々正しくレンダリングされない問題が発生する場合、/etc/X11/xorg.conf.d/20-amdgpu.conf
設定ファイルの "Device"
セクションに Option "SWCursor" "True"
を設定してください。
スケーリングに xrandr
を使用していて、カーソルがチラついたり消えたりする場合、TearFree
プロパティを設定することで修正できる場合があります: xrandr --output HDMI-A-0 --set TearFree on
。
Vega カード上でのゲーム中にシステムのフリーズ/クラッシュ
動的電源管理は、ゲーム中にシステムの完全なフリーズを発生させる場合があります。GPU のクロック速度の管理法に問題があるためです[8]。回避策は動的電源管理を無効化することです。詳細は ATI#動的電源管理 を見てください。
WebRenderer (Firefox) の破損
WebRenderer がユーザによって強制的に有効化されている場合、アーティファクトやその他の異常が発生する場合があります(例: 拡張機能のオプションを選択できないなど)。回避策は OpenGL コンポジットにフォールバックすることです。
4K@60Hz のデバイスが接続されると音声の速度が2倍になる/音が高くなる/無音
これは、AMDGPU デバイスと、HDMI で接続された 4K ディスプレイとの間の通信の問題により時々発生します。利用可能な回避策は、ディスプレイの組み込み設定から HDR か "Ultra HD Deep Color" を有効化することです。多くの Android ベースのテレビでは、これは "Optimal" ではなく "Standard" を設定することを意味します。
ディスクリート amdgpu グラフィックカードにおける電源管理/動的再アクティブ化の問題
[9] に似た問題が発生する場合、カーネルパラメータ amdgpu.runpm=0
を設定することでこの問題を回避できます。このカーネルパラメータは、dGPU が実行時に動的にオフになることを防止します。