NVIDIA Optimus 是一項允許集成圖形處理器(GPU)和英偉達(NVIDIA)獨立圖形處理器置入並通過一台筆記本電腦訪問的技術。作為前提條件,請為兩張顯卡安裝相關的 GPU 驅動。
可用方法
這裡有幾種可行的方法:
- #僅使用集成顯卡 - 能節約用電,因為此時英偉達 GPU 是完全關閉(不通電)的。
- #僅使用英偉達顯卡 - 能比集成顯卡提供更強的性能表現,但是更耗電(這對行動裝置不太友好)。此方法和 optimus-manager 以及 nvidia-xrun 兩者一樣採用了相同的底層處理,所以在選用一種更自動化的方法之前,應該先利用這個方法來排除故障和驗證一些常規功能。
- 兩者兼用 (在需要的時候使用英偉達 GPU,其他時候關閉它以節省電量):
- #使用 PRIME 渲染分載(render offload) - 英偉達官方支持方法。
- #使用 optimus-manager - 用一個簡單的命令切換顯卡(需要註銷重新登錄來生效)。還支持與 PRIME 渲染分載的混合模式。這可實現需要時使用英偉達 GPU 達到最大性能,不用時則將後者關閉。自 1.4 版本起,還支持 AMD+NVIDIA 組合。
- #使用 nvidia-xrun - 使用英偉達顯卡在另外的 TTY 上運行單獨的 X 會話。這可實現需要時使用英偉達 GPU 達到最大性能,不用時則將後者關閉。
- #使用大黃蜂(Bumblebee) - 提供了與 Windows 下相似的功能,可以選擇需要的程序使用英偉達顯卡,而其他的程序則用集成顯卡運行。不過大黃蜂有重大的性能問題。
- #使用 switcheroo-control - 類似於大黃蜂,但專為 GNOME 用戶設計。允許應用程式在其桌面項文件中指定是否偏好使用獨立顯卡,並允許你從右鍵菜單中手動選擇在英偉達 GPU 上運行任意應用程式。
- #使用 nouveau - (與英偉達官方提供的專有驅動相比)提供的性能較差,而且可能導致睡眠和休眠問題。不適用於最新的英偉達 GPU。
- #使用 EnvyControl - 類似於 optimus-manager,但不需要複雜的配置或後台運行守護進程,如果你是 GNOME 用戶,也不需要安裝修補版的 GDM。
- #使用 NVidia-eXec - 類似於大黃蜂,但沒有性能影響。它適用於 Xorg 和 Wayland。這個包是實驗性的,目前僅在 GNOME/GDM 下進行測試。
- #使用 nvidia-switch - 類似於 nvidia-xrun,但不需要切換 TTY,切換將通過登錄和註銷在顯示管理器中完成。這個包在基於 Debian 的系統上進行測試,但像 nvidia-xrun 一樣,它應該可以在所有 Linux 系統上工作。
僅使用集成顯卡
如果你只想使用某個特定的GPU而不進行切換,請檢查你系統BIOS中的選項。應該有一個選項可以禁用其中一個顯卡。有些筆記本電腦只允許禁用獨立顯卡,或者反之,但如果你只計劃使用其中一個顯卡,值得檢查一下。
如果你的BIOS不允許禁用Nvidia顯卡,你可以從Linux內核本身禁用它。參見Hybrid graphics#完全關閉獨立GPU。
在不切換渲染提供程序的情況下使用CUDA
你可以在不將渲染切換到Nvidia顯卡的情況下使用CUDA。你只需要確保在啟動CUDA應用程式之前Nvidia顯卡已通電,詳見Hybrid graphics#完全關閉獨立GPU。
現在,當你啟動CUDA應用程式時,它將自動加載所有必要的內核模塊。在使用CUDA後關閉Nvidia顯卡之前,必須先卸載nvidia
內核模塊:
# rmmod nvidia_uvm # rmmod nvidia
僅使用英偉達顯卡
專有的英偉達驅動可配置為主渲染提供程序。它也有明顯的畫面撕裂問題——除非通過啟動 NVIDIA#DRM 內核級顯示模式設置啟用 PRIME Sync,更多信息請參見 [1]。專有驅動確實允許使用獨立 GPU,而且(截至 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
文件結合提供與此配置的兼容性。
/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
接下來,依所使用的登錄圖形的方式不同而有所不同,請按實際情況選擇閱讀。
startx
請在 ~/.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 來運行這個腳本:
# 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-utils包 並運行以下命令來檢查英偉達顯卡是否被使用:
$ glxinfo | grep NVIDIA
更多信息
更多信息請參見英偉達官方網頁上的這個主題文章 [2]。
使用可切換顯卡
使用 PRIME 渲染分載(render offload)
這是 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 同步並修復撕裂問題。
官方論壇查看詳細信息:forum thread。
Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)
添加 rcutree.gp_init_delay=1
到內核參數。原始話題見 [3] 和 [4]。
解析度和屏幕掃描錯誤「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。card0
是標識為英特爾卡,顯示器通過 LVDS 連接。EDID 二進制文件位於此目錄。如果硬體配置不同,CustomEDID 的值可能有所不同,但這已得到證實。不管怎樣,路徑都將從 /sys/class/drm
開始。
或者你可以使用工具如 read-edid包 生成你的 EDID,並將驅動指向此文件。也可以使用 modelines,但是務必要修改 UseEDID
和 IgnoreEDID
。
無 EDID 錯誤的解析度問題
使用 nvidia-xconfig 時,可能會在 xorg.conf
中生成錯誤的信息,特別是錯誤的顯示器刷新率,限制了可能的解析度。嘗試注釋掉 HorizSync
/VertRefresh
行。如果這有幫助,你可能還可以刪除本文中未提及的其他內容。
鎖定問題(lspci 掛起)
問題:lspci 掛起,系統暫停失敗,關機時掛起,optirun 掛起。多出現在新的筆記本電腦或使用了類似 bbswitch GTX 的 965m 時(例如 bumblebee)以及 nouveau 的情況。
當獨立顯卡接通電源,可能出現這種情況,參見 (kernel bug 156341)。
具體解決方法參見 this issue。
你可以添加 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)
NVIDIA 驅動自 319.12 Beta [5] 起已經包含在內核(版本 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 render offload。
使用 optimus-manager 時出現 "No Devices detected"
在某些情況下,lspci 會將 PCI 域作為第一列輸出,導致 optimus-manager 生成的文件在嘗試映射 BusID
時在多款筆記本電腦上出現問題。
如果你遇到黑屏、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 issue 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
中。
記得檢查與你選擇的故障排除方法相關的文章。