PRIME
PRIME 是一種用於管理最新一些台式機和筆記本電腦上的混合圖形的技術(NVIDIA 的 Optimus,Radeon 的 AMD 動態可切換圖形)。 PRIME GPU 分載(offloading)和反向 PRIME(reverse PRIME)是在 Linux 內核中支持無復用混合顯示的嘗試。
安裝[編輯 | 編輯原始碼]
開源驅動程序[編輯 | 編輯原始碼]
安裝開源圖形驅動程序需要先刪除所有閉源圖形驅動程序並將其替換為等效的開源圖形驅動程序:
然後重新啟動並檢查系統加載的圖形驅動程序列表:
$ xrandr --listproviders
Providers: number : 2 Provider 0: id: 0x7d cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 3 outputs: 4 associated providers: 1 name:Intel Provider 1: id: 0x56 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 6 outputs: 1 associated providers: 1 name:radeon
我們可以看到有兩塊顯卡:Intel的集成顯卡(id 0x7d)和 Radeon 的獨立卡(id 0x56),後者應該被用於 GPU 密集型應用。
默認情況下系統會始終使用 Intel 卡:
$ glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
為了使用獨立顯卡(此處以radeon為例),需要先將集成顯卡定義為offload provider,因為當前連接到顯示器的是集成顯卡:
$ xrandr --setprovideroffloadsink 0x56 0x7d
現在你可以在對顯卡要求高的程序(如遊戲,3D建模工具等等)中使用獨立顯卡了:
$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Gallium 0.4 on AMD TURKS
"HAINAN @ pci:0000:03:00.0"
,而不是 radeon
. 在這種情況下在接下來的命令中應該使用 "HAINAN @ pci:0000:03:00.0"
作為顯示提供程序。閉源驅動程序[編輯 | 編輯原始碼]
要讓 PRIME 在專有驅動程序上運行,過程幾乎一樣。按照下列文章安裝驅動程序:
- AMD 顯卡參考 AMDGPU PRO 來安裝驅動程序.
- 英偉達顯卡參考 NVIDIA 來安裝驅動程序.
安裝驅動程序後,請不要重啟系統或 Xorg。在重新配置之前,由於系統配置不一樣,可能會導致 Xorg 無法運行。
按照指定用例部分的說明進行操作。理論上不需要卸載開源驅動程序即可正常運行,但也有可能需要卸載,以防止混亂和未來潛在的問題。
其他程序仍然會使用更節能的集成顯卡。每次X11重啟都必須再運行一次 xrandr --setprovideroffloadsink 0x56 0x7d
; 你可以寫一個腳本並且在啟動桌面環境時自動運行(或者將腳本放在 /etc/X11/xinit/xinitrc.d/
目錄下).
PRIME GPU 分載[編輯 | 編輯原始碼]
有時候用戶想在更強大的卡上呈現應用程式並將結果發送到連接了顯示器的卡。
命令 xrandr --setprovideroffloadsink provider sink
可用於讓做渲染工作的分載提供程序(offload provider)將其輸出發送到接收端(sink)提供程序(也就是連接了顯示器的提供程序)。 提供程序和接收端標識符可以是數字(0x7d、0x56)或區分大小寫的名稱(Intel、radeon)。
- 當使用來自官方存儲庫的大多數默認 Xorg DDX(
xf86-video-*
或內置模式設置驅動程序時,不再需要此設置,因為它們默認啟用 DRI3,因此會自動的這樣安排配置。不過,再次顯式設置它們一次也不會有什麼害處。 - 閉源驅動程序不支持 GPU 分載(不過在 NVIDIA 驅動程序上,情況有所變化,有關詳細信息,請參見下面的 #PRIME 渲染分載)。
樣例:
$ xrandr --setprovideroffloadsink radeon Intel
命令中的提供程序也可以用序號代替名字:
$ xrandr --setprovideroffloadsink 1 0
對於開源程序 - PRIME[編輯 | 編輯原始碼]
要將獨立顯卡用於最需要它的應用程式(例如遊戲、3D 建模器...),要在程序的啟動命令前面加上環境變量 DRI_PRIME=1
:
$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Gallium 0.4 on AMD TURKS
其他應用程式仍將使用功耗較低的集成顯卡。一旦 X 伺服器重新啟動,這些設置就會丟失,可能需要製作一個腳本並在桌面環境啟動時自動運行(或者,將其放在 /etc/X11/xinit/xinitrc.d/
目錄下面). 不過,這樣可能會縮短電池壽命並增加熱量。
更多信息可以參考 Gentoo:AMDGPU#Test, if a discrete graphics card is in use。
PRIME 渲染分載[編輯 | 編輯原始碼]
NVIDIA 驅動程序從 版本 435.17 開始支持這個方法。iGPU 驅動程序 xf86-video-amdgpu包 (450.57) 和 xf86-video-intel包 (455.38) 官方支持模式設置(modesetting)。
要在 NVIDIA 顯卡上運行程序,您可以使用 nvidia-prime包 軟體包提供的 prime-run
腳本:
$ prime-run glxinfo | grep "OpenGL renderer" $ prime-run vulkaninfo
PCI-Express Runtime D3 (RTD3) 電源管理[編輯 | 編輯原始碼]
開源驅動程序[編輯 | 編輯原始碼]
在不和 PRIME 分載或反向 PRIME 一起使用的時候,內核 PCI 電源管理就會關閉 GPU。
內核級顯示模式設置、xf86-video-amdgpu包、xf86-video-intel包、xf86-video-nouveau包 驅動程序都支持這個功能。
以下命令可用於檢查每個 GPU 的當前 電源狀態:
$ cat /sys/class/drm/card*/device/power_state
NVIDIA[編輯 | 編輯原始碼]
對於在 Intel Coffee Lake 或更高版本 CPU 以及某些 Ryzen CPU(如 5800H)平台上運行的圖靈顯卡,可以 在不使用的時候完全關閉 GPU。
需要以下 udev 規則:
/etc/udev/rules.d/80-nvidia-pm.rules
# Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto" ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto" # Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on" ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on"
同時設置以下 內核參數#設置內核模塊選項:
/etc/modprobe.d/nvidia-pm.conf
options nvidia "NVreg_DynamicPowerManagement=0x02"
我們還需要啟用nvidia-persistenced.service
服務以避免內核在 NVIDIA 設備資源不再使用時清空設備狀態。
配置應用程式使用 GPU 渲染[編輯 | 編輯原始碼]
即使沒有啟用動態電源管理,應用程式的渲染分載也要啟用[1]。
要在運行應用程式時渲染分載到 NVIDIA GPU 並啟用動態電源管理,要添加以下內容。[2]
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia command
在 Steam 遊戲上使用時, 啟動命令行選項可以設置為:
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%
GNOME 集成[編輯 | 編輯原始碼]
使用 GNOME 集成需要安裝 switcheroo-controlAUR和啟用 switcheroo-control.service
。
GNOME將尊重桌面項中的PrefersNonDefaultGPU
屬性。或者也可以通過右鍵單擊圖標並選擇Launch using Discrete Graphics Card
來使用GPU 啟動應用程式。
故障排除[編輯 | 編輯原始碼]
如果安裝了bumblebee包,則需要將其刪除,因為它將 nvida_drm
列入黑名單,該驅動程序由 X 伺服器加載 NVIDIA 驅動程序來實現渲染分載。
PRIME 同步[編輯 | 編輯原始碼]
當使用PRIME時,主GPU渲染屏幕內容/應用程式,並將其傳遞給備用GPU進行顯示。參考an NVIDIA thread,"傳統的 vsync 可以將應用程式的呈現與系統內存中的副本同步,但需要一種額外的機制來將系統內存中的副本與 iGPU 的顯示引擎同步。與傳統的垂直同步不同,這種機制必須涉及到 dGPU 和 iGPU 驅動之間的通信。"
這種同步是使用 PRIME 同步實現的。要檢查顯示系統是否啟用了 PRIME 同步,可以查看xrandr --prop
的輸出。
使用下面的命令啟用(PRIME 同步):
$ xrandr --output <output-name> --set "PRIME Synchronization" 1
- 在 NVIDIA 驅動程序上使用 PRIME 同步的先決條件是啟用 NVIDIA#DRM內核級顯示模式設置。
- PRIME 同步無法在 AMDGPU DDX 驅動上使用(xf86-video-amdgpu包)。
特定於 Wayland 的配置[編輯 | 編輯原始碼]
Wayland需要的配置比Xorg少。KDE 的 KWin 和 GNOME 的 Mutter (Issue 17 和 Merge request 1562) 似乎也實現了 GPU 熱插拔的初步支持。
通過設置DRI_PRIME=
環境變量來使用獨立顯卡。下面的示例假設一個系統使用 Intel 集成卡、NVIDIA 內部 GPU 和 AMD 外部 GPU。
使用集成英特爾晶片不需要修改,因為它已經是默認的:
glxinfo | grep 'OpenGL renderer'
OpenGL renderer string: Mesa Intel(R) Xe Graphics (TGL GT2)
使用開源驅動程序的 AMD 顯卡:
DRI_PRIME=pci-0000_06_00_0 glxinfo | grep 'OpenGL renderer'
OpenGL renderer string: AMD Radeon RX 5700 XT (navi10, LLVM 14.0.6, DRM 3.46, 5.18.17-hardened1-1-hardened)
使用專有驅動的 NVIDIA 顯卡:
DRI_PRIME=pci-0000_01_00_0 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep 'OpenGL renderer string'
OpenGL renderer string: NVIDIA GeForce RTX 3050 Ti Laptop GPU/PCIe/SSE2
Wayland 可以在同一台機器上同時使用多個GPU。
參見 mesa3d 的 PRIME 文檔: https://docs.mesa3d.org/envvars.html
反向 PRIME[編輯 | 編輯原始碼]
- 470 beta 之前的 NVIDIA 驅動程序上的 AMDGPU + NVIDIA 不支持反向 PRIME。更多詳細信息,請參考 [3]。舊版本的替代方法是使用 NVIDIA 作為主卡,如#Discrete card as primary GPU小節所述。
- 當前僅啟用外部顯示器時,將只能獲得 1 FPS。 更多信息參考[4]。
如果第二個 GPU 的輸出無法被主 GPU 訪問,可以使用反向 PRIME來使用它們。這將涉及使用主 GPU 渲染圖像,然後將它們傳遞給第二個 GPU。
它可能開箱即用,但如果不能,則需要按照以下步驟進行配置。
配置[編輯 | 編輯原始碼]
首先, 識別集成 GPU 的總線 ID(BusID)
lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile) 01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
在上面的示例中,Intel 卡的總線id是 00:02.0 ,翻譯到 pci 總線上為 PCI:0:2:0。
如下設置您的 xorg.conf
並調整 BusID。
/etc/X11/xorg.conf
Section "ServerLayout" Identifier "layout" Screen 0 "intel" Inactive "nvidia" Option "AllowNVIDIAGPUScreens" EndSection Section "Device" Identifier "nvidia" Driver "nvidia" EndSection Section "Screen" Identifier "nvidia" Device "nvidia" EndSection Section "Device" Identifier "intel" Driver "modesetting" BusID "PCI:0:2:0" EndSection Section "Screen" Identifier "intel" Device "intel" EndSection
命令 xrandr --setprovideroutputsource provider source
將提供程序設置為源的輸出。 例如:
$ xrandr --setprovideroutputsource radeon Intel
完成後,獨立顯卡的輸出應該在 xrandr 中可用,可以執行以下操作:
$ xrandr --output HDMI-1 --auto --above LVDS1
來配置內部和外部顯示器。
問題[編輯 | 編輯原始碼]
如果重啟後你只有一個提供程序,可能是因為當 Xorg 啟動時nvidia
模塊還沒加載。您需要啟用早期模塊加載。 有關詳細信息,請參閱 內核級顯示模式設置#KMS 早啟動。
用戶場景[編輯 | 編輯原始碼]
將獨立顯卡作為主 GPU[編輯 | 編輯原始碼]
想像一下以下場景:LVDS1(內部筆記本電腦屏幕)和 VGA 輸出都只能通過集成的英特爾 GPU 訪問。 HDMI 和 DisplayPort 輸出連接到獨立的 NVIDIA 卡。 如上所述,可以通過使用 #反向 PRIME 技術來使用所有四個輸出。 然而,性能可能會很差,因為所有輸出的所有渲染都是由集成的英特爾卡完成的。 為了改善這種情況,可以通過獨立的 NVIDIA 卡進行渲染,然後將 LVDS1 和 VGA 輸出的幀緩衝區複製到英特爾卡。
創建以下 Xorg 配置:
/etc/X11/xorg.conf.d/10-gpu.conf
Section "ServerLayout" Identifier "layout" Screen 0 "nouveau" Inactive "intel" EndSection Section "Device" Identifier "nouveau" Driver "nouveau" BusID "PCI:x:x:x" # Sample: "PCI:1:0:0" EndSection Section "Screen" Identifier "nouveau" Device "nouveau" EndSection Section "Device" Identifier "intel" Driver "intel" BusID "PCI:x:x:x" # Sample: "PCI:0:2:0" EndSection Section "Screen" Identifier "intel" Device "intel" EndSection
重啟 Xorg。現在應該使用的是NVIDIA 獨立顯卡。 HDMI 和 Display Port 輸出是主要輸出。 LVDS1 和 VGA 輸出關閉。 要啟用它們,可以運行:
$ xrandr --setprovideroutputsource Intel nouveau
集成顯卡的輸出現在應該在 xrandr 中可用。
故障排查[編輯 | 編輯原始碼]
XRandR 只識別出一個顯卡[編輯 | 編輯原始碼]
刪除或者移走 /etc/X11/xorg.conf 以及 /etc/X11/xorg.conf.d/ 目錄下任何與GPU有關的文件
當程序使用獨立顯卡渲染時,程序黑屏[編輯 | 編輯原始碼]
某些情況下PRIME的正常工作需要一個混合窗口管理器。如果你使用的窗口管理器不進行混合渲染,你可以在其基礎上使用xcompmgr。
在基於 GL 的渲染合成器下黑屏[編輯 | 編輯原始碼]
目前基於 GL 的渲染合成器和 PRIME 分載渲染還有一些問題。當基於 Xrender 的渲染合成器(xcompmgr,xfwm,compton的默認後端,cairo-compmgr和一些其他的合成器)可以正常工作,基於 GL 的渲染合成器(Mutter/muffin, Compiz, 使用 GLX 後端的 compton , Kwin 的 OpenGL 後端,等)一開始會顯示黑屏,就好像沒有運行渲染合成器一樣。雖然也可以通過調整使用渲染分載的程序窗口大小來強制顯示圖像,但這並不是一個實用的解決方案,因為它不適用於全屏的 Wine 應用程式。這意味著像 GNOME3 和 Cinnamon 這樣的桌面環境在使用 PRIME 分載時存在問題。
此外,如果使用的是英特爾 IGP,也許可以通過把 IGP 當作 UXA 而不是 SNA 運行來修復 GL合成問題,然而這可能會導致渲染分載進程出現問題(例如,xrandr --listproviders
可能不會列印獨立 GPU)。