PRIME

出自 ArchWiki

PRIME 是一种用于管理最新台式机和笔记本电脑上的混合图形的技术(NVIDIA Optimus,Radeon 的 AMD Dynamic Switchable Graphics)。PRIME GPU 卸载反向 PRIME 旨在支持 Linux 内核中的无多路复用器混合图形。

PRIME GPU 卸载

我们希望在更强大的显卡上渲染应用程序,并将结果发送到连接了显示器的显卡。

命令 xrandr --setprovideroffloadsink provider sink 可用于使渲染卸载提供程序将其输出发送到接收器提供程序(连接了显示器的提供程序)。提供程序和接收器标识符可以是数字 (0x7d, 0x56) 或区分大小写的名称 (Intel, radeon)。

注意: 当使用来自官方仓库的大多数默认 Xorg DDX(xf86-video-* 或内置 modesetting)驱动程序时,不再需要此设置,因为它们默认启用了 DRI3,因此将自动进行这些分配。再次显式设置它们也没有害处。

示例

$ xrandr --setprovideroffloadsink radeon Intel

您也可以使用提供程序索引而不是提供程序名称

$ xrandr --setprovideroffloadsink 1 0

此条目或章节需要改进语言、wiki 语法或风格。请参阅 Help:Style 以供参考。

原因: 以下子章节很混乱,我们命名了一个子章节 PRIME 渲染卸载,但没有说明它是以 NVIDIA 为中心的,我们将开源驱动程序的通用 PCI-E 电源管理塞入其中,来自 External GPU#Xorg rendered on iGPU, PRIME render offload to eGPU 的合并标志可能应该在另一个页面上解决,一旦清理完毕,我们可以链接到这里以获取要使用的环境变量。(在 Talk:PRIME 中讨论)

对于开源驱动 - PRIME

要为最需要它的应用程序(例如游戏、3D 建模器...)使用您的独立显卡,请在前面加上 DRI_PRIME=1 环境变量

$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Gallium 0.4 on AMD TURKS
注意: 除了数值之外,您还可以指定 PCI 设备名称。使用的格式类似于 /sys/bus/pci/devices/,但以 pci- 为前缀,并将分号和点替换为下划线,例如 DRI_PRIME=pci-0000_01_00_0

其他应用程序仍将使用功耗较低的集成显卡。这些设置在 X 服务器重启后将丢失,您可能需要创建一个脚本并在桌面环境启动时自动运行它(或者,将其放在 /etc/X11/xinit/xinitrc.d/ 中)。但这可能会缩短电池寿命并增加热量。

有关更多信息,请参阅 Gentoo:AMDGPU#Identifying_which_graphics_card_is_in_use

为了使 DRI_PRIME 在 Vulkan 应用程序上工作,需要安装 vulkan-mesa-layers,以及 32 位应用程序的 lib32-vulkan-mesa-layers

PRIME 渲染卸载

435.17 版本以来的 NVIDIA 驱动程序支持此方法。modesetting、xf86-video-amdgpu (450.57) 和 xf86-video-intel (455.38) 已被官方支持作为 iGPU 驱动程序。

要使用 NVIDIA 显卡运行程序,您可以使用 nvidia-prime 提供的 prime-run 脚本

$ prime-run glxinfo | grep "OpenGL renderer"
$ prime-run vulkaninfo

PCI-Express 运行时 D3 (RTD3) 电源管理

开源驱动

当不使用 PRIME 卸载或反向 PRIME 时,内核 PCI 电源管理会关闭 GPU。modesetting、xf86-video-amdgpuxf86-video-intelxf86-video-nouveau 驱动程序支持此功能。

以下命令可用于检查每个 GPU 的当前 [1] 电源状态

$ cat /sys/class/drm/card*/device/power_state
NVIDIA
注意
  • Ampere 通常不需要配置,因为默认情况下已启用。对于某些 Ampere 用户,可能需要 udev 规则。
  • 一些使用混合图形的用户报告说,在升级到较新的 NVIDIA 驱动程序(似乎 >525)[2] 后,他们的独立 NVIDIA Ampere GPU 无法保持在 D3Cold 电源状态。
  • 一些使用 pre-Ampere 显卡且较新驱动程序上 D3 支持损坏的用户报告了一个解决方法,即使用 NVreg_EnableGpuFirmware=0[3] 禁用 GSP 固件。

