NVIDIA Optimus
NVIDIA Optimus は、内蔵 GPU とディスクリート NVIDIA GPU をノート PC に組み込み、さらにノート PC からアクセスできるようにする技術です。
目次
- 1 利用可能な方法
- 2 内蔵グラフィックスのみを使う
- 3 NVIDIA グラフィックスのみを使う
- 4 切り替え可能なグラフィックスを使う
- 5 トラブルシューティング
- 5.1 ティアリング/垂直同期が機能しない
- 5.2 Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)
- 5.3 解像度や画面スキャンが正しく認識されず Xorg.log に EDID のエラーが表示される
- 5.4 解像度が間違っているが、EDID エラー無し
- 5.5 ロックアップ問題 (lspci がフリーズ)
- 5.6 ノート PC/NVIDIA Optimus で画面が見つからない
- 5.7 ランダムなフリーズ "(EE) NVIDIA(GPU-0): WAIT"
- 5.8 optimus-manager で "No Devices detected"
- 5.9 Xorg: マウスを動かしたときにだけ外部モニタが更新される
利用可能な方法
複数の方法が利用できます:
- #内蔵グラフィックスのみを使う - NVIDIA GPU は完全に電源オフになるので、消費電力を削減できます。
- #NVIDIA グラフィックスのみを使う - 内蔵グラフィックスよりも優れたパフォーマンスを発揮します。ただし、より多くの電力を消費します (これはモバイル端末においては喜ばしいことではありません)。この方法は、optimus-manager と nvidia-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 システムで動作するはずです。
内蔵グラフィックスのみを使う
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
と組み合わされます。
/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 も使えますが、UseEDID
と IgnoreEDID
は変更するようにしてください。
解像度が間違っているが、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 で報告することを検討してください)
ノート PC/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-manager
が BusID
を複数のノート PC モデルにマッピングしようとして、optimus-manager
によって生成されたファイルが壊れてしまうことがあります。
GUI のロードが終わらない黒画面が発生する場合や、GUI が部分的にロードされたがコンソールにアーティファクトが発生する場合、Xorg が (EE) - No Devices detected
でクラッシュする場合には、上流の github に回避策とバグレポートがあります.
Xorg: マウスを動かしたときにだけ外部モニタが更新される
この問題に対する回避策は、iGPU の Xorg ドライバをアンインストールすることです (例: xf86-video-amdgpu や xf86-video-intel) [6]。この方法は、外部モニタのポート (HDMI/DP/USB-C) が NVIDIA dGPU に直接接続されている限り、うまく行くはずです。