NVIDIA Optimus
NVIDIA Optimus は Intel の内蔵 GPU とディスクリートの NVIDIA GPU をノートパソコンに組み込んで利用できるようにする技術です。
いくつかの方法
- インテルのグラフィックスのみを使用 -NVIDIA GPU の電源は完全にオフになるため、消費電力を節約できます。
- nvidia のみを使用 -インテルグラフィックスよりもパフォーマンスは向上しますが、より多くのバッテリを消費します (モバイルデバイスには適していません) 。これは、 [切り替え可能なグラフィックスを使用#optimus-managerを使用する] および nvidia-xrun オプションと同じ基本プロセスを利用しており、より自動化されたアプローチの1つを選択する前に、一般的な機能のトラブルシューティングおよび検証する必要があります。
- 両方を使用する (必要に応じて NVIDIA GPU を使用し、電源を切ったままにして電力を節約する) :
- PRIME render offloadを使用 -NVIDIA が公式にサポートしている方法です。
- optimus-manager の使用 -1つのコマンドでグラフィックスを切り替えます (有効にするにはログアウトとログインが必要です) NVIDIA GPU の性能を最大限に引き出し、使用していない場合はオフにします。1.4リリース以降では、AMD と NVIDIA の組み合わせもサポートされています。
- nvidia-xrun を使用 -NVIDIA グラフィックスを使用して別の TTY で別の X セッションを実行します。NVIDIA GPU の性能を最大限に引き出し、使用していない場合はオフにします。
- Bumblebee の使用 -インテルのグラフィックスを他のすべてのものに使用しながら、選択したアプリケーションをNVIDIA のグラフィックスで実行できるようにすることで、Windows に似た機能を提供します。しかし、パフォーマンスに重大な問題があります。
- nouveau を使用 -独自の NVIDIA ドライバと比較してパフォーマンスが低く、スリープと休止状態で問題が発生する可能性があります。最新の NVIDIA GPU では動作しません。
インテルのグラフィックスのみを使用
特定の GPU のみに切り替えずに使用する場合は、システムの BIOS でオプションを確認してください。いずれかのカードを無効にするオプションがあるはずです。ラップトップによっては、個別のカードを無効にすることしかできない場合や、その逆の場合がありますが、カードのうちの1つだけを使用する予定があるかどうかを確認してください。
BIOS が Nvidia グラフィックスを無効にできない場合は、Linux カーネル自体から無効にできます。ハイブリッドグラフィック#ディスクリート GPU の完全な電源オフ を参照してください。
レンダリングプロバイダを切り替えずに CUDA を使用
CUDA は、NVIDIA グラフィックスにレンダリングを切り替えることなく使用できます。CUDA アプリケーションを起動する前に、NVIDIA カードの電源が入っていることを確認するだけです。詳細については、 ハイブリッドグラフィック#ディスクリート GPU の完全な電源オフ を参照してください。
これで、CUDA アプリケーションを起動すると、必要なすべてのカーネルモジュールが自動的にロードされます。CUDA の使用後に NVIDIA カードの電源を切る前に、まず nvidia
カーネルモジュールをアンロードする必要があります。
#rmmod nvidia_uvm #rmmod NVIDIA
CUDA のみで NVIDIA を利用
レンダリングを NVIDIA 側で行わなくとも CUDA が利用できます。CUDA アプリケーションの起動前に NVIDIA GPU に電源を入れておけば、アプリケーションの起動時に必要なカーネルモジュールが読み込まれます。
なお、終了後 NVIDIA GPU の電源を切る前には、nvidia_uvm
と nvidia
カーネルモジュールをアンロードしておいてください。
# rmmod nvidia_uvm # rmmod nvidia
ハイブリッドグラフィック#ディスクリート GPU の完全な電源オフ も参照してください。
nvidia グラフィックのみを使用
プロプライエタリの NVIDIA ドライバーは nouveau ドライバーのような動的な切り替えはサポートしていません (つまり NVIDIA デバイスしか使用できません)。また、NVIDIA は画面にティアリングが発生する問題を認識していますが未だに修正がなされていません。そのかわり、ディスクリート GPU を利用して nouveau ドライバーよりも高い性能を発揮することができます (2017年1月現在)。
まず nvidia と xorg-xrandr パッケージをインストールしてください。
そして、xorg.conf
を設定します。NVIDIA カードの PCI アドレスを知る必要があるので、次のコマンドを実行してください:
$ lspci | grep -E "VGA|3D"
NVIDIA と書かれた行の最初の7文字が PCI アドレスです。例えば 01:00.0
などと表記されます。xorg.conf
では #:#:#
という形式で表記する必要があります。例えば 01:00.0
の場合 1:0:0
となります。
/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
に記述した xrandr
コマンドの後にアンパサンドがないことを確認してください。アンパサンドがある場合、xrandr
コマンドが実行し終える前にウィンドウマネージャが起動してしまうことがあり、そうなると黒画面になってしまいます。
アンパサンドがないのに黒画面になる場合、下の #別の設定 を見て下さい。
別の設定
リリース 1.17.1 から、上記の設定を使っていて Xorg-server がクラッシュするようになった場合、/etc/X11/xorg.conf
の Intel デバイスのセクションを以下のように修正してください:
# nano /etc/X11/xorg.conf
Section "Device" Identifier "intel" Driver "modesetting" BusID "PCI:0:2:0" Option "AccelMethod" "sna" #Option "TearFree" "True" #Option "Tiling" "True" #Option "SwapbuffersWait" "True" EndSection
上の設定と同じように、BusID
は lspci コマンドの出力にあわせて置き換えてください。Intel という文字列が含まれた "VGA compatible controller" の行を検索してください。例:
$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
X を起動しても画面に何も表示されない場合、/var/log/xorg.conf
に以下のような行がないか確認してください:
/var/log/xorg.conf
[ 16112.937] (EE) Screen 1 deleted because of no matching config section.
存在する場合、/etc/X11/xorg.conf
の ServerLayout セクションを変更することで問題が解決するかもしれません:
/etc/X11/xorg.conf
Section "ServerLayout" Identifier "layout" Screen 1 "nvidia" Inactive "intel" EndSection
ディスプレイマネージャ
ディスプレイマネージャを使用する場合、~/.xinitrc
の代わりにディスプレイマネージャのディスプレイ設定スクリプトを作成・編集する必要があります。
LightDM
LightDM ディスプレイマネージャの場合:
/etc/lightdm/display_setup.sh
#!/bin/sh xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
スクリプトに実行可能属性を付与:
# chmod +x /etc/lightdm/display_setup.sh
/etc/lightdm/lightdm.conf
の [Seat:*]
セクションを編集してスクリプトを実行するように lightdm を設定:
/etc/lightdm/lightdm.conf
[Seat:*] display-setup-script=/etc/lightdm/display_setup.sh
再起動して、ディスプレイマネージャが起動するのを確認してください。
SDDM
SDDM ディスプレイマネージャの場合:
/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
GDM
GDM ディスプレイマネージャの場合 .desktop
ファイルを作成します:
/usr/share/gdm/greeter/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 が Xorg バックエンドを使うようになっているか確認してください。
KDM
KDE の KDM の場合、/usr/share/config/kdm/Xsetup
に xrandr の行を追加してください。
3D の確認
NVIDIA グラフィックが使われているかどうかは mesa-demos をインストールして次のコマンドを実行することで確認できます:
$ glxinfo | grep NVIDIA
詳細情報
詳しい情報は、NVIDIA の公式ページ [2] を見て下さい。
トラブルシューティング
垂直同期が機能せずティアリングが発生する
解決するには 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" は変更するようにしてください。
ロックアップ問題 (lspci がフリーズ)
GTX 965M が搭載された最新のノートパソコンで (Bumblebee などで) bbswitch や nouveau を使ったときに lspci がフリーズしたり、サスペンドが失敗したり、シャットダウン時に止まってしまったり、optirun でフリーズが発生することがあります。
dGPU 電源リソースがオンになっている場合、ACPI コードで失敗してフリーズが起こることがあります (カーネルバグ 156341)。
解決方法については こちら を見てください。また、acpi_osi="!Windows 2015"
や acpi_osi=! acpi_osi="Windows 2009"
をカーネルパラメータに追加して起動することで解決することもあります。
切り替え可能なグラフィックスを使用
PRIME レンダリングオフロードを使用する
これは、切り替え可能なグラフィックスをサポートする公式の NVIDIA メソッドです。
詳細については、 PRIME#PRIME render offload を参照してください。
nouveau を使う
グラフィックスイッチングについては PRIME を、オープンソースの NVIDIA ドライバについては nouveau を参照してください。
Bumblebee を使用
Bumblebee を参照してください。
nvidia-xrun を使用する
nvidia-xrun を参照してください。
optimus-managerを使用する
Optimus-manager アップストリームのドキュメントを参照してください。Arch Linux システムでのインストールと設定の両方について説明します。