对于使用 Intel Coffee Lake 或更高版本 CPU 以及某些 Ryzen CPU(如 5800H)的 Turing 代显卡,可以在不使用时完全 关闭 GPU 电源

注意: 如果您计划使用挂起或休眠,请参阅 NVIDIA/技巧和窍门#挂起后保留显存

需要以下 udev 规则,这是 NVIDIA 推荐的

/etc/udev/rules.d/80-nvidia-pm.rules
# Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto"

# Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on"

一些用户还 报告 说,以下附加行也是必要的

/etc/udev/rules.d/80-nvidia-pm.rules
# Enable runtime PM for NVIDIA VGA/3D controller devices on adding device
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto"

另外,添加以下 模块参数

/etc/modprobe.d/nvidia-pm.conf
options nvidia "NVreg_DynamicPowerManagement=0x02"

或者,您可以安装 nvidia-prime-rtd3pmAUR,它提供了这两个配置文件。

在您手动或使用 AUR 软件包设置 udev 规则和 模块参数 后,您需要重启笔记本电脑。

要检查 NVIDIA GPU 是否已关闭,您可以使用此命令

$ cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status

您将看到 suspendedrunning,如果显示 suspended,则 GPU 已关闭。现在功耗将为 0 瓦,从而延长电池续航时间。

在某些情况下,例如 NVIDIA RTX A1000,可能不会列出上述任何选项,而是结果将为 active。仅凭这一点并不意味着 GPU 处于 running 状态。在这种情况下,您可以使用此命令检查状态

$ cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_suspended_time

当 GPU 处于 suspended 状态时,每次运行命令时计数器都会递增。当 GPU 的状态变为 running 时,它将停止递增。

如果您注意到 runtime_suspended_time 没有递增,您可以运行此命令检查 D3 状态。

$ cat /proc/driver/nvidia/gpus/0000:01:00.0/power

如果显示 Runtime D3 status: Not supported,您可能需要按照 此论坛帖子 中的步骤禁用。一位用户指出 禁用 GpuFirmware 仅适用于闭源驱动程序,而不适用于 nvidia-open

我们还需要 启用 nvidia-persistenced.service,以避免内核在 NVIDIA 设备资源不再使用时拆除设备状态。[4]

配置应用程序以使用 GPU 渲染

此条目或章节是与 External GPU#Xorg rendered on iGPU, PRIME render offload to eGPU 合并的候选条目。

注意: 目标章节提到了这些变量。或许这可以与目标章节合并,以避免重复?(在 Talk:PRIME 中讨论)

即使不启用动态电源管理,也需要应用程序的卸载渲染 [5]

要在启用动态电源管理的情况下将应用程序卸载到 NVIDIA GPU 上运行,请添加以下 环境变量[6]

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia command

Steam 游戏上使用时,可以将启动器命令行设置为

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%
注意: __NV_PRIME_RENDER_OFFLOAD 的值可能需要根据系统设置为 0。建议检查哪个 GPU 是 0,哪个是 1,因为此变量指定将使用哪个 GPU。

GNOME 集成

对于 GNOME 集成,安装 switcheroo-control启用 switcheroo-control.service

GNOME 将尊重 桌面条目 中的 PrefersNonDefaultGPU 属性。或者,您可以通过右键单击图标并选择使用独立显卡启动来使用 GPU 启动应用程序。

故障排除

如果您安装了 bumblebee,您应该将其删除,因为它会阻止加载 nvidia_drm 驱动程序,而 X 服务器需要该驱动程序才能进行卸载。

PRIME 同步

使用 PRIME 时,主 GPU 渲染屏幕内容/应用程序,并将其传递给辅助 GPU 进行显示。引用 NVIDIA 线程,“传统的垂直同步可以将应用程序的渲染与复制到系统内存同步,但是需要一个额外的机制来将复制到系统内存与 iGPU 的显示引擎同步。这种机制必须涉及 dGPU 和 iGPU 驱动程序之间的通信,这与传统的垂直同步不同。”

这种同步是使用 PRIME 同步实现的。要检查是否为您的显示器启用了 PRIME 同步,请检查 xrandr --prop 的输出。

要启用它,请运行

$ xrandr --output <output-name> --set "PRIME Synchronization" 1
注意

反向 PRIME

此条目或章节需要扩充。

