跳转至内容

NVIDIA Optimus

来自 ArchWiki

本文章或章节需要扩充。

原因
  • 明确哪些是 X 相关的功能,哪些适用于 Wayland。
  • 移除剩余的“Intel”称呼,改用“集成显卡”:Optimus 也适用于 AMD 集成显卡。
(在 Talk:NVIDIA Optimus 中讨论)

NVIDIA Optimus 是一项允许笔记本电脑内置集成 GPU 和独立 NVIDIA GPU 并对其进行访问的技术。作为前提,请为两块显卡安装相应的 GPU 驱动程序

可用方法

有几种可用方法:

  • #仅使用集成显卡 - 节省电量,因为 NVIDIA GPU 将被完全断电。
  • #仅使用 NVIDIA 显卡 - 比集成显卡性能更强,但耗电量更大(对于移动设备来说并不理想)。该方法利用了与 optimus-managernvidia-xrun 相同的底层流程,应在选择自动化方案前用于故障排查和验证常规功能。
  • 同时使用(需要时使用 NVIDIA GPU,不使用时保持断电以省电):
    • #使用 PRIME 渲染卸载 - NVIDIA 官方支持的方法。
    • #使用 switcheroo-control - 类似于 PRIME 渲染卸载,但具备桌面环境集成,并且也适用于 AMD 和 Intel GPU。允许应用程序在 桌面项 文件中指定是否优先使用独立显卡,并允许你通过右键菜单手动在独立显卡上运行任何应用程序。
    • #使用 optimus-manager - 通过单个命令切换显卡(需注销并重新登录生效)。也支持通过 PRIME 渲染卸载实现混合模式。它能使 NVIDIA GPU 发挥最大性能,并在不使用时将其关闭。从 1.4 版本开始,也支持 AMD+NVIDIA 组合。
    • #使用 nvidia-xrun - 在不同的 TTY 上使用 NVIDIA 显卡运行单独的 X 会话。它能使 NVIDIA GPU 发挥最大性能,并在不使用时将其关闭。
    • #使用 Bumblebee - 提供类似 Windows 的功能,允许在运行其他程序时选择性地使用 NVIDIA 显卡运行特定应用程序。存在严重的性能问题。
    • #使用 nouveau - 性能较差(相比 NVIDIA 官方驱动),可能会导致休眠和睡眠问题。不支持最新的 NVIDIA GPU。
    • #使用 EnvyControl - 类似于 optimus-manager,但不需要复杂的配置,不需要后台驻留守护进程,如果你是 GNOME 用户,也不需要安装修补过的 GDM 版本。
    • #使用 NVidia-eXec - 类似于 Bumblebee,但没有性能损失。它同时支持 Xorg 和 Wayland。该软件包尚处于实验阶段,目前仅在 GNOME/GDM 环境下进行测试。
    • #使用 nvidia-switch - 类似于 nvidia-xrun,但无需切换 TTY,切换过程通过显示管理器的注销和登录完成。该软件包正在 Debian 系统上测试,但与 nvidia-xrun 一样,它应该能适用于所有 Linux 系统。
注意 所有这些选项都是互斥的。如果你测试了一种方法并决定尝试另一种,在进行新方法前,必须确保撤销之前方案所做的任何配置更改,否则可能会导致文件冲突和未定义的行为。

仅使用集成显卡

如果你只想使用特定的 GPU 而不进行切换,请检查系统 BIOS 中的选项。应该有一个可以禁用其中一张卡的选项。有些笔记本电脑只允许禁用独立显卡,或者反之,但如果你计划只使用其中一张卡,这值得一试。

如果 BIOS 不允许禁用 Nvidia 显卡,你可以从 Linux 内核本身禁用它。请参阅 Hybrid graphics#Fully power down discrete GPU

在不切换渲染提供程序的情况下使用 CUDA

你可以在不将渲染切换到 Nvidia 显卡的情况下使用 CUDA。你只需要确保在启动 CUDA 应用程序之前 Nvidia 显卡已通电,详细信息请参见 Hybrid graphics#Fully power down discrete GPU

现在,当你启动 CUDA 应用程序时,它会自动加载所有必要的内核模块。在使用 CUDA 后关闭 Nvidia 显卡之前,必须先卸载 nvidia 内核模块。

# rmmod nvidia_uvm
# rmmod nvidia

仅使用 NVIDIA 显卡

可以将专有的 NVIDIA 驱动程序配置为主要渲染提供程序。除非通过启用 NVIDIA#DRM kernel mode setting 来启用 prime sync,否则它会有明显的屏幕撕裂问题,详见 [1]。它确实允许使用独立 GPU,并且(截至 2017 年 1 月)在性能上比 nouveau 驱动有显著优势。

首先,安装 NVIDIA 驱动程序和 xorg-xrandr。然后,配置 /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf,其选项将与软件包提供的 /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf 合并,以提供与此设置的兼容性。

