NVIDIA Optimus (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 NVIDIA_Optimus翻译。上次翻译日期:2020-10-25。如果英文版本有所更改,则您可以帮助同步翻译。

NVIDIA Optimus 是一项允许英特尔(Intel)集成图形处理器(GPU)和英伟达(NVIDIA)独立图形处理器置入并通过一台笔记本电脑访问的技术。

可用方法

这里有几种可行的方法:

  • #仅使用英特尔显卡 - 能节约用电,因为此时英伟达图形处理器是完全关闭(不通电)的。
  • #仅使用英伟达显卡 - 能比英特尔显卡提供更强的性能表现,但是电量流失也更快(这对移动设备不太友好)。此方法和 optimus-manager 以及 nvidia-xrun 两者一样采用了相同的底层处理,所以在选用一种更自动化的方法之前,应该先利用这个方法来排除故障和验证一些常规功能。
  • 两者兼用 (在需要的时候使用英伟达图形处理器,其他时候关闭它以节省电量):
    • #使用 PRIME 渲染卸换(render offload) - 英伟达官方支持方法。
    • #使用 optimus-manager - 用一个简单的命令切换显卡(需要注销重新登录来生效)。这可实现需要时使用英伟达图形处理器达到最大性能,不用时则将后者关闭。
    • #使用 nvidia-xrun - 使用英伟达显卡在另外的 TTY 上运行单独的 X 会话。这可实现需要时使用英伟达图形处理器达到最大性能,不用时则将后者关闭。
    • #使用大黄蜂(Bumblebee) - 提供了与 Windows 下相似的功能,可以选择需要的程序使用英伟达显卡,而其他的程序则用英特尔显卡运行。不过大黄蜂有重大的性能问题。
    • #使用 nouveau - (与英伟达官方提供的专有驱动相比)提供的性能较差,而且可能导致睡眠和休眠问题。不适用于最新的英伟达图形处理器。
注意: 所有这些方法选择都是互斥的,如果测试了一种方法后又决定使用另一种方法,则必须确保在尝试另一种方法之前,还原通过遵循前一种方法所做的所有配置更改,否则可能会发生文件冲突和不定行为。

仅使用英特尔显卡

如果只考虑使用某一张显卡而不用切换的话,请检查电脑的 BIOS,那里应该有禁用某一显卡的选项。有些笔记本只允许禁用独立显卡,另一些则相反。但如果只想用两张显卡中的一张的话,还是值得去检查一下 BIOS 的。

如果 BIOS 不允许禁用掉英伟达显卡,那么可以从 Linux 内核本身禁用它。请参阅 Hybrid graphics#Fully Power Down Discrete GPU

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

您可以在不切换渲染到英伟达显卡的情况下使用 CUDA。所要做的就是确保在启动 CUDA 程序前英伟达显卡已经打开(通电),详情请参见 Hybrid graphics#Fully Power Down Discrete GPU

现在,当启动 CUDA 程序时,会自动加载必要的内核模块。在使用 CUDA 后要关闭英伟达显卡,请必须先将 nvidia 内核模块卸载:

# rmmod nvidia_uvm
# rmmod nvidia

仅使用英伟达显卡

专有的英伟达驱动可配置为主渲染提供程序。它也有明显的画面撕裂问题 —— 除非通过启动 DRM 内核模式设定 启用 PRIME Sync,更多信息请参见 [1]。专有驱动确实允许使用独立图形处理器,而且(截至 2017 年一月)它相比 nouveau 驱动有更明显的性能优势。

首先,安装 英伟达驱动和 xorg-xrandr 软件包。然后,配置 /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf,其中的选项将与软件包提供的 /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf 文件结合提供与此配置的兼容性。

注意: 在一些配置上,此配置会使英伟达驱动无法通过 EDID 文件自动探测显示参数值。解决方案可参考#分辨率和屏幕扫描错误“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 命令执行完成前就运行了,从而导致了黑屏。

显示管理器

如果打算使用显示管理器 (Display Manager, DM),就不是使用 ~/.xinitrc 文件了,而是需要为显示管理器创建或编辑显示配置脚本。

LightDM

LightDM 显示管理器创建/编辑脚本:

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

然后赋予脚本可执行权限:

# chmod +x /etc/lightdm/display_setup.sh

通过编辑 /etc/lightdm/lightdm.conf[Seat:*] 部分配置 LightDM 来运行这个脚本:

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

现在重启,然后显示管理器应该能启动了。

SDDM

SDDM 显示管理器创建/编辑脚本(SDDM 是 KDE 的默认显示管理器):

/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 使用 Xorg 作为后端

检查 3D 设置

可通过安装 mesa-demos 并运行以下命令来检查英伟达显卡是否被使用:

$ glxinfo | grep NVIDIA

更多信息

更多信息请参见英伟达官方网页上的这个主题文章 [2]

疑难解答

Tango-edit-clear.pngThis article or section needs language, wiki syntax or style improvements. See Help:Style for reference.Tango-edit-clear.png

Reason: If this is relevant only for #Use NVIDIA graphics only, it should be a subsection. Otherwise it should be the last section on the page. (Discuss in Talk:NVIDIA Optimus (简体中文))

垂直同步撕裂

xorg-server需要 1.19 或更高版本,linux内核需要4.5 或更高版本,nvidia需要370.23更高版本。还需要开启DRM kernel mode setting设置项以修复撕裂问题。

官方论坛查看详细信息:forum thread

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)

添加 rcutree.rcu_idle_gp_delay=1 到内核参数。原始话题见[3]

分辨率和屏幕扫描错误“EDID errors in Xorg.log”

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

增加这些线路和变化部分反映你自己的系统:

/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。显示器连接通过LVDS,card0是标识为英特尔卡。EDID二进制是这个目录。如果硬件配置不同,CustomEDID的值可能有所不同,但这已得到证实。不管怎样,路径都将从/sys/class/drm开始

或者你可以生成你的工具,如读取read-edid,将驱动点指向这个文件。也可以使用modelines,但是务必要修改 "UseEDID" 和 "IgnoreEDID"。

锁定问题(lspci 挂起)

问题:lspci挂起,系统暂停失败,关机时挂起,optirun挂起。多出现在新的笔记本电脑或使用了类似bbswitch GTX的965m时(例如bumblebee)以及nouveau的情况。

当独立显卡接通电源,可能出现这种情况,参见 (kernel bug 156341)。

具体解决方法参见 this issue。 你可以添加acpi_osi="!Windows 2015"acpi_osi=! acpi_osi="Windows 2009"Kernel parameters中。

笔记本电脑未发现屏幕/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)

NVIDIA驱动自319.12 Beta [4]起已经包含在内核(版本3.9级以上)中。

另一个解决方案是安装Intel驱动进行显示,如果需要运行3D软件,可以使用 Bumblebee (简体中文)来使用NVIDIA显卡。

使用可切换显卡

使用 PRIME 渲染卸换(render offload)

这是英伟达为支持可切换显卡提供的官方方法。

详情请参见 PRIME#PRIME render offload

使用 nouveau

要了解显卡切换相关内容,请参见 PRIME;要了解开源英伟达驱动相关内容,请参见 nouveau

使用大黄蜂(Bumblebee)

请参见 Bumblebee

使用 nvidia-xrun

请参见 nvidia-xrun

使用 optimus-manager

请参见 Optimus-manager 上游文档。其中包含了在 Arch Linux 系统上的安装和配置方法。