AMD GPU: Difference between revisions
CarlenWhite (talk | contribs) m Fix URL for zen patches (previous commits incorrectly signed) |
added table of GPU features |
||
Line 1: | Line 1: | ||
= | {| class="wikitable" | ||
|+ AMD GPU Series and Their Features | |||
|- | |||
! GPU Generation !! Series !! Architecture !! HIP Support !! Ray Tracing !! AI Acceleration !! Vulkan Support | |||
|- | |||
| Pre-GCN & Early GCN || Radeon HD 5000/6000/7000 Series || TeraScale/GCN 1.0 || No || No || No || No | |||
|- | |||
} | | GCN 2nd Gen (Sea Islands) || Radeon R7/R9 200 Series || GCN 2.0 || No || No || No || Vulkan 1.0 | ||
|- | |||
| GCN 3rd Gen (Volcanic Islands) || Radeon R9 300/Fury Series || GCN 3.0 || No || No || No || Vulkan 1.0 | |||
|- | |||
| GCN 4th Gen (Polaris) || Radeon RX 400/500 Series || GCN 4.0 || Yes (up to ROCm 5.6) || No || No || Vulkan 1.0 | |||
|- | |||
| GCN 5th Gen (Vega) || Radeon RX Vega Series || GCN 5.0 || Yes (up to ROCm 5.6) || No || No || Vulkan 1.1 | |||
|- | |||
| RDNA 1st Gen (Navi 1x) || Radeon RX 5000 Series || RDNA 1.0 || Yes || No || No || Vulkan 1.1 | |||
|- | |||
| RDNA 2nd Gen (Navi 2x) || Radeon RX 6000 Series || RDNA 2.0 || Yes || Yes || No || Vulkan 1.2 | |||
|- | |||
| RDNA 3rd Gen (Navi 3x) || Radeon RX 7000 Series || RDNA 3.0 || Yes || Yes || Yes || Vulkan 1.3 | |||
|} | |||
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 correct driver early == | |||
== | |||
The kernel can load the correct driver right away: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
boot. | boot.initrd.kernelModules = [ "amdgpu" ]; | ||
]; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== XServer == | |||
Make sure Xserver uses the `amdgpu` driver in your configuration.nix: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="nix"> | ||
services.xserver.enable = true; | |||
services.xserver.videoDrivers = [ "amdgpu" ]; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Enable Southern Islands (SI) and Sea Islands (CIK) support == | ||
The oldest architectures that AMDGPU supports are [https://en.wikipedia.org/wiki/Radeon_HD_7000_series Southern Islands (SI, i.e. GCN 1)] and [https://en.wikipedia.org/wiki/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"> | <syntaxhighlight lang="nix"> | ||
# | # for Southern Islands (SI i.e. GCN 1) cards | ||
boot.kernelParams = [ "radeon.si_support=0" "amdgpu.si_support=1" ]; | 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" ]; | boot.kernelParams = [ "radeon.cik_support=0" "amdgpu.cik_support=1" ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 96: | Line 54: | ||
Doing this is required to use [[#Vulkan|Vulkan]] on these cards, as the <code>radeon</code> driver doesn't support it. | 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: | Most software has the HIP libraries hard-coded. You can work around it on NixOS by using: | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
systemd.tmpfiles.rules = [ | |||
"L+ /opt/rocm/hip - - - - ${pkgs.rocmPackages.clr}" | |||
"L+ /opt/rocm - - - - ${ | |||
]; | ]; | ||
</syntaxhighlight> | |||
=== Blender === | |||
Hardware accelerated rendering can be achieved by using the package <syntaxhighlight lang="nix" inline>blender-hip</syntaxhighlight>. See the table for which cards support HIP (Polaris and above will support HIP). | |||
Hardware accelerated rendering can be achieved by using the package <syntaxhighlight lang="nix" inline | |||
== OpenCL == | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware. | hardware.opengl.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). | 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) === | <syntaxhighlight lang="nix"> | ||
As of [https://github.com/ROCm/ROCm/issues/1659 ROCm 4.5], AMD has disabled OpenCL on Polaris | environment.systemPackages = with pkgs; [ | ||
clinfo | |||
]; | |||
</syntaxhighlight> | |||
=== 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"> | ||
Line 137: | Line 94: | ||
</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 --> | <!-- 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 | 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 = | hardware.opengl.extraPackages = [ | ||
# NOTE: at some point GPUs in the R600-family and newer | |||
# NOTE: at some point GPUs in the R600 family and newer | |||
# may need to replace this with the "rusticl" ICD; | # may need to replace this with the "rusticl" ICD; | ||
# and GPUs in the R500-family and older may need to | # and GPUs in the R500-family and older may need to | ||
# pin the package version or backport | # pin the package version or backport/patch this back in | ||
# - https://www.phoronix.com/news/Mesa-Delete-Clover-Discussion | # - https://www.phoronix.com/news/Mesa-Delete-Clover-Discussion | ||
# - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19385 | # - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19385 | ||
pkgs.mesa.opencl | |||
]; | ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Installing `mesa.opencl` with `nix-shell` will not work; it needs to be configured at a higher level for the OpenCL ICD loader, which only searches fixed locations. | |||
If you have an AMD GPU from the GCN 1st Gen series or newer, [https://docs.mesa3d.org/rusticl.html Rusticl] should provide OpenCL support. | |||
Vulkan is already enabled by default (using Mesa RADV) on 64 bit applications. The settings to control it | |||
== Vulkan == | |||
Vulkan is already enabled by default (using Mesa RADV) on 64 bit applications. The settings to control it for 32 bit applications is: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.opengl.driSupport32Bit = true; # For 32 bit applications | hardware.opengl.driSupport32Bit = true; # For 32 bit applications | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== AMDVLK === | Soon this will be changed to | ||
<syntaxhighlight lang="nix"> | |||
hardware.graphics.enable32Bit = true; # For 32 bit applications | |||
</syntaxhighlight> | |||
=== AMDVLK === | |||
The AMDVLK drivers can be used in addition to the Mesa RADV drivers. The program will choose which one to use: | The AMDVLK drivers can be used in addition to the Mesa RADV drivers. The program will choose which one to use: | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.opengl.extraPackages = with pkgs; [ | hardware.opengl.extraPackages = with pkgs; [ | ||
amdvlk | amdvlk | ||
Line 194: | Line 146: | ||
More information can be found here: https://nixos.org/manual/nixos/unstable/index.html#sec-gpu-accel-vulkan | More information can be found here: https://nixos.org/manual/nixos/unstable/index.html#sec-gpu-accel-vulkan | ||
=== | == 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"> | <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> | </syntaxhighlight> | ||
[[Category:Video]] | [[Category:Video]] |