ハイブリッドグラフィックス
ハイブリッドグラフィックは同一のコンピュータで2つのグラフィックカードを動作させるというコンセプトです。一つのコンピュータで二つのグラフィックカードを使用して、高いパフォーマンスと省電力の両方を達成する新しいテクノロジーとして、ノートパソコンのメーカーによって開発されました。
様々なテクノロジーが存在し、問題を解決するために個々のメーカーによって独自の方法が開発されています。このテクノロジーは Windows ではしっかりとサポートされていますが、Linux ディストリビューションでは未だ実験的な段階です。このページでは、それぞれのアプローチとモデルについて軽く説明し、そして GNU/Linux システムのサポートがないことに対するコミュニティによるソリューションを紹介します。
目次
第一世代のハイブリッドモデル (ベーシックな切り替え)
ハイブリッドグラフィックの第一世代のノートパソコンではハードウェアマルチプレクサ (MUX) を使用していました。内蔵グラフィックプロセッサ (IGP) による省電力ながらローレベルな 3D レンダリングを使用するか、あるいは専用グラフィックプロセッサ (DGP) を使って電力消費量の多い高性能な 3D レンダリングを使うか選ぶことができます。ユーザーがグラフィックプロファイルを選べるのは起動あるいはログイン時だけで、ユーザーセッションの実行中はどちらかに固定されます。GPU の切り替えは以下のような手順で行われます:
- ディスプレイをオフ
- DGP をオン
- マルチプレクサを切り替え
- IGP をオフ
- ディスプレイをオン
一時的に画面が非表示になるためスムーズな切り替えではありません。下のモデルのほうがユーザーフレンドリです。
動的な切り替えモデル
新しいハイブリッドグラフィック技術のほとんどは 基本的なスイッチングとして2つのグラフィックカードを使います。 しかし、今では DGP と IGP はフレームバッファに接続されていてハードウェアマルチプレクサがありません。 IGP は常にオンとなっており省電力と高性能レンダリングどちらが必要なのかにあわせて DGP のオンオフが切り替わります。 ほとんどの場合は DGP だけを使用するということはできず、ソフトウェアによって切り替えやレンダリングが制御されます。 ブート時に、Linux カーネルはビデオモードを使用して起動されて、低水準なグラフィックドライバーが設定されます。ほとんどの Linux ディストリビューションは X.org を使用してグラフィック環境を整えます。最後に、ログインマネージャやウィンドウマネージャなどの他のソフトウェアが起動します。このような階層的なシステムは単一のグラフィックカードを使用する場合を想定して設計されています。
ディスクリート GPU の完全な電源オフ
バッテリーの節約のためにグラフィックプロセッサーの電源をオフにしたい場合があるでしょう。この場合には以下の方法が可能です。
bbswitch の使用
NVidia GPU を使っている場合、 bbswitch を利用するとより安全に電源の制御が行えます。bbswitch は ディスクリート GPU を必要ないとき、あるいはブート時に自動的に無効化するため、正しい ACPI の呼び出しを行うカーネルパッケージで構成されています。
acpi_call の使用
bbswitch がサポートしない GPU を使っている場合、あるいは他の選択肢として、 acpi_call パッケージをインストールすることで手動で行うことができます。
パッケージをインストールしたらカーネルモジュールをロードしてください:
# modprobe acpi_call
カーネルモジュールをロードしたら次のスクリプトをダウンロードして、実行します:
https://raw.githubusercontent.com/mkottman/acpi_call/master/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 の電源を自動的にオフにする
上記のままでは 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 サーバ初期化後
いくつかのシステムでは、ディスクリート GPU を X サーバの初期化の前に電源オフにすることで、システムが停止するかもしれません。 このような場合、 X サーバの初期化が終わった後に GPU の電源を落すのがよいでしょう。これはいくつかのディスプレイマネージャでは可能で、例えば LightDM では、 display-setup-script seat configuration パラメータが root 権限で実行するスクリプトとして使えて、 GPU を無効化することができます。
System76
Some System76 laptops (like the Oryx Pro) have their own unique hybrid graphics option. To make use of it, install system76-powerAUR, enable the system76-power
service, and run system76-power graphics hybrid
.