NVIDIA Optimus

提供: ArchWiki
2023年6月16日 (金) 18:37時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎Xorg: external monitor updates only when the mouse is moving: セクション名を翻訳)
ナビゲーションに移動 検索に移動

関連記事

NVIDIA Optimus は、内蔵 GPU とディスクリート NVIDIA GPU をノート PC に組み込み、さらにノート PC からアクセスできるようにする技術です。

利用可能な方法

複数の方法が利用できます:

  • #内蔵グラフィックスのみを使う - NVIDIA GPU は完全に電源オフになるので、消費電力を削減できます。
  • #NVIDIA グラフィックスのみを使う - 内蔵グラフィックスよりも優れたパフォーマンスを発揮します。ただし、より多くの電力を消費します (これはモバイル端末においては喜ばしいことではありません)。この方法は、optimus-managernvidia-xrun と同じ基本プロセスを利用しており、より自動化されたアプローチを取る前にトラブルシューティングや一般的な機能検証のためにこの方法を利用するべきです。
  • 両方を使う (必要なときに NVIDIA GPU を使用し、それ以外のときは電源を落として電力を節約する):
    • #PRIME レンダーオフロードを使う - NVIDIA が公式にサポートしている方法です。
    • #optimus-manager を使う - 1つのコマンドでグラフィックスを切り替えます (適用させるにはログインし直さなければなりません)。NVIDIA GPU の性能を最大限に引き出し、使用していない場合はオフにします。1.4 リリース以降では、AMD と NVIDIA の組み合わせもサポートされています。
    • #nvidia-xrun を使う - NVIDIA グラフィックスを使用して別の TTY で別の X セッションを実行します。NVIDIA GPU の性能を最大限に引き出し、使用していない場合はオフにします。
    • #Bumblebee を使う - 指定したアプリケーションに対しては NVIDIA グラフィックスを使用し、その他のアプリケーションに対しては Intel グラフィックスを使えるようにすることで、Windows ライクな機能を提供します。しかし、重大なパフォーマンスの問題を抱えています。
    • #switcheroo-control を使う - Bumblebee と似ていますが、特に GNOME ユーザ向けです。デスクトップエントリ内で専用 GPU を優先するかどうかを指定できるようになり、さらに右クリックメニューから手動で NVIDIA GPU でアプリケーションを実行できるようになります。
    • #nouveau を使う - (プロプライエタリな NVIDIA ドライバと比較して) パフォーマンスが劣っており、スリープやハイバネートの問題が発生することがあります。最新の NVIDIA GPU では動作しません。
    • #EnvyControl を使う - optimus-manager と似ていますが、多くの設定を必要とせず、バックグラウンドでデーモンを実行する必要もありませんし、GNOME を使用している場合でもパッチ適用済みの GDM バージョンをインストールする必要はありません。
    • #NVidia-eXec を使う - Bumblebee と似ていますが、パフォーマンスが低下することはありません。Xorg と Wayland の両方で動作します。このパッケージは実験的であり、現在、GNOME/GDM においてテストされています。
    • #nvidia-switch を使う - nvidia-xrun と似ていますが、TTY を変更する必要はありません。切り替えは、ディスプレイマネージャでログインとログアウトをすることにより、行われます。このパッケージは、Debian ベースのシステムでテストされていますが、nvidia-xrun のように、全ての Linux システムで動作するはずです。
ノート: これらのオプションはすべて相互に排他的です。1つの方法をテストして別の方法を選択する場合は、別の方法を試行する前に、1つの方法に従って行われた構成変更を必ず元に戻す必要があります。そうしないと、ファイルの競合や未定義の動作が発生する可能性があります。

内蔵グラフィックスのみを使う

GPU を切り替えることに興味はなく、特定の GPU のみを使いたい場合は、システムの BIOS で関連するオプションを確認してください。いずれかのカードを無効にするオプションがあるはずです。ラップトップによっては、ディスクリートカードを有効化したり無効化したりしかできないことがあります。とはいえ、どれかのカードだけを使用する予定であるかを確認することは、損ではありません。

BIOS で Nvidia グラフィックスを無効にできない場合は、Linux カーネル自体から無効にできます。ハイブリッドグラフィック#ディスクリート GPU の完全な電源オフ を参照してください。

レンダリングプロバイダを切り替えずに CUDA を使う

CUDA は、NVIDIA グラフィックスにレンダリングを切り替えることなく使用できます。CUDA アプリケーションを起動する前に、NVIDIA カードの電源が入っていることを確認するだけです。詳細については、ハイブリッドグラフィック#ディスクリート GPU の完全な電源オフ を参照してください。

これで、CUDA アプリケーションを起動すると、必要なすべてのカーネルモジュールが自動的にロードされます。CUDA の使用後に NVIDIA カードの電源を切る前に、まず nvidia カーネルモジュールをアンロードする必要があります:

