NVIDIA/ヒントとテクニック

提供: ArchWiki
ナビゲーションに移動 検索に移動

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

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 出力を使う

Wikibooks:NVIDIA/TV-OUT を見てください。

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

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

強制的に NVIDIA が DFP を使用するようにするには、EDID のコピーをファイルシステムのどこかに保存して、X がTV/DFP から EDID を読み込まずにそのファイルをパースできるようにします。

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.bin"

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 を全く使わず (例: Wayland を実行している場合やヘッドレスサーバの場合) GPU から直接温度を読み込むことができる nvidia-smi を使います。 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

参照: https://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 カードの温度センサーにはアクセスできません。

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

オーバークロックと冷却

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

警告: オーバークロックによってハードウェアに永久的な損傷が発生するかもしれません。警告しましたよ。
ノート:
  • rootless モードで Xorg サーバを実行している場合、オーバークロックの設定は適用できません。Xorg を root として実行することを検討してください。
  • DRM カーネルモードセッティングを有効にすると Coolbits の値に関わらずオーバークロックができなくなる場合があります。

オーバークロックは Device セクションの Coolbits オプションによって制御されます。これにより、サポートされない様々な機能を有効化できます:

Option "Coolbits" ""
ヒント: Coolbits オプションは、Xorg の設定ファイルを操作する nvidia-xconfig を使って簡単に設定できます:
# nvidia-xconfig --cool-bits=value

Coolbits の値は2進数の構成ビットを足し合わせたものです。構成ビットは以下のとおりです:

  • 1 (ビット0) - nvidia-settingsClock Frequencies ページで古い(Fermi以前)コアをオーバークロックできるようにします。
  • 2 (ビット1) - このビットがセットされると、ドライバは「ビデオメモリの容量が異なる複数の GPU を使用するときに SLI の初期化を試みます。」
  • 4 (ビット2) - nvidia-settingsThermal Monitor ページで GPU ファンの速度を手動設定できるようにします。
  • 8 (ビット3) - nvidia-settingsPowerMizer ページでオーバークロック出来るようにします。Fermi や Fermi より新しいアーキテクチャでバージョン 337.12 から利用可能です。[1]
  • 16 (ビット4) - nvidia-settings の CLI のオプションを使ってオーバーボルテージできるようにします。Fermi や Fermi より新しいアーキテクチャでバージョン 346.16 から利用可能です。[2]

複数の機能を有効化するには Coolbits の値に上記の値を足し合わせてください。例えば、Fermi コアのオーバークロックとオーバーボルテージを有効化する場合は Option "Coolbits" "24" をセットします。

Coolbits に関するドキュメントは /usr/share/doc/nvidia/html/xconfigoptions.htmlここにあります。

ノート: 別の手段としては DOS(推奨) 内から、あるいは nvflashNiBiTor 6.0 を Win32 環境内で使って、GPU BIOS を編集しリフラッシュするというものがあります。BIOS をフラッシュする利点は電圧制限を上げられることだけでなく、一般に Coolbit のようなソフトウェアオーバークロッキングの方法で安定性が向上することです。Fermi BIOS modification tutorial

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

この記事またはセクションは情報が古くなっています。
理由: RegistryDwords は Xorg の設定ファイルで無視されるようになりました。 (Discuss)

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

Option "RegistryDwords" "PerfLevelSrc=0x2222"

最高パフォーマンスモードへの変更を許可する

