NVIDIA/ヒントとテクニック

提供: ArchWiki
2022年3月21日 (月) 11:54時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎サスペンド後にビデオメモリを保持する: 翻訳を修正)
ナビゲーションに移動 検索に移動

ターミナルの解像度を修正する

nouveau からドライバーを変えた場合、起動時のターミナルが低解像度で表示されるようになることがあります。

GRUB を使用している場合、GRUB/ヒントとテクニック#フレームバッファの解像度を設定するを見てください。

systemd-boot を使用している場合、esp/EFI/loader/loader.conf 内で console-mode を設定してください。詳しくは systemd-boot#ローダー設定 をご覧ください。

rEFInd を使用している場合、esp/EFI/refind/refind.conf/etc/refind.d/refind.conf に以下を追加してください(後者のファイルは任意ですが、両方に追加することを推奨します):

use_graphics_for linux

ちょっとした注意事項としては、これによりブート中にカーネルパラメータが表示されなくなります。

TV 出力を使う

TV 出力については こちら に良い記事があります。

X で TV (DFP) を唯一のディスプレイとして使う

モニターが検出されないと X サーバーは自動的に CRT-0 にフォールバックします。これは DVI で接続した TV をメインディスプレイとして使っている際、TV の電源がオフになっていたり切断されているのに X を起動したときに問題になります。

NVIDIA に強制的に DFP を使わせるには、EDID のコピーをファイルシステムのどこかに保存して TV/DFP の EDID のかわりに X が保存したファイルを読み込むようにしてください。

EDID を取得するには、nvidia-settings を起動します。ツリー形式で情報が表示されますが、今は設定は無視して GPU を選択し ("GPU-0" などという名前が付いているエントリを選択してください)、DFP セクションをクリックして (例: DFP-0)、Acquire Edid ボタンをクリックしてファイルをどこかに保存してください (例: /etc/X11/dfp0.edid)。

フロントエンドにマウスやキーボードが接続されていない場合、コマンドラインを使って EDID を取得することもできます。EDID ブロックも出力するように引数を指定して X サーバーを起動します:

$ startx -- -logverbose 6

X サーバーの初期化が完了したら、サーバーを閉じて /var/log/Xorg.0.log にログファイルがあるか確認してください。nvidia-xconfig を使って EDID ブロックを抽出できます:

$ nvidia-xconfig --extract-edids-from-file=/var/log/Xorg.0.log --extract-edids-output-file=/etc/X11/dfp0.bin

xorg.conf を編集して Device セクションに以下を追加:

Option "ConnectedMonitor" "DFP"
Option "CustomEDID" "DFP-0:/etc/X11/dfp0.edid"

ConnectedMonitor オプションはドライバーに強制的に DFP を認識させます。CustomEDID にはデバイスの EDID データを指定してください。TV/DFP が接続されているかのように X が起動するようになります。

ブート時に自動的にディスプレイマネージャを起動して適切な X ディスプレイが設定されてから TV の電源を入れることができます。

上記の変更でうまくいかない場合、xorg.conf の中の Device セクションで Option "ConnectedMonitor" "DFP" を削除して以下の行を追加してみてください:

Option "ModeValidation" "NoDFPNativeResolutionCheck"
Option "ConnectedMonitor" "DFP-0"

NoDFPNativeResolutionCheck を設定することで NVIDIA はネイティブ解像度に適合しないモードも無効化しなくなります。

ヘッドレス (モニターなし) 解像度

ヘッドレスモードでは解像度は VNC や Steam Link で利用される 640x480 に落ちます。より高い解像度(例えば、1920x1080)で開始するには、xorg.conf 内の Screen サブセクションの下にある Virtual エントリ で指定します:

Section "Screen"
   [...]
   SubSection     "Display"
       Depth       24
       Virtual     1920 1080
   EndSubSection
EndSection
ヒント: ヘッドレスモードは扱いづらく、エラーが発生しがちかもしれません。例えば、ヘッドレスモードではデスクトップ環境や nvidia-utils は解像度を変更するためのグラフィカルな手段を提供しません。解像度の設定を容易にするためには、ポートにモニターが接続されているように見せかける、ダミーの DP や HDMI アダプターを使うことができます。そうすれば、VNC や Steam Link のようなリモートセッションを使って、解像度を普通に変更できます。

電源を確認

