NVIDIA Optimus
NVIDIA Optimus 是一种技术,允许将集成 GPU 和独立 NVIDIA GPU 构建到笔记本电脑中并由其访问。作为先决条件,安装两个显卡相关的 GPU 驱动程序。
可用方法
有几种可用方法
- #仅使用集成显卡 - 节省电量,因为 NVIDIA GPU 将完全断电。
- #仅使用 NVIDIA 显卡 - 提供比集成显卡更高的性能,但消耗更多电池电量(这对于移动设备来说是不受欢迎的)。这利用了与 optimus-manager 和 nvidia-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
组合,以提供与此设置的兼容性。
/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,但请确保更改 UseEDID
和 IgnoreEDID
。
没有 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-amdgpu 或 xf86-video-intel)[6]。只要外部显示器端口 (HDMI/DP/USB-C) 直接连接到 Nvidia dGPU,这应该就可以工作。
低功耗使用 (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
。
请记住查看与您选择的特定方法相关的文章以进行故障排除。