NVIDIA Optimus

提供: ArchWiki
2023年6月16日 (金) 17:57時点におけるAshMyzk (トーク | 投稿記録)による版 (リンクを修正)
ナビゲーションに移動 検索に移動

関連記事

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 render offload を参照してください。

nouveau を使う

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

Bumblebee を使用

Bumblebee を参照してください。

nvidia-xrun を使用する

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

optimus-manager を使用する

Optimus-manager アップストリームのドキュメントを参照してください。Arch Linux システムでのインストールと設定の両方の説明があります。

EnvyControl を使用する

アップストリームのドキュメント EnvyControl を参照してください。インストール方法と使い方の説明があります。

NVidia-eXec を使用する

アップストリームのドキュメント NVidia-eXec を参照してください。インストール方法と使い方の説明があります。

nvidia-switch を使用する

アップストリームのドキュメント nvidia-switch を参照してください。インストール方法と使い方の説明があります。

トラブルシューティング

垂直同期が機能せずティアリングが発生する

解決するには xorg-server 1.19 以上、linux カーネル 4.5 以上、nvidia 370.23 以上が必須です。NVIDIA#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 を追加してください。詳しくは こちら を参照。

解像度や画面スキャンが正しく認識されず 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 は intel カードの識別子でディスプレイは LVDS で接続されています。edid バイナリはこのディレクトリに存在します。ハードウェアの構成が異なっている場合、CustomEDID の値も変わってくるので確認するようにしてください。パスの先頭の /sys/class/drm は変わらないはずです。

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

Wrong resolution without EDID errors

Using nvidia-xconfig, incorrect information might be generated in Xorg.conf and in particular wrong monitor refresh rates that restruct the possible resolutions. Try commenting out the HorizSync/VertRefresh lines. If this helps, you can probably also remove everything else not mentioned in this article.

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

GTX 965M が搭載された最新のノートパソコンで (Bumblebee などで) bbswitch や nouveau を使ったときに lspci がフリーズしたり、サスペンドが失敗したり、シャットダウン時に止まってしまったり、optirun でフリーズが発生することがあります。

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

解決方法については こちら を見てください。また、acpi_osi="!Windows 2015"acpi_osi=! acpi_osi="Windows 2009"カーネルパラメータに追加して起動することで解決することもあります。

No screens found on a laptop/NVIDIA Optimus

Check if $ lspci | grep VGA outputs something similar to:

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 drivers now offer Optimus support since 319.12 Beta [3] with kernels above and including 3.9.

Another solution is to install the Intel driver to handle the screens, then if you want 3D software you should run them through Bumblebee to tell them to use the NVIDIA card.