注意 在某些配置中,此设置会破坏 nvidia 驱动程序通过 EDID 文件自动检测显示器值的功能。作为临时解决方案,请参阅 #Resolution, screen scan wrong. EDID errors in Xorg.log
/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection

接下来,将以下两行添加到 ~/.xinitrc 的开头

~/.xinitrc
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

现在重启以加载驱动程序,X 应该会启动。

如果你的显示器 DPI 不正确,请添加以下行

xrandr --dpi 96

如果在启动 X 时出现黑屏,请确保 ~/.xinitrc 中的两个 xrandr 命令后面没有“与”符号(&)。如果有,窗口管理器可能会在 xrandr 命令完成执行前就启动,从而导致黑屏。

显示管理器

如果你使用的是 显示管理器,则需要为你的显示管理器创建或编辑显示设置脚本,而不是使用 ~/.xinitrc

LightDM

对于 LightDM 显示管理器

/etc/lightdm/display_setup.sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

使脚本可执行

现在通过编辑 /etc/lightdm/lightdm.conf 中的 [Seat:*] 部分来配置 lightdm 以运行该脚本

/etc/lightdm/lightdm.conf
[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

重启后,你的显示管理器应该会启动。

SDDM

对于 SDDM 显示管理器(SDDM 是 KDE 的默认 DM)

/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM

对于 GDM 显示管理器,请创建两个新的 .desktop 文件

/usr/share/gdm/greeter/autostart/optimus.desktop
/etc/xdg/autostart/optimus.desktop
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

确保 GDM 使用 X 作为默认后端

检查 3D 功能

你可以通过安装 mesa-utils 并运行以下命令来检查是否正在使用 NVIDIA 显卡

$ glxinfo | grep NVIDIA

更多信息

更多信息,请查看 NVIDIA 关于该主题的官方页面 [2]

使用双显卡切换

使用 PRIME 渲染卸载

这是 NVIDIA 支持双显卡切换的官方方法。

详见 PRIME#PRIME render offload

使用 switcheroo-control

详见 PRIME#Desktop environment integration

使用 optimus-manager

详见 Optimus-manager 上游文档。它涵盖了 Arch Linux 系统中的安装和配置。

使用 nvidia-xrun

详见 nvidia-xrun

使用 Bumblebee

详见 Bumblebee

使用 nouveau

显卡切换请参阅 PRIME,开源 NVIDIA 驱动程序请参阅 nouveau

使用 EnvyControl

详见 EnvyControl 上游文档,涵盖了安装和使用说明。

使用 NVidia-eXec

详见 NVidia-eXec 上游文档,涵盖了安装和使用说明。

使用 nvidia-switch

详见 nvidia-switch 上游文档,涵盖了安装和使用说明。

故障排除

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 如果不指定每个子章节具体使用的是哪种解决方案(仅集成显卡、仅 NVIDIA 显卡或双显卡切换),本节将毫无意义。如果是 #使用双显卡切换,故障排查应归属于对应的链接页面。(在 Talk:NVIDIA Optimus 中讨论)

画面撕裂/垂直同步失效

启用 DRM kernel mode setting,这将启用 PRIME 同步并修复画面撕裂。

你可以阅读官方 论坛帖子 获取详细信息。

初始化PCI上的NVIDIA GPU失败:1:0:0 (GPU已从总线移除 / RmInitAdapter 失败!)

rcutree.gp_init_delay=1 添加到内核参数中。原始讨论见 [3][4]

分辨率、屏幕扫描错误,Xorg.log 中出现 EDID 错误

这是由于 NVIDIA 驱动程序未能检测到显示器的 EDID。你需要手动指定 EDID 文件的路径或以类似方式提供相同信息。

要提供 EDID 文件路径,请编辑 Xorg.conf 中 NVIDIA 卡的 Device 部分,添加这些行并更改部分内容以匹配你自己的系统:

/etc/X11/xorg.conf
Section "Device"
       	Option		"ConnectedMonitor" "CRT-0"
       	Option		"CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid"
	Option		"IgnoreEDID" "false"
	Option		"UseEDID" "true"
EndSection

如果 Xorg 无法启动,尝试将所有 CRT 引用替换为 DFB。card0 是 Intel 显卡的标识符,显示器通过 LVDS 连接到该卡。edid 二进制文件位于此目录中。如果硬件配置不同,CustomEDID 的值可能会有所不同,但这一点尚需确认。路径通常始终以 /sys/class/drm 开头。

或者,你可以使用 read-edid 等工具生成 edid,并将驱动程序指向该文件。即使是模型行(modelines)也可以使用,但请务必更改 UseEDIDIgnoreEDID

无 EDID 错误但分辨率异常

使用 nvidia-xconfig 时,可能会在 xorg.conf 中生成错误的信息,特别是错误的显示器刷新率,这限制了可用的分辨率。尝试注释掉 HorizSync/VertRefresh 行。如果这有帮助,你可能还可以删除文中未提到的其他所有内容。

死锁问题(lspci 挂起)

症状:lspci 挂起、系统挂起失败、关机挂起、optirun 挂起。

适用情况:使用较新的笔记本电脑(如 GTX 965M 或类似型号)且正在使用 bbswitch(例如通过 Bumblebee)或 nouveau 时。

当 dGPU 电源资源被打开时,可能会失败并挂起在 ACPI 代码中(内核漏洞 156341)。

使用 nouveau 时,禁用运行时电源管理会阻止其更改电源状态,从而避免此问题。要禁用运行时电源管理,请将 nouveau.runpm=0 添加到内核参数。

对于已知的特定型号变通方法,请参阅 此问题。在其他情况下,你可以尝试在启动时添加 acpi_osi="!Windows 2015"acpi_osi=! acpi_osi="Windows 2009" 到你的 内核参数。(考虑向该问题报告你的笔记本电脑型号。)

笔记本/NVIDIA Optimus 上找不到屏幕

检查输出是否类似于

$ lspci -nnd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation Core Processor Integrated Graphics Controller [8086:0042] 
(rev 18)
01:00.0 VGA compatible controller [0300]: nVidia Corporation Device 0df4 [10de:0df4] (rev a1)

NVIDIA 驱动程序自 319.12 Beta [5] 版本起(配合 3.9 及以上内核)提供了对 Optimus 的支持。

另一种解决方案是安装 Intel 驱动程序来处理屏幕,如果你需要 3D 软件,则应通过 Bumblebee 运行它们以指定使用 NVIDIA 显卡。

随机死机 "(EE) NVIDIA(GPU-0): WAIT"

在集成 AMD 显卡和作为唯一使用的独立 NVIDIA 显卡配置上,使用专有驱动程序时,用户报告会出现长达 10 秒的死机,Xorg 日志中出现以下错误

[   219.796] (EE) NVIDIA(GPU-0): WAIT (2, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)
[   226.796] (EE) NVIDIA(GPU-0): WAIT (1, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)

虽然尚未找到根本原因,但这似乎与集成显卡和独立显卡与 Xorg 交互冲突有关。

解决方法是使用双显卡切换,详情请参阅 PRIME#PRIME render offload

使用 optimus-manager 时提示 "No Devices detected"

在某些情况下,lspci 会将 PCI 域显示为第一列输出,导致 optimus-manager 在多个笔记本电脑型号上尝试映射 BusID 时生成的配置文件出错。

如果你遇到黑屏无法加载 GUI、GUI 部分加载伴有控制台伪影,或者 Xorg 崩溃并报错 (EE) - No Devices detected,可以在 上游 GitHub 找到变通方法和错误报告。

Xorg:外接显示器仅在鼠标移动时更新

该问题的一种变通方法是卸载 iGPU 的 Xorg 驱动程序(例如 xf86-video-amdgpuxf86-video-intel[6]。只要外接显示器接口(HDMI/DP/USB-C)直接连接到 Nvidia 独显,此方法即可生效。

提示 桌面行为可能会变得异常(例如,切换虚拟桌面或使用 Alt-Tab 时外接显示器上的图像会冻结),这也可以通过禁用笔记本电脑内置显示器来解决。

低功耗使用 (TDP)

自 530.41 驱动版本以来,出现了显卡功耗被锁定在低限制的情况(见 GitHub 问题 483)。NVIDIA 驱动程序已禁用了使用 nvidia-smi 命令手动设置功耗限制的能力,导致许多笔记本电脑被锁定在低功耗状态,性能不佳。

要解决此问题(针对 Ampere 或更新架构),请参阅 NVIDIA/Tips and tricks#Dynamic Boost

NVIDIA GPU 无法关闭或无法保持禁用状态

某些进程可能因其与 GPU 交互的方式而使你的 NVIDIA GPU 保持开启状态。这会导致显着增加功耗、缩短电池寿命并提高温度。

你可以通过运行以下命令来检查你的 GPU 是处于活动状态还是挂起状态

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

如果状态为 active,你可能正在运行一个让 GPU 保持唤醒的进程。

如果你使用的温度监控软件在探测 GPU 温度,它通常会调用 nvidia-smi 来获取温度,这将唤醒你的 GPU 并使其保持在活动状态。

你可以使用 nvtop 来检查是否有进程(如 Xorg)正在使用 NVIDIA GPU,但该方法并不适用于所有情况。例如,如果你运行了 Ollama 服务器,它会始终保持 GPU 开启,但不会显示在 nvtop 中,也不会调用 nvidia-smi

请记得同时查看你选择的特定方法的故障排查文章。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.