PRIME
PRIME 是一种用于管理最新台式机和笔记本电脑上的混合图形的技术(NVIDIA Optimus,Radeon 的 AMD Dynamic Switchable Graphics)。PRIME GPU 卸载和反向 PRIME 旨在支持 Linux 内核中的无多路复用器混合图形。
PRIME GPU 卸载
我们希望在更强大的显卡上渲染应用程序,并将结果发送到连接了显示器的显卡。
命令 xrandr --setprovideroffloadsink provider sink
可用于使渲染卸载提供程序将其输出发送到接收器提供程序(连接了显示器的提供程序)。提供程序和接收器标识符可以是数字 (0x7d, 0x56) 或区分大小写的名称 (Intel, radeon)。
xf86-video-*
或内置 modesetting)驱动程序时,不再需要此设置,因为它们默认启用了 DRI3,因此将自动进行这些分配。再次显式设置它们也没有害处。示例
$ xrandr --setprovideroffloadsink radeon Intel
您也可以使用提供程序索引而不是提供程序名称
$ xrandr --setprovideroffloadsink 1 0
对于开源驱动 - PRIME
要为最需要它的应用程序(例如游戏、3D 建模器...)使用您的独立显卡,请在前面加上 DRI_PRIME=1
环境变量
$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Gallium 0.4 on AMD TURKS
/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-amdgpu、xf86-video-intel、xf86-video-nouveau 驱动程序支持此功能。
以下命令可用于检查每个 GPU 的当前 [1] 电源状态
$ cat /sys/class/drm/card*/device/power_state
NVIDIA
对于使用 Intel Coffee Lake 或更高版本 CPU 以及某些 Ryzen CPU(如 5800H)的 Turing 代显卡,可以在不使用时完全 关闭 GPU 电源。
需要以下 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
您将看到 suspended
或 running
,如果显示 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 渲染
即使不启用动态电源管理,也需要应用程序的卸载渲染 [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
- 使用 NVIDIA 驱动程序进行 PRIME 同步的先决条件是 启用 modesetting。
- PRIME 同步在 AMDGPU DDX 驱动程序 (xf86-video-amdgpu) 中不可用。
反向 PRIME
如果辅助 GPU 具有主 GPU 无法访问的输出,则可以使用反向 PRIME 来利用它们。这将涉及使用主 GPU 渲染图像,然后将其传递给辅助 GPU。
它可能会开箱即用,但是如果不是,请按照以下步骤操作。
配置
首先,识别集成 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#早期加载。
故障排除
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
为集成显卡使用配置文件启用 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 实用程序,或者自己编写一些自动化脚本。