AMD GPU: Difference between revisions
imported>Artturin clarify amdvlk |
m Added performance issues with AMDVLK |
||
(45 intermediate revisions by 26 users not shown) | |||
Line 1: | Line 1: | ||
This guide is about setting up NixOS to correctly use your | This guide is about setting up NixOS to correctly use your AMD Graphics card if it is relatively new (aka, after the GCN architecture). | ||
== Make the kernel use the | == Basic Setup == | ||
For ordinary desktop / gaming usage, AMD GPUs are expected to work out of the box. As with any desktop configuration though, graphics acceleration does need to be enabled. | |||
<syntaxhighlight lang="nix"> | |||
hardware.graphics = { | |||
enable = true; | |||
enable32Bit = true; | |||
}; | |||
</syntaxhighlight> | |||
== Problems == | |||
=== Dual Monitors === | |||
If you encounter problems having multiple monitors connected to your GPU, adding `video` parameters for each connector to the kernel command line sometimes helps. | |||
For example: | |||
<syntaxhighlight lang="nix"> | |||
boot.kernelParams = [ | |||
"video=DP-1:2560x1440@144" | |||
"video=DP-2:2560x1440@144" | |||
]; | |||
</syntaxhighlight> | |||
With the connector names (like `DP-1`), the resolution and frame rate adjusted accordingly. | |||
To figure out the connector names, execute the following command while your monitors are connected: | |||
<syntaxhighlight lang="bash"> | |||
head /sys/class/drm/*/status | |||
</syntaxhighlight> | |||
=== System Hang with Vega Graphics (and select GPUs) === | |||
Currently on the latest kernel/mesa (currently 6.13 and 24.3.4 respectively), Vega integrated graphics (and other GPUs like the RX 6600<ref>https://bbs.archlinux.org/viewtopic.php?pid=2224147#p2224147</ref>) will have a possibility to hang due to context-switching between Graphics and Compute.<ref>https://bbs.archlinux.org/viewtopic.php?id=301798</ref> There are currently two sets of patches to choose between stability or speed that can be applied: [https://github.com/SeryogaBrigada/linux/commits/v6.13-amdgpu amdgpu-stable] and [https://github.com/SeryogaBrigada/linux/commits/v6.13-amdgpu-testing amdgpu-testing]. | |||
See [[Linux Kernel#Patching a single In-tree kernel module]], keep in mind how to make [https://stackoverflow.com/a/23525893 patch diffs from commits from GitHub], and consider this example configuration:<syntaxhighlight lang="nix"> | |||
{ config, pkgs, ... }: | |||
let | |||
amdgpu-kernel-module = pkgs.callPackage ./packages/amdgpu-kernel-module.nix { | |||
# Make sure the module targets the same kernel as your system is using. | |||
kernel = config.boot.kernelPackages.kernel; | |||
}; | |||
# linuxPackages_latest 6.13 (or linuxPackages_zen 6.13) | |||
amdgpu-stability-patch = pkgs.fetchpatch { | |||
name = "amdgpu-stability-patch"; | |||
url = "https://github.com/torvalds/linux/compare/ffd294d346d185b70e28b1a28abe367bbfe53c04...SeryogaBrigada:linux:4c55a12d64d769f925ef049dd6a92166f7841453.diff"; | |||
hash = "sha256-q/gWUPmKHFBHp7V15BW4ixfUn1kaeJhgDs0okeOGG9c="; | |||
}; | |||
/* | |||
# linuxPackages_zen 6.12 | |||
amdgpu-stability-patch = pkgs.fetchpatch { | |||
name = "amdgpu-stability-patch-zen"; | |||
url = "https://github.com/zen-kernel/zen-kernel/compare/fd00d197bb0a82b25e28d26d4937f917969012aa...WhiteHusky:zen-kernel:f4c32ca166ad55d7e2bbf9adf121113500f3b42b.diff"; | |||
hash = "sha256-bMT5OqBCyILwspWJyZk0j0c8gbxtcsEI53cQMbhbkL8="; | |||
}; | |||
*/ | |||
in | |||
{ | |||
# amdgpu instability with context switching between compute and graphics | |||
# https://bbs.archlinux.org/viewtopic.php?id=301798 | |||
# side-effects: plymouth fails to show at boot, but does not interfere with booting | |||
boot.extraModulePackages = [ | |||
(amdgpu-kernel-module.overrideAttrs (_: { | |||
patches = [ | |||
amdgpu-stability-patch | |||
]; | |||
})) | |||
]; | |||
} | |||
</syntaxhighlight> | |||
=== Sporadic Crashes === | |||
If getting error messages in <code>dmesg</code> with <code>page fault</code> or <code>GCVM_L2_PROTECTION_FAULT_STATUS</code> it might be from AMD GPU boosting too high without enough voltage | |||
Use a tool like LACT to increase power usage limit to 15%, undervolt by moderate amount (e.g. -50mV for 7900 XTX) and optionally decrease maximum GPU clock. | |||
* https://wiki.gentoo.org/wiki/AMDGPU#Frequent_and_Sporadic_Crashes | |||
* https://gitlab.freedesktop.org/mesa/mesa/-/issues/11532 | |||
* https://gitlab.freedesktop.org/drm/amd/-/issues/3067 | |||
== Special Configuration == | |||
The following configurations are only required if you have a specific reason for needing them. They are not expected to be necessary for a typical desktop / gaming setup. | |||
=== Enable Southern Islands (SI) and Sea Islands (CIK) support === | |||
The oldest architectures that AMDGPU supports are [[wikipedia:Radeon_HD_7000_series|Southern Islands (SI, i.e. GCN 1)]] and [[wikipedia:Radeon_HD_8000_series|Sea Islands (CIK, i.e. GCN 2)]], but support for them is disabled by default. To use AMDGPU instead of the <code>radeon</code> driver, you can set the kernel parameters: | |||
<syntaxhighlight lang="nix"> | |||
# For Southern Islands (SI i.e. GCN 1) cards | |||
boot.kernelParams = [ "radeon.si_support=0" "amdgpu.si_support=1" ]; | |||
# For Sea Islands (CIK i.e. GCN 2) cards | |||
boot.kernelParams = [ "radeon.cik_support=0" "amdgpu.cik_support=1" ]; | |||
</syntaxhighlight> | |||
Doing this is required to use [[#Vulkan|Vulkan]] on these cards, as the <code>radeon</code> driver doesn't support it. | |||
=== HIP === | |||
Most software has the HIP libraries hard-coded. You can work around it on NixOS by using: | |||
<syntaxhighlight lang="nix"> | |||
systemd.tmpfiles.rules = | |||
let | |||
rocmEnv = pkgs.symlinkJoin { | |||
name = "rocm-combined"; | |||
paths = with pkgs.rocmPackages; [ | |||
rocblas | |||
hipblas | |||
clr | |||
]; | |||
}; | |||
in [ | |||
"L+ /opt/rocm - - - - ${rocmEnv}" | |||
]; | |||
</syntaxhighlight> | |||
==== Blender ==== | |||
Hardware accelerated rendering can be achieved by using the package <syntaxhighlight lang="nix" inline="">blender-hip</syntaxhighlight>. | |||
Currently, you need to [[Linux kernel|use the latest kernel]] for <syntaxhighlight lang="nix" inline="">blender-hip</syntaxhighlight> to work. | |||
=== OpenCL === | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.graphics.extraPackages = with pkgs; [ rocmPackages.clr.icd ]; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
You should also install the <code>clinfo</code> package to verify that OpenCL is correctly setup (or check in the program you use to see if it is now available, such as in Darktable). | |||
==== Radeon 500 series (aka Polaris) ==== | |||
As of [https://github.com/ROCm/ROCm/issues/1659 ROCm 4.5], AMD has disabled OpenCL on Polaris-based cards. This can be re-enabled by setting the environment variable <code>ROC_ENABLE_PRE_VEGA=1</code> | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
environment.variables = { | |||
ROC_ENABLE_PRE_VEGA = "1"; | |||
}; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Older GPUs (TeraScale) ==== | |||
<!-- FIXME this should be moved to a dedicated page for the "radeon" driver or OpenCL, if either of those are created at some point in the future --> | |||
For graphics cards older than GCN 1 — or for any GCN using the "radeon" driver — enable OpenCL by adding Clover ''instead of'' the ROCm ICD: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.opengl.extraPackages = with pkgs; [ | hardware.opengl.extraPackages = with pkgs; [ | ||
# OpenCL support for the older Radeon R300, R400, R500, | |||
# R600, R700, Evergreen, Northern Islands, | |||
# Southern Islands (radeon), and Sea Islands (radeon) | |||
# GPU families | |||
mesa.opencl | |||
# NOTE: at some point GPUs in the R600 family and newer | |||
# may need to replace this with the "rusticl" ICD; | |||
# and GPUs in the R500-family and older may need to | |||
# pin the package version or backport Clover | |||
# - https://www.phoronix.com/news/Mesa-Delete-Clover-Discussion | |||
# - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19385 | |||
]; | ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Merely installing <code>mesa.opencl</code> with <code>nix-shell -p</code> will not work; it needs to be present at build-time for the OpenCL ICD loader, which only searches static paths. | |||
== Vulkan == | === Vulkan === | ||
Vulkan is already enabled by default (using Mesa RADV) on 64 bit applications. The settings to control it are: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.opengl.driSupport = true; | hardware.opengl.driSupport = true; # This is already enabled by default | ||
# | hardware.opengl.driSupport32Bit = true; # For 32 bit applications | ||
hardware.opengl.driSupport32Bit = true; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
==== AMDVLK ==== | |||
The AMDVLK drivers can be used in addition to the Mesa RADV drivers. The program will choose which one to use: | |||
<syntaxhighlight lang="nix"> | |||
#24.11 | |||
hardware.graphics.extraPackages = with pkgs; [ | |||
amdvlk | |||
]; | |||
# For 32 bit applications | |||
hardware.graphics.extraPackages32 = with pkgs; [ | |||
driversi686Linux.amdvlk | |||
]; | |||
#24.05 and below | |||
hardware.opengl.extraPackages = with pkgs; [ | hardware.opengl.extraPackages = with pkgs; [ | ||
amdvlk | |||
]; | ]; | ||
# For 32 bit applications | # For 32 bit applications | ||
hardware.opengl.extraPackages32 = with pkgs; [ | hardware.opengl.extraPackages32 = with pkgs; [ | ||
driversi686Linux.amdvlk | driversi686Linux.amdvlk | ||
]; | ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
More information can be found here: https://nixos.org/manual/nixos/unstable/index.html#sec-gpu-accel-vulkan | |||
===== Performance Issues with AMDVLK ===== | |||
Some games choose AMDVLK over RADV, which can cause noticeable performance issues (e.g. <50% less FPS in games) | |||
To force RADV<syntaxhighlight lang="nix"> | |||
environment.variables.AMD_VULKAN_ICD = "RADV"; | |||
</syntaxhighlight> | |||
=== GUI tools === | |||
==== LACT - Linux AMDGPU Controller ==== | |||
This application allows you to overclock, undervolt, set fans curves of AMD GPUs on a Linux system. | |||
In order to install the daemon service you need to add the package to <code>systemd.packages</code>. Also the <code>wantedBy</code> field should be set to <code>multi-user.target</code> to start the service during boot. | |||
<syntaxhighlight lang="nix"> | |||
environment.systemPackages = with pkgs; [ lact ]; | |||
systemd.packages = with pkgs; [ lact ]; | |||
systemd.services.lactd.wantedBy = ["multi-user.target"]; | |||
</syntaxhighlight> | |||
=== Links === | |||
* https://wiki.archlinux.org/title/AMDGPU | |||
* https://wiki.gentoo.org/wiki/AMDGPU | |||
=== References === | |||
[[Category:Video]] | [[Category:Video]] |