# rmmod nvidia_uvm
# rmmod nvidia

NVIDIA グラフィックスのみを使う

プロプライエタリな NVIDIA ドライバは、プライマリレンダリングプロバイダとして設定することができます。NVIDIA#DRM カーネルモード設定 を有効化することによって prime sync を有効化しない限り、顕著なスクリーンティアリングの問題が発生します (詳細は [1] を参照)。ディスクリート GPU を使用することができ (2017年1月現在)、パフォーマンスにおいて nouveau ドライバよりも顕著な優位性を持っています。

まず、NVIDIA ドライバと xorg-xrandrインストールしてください。そして、/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf を設定してください。この設定ファイルのオプションは、このセットアップとの互換性を提供するために、パッケージによって提供されている /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf と組み合わされます。

ノート: セットアップによっては EDID ファイルによる nvidia ドライバーのディスプレイの値の自動検出がされなくなることがあります。回避策は #解像度や画面スキャンが正しく認識されず Xorg.log に EDID のエラーが表示される を見て下さい。
/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection

次に、~/.xinitrc の先頭に以下の2行を追加してください:

~/.xinitrc
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

そしてドライバをロードするために再起動し、X を起動させます。

ディスプレイの dpi が正しくない場合は以下の行を追加してください:

xrandr --dpi 96

X の起動時に黒画面が表示される場合、~/.xinitrc に記述した 2 つの xrandr コマンドの後にアンパサンド (アンド記号) がないことを確認してください。アンパサンドがある場合、xrandr コマンドが実行し終える前にウィンドウマネージャが起動してしまうことがあり、そうなると黒画面になってしまいます。

ディスプレイマネージャ

ディスプレイマネージャを使用する場合、~/.xinitrc を使うのではなく、使用しているディスプレイマネージャのディスプレイセットアップスクリプトを作成あるいは編集する必要があります。

LightDM

LightDM ディスプレイマネージャの場合:

/etc/lightdm/display_setup.sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

スクリプトに実行可能属性を付与してください。

次に、そのスクリプトを実行するように lightdm を設定します。/etc/lightdm/lightdm.conf 内の [Seat:*] セクションを編集してください:

/etc/lightdm/lightdm.conf
[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

そして、再起動し、ディスプレイマネージャを起動させてください。

SDDM

SDDM ディスプレイマネージャの場合 (SDDM は KDE のデフォルトのディスプレイマネージャです):

/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM

GDM ディスプレイマネージャの場合、2つの .desktop ファイルを新規作成してください:

/usr/share/gdm/greeter/autostart/optimus.desktop
/etc/xdg/autostart/optimus.desktop
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

GDM が X をデフォルトバックエンドとして使うように設定してください。

3D を確認する

NVIDIA グラフィックスが使用されているかどうかは、mesa-utils をインストールして次のコマンドを実行することで確認できます:

$ glxinfo | grep NVIDIA

詳細情報

詳細情報は、このトピックに関する NVIDIA の公式ページ [2] を見てください。

切り替え可能なグラフィックスを使う

PRIME レンダーオフロードを使う

これは、切替可能なグラフィックスをサポートする NVIDIA 公式の方法です。

詳細は PRIME#PRIME レンダーオフロード を参照してください。

nouveau を使う

グラフィックスの切り替えについては PRIME を、オープンソースな NVIDIA ドライバについては nouveau を参照してください。

Bumblebee を使う

Bumblebee を参照してください。

switcheroo-control を使う

PRIME#Gnome 統合 を参照してください。

nvidia-xrun を使う

nvidia-xrun を参照してください。

optimus-manager を使う

上流のドキュメント Optimus-manager を参照してください。Arch Linux システムにおけるインストールと設定方法の両方がカバーされています。

EnvyControl を使う

上流のドキュメント EnvyControl を参照してください。インストール方法と使用方法の両方がカバーされています。

NVidia-eXec を使う

上流のドキュメント NVidia-eXec を参照してください。インストール方法と使用方法の両方がカバーされています。

nvidia-switch を使う

上流のドキュメント nvidia-switch を参照してください。インストール方法と使用方法の両方がカバーされています。

トラブルシューティング

ティアリング/垂直同期が機能しない

DRM カーネルモード設定を有効化してください。これにより、PRIME 同期が有効化され、ティアリングが修正されます。

詳細は公式のフォーラムスレッドで確認できます。

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)

カーネルパラメータに rcutree.rcu_idle_gp_delay=1 を追加してください。オリジナルのトピックは [3][4] で確認できます。

解像度や画面スキャンが正しく認識されず Xorg.log に EDID のエラーが表示される

NVIDIA ドライバがディスプレイの EDID を検出できていないことが原因です。手動で EDID ファイルへのパスを指定するか、同じような方法で同一の情報を提供する必要があります。

EDID ファイルへのパスを指定するには Xorg.conf の NVIDIA カードの Device セクションを編集して、以下の記述を追加して適当にパスを置き換えてください:

