NVIDIA Optimus

来自 ArchWiki
(重定向自 Optimus)

此文章或章节需要扩充。

原因
  • 明确区分哪些是 X 特有的,哪些可以在 Wayland 上使用。
  • 移除对 "Intel" 的剩余提及,改为 "集成":Optimus 也适用于 AMD iGPU。
(在 Talk:NVIDIA Optimus 中讨论)

NVIDIA Optimus 是一种技术,允许将集成 GPU 和独立 NVIDIA GPU 构建到笔记本电脑中并由其访问。作为先决条件,安装两个显卡相关的 GPU 驱动程序

可用方法

有几种可用方法

  • #仅使用集成显卡 - 节省电量,因为 NVIDIA GPU 将完全断电。
  • #仅使用 NVIDIA 显卡 - 提供比集成显卡更高的性能,但消耗更多电池电量(这对于移动设备来说是不受欢迎的)。这利用了与 optimus-managernvidia-xrun 选项相同的底层过程,它应该用于故障排除和验证一般功能,然后再选择更自动化的方法之一。
  • 两者都使用(在需要时使用 NVIDIA GPU,并在不使用时关闭电源以节省电量)
    • #使用 PRIME 渲染卸载 - NVIDIA 官方支持的方法。
    • #使用 optimus-manager - 使用单个命令切换显卡(需要注销并重新登录才能生效)。还支持带有 PRIME 渲染卸载的混合模式。它可以最大限度地发挥 NVIDIA GPU 的性能,并在不使用时将其关闭。自 1.4 版本以来,也支持 AMD+NVIDIA 组合。
    • #使用 nvidia-xrun - 在不同的 TTY 上使用 NVIDIA 显卡运行单独的 X 会话。它可以最大限度地发挥 NVIDIA GPU 的性能,并在不使用时将其关闭。
    • #使用 Bumblebee - 通过允许使用 NVIDIA 显卡运行选定的应用程序,同时对其他所有内容使用 Intel 显卡,提供类似 Windows 的功能。存在明显的性能问题。
    • #使用 switcheroo-control - 类似于 Bumblebee,但专门为 GNOME 用户设计。允许应用程序在其 桌面条目文件中指定它们是否更喜欢专用 GPU,并允许您从右键单击菜单手动在 NVIDIA GPU 上运行任何应用程序。
    • #使用 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 内核本身禁用它。请参阅 混合显卡#完全关闭独立 GPU 的电源

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

您可以在不切换渲染到 Nvidia 显卡的情况下使用 CUDA。您需要做的就是确保在启动 CUDA 应用程序之前 Nvidia 显卡已通电,有关详细信息,请参阅 混合显卡#完全关闭独立 GPU 的电源

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

# rmmod nvidia_uvm
# rmmod nvidia

仅使用 NVIDIA 显卡

可以将专有 NVIDIA 驱动程序配置为主要的渲染提供程序。它也存在明显的画面撕裂问题,除非您通过启用 NVIDIA#DRM 内核模式设置 来启用 prime 同步,有关更多信息,请参阅 [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 文件自动检测显示器值的机制。作为一种解决方法,请参阅 #分辨率、屏幕扫描错误。Xorg.log 中的 EDID 错误
/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

使脚本成为可执行文件

现在配置 lightdm 以运行脚本,方法是编辑 /etc/lightdm/lightdm.conf 中的 [Seat:*] 部分

/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 渲染卸载

使用 nouveau

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

使用 Bumblebee

请参阅 Bumblebee

使用 switcheroo-control

请参阅 PRIME#GNOME 集成

使用 nvidia-xrun

请参阅 nvidia-xrun

使用 optimus-manager

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

使用 EnvyControl

请参阅 EnvyControl 上游文档。它涵盖了安装和使用说明。

使用 NVidia-eXec

请参阅 NVidia-eXec 上游文档。它涵盖了安装和使用说明。

使用 nvidia-switch

请参阅 nvidia-switch 上游文档。它涵盖了安装和使用说明。

故障排除

画面撕裂/垂直同步损坏

启用 DRM 内核模式设置,这将反过来启用 PRIME 同步并修复画面撕裂问题。

您可以阅读官方 论坛帖子 以了解详情。

初始化 NVIDIA GPU 在 PCI:1:0:0 失败 (GPU 从总线上掉落 / RmInitAdapter 失败!)

rcutree.gp_init_delay=1 添加到内核参数。原始主题可以在 [3][4] 中找到。

分辨率、屏幕扫描错误。Xorg.log 中的 EDID 错误

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

要提供 EDID 文件的路径,请编辑 Xorg.conf 中 NVIDIA 显卡的 Device Section,添加以下行并更改部分内容以反映您自己的系统

/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,并将驱动程序指向此文件。甚至可以使用 modeline,但请确保更改 UseEDIDIgnoreEDID

没有 EDID 错误但分辨率错误

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

锁定问题 (lspci 挂起)

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

适用于:使用 bbswitch(例如通过 Bumblebee)或 nouveau 的较新笔记本电脑,配备 GTX 965M 或类似显卡。

当 dGPU 电源资源打开时,它可能无法执行此操作并在 ACPI 代码中挂起(内核错误 156341)。

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

有关已知的特定型号解决方法,请参阅 此问题。在其他情况下,您可以尝试使用添加到 内核参数acpi_osi="!Windows 2015"acpi_osi=! acpi_osi="Windows 2009" 启动。(考虑将您的笔记本电脑报告给该问题。)

笔记本电脑/NVIDIA Optimus 上未找到屏幕

检查输出是否类似于

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation Device 0df4 (rev a1)

自 319.12 Beta [5] 起,NVIDIA 驱动程序现在为 Optimus 提供支持,内核版本为 3.9 及更高版本。

另一种解决方案是安装 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 渲染卸载

使用 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 dGPU,这应该就可以工作。

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

低功耗使用 (TDP)

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

要解决此问题(对于 Ampere 代或更新的代),启动/启用 nvidia-powerd.service,这将启用 DynamicBoost

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

请记住查看与您选择的特定方法相关的文章以进行故障排除。