NVIDIA の X.org ドライバーを使って GPU の現在の電源を検出することもできます。現在の電源を表示するには、読み取り専用パラメータの 'GPUPowerSource' をチェックしてください (0 - AC, 1 - バッテリー):

$ nvidia-settings -q GPUPowerSource -t
1

ACPI イベントを Listen する

NVIDIA ドライバーは自動的に acpid デーモンに接続して、バッテリー電源やドッキング、ホットキーなどの ACPI イベントを listen します。接続が失敗した場合、X.org は以下のような警告を出力します:

~/.local/share/xorg/Xorg.0.log
NVIDIA(0): ACPI: failed to connect to the ACPI event daemon; the daemon
NVIDIA(0):     may not be running or the "AcpidSocketPath" X
NVIDIA(0):     configuration option may not be set correctly.  When the
NVIDIA(0):     ACPI event daemon is available, the NVIDIA X driver will
NVIDIA(0):     try to use it to receive ACPI event notifications.  For
NVIDIA(0):     details, please see the "ConnectToAcpid" and
NVIDIA(0):     "AcpidSocketPath" X configuration options in Appendix B: X
NVIDIA(0):     Config Options in the README.

上記の警告は完全に無害ですが、/etc/X11/xorg.conf.d/20-nvidia.confConnectToAcpid オプションを無効にすることでメッセージを消すことができます:

Section "Device"
  ...
  Driver "nvidia"
  Option "ConnectToAcpid" "0"
  ...
EndSection

ノートパソコンを使っている場合、acpid デーモンをインストールして有効化することを推奨します。

GPU の温度をシェルに表示する

GPU の温度を確認する方法は3つあります。nvidia-settings は X を使用する必要があります。X を使っていない場合は nvidia-sminvclock による方法を使って下さい。また、nvclock は GeForce 200 シリーズのカードや Zotac IONITX の 8800GS などの内蔵 GPU など新しい NVIDIA カードでは機能しません。

nvidia-settings

GPU の温度をシェルに表示するには、以下のように nvidia-settings を使って下さい:

$ nvidia-settings -q gpucoretemp

このコマンドを使うと以下のように出力されます:

Attribute 'GPUCoreTemp' (hostname:0.0): 41.
'GPUCoreTemp' is an integer attribute.
'GPUCoreTemp' is a read-only attribute.
'GPUCoreTemp' can use the following target types: X Screen, GPU.

上記の場合、ボードの GPU 温度は 41 C になります。

rrdtoolconky などのユーティリティで使うために温度だけを表示したいときは:

$ nvidia-settings -q gpucoretemp -t
41

nvidia-smi

X を全く使わず GPU から直接温度を読み込むことができる nvidia-smi を使います。サーバーマシンの場合や Wayland を使っている場合はこちらの方法を推奨します。GPU の温度をシェルに表示するには、以下のように nvidia-smi を使って下さい:

$ nvidia-smi

このコマンドを使うと以下のように出力されます:

$ nvidia-smi
Fri Jan  6 18:53:54 2012       
+------------------------------------------------------+                       
| NVIDIA-SMI 2.290.10   Driver Version: 290.10         |                       
|-------------------------------+----------------------+----------------------+
| Nb.  Name                     | Bus Id        Disp.  | Volatile ECC SB / DB |
| Fan   Temp   Power Usage /Cap | Memory Usage         | GPU Util. Compute M. |
|===============================+======================+======================|
| 0.  GeForce 8500 GT           | 0000:01:00.0  N/A    |       N/A        N/A |
|  30%   62 C  N/A   N/A /  N/A |  17%   42MB /  255MB |  N/A      Default    |
|-------------------------------+----------------------+----------------------|
| Compute processes:                                               GPU Memory |
|  GPU  PID     Process name                                       Usage      |
|=============================================================================|
|  0.           ERROR: Not Supported                                          |
+-----------------------------------------------------------------------------+

温度だけ見るには:

$ nvidia-smi -q -d TEMPERATURE

====NVSMI LOG====

Timestamp                           : Sun Apr 12 08:49:10 2015
Driver Version                      : 346.59

Attached GPUs                       : 1
GPU 0000:01:00.0
    Temperature
        GPU Current Temp            : 52 C
        GPU Shutdown Temp           : N/A
        GPU Slowdown Temp           : N/A