/etc/X11/xorg.conf
Section "Device"
       	Option		"ConnectedMonitor" "CRT-0"
       	Option		"CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid"
	Option		"IgnoreEDID" "false"
	Option		"UseEDID" "true"
EndSection

Xorg が起動しない場合は、CRT という文字列を全て DFB に置き換えてみて下さい。 card0 は、LVDS でディスプレイに接続されている Intel カードの識別子です。edid バイナリはこのディレクトリに存在します。ハードウェアの構成が異なっている場合、CustomEDID の値も変わってくるので確認するようにしてください。どのような場合でも、パスは /sys/class/drm で始まります。

または、read-edid などのツールを使って edid を自分で作成して、作成したファイルを使うようにドライバーを設定することもできます。modelines も使えますが、UseEDIDIgnoreEDID は変更するようにしてください。

解像度が間違っているが、EDID エラー無し

nvidia-xconfig を使っていると、不適切な情報 (特に、利用可能な解像度を制限するモニタのリフレッシュレート) が xorg.conf 内に生成されてしまうことがあります。HorizSync/VertRefresh の行をコメントアウトしてみてください。これで解決するならば、この記事で言及していないその他すべての項目も削除できるでしょう。

ロックアップ問題 (lspci がフリーズ)

症状: lspci がハングする。システムのサスペンドが失敗する。シャットダウン時にハングする。optirun がハングする。

対象: GTX 965M やそれと似たようなカードを搭載した新しいノート PC で、bbswitch (例: Bumblebee 経由) や nouveau を使用している時。

dGPU 電源リソースがオンになっている場合、ACPI コードで失敗してフリーズが起こることがあります (カーネルバグ 156341)。

nouveau を使用している際に、ランタイムの電源管理を無効化すると、nouveau が電源状態を変更しなくなるため、この問題を回避できます。 ランタイムの電源管理を無効化するには、カーネルパラメータに nouveau.runpm=0 を追加してください。

モデル固有の既知の解決策については、この issue を見てください。 その他の場合、acpi_osi="!Windows 2015"acpi_osi=! acpi_osi="Windows 2009"カーネルパラメータに追加して起動することで解決することもあります。(あなたのノート PC を先の issue で報告することを検討してください)

laptop/NVIDIA Optimus で画面が見つからない

以下のような出力がないか調べてください:

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation Device 0df4 (rev a1)

NVIDIA ドライバ 319.12 Beta [5] と Linux カーネル 3.9 以降では、NVIDIA ドライバは Optimus のサポートを提供します。

他の解決策は、Intel ドライバをインストールして、Intel ドライバにスクリーンを処理させることです。3D ソフトウェアを使用したい場合は、Bumblebee を使ってそのソフトウェアを実行し、NVIDIA カードを使うようにソフトウェアに指示する必要があります。

ランダムなフリーズ "(EE) NVIDIA(GPU-0): WAIT"

内蔵 AMD カードを搭載していて、専用 NVIDIA カードのみを使用するように設定している環境でプロプライエタリな (NVIDIA) ドライバを使用していると、最大 10 秒フリーズし、Xorg のログに以下のエラーが出力されると報告されています:

[   219.796] (EE) NVIDIA(GPU-0): WAIT (2, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)
[   226.796] (EE) NVIDIA(GPU-0): WAIT (1, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)

これはまだ根本的な原因ではありませんが、内蔵カードと専用カードが Xorg とやり取りする過程で競合が発生することと関連があるようです。

回避策は、切り替え可能なグラフィックスを使うことです。詳細は PRIME#PRIME レンダーオフロード を参照してください。

optimus-manager で "No Devices detected"

lspci が pci ドメインを最初の出力列に出力してしまい、optimus-managerBusID を複数のノート PC モデルにマッピングしようとして、optimus-manager によって生成されたファイルが壊れてしまうことがあります。

GUI のロードが終わらない黒画面が発生する場合や、GUI が部分的にロードされたがコンソールにアーティファクトが発生する場合、Xorg が (EE) - No Devices detected でクラッシュする場合には、上流の github に回避策とバグレポートがあります.

Xorg: マウスを動かしたときにだけ外部モニタが更新される

この問題に対する回避策は、iGPU の Xorg ドライバをアンインストールすることです (例: xf86-video-amdgpuxf86-video-intel) [6]。この方法は、外部モニタのポート (HDMI/DP/USB-C) が NVIDIA dGPU に直接接続されている限り、うまく行くはずです。

ヒント: デスクトップの挙動が奇妙になる場合があります (例: 仮想デスクトップを切り替えたり、Alt-Tab を使用したときに外部モニタの画像がフリーズするなど)。これは、ノート PC のモニタを無効化することで回避できます。
翻訳ステータス: このページは en:NVIDIA Optimus の翻訳バージョンです。最後の翻訳日は 2023-06-16 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。