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

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

関連記事

ハイブリッドグラフィックスは同一のコンピュータで2つのグラフィックカードを動作させるというコンセプトです。ノート PC の製造業者たちは、性能と電力消費量の異なる2つのグラフィックカードを単一のコンピュータ上で使用する技術を開発しました。ハイブリッドグラフィックスでは、専用 GPU (ディスクリート GPU) を非アクティブにしておいて、統合 GPU よりも 3D 描画パフォーマンスが要求される場合にアクティブ化させることで、高パフォーマンスなユースケースと省電力なユースケースの両方をサポートするように開発されています。

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

ノート: あなたの環境が 2010 年より前のものでない限り、システムは動的切り替えモデルを使用している可能性が高いです。以前のハイブリッドグラフィクスのソリューションでは、効果を発揮させるために再起動か、再ログインが必要なグラフィックスタック全体の再起動が必要でした。

動的切り替え

新しいハイブリッドグラフィック技術のほとんどは2つのグラフィクカードを使用します: 専用 GPU と統合 GPU はフレームバッファに接続されていて、ハードウェアのマルチプレクサは存在しません。統合 GPU は常にオンになっており、省電力と構成のレンダリングのどちらが必要とされているのかに合わせて 専用 GPU はオン/オフが切り替えられます。ほとんどの場合、専用 GPU のみを使用するための方法は存在せず、GPU のオン/オフとレンダリングは全てソフトウェアによって制御されます。

起動時に Linux カーネルは、あるビデオモードを使って起動し、アプリケーションによって使用される低レベルなグラフィックドライバをセットアップします。そして、ほとんどの Linux ディストリビューションは X.org を使用してグラフィク環境を整えます。最後に、いくつかの他のソフトウェアが起動されます: 最初にログインマネージャで、その次にウィンドウマネージャと言った具合です。このような階層的なシステムは、単一のグラフィックカードを使用する場合を想定して設計されています。

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

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

バッテリー節約のために高性能なグラフィックプロセッサをオフにしたい場合があるでしょう。

BIOS/UEFI を使う

一部のノート PC のメーカーは、BIOS または UEFI に専用カードのオン/オフのためのオプションを提供しています。

udev ルールを使う

まず、ディスプレイマネージャ設定から NVIDIA に関する設定を全て取り除いてください。

以下のファイルを作成して nouveau ドライバをブラックリストに追加してください:

/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

そして、以下のルールを追加してください:

/etc/udev/rules.d/00-remove-nvidia.rules
# Remove NVIDIA USB xHCI Host Controller devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"

# Remove NVIDIA USB Type-C UCSI devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"

# Remove NVIDIA Audio devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"

# Remove NVIDIA VGA/3D controller devices
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", ATTR{power/control}="auto", ATTR{remove}="1"

再起動し、lspci を実行して NVIDIA GPU が存在しているか確認してください。

bbswitch を使う

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

ノート: カーネル 4.8 以降、PCI-E ポート電源管理の方法では bbswitch は機能しません。詳細は Bumblebee#カーネル 4.8 で電源管理が機能しない を参照してください。

acpi_call を使う

bbswitch によってサポートされていない GPU においては、acpi_call パッケージで同じことを手動で行うことができます。

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

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

# modprobe acpi_call

カーネルモジュールをロードしたら、/usr/share/acpi_call/examples/turn_off_gpu.sh スクリプトを実行してください。

このスクリプトは、既知のデータバスを全て走査し、それらの電源を切ろうと試みます。この際、以下のように出力されます:

# /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 を無効化した後に、システムのハイバーネートやサスペンドで問題があった場合には、適切な 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 を無効化することができます。

System76

一部の System76 ラップトップ(Oryx Pro など)には独自のハイブリッドグラフィックオプションがあります。これを使うには、system76-powerAUR をインストールし、system76-power.service サービスを有効化して、system76-power graphics hybrid を実行してください。

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

まず、system76-power grahics integrated を実行し再起動して、統合グラフィックスモードで動作させてください。統合モードになったら、system76-power graphics power off を実行してディスクリートグラフィックスカードの電源を落としてください。このコマンドは永続的ではなく、起動する度に実行する必要があります。

翻訳ステータス: このページは en:Hybrid graphics の翻訳バージョンです。最後の翻訳日は 2023-08-24 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。