この記事またはセクションの正確性には問題があります。
理由: このセクションでは GPU boost について説明しており、上記のオーバークロックの話題とは関係ありません。nvidia-smi(1) の man ページには 「Kepler+ ファミリの Tesla デバイスや Maxwell ベースの Geforce Titan 用」と書かれてあります。そして Lahwaacz 氏が知る限り、これをサポートし、最大に等しいデフォルトクロックを持たない GPU は Tesla K40 のみです[3]。Pascal アーキテクチャ以降、Boost 3.0 は自動クロック制御を異なる方法で処理します。 (議論: トーク:NVIDIA/ヒントとテクニック#)

nvidia-settings でパフォーマンスモードを変更してもメモリレートをオーバークロックしてもほとんど影響を及ぼしません。以下を試してください:

  • Coolbit を 24 や 28 にセットし、Powermizer RegistryDwords を削除して X を再起動。
  • Clock と Memory レートの最大値を見つけだす。(起動後にあなたの gfx カードで報告されているものよりも低くなる可能性があります!):
    $ nvidia-smi -q -d SUPPORTED_CLOCKS
  • GPU 0 のレートを設定する:
    # nvidia-smi -i 0 -ac memratemax,clockratemax

レートを最大に設定した後、パフォーマンスモードが nvidia-settings で利用でき、グラフィックスクロックとメモリ転送レートをオーバークロックできます。

オーバークロックの設定を保存する

通常、nvidia-settings インターフェイスで設定したクロックと電圧のオフセットは保存されず、再起動すると消えてしまいます。幸い、プロプライエタリドライバにおいてオーバークロック用のインターフェイスを提供し、ユーザのオーバークロック設定を保存することが可能で、起動時に自動的に設定を適用するツールがあります。以下にその一部を挙げます:

  • gweAUR - グラフィカル。デスクトップセッションの開始時に設定を適用します。
  • nvclockAURsystemd-nvclock-unitAUR - グラフィカル。システムの起動時に設定を適用します。
  • nvocAUR - テキストベース。プロファイルは /etc/nvoc.d/ 下の設定ファイルです。デスクトップセッション開始時に設定を適用します。

あるいは、GPUGraphicsClockOffset 属性と GPUMemoryTransferRateOffset 属性を起動時に nvidia-settings のコマンドラインインターフェイスでセットすることができます。例えば:

$ nvidia-settings -a "GPUGraphicsClockOffset[performance_level]=offset"
$ nvidia-settings -a "GPUMemoryTransferRateOffset[performance_level]=offset"

performance_level は最も高いパフォーマンスレベルとなります。マシンに複数の GPU が存在する場合、GPU ID を指定する必要があります: [gpu:gpu_id]GPUGraphicsClockOffset[performance_level]=offset

カスタムの TDP 制限

最近の NVIDIA グラフィックカードは TDP と温度が制限内に収まるように周波数を調整します。パフォーマンスを上げるために TDP 制限を変更できます。これにより温度が上昇し、電力消費量が増加するでしょう。

例えば、電力制限を 160.30W に設定するには:

# nvidia-smi -pl 160.30

(ドライバの永続化なしで)電力制限を起動時に設定するには:

/etc/systemd/system/nvidia-tdp.timer
[Unit]
Description=Set NVIDIA power limit on boot

[Timer]
OnBootSec=5

[Install]
WantedBy=timers.target
/etc/systemd/system/nvidia-tdp.service
[Unit]
Description=Set NVIDIA power limit

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -pl 160.30

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

nvidia-settings のコンソールインターフェイスを使ってグラフィックカードのファンの速度を調整することができます。まず、Xorg 設定の Coolbits オプションでビット2を有効化していることを確認してください。

ノート: 現在 GeForce 400/500 シリーズのカードではこの方法を使ってログイン時にファンの速度を設定することはできません。この方法では nvidia-settings を使って現在の X セッション内でファンのスピードを変更することしかできません。

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

nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=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 に置き換わっています [4]

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

$ nvidia-xconfig --enable-all-gpus
$ nvidia-xconfig --cool-bits=4
ノート: 一部のラップトップ(ThinkPad X1 ExtremeP51/P52 を含む)においては、2つのファンがあるものの、どちらも nvidia によって制御されません。

カーネルモジュールパラメータ

一部のオプションはカーネルモジュールパラメータから設定できます。パラメータの完全なリストは modinfo nvidia を実行するか nv-reg.h を見てください。Gentoo:NVidia/nvidia-drivers/ja#カーネルモジュールのパラメーター も見てください。

例えば、以下を有効化するとカーネルモードセッティング(上記を参照)が有効になり、さらに PAT 機能 [5] が有効になります。PAT 機能はメモリの割り当て方に影響を及ぼします。PAT は Pentium III に初めて導入され [6]、それよりも新しい CPU の殆どでサポートされています(wikipedia:Page attribute table#Processors を参照)。あなたのシステムでこの機能がサポートされている場合、パフォーマンスが向上するはずです。

/etc/modprobe.d/nvidia.conf
options nvidia-drm modeset=1 
options nvidia NVreg_UsePageAttributeTable=1

一部のノートパソコンでは NVIDIA の設定を有効化するために以下のオプションを含めなければなりません。さもないと "Setting applications clocks is not supported" などと表示されます。

/etc/modprobe.d/nvidia.conf
options nvidia NVreg_RegistryDwords="OverrideMaxPerf=0x1"

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

デフォルトでは、システムのサスペンドと復帰時に NVIDIA の Linux ドライバーは必須のビデオメモリの割り当てのみを保存し復元します。NVIDIA 曰く ([7]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 カーネルモジュールを NVreg_PreserveVideoMemoryAllocations=1 オプションでロードし、nvidia-suspend.servicenvidia-hibernate.service有効化してください。

ノート:
  • デフォルトでは、ビデオメモリの内容は (tmpfs である) /tmp に保存されます。NVIDIA は、最高のパフォーマンスを得るために他のファイルシステムを使うことを推奨しています。また、/tmp のサイズがメモリの容量に対して不十分である場合も、他のファイルシステムを使う必要があります: NVreg_TemporaryFilePath オプションで別の場所を指定してください (例えば、NVreg_TemporaryFilePath=/var/tmp)。
  • ビデオメモリの内容を保存するファイルシステムは、無名一時ファイルをサポートし (例えば、ext4 や XFS)、かつビデオメモリの割り当てを保存するのに十分な容量がある必要があります (つまり、すべての NVIDIA GPU のメモリ容量合計の 1.05 倍以上)。コマンド nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits を使えば、システム上のすべての GPU ビデオメモリの容量を一覧表示できます。

変更を永続化させるには、以下のファイルを作成してください:

/etc/modprobe.d/nvidia-power-management.conf
options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/path/to/tmp-nvidia

/proc/driver/nvidia/suspend とのやり取りは、単純な Unix シェルスクリプトである /usr/bin/nvidia-sleep.sh によって行われます。このスクリプト自体は systemd のようなツールによって呼び出されます。nvidia-utils パッケージには、次のサービスが同梱されています (本質的には nvidia-sleep.sh を呼び出すだけです): nvidia-suspend.servicenvidia-hibernate.servicenvidia-resume.service

ノート: NVIDIA の指示に反して、現在 nvidia-resume.service を有効化する必要はありません (それどころか、有効化するのは恐らく良いアイデアではありません)。その理由は、/usr/lib/systemd/system-sleep/nvidia スクリプトがそのサービスと同じことをするからです (ただし、より早い段階で)。このスクリプトはデフォルトで有効化されています (Systemd がこれをサスペンドから復帰したあとで呼び出します)。nvidia-suspend.servicenvidia-hibernate.service の両方/一方は有効化してください。ただし、GDM で Wayland を使用している場合は、nvidia-resume.service も有効化してください。

ドライバーの持続

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

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


翻訳ステータス: このページは en:NVIDIA/Tips and tricks の翻訳バージョンです。最後の翻訳日は 2022-11-30 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。