ハイブリッドグラフィック

提供: ArchWiki
ナビゲーションに移動 検索に移動

ハイブリッドグラフィックは同一のコンピュータで2つのグラフィックカードを動作させるというコンセプトです。一つのコンピュータで二つのグラフィックカードを使用して、高いパフォーマンスと省電力の両方を達成する新しいテクノロジーとして、ノートパソコンのメーカーによって開発されました。

様々なテクノロジーが存在し、問題を解決するために個々のメーカーによって独自の方法が開発されています。このテクノロジーは Windows ではしっかりとサポートされていますが、Linux ディストリビューションでは未だ実験的な段階です。このページでは、それぞれのアプローチとモデルについて軽く説明し、そして GNU/Linux システムのサポートがないことに対するコミュニティによるソリューションを紹介します。

第一世代のハイブリッドモデル (ベーシックな切り替え)

ノート: 10年以上前のノートパソコンでない限り、大抵の場合は動的切り替えが使われます。

ハイブリッドグラフィックの第一世代のノートパソコンではハードウェアマルチプレクサ (MUX) を使用していました。内蔵グラフィックプロセッサ (IGP) による省電力ながらローレベルな 3D レンダリングを使用するか、あるいは専用グラフィックプロセッサ (DGP) を使って電力消費量の多い高性能な 3D レンダリングを使うか選ぶことができます。ユーザーがグラフィックプロファイルを選べるのは起動あるいはログイン時だけで、ユーザーセッションの実行中はどちらかに固定されます。GPU の切り替えは以下のような手順で行われます:

  • ディスプレイをオフ
  • DGP をオン
  • マルチプレクサを切り替え
  • IGP をオフ
  • ディスプレイをオン

一時的に画面が非表示になるためスムーズな切り替えではありません。下のモデルのほうがユーザーフレンドリです。

動的な切り替えモデル

ノート: 2016年現在、ほとんどのメーカーはこちらのモデルを使っています。

新しいハイブリッドグラフィック技術のほとんどは 基本的なスイッチングとして2つのグラフィックカードを使います。 しかし、今では DGP と IGP はフレームバッファに接続されていてハードウェアマルチプレクサがありません。 IGP は常にオンとなっており省電力と高性能レンダリングどちらが必要なのかにあわせて DGP のオンオフが切り替わります。 ほとんどの場合は DGP だけを使用するということはできず、ソフトウェアによって切り替えやレンダリングが制御されます。 ブート時に、Linux カーネルはビデオモードを使用して起動されて、低水準なグラフィックドライバーが設定されます。ほとんどの Linux ディストリビューションは X.org を使用してグラフィック環境を整えます。最後に、ログインマネージャやウィンドウマネージャなどの他のソフトウェアが起動します。このような階層的なシステムは単一のグラフィックカードを使用する場合を想定して設計されています。

ノート: NVIDIA のプロプライエタリドライバーを使用するハイブリッドグラフィックについては NVIDIA OptimusBumblebee を読んでください。他のハイブリッドグラフィック (AMD Radeon を使用する場合や Nouveau ドライバーで NVIDIA のカードを使う場合) については PRIME を読んでください。

ディスクリート GPU の完全な電源オフ

バッテリーの節約のためにグラフィックプロセッサーの電源をオフにしたい場合があるでしょう。この場合には以下の方法が可能です。

bbswitch の使用

NVidia GPU を使っている場合、 bbswitch を利用するとより安全に電源の制御が行えます。bbswitch は ディスクリート GPU を必要ないとき、あるいはブート時に自動的に無効化するため、正しい ACPI の呼び出しを行うカーネルパッケージで構成されています。

acpi_call の使用

bbswitch がサポートしない GPU を使っている場合、あるいは他の選択肢として、 acpi_call パッケージをインストールすることで手動で行うことができます。

ヒント: 公式リポジトリに含まれていないカーネルを使っている場合、代わりに acpi_call-dkms を使ってください。DKMS も見てください。

パッケージをインストールしたらカーネルモジュールをロードしてください:

# 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 を無効化した後に、システムのハイバーネートやサスペンドで問題があった場合には、適切な acpi_call を送出して有効化させることを試して下さい。こちらも参照してください サスペンド/リジューム サービスファイル
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 を無効化することができます。