rrdtoolconky などのユーティリティで使うために温度だけを取得したいときは:

$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits
52

参照: http://www.question-defense.com/2010/03/22/gpu-linux-shell-temp-get-nvidia-gpu-temperatures-via-linux-cli

nvclock

AUR から利用できる nvclockAUR を使います。

ノート: nvclock は Geforce 200 シリーズなどの新しい NVIDIA カードの温度センサーにはアクセスできません。

たまに nvclock と nvidia-settings/nv-control が報告する温度が食い違うことがあります。nvclock の作者 (thunderbird) による この投稿 によると、nvclock の値のほうが正確なようです。

ログイン時にファンの速度を設定する

nvidia-settings' のコンソールインターフェイスを使ってグラフィックカードのファンの速度を調整することができます。まずは Xorg 設定の Device セクションで Coolbits オプションを 45、または 12 (fermi 以上) に設定してファンコントロールを有効にしてください:

Option "Coolbits" "4"
ノート: GeForce 400/500 シリーズのカードではこの方法を使ってログイン時にファンの速度を設定することはできません。

Xorg が起動した時にファンを調整するには以下の行を xinitrc ファイルに記述します。n は設定したいファンの速度のパーセンテージに置き換えて下さい。

nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUCurrentFanSpeed=n"

GPU とファンの番号を増やすことで二番目の GPU を設定することもできます。

nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUCurrentFanSpeed=n" \
                -a "[gpu:1]/GPUFanControlState=1" -a  [fan:1]/GPUCurrentFanSpeed=n" &

GDMKDM などのログインマネージャを使用している場合、デスクトップエントリファイルを作成して設定をさせることもできます。~/.config/autostart/nvidia-fan-speed.desktop を作成してその中に以下のテキストを入力してください。n は速度のパーセンテージに置き換えて下さい。

[Desktop Entry]
Type=Application
Exec=nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUCurrentFanSpeed=n"
X-GNOME-Autostart-enabled=true
Name=nvidia-fan-speed
ノート: ドライバーのバージョン 349.16 から、GPUCurrentFanSpeedGPUTargetFanSpeed に置き換わっています [1]

複数のグラフィックカードのファン速度を調整できるようにしたい場合、以下のコマンドを実行:

$ nvidia-xconfig --enable-all-gpus
$ nvidia-xconfig --cool-bits=4

手動設定

設定ファイルを編集することで (自動設定GUI では有効にできない) 設定を変更することができます。変更を反映するには Xorg サーバーを再起動させる必要があります。

オプションの詳しい説明は NVIDIA Accelerated Linux Graphics Driver README and Installation Guide を見てください。

起動時のロゴを無効にする

Device セクションの下に "NoLogo" オプションを追加してください:

Option "NoLogo" "1"

モニターの検出を上書きする

Device セクションの下に "ConnectedMonitor" オプションを追加することで X サーバーの起動時のモニター検出を上書きすることができます。それによって起動時間を大幅に早くすることが可能です。利用可能なオプション: "CRT" (アナログ接続), "DFP" (デジタルモニター), "TV" (テレビ)。

以下の設定をすることで NVIDIA ドライバーは起動時のチェックを迂回しモニターを DFP と認識します:

Option "ConnectedMonitor" "DFP"
ノート: ディスプレイがフラットパネルだとしても15ピンの VGA 接続をしている場合は "CRT" を使ってください。"DFP" は DVI, HDMI, DisplayPort などのデジタル接続で使用します。

輝度調整を有効にする

Device セクションの下に追加してください:

Option "RegistryDwords" "EnableBrightnessControl=1"

上記のオプションで輝度のコントロールが機能しない場合、nvidia-bl-dkmsAUR をインストールしてください。

ノート: nvidia-bl-dkmsAUR をインストールすると /sys/class/backlight/nvidia_backlight/ インターフェイスでバックライトの明るさを制御できるようになりますが、依然としてシステムが /sys/class/backlight/acpi_video0/ でバックライトの制御をしようとするかもしれません。そのような場合、inotifywait などで acpi_video0/brightness を監視して、変化があったら nvidia_backlight/brightness に値を書き込むようにしてください。バックライト#sysfs を変更しても明るさが変更されないを参照。

SLI を有効にする

