混合圖形技術
混合圖形技術是指在同一個計算機上使用多個顯卡. 筆記本生產商在同一個計算機上使用兩個顯卡,具有不同的性能和電源消耗,混合圖形技術通過控制兩個顯卡的使用情況實現高性能和低功耗兩個目標。
不同的廠商有不同的混合顯示解決方案,這個功能在 Windows 上支持的很好,但是在 Linux 上還只是實驗性質。我們會簡單的介紹各種方式和社區的支持情況。
第一代混合顯示模式 (基本切換)[編輯 | 編輯原始碼]
目前大多數筆記本使用的都是動態切換模式,但也有部分2023年的新產品[1]仍在使用基本切換模式。
如何簡單地辨別兩種模式?
基本切換模式一般需要重啟才能切換顯卡,而動態切換模式無需重啟。
第一代使用混合顯示技術的筆記本用硬體多路復用 (MUX)的方式。機器可以在低功耗和低性能的集成顯卡和高功耗高性能的獨立顯卡之間進行切換:使用集成顯卡處理低性能3D渲染任務可以延長續航,獨立顯卡更適合高性能3D渲染需求,但它會吃掉更多的電。用戶可以在啟動或登錄時選擇要使用哪個顯卡,使用的時候就基本沒法切換顯卡。基本的切換步驟:
- 關閉顯示器
- 打開獨立顯卡
- 切換多路復用電路
- 關閉集成顯卡
- 重新打開顯示器
這種切換並不平滑,會出現屏幕閃爍或黑屏。動態切換模式對使用體驗更加友好。
完全關閉獨立顯卡[編輯 | 編輯原始碼]
目前在Linux上,還沒有軟體包能夠支持基本切換模式。因此,若想要完全關閉獨立顯卡,你需要先在Windows上使用筆記本廠商提供的軟體切換到集成顯卡,再啟動Linux。
然後需要安裝bbswitch包,安裝後加載內核模塊:
# modprobe bbswitch
執行以下命令來查看獨立顯卡是否關閉
$ cat /proc/acpi/bbswitch
若輸出為
0000:01:00.0 ON
則表示獨立顯卡處於開啟狀態,執行以下命令來關閉獨立顯卡
# tee /proc/acpi/bbswitch <<<OFF
再次使用cat命令查看是否已經關閉,若仍處於開啟狀態,可能是由於顯卡驅動在運行,使用dmesg查看錯誤信息
# dmesg |tail -1
卸載相關驅動後,再嘗試關閉顯卡。
關於如何設置開機自動禁用獨顯,請參見電源管理
動態切換模式[編輯 | 編輯原始碼]
2016 年以後生產的筆記本大部分都是這個模式。新的混合顯示技術也需要在不同的顯卡之間切換,但是現在不再使用硬體多路復用的方式,而是通過一個幀緩存進行協調。集成顯卡一直工作,獨立顯卡會根據顯示的需要動態的開關。大部分情況下都無法只使用獨立顯卡,而且切換是由軟體控制。
- NV 的閉源驅動請參考 NVIDIA Optimus 和 Bumblebee
- 其它驅動,包括 NV Nouveau 開源驅動和 AMD Radeon 請參考 PRIME
完全關閉獨立顯卡[編輯 | 編輯原始碼]
你可能為了節約電量而希望關閉高性能圖形處理器,你可以通過安裝 acpi_call包 包來實現。
安裝後加載內核模塊:
# modprobe acpi_call
加載內核模塊後執行以下命令:
# /usr/share/acpi_call/examples/turn_off_gpu.sh
此腳本將遍歷所有已知數據總線並嘗試將其關閉。您將獲得類似於以下內容的輸出:
Trying \_SB.PCI0.P0P1.VGA._OFF: failed Trying \_SB.PCI0.P0P2.VGA._OFF: failed Trying \_SB_.PCI0.OVGA.ATPX: failed Trying \_SB_.PCI0.OVGA.XTPX: failed Trying \_SB.PCI0.P0P3.PEGP._OFF: failed Trying \_SB.PCI0.P0P2.PEGP._OFF: failed Trying \_SB.PCI0.P0P1.PEGP._OFF: failed Trying \_SB.PCI0.MXR0.MXM0._OFF: failed Trying \_SB.PCI0.PEG1.GFX0._OFF: failed Trying \_SB.PCI0.PEG0.GFX0.DOFF: failed Trying \_SB.PCI0.PEG1.GFX0.DOFF: failed Trying \_SB.PCI0.PEG0.PEGP._OFF: works! Trying \_SB.PCI0.XVR0.Z01I.DGOF: failed Trying \_SB.PCI0.PEGR.GFX0._OFF: failed Trying \_SB.PCI0.PEG.VID._OFF: failed Trying \_SB.PCI0.PEG0.VID._OFF: failed Trying \_SB.PCI0.P0P2.DGPU._OFF: failed Trying \_SB.PCI0.P0P4.DGPU.DOFF: failed Trying \_SB.PCI0.IXVE.IGPU.DGOF: failed Trying \_SB.PCI0.RP00.VGA._PS3: failed Trying \_SB.PCI0.RP00.VGA.P3MO: failed Trying \_SB.PCI0.GFX0.DSM._T_0: failed Trying \_SB.PCI0.LPC.EC.PUBS._OFF: failed Trying \_SB.PCI0.P0P2.NVID._OFF: failed Trying \_SB.PCI0.P0P2.VGA.PX02: failed Trying \_SB_.PCI0.PEGP.DGFX._OFF: failed Trying \_SB_.PCI0.VGA.PX02: failed
看到「works!」了麼?這意味著腳本找到了一個GPU所在的總線,現在它已經關閉了晶片。要確認這一點,您的電池剩餘時間應該會增加。目前,晶片將在下次重啟時重新啟動,要解決此問題我們需要執行以下操作:
將內核模塊添加到模塊列表以在引導時加載:
/etc/modules-load.d/acpi_call.conf
#Load 'acpi_call.ko' at boot. acpi_call
啟動時[編輯 | 編輯原始碼]
要在啟動時關閉GPU,我們可以運行上面的腳本,但老實說這不是很優雅,所以我們可以使用systemd的tmpfiles。
/etc/tmpfiles.d/acpi_call.conf
w /proc/acpi/call - - - - \\_SB.PCI0.PEG0.PEGP._OFF
上面的配置將由systemd在啟動時加載。它的作用是將特定的OFF信號寫入 /proc/acpi/call
文件。顯然,需要將 \_SB.PCI0.PEG0.PEGP._OFF
替換為適用於您系統的那個(請注意您需要轉義反斜槓)。
X server initialization 之後[編輯 | 編輯原始碼]
在某些系統下, 在X server 初始化前關閉獨立顯卡,會導致系統掛起(hang)。這種情況下,調換操作步驟,即在X server初始化之後,再關閉獨立顯卡可能可以解決問題。這個操作可以在一些display manager(顯示管理器)裡進行設定。 比如,LightDM, the display-setup-script seat configuration parameter could be used to execute a script as root that disables the GPU.
- ↑ https://www.asus.com.cn/laptops/for-creators/vivobook/vivobook-pro-16x-oled-k6604/ 華碩在2023年發布的筆記本電腦,第一段介紹中就清楚寫明了採用MUX切換技術。