Nvidia PRIME用法,雙顯卡Linux電腦切換獨顯跑3D渲染,解決畫面撕裂

目錄
本文說明Nvidia PRIME指令的用法,適合桌電與筆電的Linux用戶參考。
如果您的Linux電腦有Intel + Nvidia
或AMD + Nvidia
的雙顯示卡架構,不妨試試內顯為主,獨顯為輔的使用策略。
測試系統:Arch Linux 6.5.9。本文介紹的指令亦適用於Ubuntu。
1. 不要用Nvidia顯示卡當主顯卡的理由 #
Nvidia PRIME是Nvidia顯示卡的一種技術,專為雙顯卡筆電打造,可以在獨立顯示卡與內顯之間切換。
比如,筆電用Intel內顯開機,桌面環境用內顯渲染。當遇到需要重度GPU渲染的遊戲程式時,才將渲染作業分配給Nvidia顯示卡,此種過程稱之為PRIME Render Offload
。
我這裡要論述不要用Nvidia當主顯示卡的理由,即讓螢幕所有的渲染都由Nvidia顯示卡處理。
考慮一個常見情況:Intel + Nvidia筆電,Intel CPU有內顯,而Nvidia顯示卡接著HDMI輸出孔。
雙顯卡筆電預設開機應該是用內顯渲染畫面的,而HDMI輸出也能作動,為何?Linux在沒安裝Nvidia專有驅動的情況下會載入開源nouveau驅動,至少讓顯示卡有畫面,並且很省電。可是一旦用到Nvidia玩遊戲,或者跑渲染作業,就得安裝效能更強的Nvidia專有驅動。
那我們幹嘛不讓所有程式都用Nvidia渲染就行了?在裝好Nvidia驅動後可以用
Envy Control把Nvidia設定主顯示卡使用了(Use Nvidia only
),所有軟體都會自動獲得更好的GPU性能。
可是這樣裝會造成一些問題,首先Nvidia GeForce MX系列顯示卡的電力控管很糟糕,裝上專有驅動後電是用噴的;再者,KDE X11與Nvidia相性不佳,偶有畫面撕裂情況。
如果你跟我一樣有這種情況,那當然是避免掉這種問題比較好。回到本段一開始講的,使用PRIME Render Offload
的方法。
2. 雙顯卡筆電的Nvidia獨顯切換方式 #
安裝 Envy Control
將模式設定為Hybrid,這樣會保持兩邊顯示卡啟用。
3. 如何使用prime-run指令 #
- 開機後,使用指令
lspci -k | grep -A 2 -i "VGA"
檢查目前使用的顯示卡,應會同時列出Intel和Nvidia的顯示卡
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04)
Subsystem: ASUSTeK Computer Inc. Device 1830
Kernel driver in use: i915
--
01:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] (rev a1)
Subsystem: ASUSTeK Computer Inc. Device 85d6
Kernel driver in use: nvidia
- 因此,在這之後所有應用程式預設都會以Intel顯示卡渲染。當需要使用Nvidia顯示卡渲染的時候,在指令前面加上
prime-run
舉例:從終端機執行Minetest,啟用光影,看FPS高低便能知道效果。
指令:minetest
,用Intel顯示卡運算,FPS低落
指令:prime-run minetest
,Nvidia顯示卡FPS正常。
如果prime-run無效,試試改用PRIME環境變數
啟動程式:
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus="NVIDIA_only" minetest
當您要跑CUDA之類的程式的時候,也是這樣操作。預先指定以上環境變數,程式就能利用Nvidia顯示卡渲染。
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus="NVIDIA_only" "執行檔"
能不能讓應用程式切換Nvidia顯示卡更方便些?
如果安裝的是GNOME桌面,對應用程式圖示按右鍵會有「以獨立顯示卡啟動」的選項,這樣就會暫時以Nvidia顯示卡啟動該程式。
KDE的話則是右鍵 → 編輯應用程式,加入PRIME的環境變數:__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus="NVIDIA_only"
,這樣以後點應用程式圖示就會一律以Nvidia顯示卡啟動。
4. 以Nvidia PRIME啟動Flatpak版程式 #
以Steam為例,使用flatpak override
設定環境變數,這樣Steam以及其餘子行程都會以Nvidia獨顯啟動。
flatpak override --user --env='__NV_PRIME_RENDER_OFFLOAD=1' --env='__GLX_VENDOR_LIBRARY_NAME=nvidia' --env='__VK_LAYER_NV_optimus="NVIDIA_only"' com.valvesoftware.Steam
也可以點選個別Steam遊戲,右鍵 → 內容
在啟動選項加入PRIME的環境變數:__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus="NVIDIA_only" %command%
,這樣只有該遊戲會用Nvidia渲染。
值得注意的是Proton 8.0部份遊戲配合PRIME似乎會閃退,需降版至Proton 7.0。
5. Nvidia PRIME的雙螢幕輸出 #
在KDE X11環境下是開箱即用,獨顯的HDMI孔接上第二個螢幕後應該會輸出畫面。
不過仍然需要使用prime-run
指令才能指定用獨顯跑3D程式。
若沒看到畫面就用xrandr
指令手動設定。
6. 讓桌電也用上PRIME吧 #
Nvidia PRIME通常是筆電在用的技術。因為Linux開機預設使用Intel內顯從而迴避了下面桌電獨顯的問題,Nvidia的獨顯需要使用Nvidai PRIME的技術才會動起來。
我的桌電有Intel i5-7400的內顯HD630,還有Nvidia的獨立顯示卡GTX 1050Ti。螢幕一部,插在獨顯的HDMI孔上,所以預設桌面環境是用Nvidia顯示卡渲染的。
同樣地,我之所以對Nvidia感到厭煩,是因為Nvidia的專有驅動在X11環境不時會造成畫面撕裂,還會讓系統動畫lag、小機率關不了機、開機無法進tty支援哩哩拉拉等小問題。
Nvidia PRIME可不是筆電的專利!Linux桌電只要有雙顯示卡,也是可以使用Nvidia PRIME。
所以囉我決定將筆電的這個技術,沿用到桌電上,採「內顯」用於畫面輸出,需要時再呼叫「獨顯」出來幹活的方案。
這樣的話,沒有Nvidia畫面撕裂問題,又能保持Nvidia的效能。預設用Intel內顯當主畫面輸出,3D運算就是用Intel,看影片解碼夠力了,還能無痛跑 Waydroid和Android-x86的 virglrenderer。等有需要重度3D計算再叫Nvidia顯示卡出來幹活即可。
將桌電設定為Intel內顯優先開機
- 現在我的螢幕線是插在Nvidia獨顯上。首先檢查目前使用的是nouveau還是Nvidia專有驅動,顯示nouveau就是前者了。
lsmod | egrep "nvidia|nouveau"
雖說若有安裝開源Nvidia驅動nouveau,應先將其解除安裝,但它是含在Mesa套件裡面的,而Intel驅動需要Mesa,所以頂多只能禁止其載入。在安裝Nvidia專有驅動後,nouveau應會自動被停用。
安裝Nvidia專有驅動和相關工具,重開機。
sudo pacman -S nvidia nvida-utils nvtop
- 使用指令
lspci -k | grep -A 2 -i "VGA"
列出目前使用的GPU。如果螢幕的線是插在Nvidia的HDMI孔上,那麼應該只會看到Nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] (rev a1)
Subsystem: ASUSTeK Computer Inc. Device 85d6
Kernel driver in use: nvidia
- 因為等下要改用Intel內顯啟動,安裝Intel的開源驅動,還有Vulkan。
sudo pacman -S mesa intel-media-driver vulkan-intel
檢查GRUB參數:
cat /etc/default/grub
,確認GRUB_CMDLINE_LINUX_DEFAULT
沒有設定nomodeset
和nvidia-drm.modeset=1
,否則用Intel顯卡開機會沒畫面。電腦關機。
進入電腦的BIOS,設定為內顯優先開機。我的主機板的該設定位置Advanced → System Agent (SA)Configuration,設定IGFX優先開機。
之後電腦重開機,將插在獨顯的HDMI線拔掉,改插到主機板的HDMI孔。
Nvidia PRIME用法參考上文。