警告:
  • 2011年5月7日現在、SLI を有効にすると GNOME 3 で動画パフォーマンスが落ちます。
  • GTX 10xx シリーズ (1080, 1070, 1060 など) では 2-way SLI しか対応していません。CUDA/OpenCL アプリケーションでは 3-way や 4-way の SLI をすることもできますが、OpenGL アプリケーションでは大抵の場合上手く行きません。

NVIDIA ドライバーの README の Appendix B より: このオプションはサポートされている環境で SLI レンダリングの設定をコントロールします。「サポートされている環境」とは SLI 対応のマザーボードを搭載し SLI 対応の GeForce GPU が2枚か3枚刺さっているコンピューターのことです。詳しくは NVIDIA の SLI Zone を見て下さい。

まず lspci を使って一番目の GPU の PCI Bus ID を確認してください:

$ lspci | grep VGA
03:00.0 VGA compatible controller: nVidia Corporation G92 [GeForce 8800 GTS 512] (rev a2)
05:00.0 VGA compatible controller: nVidia Corporation G92 [GeForce 8800 GTS 512] (rev a2)

Device セクションの下に BusID を追加してください (上記の例では3):

BusID "PCI:3:0:0"
ノート: 指定するときの形式は重要です。BusID の値は "PCI:<BusID>:0:0" と指定してください。

使用したい SLI レンダリングモードの値を Screen セクションの下に追加してください:

Option "SLI" "AA"

以下の表は利用できるレンダリングモードを示しています。

挙動
0, no, off, false, Single レンダリングの際には単一の GPU だけを使用。
1, yes, on, true, Auto SLI を有効にしてドライバーに適切なレンダリングモードを自動で選択させる。
AFR SLI を有効にして alternate フレームレンダリングモードを使用する。
SFR SLI を有効にして split フレームレンダリングモードを使用する。
AA SLI を有効にして SLI アンチエイリアスを使用する。これをフルシーンアンチエイリアスと一緒に使うことで見栄えが良くなります。

もしくは、nvidia-xconfig ユーティリティを使って、コマンドによって xorg.conf に変更を挿入することもできます:

# nvidia-xconfig --busid=PCI:3:0:0 --sli=AA

シェルから SLI モードが有効になっているか確認するには:

$ nvidia-settings -q all | grep SLIMode
  Attribute 'SLIMode' (arch:0.0): AA 
    'SLIMode' is a string attribute.
    'SLIMode' is a read-only attribute.
    'SLIMode' can use the following target types: X Screen.
警告: SLI を有効にした後、xorg の起動時にシステムがフリーズしたり反応しなくなることがあります。再起動する前にディスプレイマネージャを無効にすることを推奨します。

オーバークロックを有効にする

警告: オーバークロックはハードウェアにダメージを与える可能性があり、このページの著者はメーカーによって決められた仕様の範囲外で製品を扱うことについて何も責任を負えないので注意してください。

GPU やメモリのオーバークロックは Device セクションの Coolbits オプションによって制御され、サポートされない機能が使えるようになります:

Option "Coolbits" "value"
ヒント: Coolbits オプションは Xorg の設定ファイルを変更する nvidia-xconfig で簡単に変えることができます: # nvidia-xconfig --cool-bits=value

Coolbits の値は2進法でビットを立てた合計になります。それぞれのビットの意味は:

  • 1 (ビット 0) - (Fermi 以前の) 古いコアで nvidia-settingsClock Frequencies ページからオーバークロックできるようになります。
  • 2 (ビット 1) - このビットが設定されると、ドライバーは GPU を使う際に様々な量のビデオメモリで SLI を初期化しようとします。
  • 4 (ビット 2) - GPU のファンの速度の手動設定が nvidia-settingsThermal Monitor ページで可能になります。
  • 8 (ビット 3) - Fermi 以降の新しいコアで nvidia-settingsPowerMizer ページからオーバークロックできるようになります。バージョン 337.12 から使えるようになりました [2]
  • 16 (ビット 4) - Fermi 以降の新しいコアで nvidia-settings の CLI オプションを使って電圧アップができるようになります。バージョン 346.16 から使えるようになりました [3]

複数の機能を有効にするには、合計した Coolbits の値を追加します。例えば、オーバークロックと Fermi コアの電圧アップを有効にするには、Option "Coolbits" "24" と設定します。

Coolbits のドキュメントは /usr/share/doc/nvidia/html/xconfigoptions.html にあります。Coolbits に関するドライバーバージョン 355.11 のドキュメントはオンラインで こちら から見ることができます。