原因: 缺少关于为开源和闭源 amdgpu 驱动程序配置 Intel + AMD 反向 prime 的信息(在 Talk:PRIME 中讨论)
注意
  • 在 470 beta 之前的 NVIDIA 驱动程序上,AMDGPU + NVIDIA 不支持反向 PRIME。有关更多详细信息,请参见 [7]
  • 当前,当仅启用外部显示器时,您将仅获得 1 FPS。有关更多详细信息,请参见 [8],但一种解决方法很可能是导出 “LIBGL_DRI3_DISABLE=true”

如果辅助 GPU 具有主 GPU 无法访问的输出,则可以使用反向 PRIME 来利用它们。这将涉及使用主 GPU 渲染图像,然后将其传递给辅助 GPU。

它可能会开箱即用,但是如果不是,请按照以下步骤操作。

配置

此条目或章节需要改进语言、wiki 语法或风格。请参阅 Help:Style 以供参考。

原因: 本节的前半部分是 Intel + NVIDIA,后半部分是 Intel + Radeon。识别 GPU 总线 ID 应委托给通用章节。(在 Talk:PRIME 中讨论)

首先,识别集成 GPU BusID

lspci -d ::03xx
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile)
01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)

在上面的示例中,Intel 显卡的 BusID 为 00:02.0,转换为 PCI:0:2:0。

按如下方式设置您的 xorg.conf 并调整 BusID。

/etc/X11/xorg.conf
Section "ServerLayout"
        Identifier "layout"
        Screen 0 "intel"
        Inactive "nvidia"
        Option "AllowNVIDIAGPUScreens"
EndSection

Section "Device"
        Identifier "nvidia"
        Driver "nvidia"
EndSection

Section "Screen"
        Identifier "nvidia"
        Device "nvidia"
EndSection

Section "Device"
        Identifier "intel"
        Driver "modesetting"
        BusID "PCI:0:2:0"
EndSection

Section "Screen"
        Identifier "intel"
        Device "intel"
EndSection

命令 xrandr --setprovideroutputsource provider source 将提供程序设置为源的输出。例如

$ xrandr --setprovideroutputsource radeon Intel

完成此操作后,独立显卡的输出应在 xrandr 中可用,您可以执行类似操作

$ xrandr --output HDMI-1 --auto --above LVDS1

以配置内部和外部显示器。

已知问题

如果在重启后只有一个提供程序,则可能是因为在 Xorg 启动时,nvidia 模块尚未加载。您需要启用早期模块加载。有关详细信息,请参见 NVIDIA#早期加载

故障排除

此条目或章节的事实准确性存在争议。

原因: 本节中没有来源来证明解决方法的合理性(在 Talk:PRIME 中讨论)

XRandR 仅指定 1 个输出提供程序

删除/移动 /etc/X11/xorg.conf 文件以及 /etc/X11/xorg.conf.d/ 中与 GPU 相关的任何其他文件。在此更改后重启 X 服务器。

如果视频驱动程序在 /etc/modprobe.d//usr/lib/modprobe.d/ 中被列入黑名单,请加载模块并重启 X。如果您使用 bbswitch 模块用于 NVIDIA GPU,则可能是这种情况。

另一个可能的问题是 Xorg 可能会尝试自动将监视器分配给您的第二张 GPU。检查日志

$ grep "No modes" ~/.local/share/xorg/Xorg.0.log
AMDGPU(0): No modes.

要解决此问题,请将带有非活动设备的 ServerLayout 部分添加到您的 xorg.conf 中

/etc/X11/xorg.conf
Section "ServerLayout"
  Identifier     "X.org Configured"
  Screen      0  "Screen0" 0 0 # Screen for your primary GPU
  Inactive       "Card1"       # Device for your second GPU
EndSection

当应用程序使用独立显卡渲染时,只渲染一个黑屏

在某些情况下,PRIME 需要合成管理器才能正常工作。如果您的窗口管理器不处理合成,则可以在其之上使用合成器

如果您使用 Xfce,您可以转到菜单 > 设置 > 窗口管理器微调 > 合成器并启用合成,然后再次尝试您的应用程序。

使用基于 GL 的合成器的黑屏

