最近收到通知說 12.0.5 的 mesa 打算 backport 回 Ubuntu 16.04,並且取代原本 16.04 中11.2.0 版本的 mesa,希望在正式釋出 backport 版本前提供更多測試。因此對這個技術稍微了解了一下,摘要如下。
詞彙
provider:
提供運算資源的單位,例如一張獨立顯卡。
sink output:
在這裡指有連接外部裝置 port 的 provider,但基本上不太負擔運算繪圖,只輸出。不要跟電路學中的 sink-source 混淆(電路學中是指裝置接地和電壓方式的不同)
source output:
在這裡是指負擔運算繪圖,但輸出由其他 provider.
multiplexer:
較早期不是採用動態切換時,需要關掉一個 GPU 再去啟動另外一個 GPU來達成切換,負責開關的裝置叫做 multiplexer[a],通常是一種硬體。比較新的裝置是不需要(硬體上的) multiplexer,稱為 muxless。附註資料[c][d]中的硬體透過 GCN (一種新的指令集架構)支援這種功能。
因此在處理這類問題,我們會需要知道(下文有對應指令):
- provider 的資訊,包括他是 sink or source output
- render 時的資訊;例如是誰在負責運算、運算結果的表現如何。
我們會需要執行下面這些動作(下文有對應指令):
使用情境
案例一:PRIME
一個支援 muxless 的系統有兩個顯卡,分別是主要的 integrated graphic 和第二顯卡。輸出 port 在 integrated graphic 上面。
因為 integrated graphic 是常駐的、低耗電的晶片裝置,所以平常的運算都交給他。有時如果要把運算負擔(loading)從 integrated graphic 交給第二顯卡,integrated graphic 只剩下把資料從 port 輸出,這個動作就叫做 offload。PRIME 技術就是提供 muxless 的裝置實作 offload 功能。
目前只有 AMD 的顯卡支援這技術[c][d],nvidia 還沒。
案例二:REVERSE PRIME
一個支援 muxless 的系統有兩個顯卡,分別是主要的 integrated graphic 和第二顯卡。輸出 port 在第二顯卡上面。例如 integrated graphic 是內建螢幕和 VGA 輸出,第二顯卡上則有 HDMI 和 display port 輸出,而使用者現在想用 display port 來輸出。
使用者現在想用 display port 來輸出,可是又不想用第二顯卡處理大量運算;因為第二顯卡雖然運算能力比較好,但是比較耗電。也就是說希望第二顯卡負責輸出就好,運算負擔還是 integrated graphic 在處理,只是 port 不是直接由 integrated graphic 控制。Reverse PRIME 技術可以實踐這種設定。
案例三:案例二的進階
一個支援 muxless 的系統有兩個顯卡,分別是主要的 integrated graphic 和第二顯卡。 integrated graphic 是內建螢幕輸出和 VGA 輸出,第二顯卡上則有 HDMI 和 display port 輸出。使用者想要四個 ports 都輸出,但是希望畫面流暢一點。
全部四個 ports 都由 integrated graphic 輸出的話,有可能會不流暢。因此使用者會希望運算盡量都是交給第二顯卡。
實作
案例一:PRIME
列出 provider 資訊
xrandr --listproviders
指定 provider 1 負責運算,provider 2 負責作為 sink output 輸出。(我把這個選項理解成:set provider 1 offload sink output)
xrandr --setprovideroffloadsink 1 0
在 default intel/modesetting driver 中,因為 DRI3 功能已經預設開啟,所以其實上述的設定已經是系統預設了,但手動再做一次並不會怎樣。[b]
這時候只要透過環境變數 DRI_PRIME 就可以動態地切換看是要哪個 provider 去繪圖。例如:
DRI_PRIME=1 <任何執行 render 的指令>
展示使用 provider 0 時(integrated graphic),對應的 opengl 參數 (glxinfo 這個工具可以透過安裝 mesa-utils 來取得)
DRI_PRIME=0 glxinfo
展示使用 provider 1 時(第二顯卡),對應的 opengl 參數
DRI_PRIME=1 glxinfo
在
這個 merge request 中,checkbox 被加入檢查系統是否具有支援 PRIME 技術的功能;如果有支援,那麼試著在接下來的測試中使用這個技術(同時也是測試這個技術),參見
原始碼。
從原始碼裡我們可以看到,要下面幾個條件被滿足才會判定系統支援 PRIME 技術,包括:
- 系統有 amdgpu 這個套件(open source 版本的 AMD 顯卡 driver)
- Ubuntu 系統是 Xenial
- 有兩個以上的 GPU
案例二:REVERSE PRIME
略,參見[b]
案例三:案例二的進階
略,參見[b]
參考資料:
[a] https://wiki.archlinux.org/index.php/hybrid_graphics
[b] https://wiki.archlinux.org/index.php/PRIME
[c] https://en.wikipedia.org/wiki/Graphics_Core_Next
[d] https://en.wikipedia.org/wiki/AMD_Radeon_Rx_200_series
[e] xrandr manual