ノート: An alternative is to edit and reflash the GPU BIOS either under DOS (preferred), or within a Win32 environment by way of nvflash[リンク切れ 2013-05-25] and NiBiTor 6.0[リンク切れ 2013-05-25]. The advantage of BIOS flashing is that not only can voltage limits be raised, but stability is generally improved over software overclocking methods such as Coolbits. Fermi BIOS modification tutorial

静的な 2D/3D クロックを設定する

以下の文字列を Device セクションに設定すると PowerMizer がパフォーマンス最高レベルで有効になります (この行がないと VSync が動作しません):

Option "RegistryDwords" "PerfLevelSrc=0x2222"

サスペンド後にビデオメモリを保持する

デフォルトではシステムのサスペンドと復帰時に NVIDIA の Linux ドライバーは必須のビデオメモリの割り当てのみを保存し復元します。NVIDIA 曰く ([4]nvidia-utils パッケージをインストールすると /usr/share/doc/nvidia/html/powermanagement.html でも読めます): 結果として生じる、ビデオメモリの内容の消失はユーザスペースの NVIDIA ドライバーや一部のアプリケーションによって部分的に補われます。しかし、電源管理サイクルの終了時にレンダリングの破損やアプリケーションのクラッシュなどの機能不全が発生する可能性があります。

まだ 実験的な システムではすべてのビデオメモリを保存することが可能です(ディスクかメインメモリ上に十分なスペースが与えられた場合)。インターフェイスは次のように /proc/driver/nvidia/suspend を介します: 通常の Linux の /sys/power/state ファイルに書き込む直前には "suspend" (または "hibernate") を /proc/driver/nvidia/suspend に書き込みます。復帰した直後か、サスペンドやハイバネートへの移行に失敗した後には /proc/driver/nvidia/suspend に "resume" を書き込みます。

NVIDIA ドライバーはデータの保管場所としてユーザ定義のファイルシステムに依存しています。そのファイルシステムでは無名の一時ファイルがサポートされ(ext4 はこれをサポートします)、ビデオメモリの割り当てを保持するのに十分な容量がある必要があります(例えば、(すべての NVIDIA GPUs のビデオメモリ容量の合計) * 1.02 以上)。コマンド nvidia-smi -q -d MEMORY を使えば、システム上のすべての GPU ビデオメモリの容量を一覧表示できます。

システムがスリープしている間にビデオメモリの内容を保持するファイルシステムを選ぶ(そして、すべてのビデオメモリ割り当てを保存し保持するデフォルトの方法を変更する)ためには、2つのオプションを "nvidia" カーネルモジュールに渡す必要があります。例えば、以下の行を /etc/modprobe.d/nvidia-power-management.conf に書き込んで再起動します:

options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/tmp-nvidia

"/tmp-nvidia" の部分はお好きなファイルシステム内のパスに自由に置き換えてください。

/proc/driver/nvidia/suspend とのやり取りは単純な Unix シェルスクリプトである /usr/bin/nvidia-sleep.sh によって行われます。このスクリプト自体は Systemd のようなツールによって呼び出されます。Arch Linux の nvidia-utils パッケージには次の関連する Systemd サービスが同梱されています(本質的には nvidia-sleep.sh を呼び出すだけです): nvidia-suspend, nvidia-hibernate, nvidia-resume。NVIDIA の指示に反して、現在 nvidia-resume を有効化する必要はありません(それどころか、有効化するのは恐らく良いアイデアではありません)。その理由は、/usr/lib/systemd/system-sleep/nvidia スクリプトが nvidia-resume サービスと同じことをするからです(ただし、より早い段階で)。このスクリプトは規定で有効化されています(Systemd がこれをサスペンドから復帰したあとで呼び出します)。nvidia-suspendnvidia-hibernate の両方/一方は有効化してください。

ドライバーの持続

NVIDIA はブート時に任意で実行できるデーモンを用意しています。標準的な単一GPU X desktop 環境では持続デーモンは必要ではなく、むしろ問題を引き起こします[5]。詳細については NVIDIA ドキュメントの Driver Persistence 章をご覧ください。

ブート時に持続デーモンを開始するには nvidia-persistenced.service有効化してください。手動での使用については上流のドキュメントをご覧ください。