混合图形技术

来自 Arch Linux 中文维基

混合图形技术是指在同一个计算机上使用多个显卡. 笔记本生产商在同一个计算机上使用两个显卡,具有不同的性能和电源消耗,混合图形技术通过控制两个显卡的使用情况实现高性能和低功耗两个目标。

不同的厂商有不同的混合显示解决方案,这个功能在 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 年以后生产的笔记本大部分都是这个模式。新的混合显示技术也需要在不同的显卡之间切换,但是现在不再使用硬件多路复用的方式,而是通过一个帧缓存进行协调。集成显卡一直工作,独立显卡会根据显示的需要动态的开关。大部分情况下都无法只使用独立显卡,而且切换是由软件控制。

完全关闭独立显卡[编辑 | 编辑源代码]

你可能为了节约电量而希望关闭高性能图形处理器,你可以通过安装 acpi_call 包来实现。

提示:对于内核不是Official repositories的用户, acpi_call-dkms 是代替方案. 参见 DKMS

安装后加载内核模块:

# 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所在的总线,现在它已经关闭了芯片。要确认这一点,您的电池剩余时间应该会增加。目前,芯片将在下次重启时重新启动,要解决此问题我们需要执行以下操作:

注意: 只需要重启就可以重新启用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 替换为适用于您系统的那个(请注意您需要转义反斜杠)。

提示:如果您在禁用GPU后遇到休眠或暂停系统的问题,请尝试通过发送相应的acpi_call再次启用它。参加:使用服务文件.

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.

  1. https://www.asus.com.cn/laptops/for-creators/vivobook/vivobook-pro-16x-oled-k6604/ 华硕在2023年发布的笔记本电脑,第一段介绍中就清楚写明了采用MUX切换技术。