当前,基于 GL 的合成器和 PRIME 卸载存在问题。虽然基于 Xrender 的合成器(xcompmgr、xfwm、compton 的默认后端、cairo-compmgr 以及其他一些)可以正常工作,但基于 GL 的合成器(Mutter/muffin、Compiz、带有 GLX 后端的 compton、Kwin 的 OpenGL 后端等)最初将显示黑屏,就好像没有合成器运行一样。虽然您可以通过调整卸载窗口的大小来强制图像出现,但这并不是一个实用的解决方案,因为它不适用于全屏 Wine 应用程序等。这意味着 GNOME3 和 Cinnamon 等桌面环境在使用 PRIME 卸载时存在问题。

此外,如果您正在使用 Intel IGP,您可以通过将 IGP 作为 UXA 而不是 SNA 运行来修复 GL 合成问题,但这可能会导致卸载过程出现问题(即,xrandr --listproviders 可能不会列出独立 GPU)。

有关详细信息,请参见 FDO Bug #69101

解决此问题的另一种方法是在 Intel 驱动程序中启用 DRI3。有关示例配置,请参见以下问题。

GNOME

您可能会发现禁用全屏非直接允许 PRIME 卸载为全屏应用程序正常工作。

使用 PRIME 和切换窗口/工作区时内核崩溃/Oops

注意: 这已在具有 Intel+AMD 的系统上进行了测试

为集成显卡使用配置文件启用 DRI3 似乎可以解决此问题。

要启用 DRI3,您需要为集成显卡创建一个配置,添加 DRI3 选项

Section "Device"
    Identifier "Intel Graphics"
    Driver "intel"
    Option "DRI" "3"
EndSection

之后,您可以使用 DRI_PRIME=1,而无需运行 xrandr --setprovideroffloadsink radeon Intel,因为 DRI3 将负责卸载。

使用反向 PRIME 时,在第二台显示器上出现故障/重影同步问题

当不使用合成管理器时,例如使用 i3,此问题可能会影响用户。[9]

如果您在 Gnome 下遇到此问题,则可能的修复方法是在 /etc/environment 中设置一些环境变量 [10]

CLUTTER_PAINT=disable-clipped-redraws:disable-culling
CLUTTER_VBLANK=True

启动 GL 应用程序时出现错误 “radeon: Failed to allocate virtual address for buffer:”

当内核驱动程序中的电源管理运行时,会给出此错误。您可以通过将 radeon.runpm=0 附加到引导加载程序中的内核参数来克服此错误。

使用闭源驱动程序和反向 PRIME 时,Vulkan 应用程序/游戏持续卡顿/冻结

某些 Vulkan 应用程序(特别是使用 VK_PRESENT_MODE_FIFO_KHR 和/或 VK_PRESENT_MODE_FIFO_RELAXED_KHR 的应用程序,包括使用 DXVK 运行的 Windows 游戏)在运行于使用反向 PRIME 的系统上时,将导致 GPU 持续锁定(~5-10 秒冻结,~1 秒工作正常)[11]

GPU 锁定将导致任何输入都无法使用(包括切换 TTY 和使用 SysRq 功能)。

此 NVIDIA 错误尚无已知的修复方法,但存在一些解决方法

  • 关闭垂直同步(某些应用程序可能无法关闭)
  • 关闭 PRIME 同步[12](将引入画面撕裂)
xrandr --output HDMI-0 --set "PRIME Synchronization" 0 #replace HDMI-0 with your xrandr output ID

您可以通过运行来自 vulkan-tools 软件包的 vkcube 来验证您的配置是否受此问题影响。

某些程序在 Wayland 下打开时有延迟

如果您有 RTD3 工作(来自 #NVIDIA),当使用 Wayland 时,您会在程序打开时遇到一些延迟,这是因为它首先尝试打开 GPU 电源(这需要大约 1 秒或更长时间),然后它尝试打开程序,浪费时间和电池寿命。这是一个 NVIDIA 驱动程序问题。更多详情请点击此处

要解决此问题,请在您的 /etc/environment 文件中添加以下 2 行

/etc/environment
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
__GLX_VENDOR_LIBRARY_NAME=mesa

使用 DXVK 运行 Wine 游戏时出错

当使用 PRIME 卸载时,遇到 Major opcode of failed request: 156 (NV-GLX) 是一个已知问题。唯一已知的解决方法是在 完全在 NVIDIA GPU 上启动 X 会话。在仅 NVIDIA 和 PRIME 卸载方法之间切换的用户友好方法是 optimus-manager 实用程序,或者自己编写一些自动化脚本。

参见