NVIDIA Optimus
NVIDIA Optimus は、内蔵 GPU とディスクリート NVIDIA GPU をノート PC に組み込み、さらにノート PC からアクセスできるようにする技術です。
利用可能な方法
複数の方法が利用できます:
- #内蔵グラフィックスのみを使う - NVIDIA GPU は完全に電源オフになるので、消費電力を削減できます。
- #NVIDIA グラフィックスのみを使う - 内蔵グラフィックスよりも優れたパフォーマンスを発揮します。ただし、より多くの電力を消費します (これはモバイル端末においては喜ばしいことではありません)。この方法は、optimus-manager と nvidia-xrun と同じ基本プロセスを利用しており、より自動化されたアプローチを取る前にトラブルシューティングや一般的な機能検証のためにこの方法を利用するべきです。
- 両方を使う (必要なときに NVIDIA GPU を使用し、それ以外のときは電源を落として電力を節約する):
- #PRIME render offload を使う - 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 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.