「NVIDIA/ヒントとテクニック」の版間の差分
同期 |
同期 |
||
| (同じ利用者による、間の1版が非表示) | |||
| 4行目: | 4行目: | ||
[[ru:NVIDIA/Tips and tricks]] |
[[ru:NVIDIA/Tips and tricks]] |
||
[[zh-hans:NVIDIA/提示和技巧]] |
[[zh-hans:NVIDIA/提示和技巧]] |
||
メインの記事は [[NVIDIA]] です。 |
|||
== ターミナルの解像度を修正する == |
== ターミナルの解像度を修正する == |
||
[[NVIDIA#fbdev]] がデフォルトで有効であるため、[[Linux コンソール]]は追加の設定無しでモニタのネイティブな解像度を使用するはずです。 |
|||
nouveau からドライバーを変えた場合、起動時のターミナルが低解像度で表示されるようになることがあります。 |
|||
{{ic|fbdev}} を無効化していたり、古いドライバを使用していたりする場合は、解像度が予想より小さい場合があります。回避策として、[[ブートローダー]]の設定で解像度を設定することができます。 |
|||
GRUB を使用している場合、[[GRUB/ヒントとテクニック#フレームバッファの解像度を設定する]]を見てください。 |
GRUB を使用している場合、[[GRUB/ヒントとテクニック#フレームバッファの解像度を設定する]]を見てください。 |
||
| 24行目: | 25行目: | ||
== X で TV (DFP) を唯一のディスプレイとして使う == |
== X で TV (DFP) を唯一のディスプレイとして使う == |
||
モニターが自動的に検出されない場合、X サーバーは |
モニターが自動的に検出されない場合、X サーバーは何かしらのデフォルトの解像度 (通常であれば 640x480) にフォールバックします。これは、DVI/HDMI/DisplayPort 接続の TV をメインディスプレイとして使用していて TV がオフまたは切断されているときに X が起動すると問題になります。 |
||
NVIDIA に正しい解像度を強制するには、EDID のコピーをファイルシステムのどこかに保存して、X がディスプレイから EDID を読み込まずにそのファイルをパースできるようにします。 |
|||
EDID を取得するには、nvidia-settings を起動します。ツリー形式で情報が表示されますが、今は設定は無視して GPU を選択し (対応するエントリは |
EDID を取得するには、{{ic|nvidia-settings}} を起動します。ツリー形式で情報が表示されますが、今は設定は無視して GPU を選択し (対応するエントリは ''GPU-0'' などのような名前であるはずです)、''DFP'' セクションをクリックして (''DFP-0'' などのような名前です)、''Acquire Edid...'' ボタンをクリックしてファイルをどこかに保存してください (例: {{ic|/etc/X11/dfp0.edid}})。 |
||
フロントエンドにマウスやキーボードが接続されていない場合、コマンドラインを使って EDID を取得することもできます。EDID ブロックも出力するように引数を指定して X サーバーを起動します: |
フロントエンドにマウスやキーボードが接続されていない場合、コマンドラインを使って EDID を取得することもできます。EDID ブロックも出力するように引数を指定して X サーバーを起動します: |
||
$ startx -- -logverbose 6 |
$ startx -- -logverbose 6 |
||
X サーバーの初期化が完了したら、サーバーを閉じて {{ic|/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 |
|||
X サーバーが初期化を完了したら、サーバーを閉じ、''nvidia-xconfig'' を使って [[Xorg#一般|Xorg のログファイル]]から EDID ブロックを抽出してください: |
|||
{{ic|xorg.conf}} を編集して {{ic|Device}} セクションに以下を追加: |
|||
Option "ConnectedMonitor" "DFP" |
|||
Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin" |
|||
{{ic|ConnectedMonitor}} オプションはドライバーに強制的に DFP を認識させます。{{ic|CustomEDID}} にはデバイスの EDID データを指定してください。TV/DFP が接続されているかのように X が起動するようになります。 |
|||
$ nvidia-xconfig --extract-edids-from-file ~/.local/share/xorg/Xorg.0.log --extract-edids-output-file ./dfp0.bin |
|||
ブート時に自動的にディスプレイマネージャを起動して適切な X ディスプレイが設定されてから TV の電源を入れることができます。 |
|||
Xorg の設定で以下を {{ic|Device}} セクションに追加してください: |
|||
Option "ModeValidation" "NoDFPNativeResolutionCheck" |
|||
Option "ConnectedMonitor" "DFP-0" |
|||
{{hc|/etc/X11/xorg.conf.d/20-nvidia.conf| |
|||
{{ic|NoDFPNativeResolutionCheck}} を設定することで NVIDIA はネイティブ解像度に適合しないモードも無効化しなくなります。 |
|||
Option "ConnectedMonitor" "DFP" |
|||
Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin" |
|||
}} |
|||
{{ic|ConnectedMonitor}} オプションはドライバーに強制的に DFP を認識させます。{{ic|CustomEDID}} にはデバイスの EDID データを指定してください。TV/DFP が接続されているかのように X が起動するようになります。 |
|||
ブート時に自動的にディスプレイマネージャを起動して適切な X ディスプレイが設定されてから TV の電源を入れることができます。 |
|||
== ヘッドレス (モニターなし) 解像度 == |
== ヘッドレス (モニターなし) 解像度 == |
||
| 185行目: | 187行目: | ||
{{Note| |
{{Note| |
||
* rootless モードで Xorg サーバを実行している場合、オーバークロックの設定は適用できません。[[Xorg#root として Xorg を実行|Xorg を root として実行]]することを検討してください。 |
* rootless モードで Xorg サーバを実行している場合、一部のオーバークロックの設定は適用できません。[[Xorg#root として Xorg を実行|Xorg を root として実行]]することを検討してください。 |
||
* ''nvidia-settings'' は root として実行する必要があるかもしれません。 |
|||
* DRM カーネルモードセッティングを有効にすると Coolbits の値に関わらずオーバークロックができなくなる場合があります。}} |
|||
* DRM カーネルモードセッティングを有効にすると Coolbits の値に関わらずオーバークロックができなくなる場合があります。 |
|||
}} |
|||
オーバークロックは {{ic|Device}} セクション |
ドライバのバージョンによっては、一部のオーバークロック機能がデフォルトで有効になっています。一部のサポートされていないオーバークロック機能は {{ic|Device}} セクションで ''Coolbits'' オプションで有効化する必要があります: |
||
Option "Coolbits" "''値''" |
Option "Coolbits" "''値''" |
||
| 196行目: | 200行目: | ||
''Coolbits'' の値は2進数の構成ビットを足し合わせたものです。構成ビットは以下のとおりです: |
''Coolbits'' の値は2進数の構成ビットを足し合わせたものです。構成ビットは以下のとおりです: |
||
* {{ic| |
* {{ic|8}} (ビット3) - ''nvidia-settings'' の ''PowerMizer'' ページの追加のオーバークロック機能を有効化します。Fermi や Fermi より新しいアーキテクチャでバージョン 337.12 から利用可能です。[https://www.phoronix.com/scan.php?px=MTY1OTM&page=news_item] |
||
* {{ic|2}} (ビット1) - このビットがセットされると、ドライバは「ビデオメモリの容量が異なる複数の GPU を使用するときに SLI の初期化を試みます。」 |
|||
* {{ic|4}} (ビット2) - ''nvidia-settings'' の ''Thermal Monitor'' ページで GPU ファンの速度を手動設定できるようにします。 |
|||
* {{ic|8}} (ビット3) - ''nvidia-settings'' の ''PowerMizer'' ページでオーバークロックできるようにします。Fermi や Fermi より新しいアーキテクチャでバージョン 337.12 から利用可能です。[https://www.phoronix.com/scan.php?px=MTY1OTM&page=news_item] |
|||
* {{ic|16}} (ビット4) - ''nvidia-settings'' の CLI のオプションを使ってオーバーボルテージできるようにします。Fermi や Fermi より新しいアーキテクチャでバージョン 346.16 から利用可能です。[https://www.phoronix.com/scan.php?page=news_item&px=MTg0MDI] |
* {{ic|16}} (ビット4) - ''nvidia-settings'' の CLI のオプションを使ってオーバーボルテージできるようにします。Fermi や Fermi より新しいアーキテクチャでバージョン 346.16 から利用可能です。[https://www.phoronix.com/scan.php?page=news_item&px=MTg0MDI] |
||
サポートされていないバージョンのドライバを使用している場合は、以下のビットも使用する必要があるかもしれません: |
|||
* {{ic|1}} (ビット0) - ''nvidia-settings'' の ''Clock Frequencies'' ページで古い(Fermi以前)コアをオーバークロックできるようにします。バージョン 343.13 で削除されました。 |
|||
* {{ic|2}} (ビット1) - このビットがセットされると、ドライバは「ビデオメモリの容量が異なる複数の GPU を使用するときに SLI の初期化を試みます。」バージョン 470.42.01 で削除されました。 |
|||
* {{ic|4}} (ビット2) - ''nvidia-settings'' の ''Thermal Monitor'' ページで GPU ファンの速度を手動設定できるようにします。バージョン 470.42.01 で削除されました。 |
|||
複数の機能を有効化するには ''Coolbits'' の値に上記の値を足し合わせてください。例えば、Fermi コアのオーバークロックとオーバーボルテージを有効化する場合は {{ic|Option "Coolbits" "24"}} をセットします。 |
複数の機能を有効化するには ''Coolbits'' の値に上記の値を足し合わせてください。例えば、Fermi コアのオーバークロックとオーバーボルテージを有効化する場合は {{ic|Option "Coolbits" "24"}} をセットします。 |
||
''Coolbits'' に関するドキュメントは {{ic|/usr/share/doc/nvidia/html/xconfigoptions.html}} と[https://download.nvidia.com/XFree86/Linux-x86_64/ |
''Coolbits'' に関するドキュメントは {{ic|/usr/share/doc/nvidia/html/xconfigoptions.html}} と[https://download.nvidia.com/XFree86/Linux-x86_64/575.64/README/xconfigoptions.html#Coolbits ここ]にあります。 |
||
{{Note| 別の手段としては DOS(推奨) 内から、あるいは [https://www.techpowerup.com/download/nvidia-nvflash/ nvflash] と [https://www.guru3d.com/files-details/nvidia-bios-editor-download-nibitor.html NiBiTor 6.0] を Win32 環境内で使って、GPU BIOS を編集しリフラッシュするというものがあります。BIOS をフラッシュする利点は電圧制限を上げられることだけでなく、一般に Coolbit のようなソフトウェアオーバークロッキングの方法で安定性が向上することです。[https://ivanvojtko.blogspot.sk/2014/03/how-to-overclock-geforce-460gtx-fermi.html Fermi BIOS modification tutorial]}} |
{{Note| 別の手段としては DOS(推奨) 内から、あるいは [https://www.techpowerup.com/download/nvidia-nvflash/ nvflash] と [https://www.guru3d.com/files-details/nvidia-bios-editor-download-nibitor.html NiBiTor 6.0] を Win32 環境内で使って、GPU BIOS を編集しリフラッシュするというものがあります。BIOS をフラッシュする利点は電圧制限を上げられることだけでなく、一般に Coolbit のようなソフトウェアオーバークロッキングの方法で安定性が向上することです。[https://ivanvojtko.blogspot.sk/2014/03/how-to-overclock-geforce-460gtx-fermi.html Fermi BIOS modification tutorial]}} |
||
| 218行目: | 225行目: | ||
=== GPU のブーストクロックを下げる === |
=== GPU のブーストクロックを下げる === |
||
[https://nouveau.freedesktop.org/CodeNames.html# |
[https://nouveau.freedesktop.org/CodeNames.html#NV140 Volta (NV140/GVXXX)] GPU 及びそれ以降では、クロックブーストが異なる方法で動作します。最大クロックはブート時に、サポートされている最も高い制限値に設定されます。これが望ましい動作である場合は、設定は必要ありません。 |
||
これの欠点は、電力効率が低いことです。クロックが上がると、安定性のために電圧を上げる必要があります。その結果として、電力消費量、発熱、ファンの音量が非線形的に増加します。なので、ブーストクロックの制限を下げることで、電力効率を上げることができます。 |
これの欠点は、電力効率が低いことです。クロックが上がると、安定性のために電圧を上げる必要があります。その結果として、電力消費量、発熱、ファンの音量が非線形的に増加します。なので、ブーストクロックの制限を下げることで、電力効率を上げることができます。 |
||
ブーストクロックの制限は nvidia-smi を使用して変更できます: |
ブーストクロックの制限は ''nvidia-smi'' を使用して変更できます: |
||
* サポートされているクロックレートを表示: {{bc|$ nvidia-smi -q -d SUPPORTED_CLOCKS}} |
* サポートされているクロックレートを表示: {{bc|$ nvidia-smi -q -d SUPPORTED_CLOCKS}} |
||
| 228行目: | 235行目: | ||
* メモリのブーストクロックの制限を 5001 MHz に設定: {{bc|1=# nvidia-smi --lock-memory-clocks=0,5001}} |
* メモリのブーストクロックの制限を 5001 MHz に設定: {{bc|1=# nvidia-smi --lock-memory-clocks=0,5001}} |
||
電力効率の最適化をするには、ゲームをプレイしながら nvidia-smi で GPU 使用率を確認してください。VSync はオンにしておく必要があります。ブーストクロックの制限を下げると、GPU 使用率が増加します。遅い GPU では、各フレームを描画するのにより長い時間がかかるからです。GPU 使用率が 100% になり、かつ、カクつきが発生しない程度にまでクロックを下げれば、効率は最大になります。このとき、各フレームはリフレッシュレートを維持するのにちょうど十分なほど高速に描画できていることになります。 |
電力効率の最適化をするには、ゲームをプレイしながら ''nvidia-smi'' で GPU 使用率を確認してください。VSync はオンにしておく必要があります。ブーストクロックの制限を下げると、GPU 使用率が増加します。遅い GPU では、各フレームを描画するのにより長い時間がかかるからです。GPU 使用率が 100% になり、かつ、カクつきが発生しない程度にまでクロックを下げれば、効率は最大になります。このとき、各フレームはリフレッシュレートを維持するのにちょうど十分なほど高速に描画できていることになります。 |
||
例として、RTX 3090 Ti でデフォルトから上記の設定に変更した場合、Hitman 3 を 4K 60 FPS でプレイしたところ、電力消費量が 30% 減少し、温度は 75 度から 63 度に、ファンの速度は 73% から 57% に低下しました。 |
例として、RTX 3090 Ti でデフォルトから上記の設定に変更した場合、Hitman 3 を 4K 60 FPS でプレイしたところ、電力消費量が 30% 減少し、温度は 75 度から 63 度に、ファンの速度は 73% から 57% に低下しました。 |
||
| 248行目: | 255行目: | ||
=== カスタムの TDP 制限 === |
=== カスタムの TDP 制限 === |
||
{{Accuracy|It seems that not all cards support this. Among the 3 cards available to me: a desktop 3080 Ti, a mobile 1650 MaxQ, and a mobile 500 Ada, this only worked on the 3080 Ti; on the two laptops I got "not supported for GPU" warnings. Is this feature unavailable for mobile GPUs?}} |
|||
最近の NVIDIA グラフィックカードは TDP と温度が制限内に収まるように周波数を調整します。パフォーマンスを上げるために TDP 制限を変更できます。これにより温度が上昇し、電力消費量が増加するでしょう。 |
最近の NVIDIA グラフィックカードは TDP と温度が制限内に収まるように周波数を調整します。パフォーマンスを上げるために TDP 制限を変更できます。これにより温度が上昇し、電力消費量が増加するでしょう。 |
||
| 280行目: | 289行目: | ||
=== ログイン時にファンの速度を設定する === |
=== ログイン時にファンの速度を設定する === |
||
{{Accuracy|GPU のファン速度を手動設定するには (たとえ Xorg が root として実行されていたとしても) ''nvidia-settings'' を root として実行する必要があるため、以下の方法はうまく行きません。}} |
|||
''nvidia-settings'' のコンソールインターフェイスを使ってグラフィックカードのファンの速度を調整することができます。まず、Xorg 設定の [[#nvidia-settings からオーバークロックを有効化する|Coolbits]] オプションでビット2を有効化していることを確認してください。 |
''nvidia-settings'' のコンソールインターフェイスを使ってグラフィックカードのファンの速度を調整することができます。まず、Xorg 設定の [[#nvidia-settings からオーバークロックを有効化する|Coolbits]] オプションでビット2を有効化していることを確認してください。 |
||
| 305行目: | 316行目: | ||
複数のグラフィックカードのファン速度を調整できるようにしたい場合、以下のコマンドを実行: |
複数のグラフィックカードのファン速度を調整できるようにしたい場合、以下のコマンドを実行: |
||
$ nvidia-xconfig --enable-all-gpus |
$ nvidia-xconfig --enable-all-gpus |
||
$ nvidia-xconfig --cool-bits=4 |
$ nvidia-xconfig --cool-bits=4 |
||
| 312行目: | 324行目: | ||
=== NVML によるシンプルなオーバークロックスクリプト === |
=== NVML によるシンプルなオーバークロックスクリプト === |
||
Nvidia Management Library (NVML) は、GPU のコアとメモリのクロックオフセットと電力制限値を管理できる API を提供しています。これを使うには、{{ |
Nvidia Management Library (NVML) は、GPU のコアとメモリのクロックオフセットと電力制限値を管理できる API を提供しています。これを使うには、{{Pkg|python-nvidia-ml-py}} をインストールし、以下の Python スクリプトを所望の設定で使用してください。このスクリプトは、起動のたびに root として実行してオーバークロック/低電圧の設定を適用し直す必要があります。 |
||
{{bc|1= |
{{bc|1= |
||
| 334行目: | 346行目: | ||
nvmlDeviceSetPowerManagementLimit(myGPU, 000000) |
nvmlDeviceSetPowerManagementLimit(myGPU, 000000) |
||
}} |
}} |
||
=== NVML で低電圧化 === |
|||
NVML API を用いることで GPU の低電圧化もできます。これにより、電力消費量を減らし、温度を下げることができます。パフォーマンスのロスは最小限であり、それどころか逆にパフォーマンスが向上することもあります。特にノート PC においては、低電圧化が望ましいかもしれません。 |
|||
{{Note|極度に低電圧化すると、深刻な安定性の問題を生じる可能性があります。特に、ファームウェアから直接設定した場合、コンピュータが起動不能になることもあります。一部のマザーボードには、これを防ぐための低電圧保護の設定が存在します。低電圧化を行う際は、この設定を事前に無効にしておく必要があります (Alienware m16 R1 がその例です)。(低電圧化による) 恩恵は、マザーボードのブランドとモデルにより異なります。 |
|||
さらに、オーバークロックの場合と同じく、電圧は少しずつ調整して、そのたびに[[ストレステスト|システムの安定性をテスト]]するべきです。}} |
|||
{{Pkg|python-nvidia-ml-py}} を[[インストール]]し、以下のスクリプトを[[作成]]、そして[[実行可能属性|実行可能に]]してください。 |
|||
{{hc|/usr/local/sbin/nvidia-undervolt.py|2= |
|||
#!/bin/env python |
|||
from pynvml import * |
|||
from ctypes import byref |
|||
nvmlInit() |
|||
# 電圧を調整する GPU の選択。複数 GPU の環境でエラーになる場合は、1など他の値に設定してください。 |
|||
myGPU = nvmlDeviceGetHandleByIndex(0) |
|||
##print(f"myGPU value: {myGPU}") |
|||
# 許容最小・最大電力の取得。 |
|||
##min_power, max_power = nvmlDeviceGetPowerManagementLimitConstraints(myGPU) |
|||
##print(f"Allowed range: {min_power} mW to {max_power} mW") |
|||
# この行で電力制限を mW 単位で設定できます (例: 216W は 216000 になります)。 |
|||
# この値は、許容最小・最大電力の制限内に収まっていなければなりません。 |
|||
# 電力制限を設定しない場合は、以下の行を削除あるいはコメントアウトしてください。 |
|||
nvmlDeviceSetPowerManagementLimit(myGPU, 000000) |
|||
# 許容最小・最大クロックの定義。 |
|||
# GPU によってサポートされているクロックは次のコマンドで確認できます: |
|||
# nvidia-smi -q -d SUPPORTED_CLOCKS |
|||
nvmlDeviceSetGpuLockedClocks(myGPU,''210'',''2340'') |
|||
#################################### |
|||
# ============ P0 State ============ |
|||
#################################### |
|||
# ============ メモリ ============ |
|||
# 必要に応じて以下のコードをアンコメント、編集してください。 |
|||
# 注意: メモリクロックのオフセットは「2倍する」必要があります。 |
|||
# 例えば、オフセットを 500 に設定したい場合は、 |
|||
# clockOffsetMHz に 1000 を代入してください。 |
|||
##infoMemP0 = c_nvmlClockOffset_t() |
|||
##infoMemP0.version = nvmlClockOffset_v1 |
|||
##infoMemP0.type = NVML_CLOCK_MEM |
|||
##infoMemP0.pstate = NVML_PSTATE_0 |
|||
##infoMemP0.clockOffsetMHz = ''2000'' |
|||
### このオフセットは、メモリをどれだけより速くするかを表しています。 |
|||
### 例えば、この場合、メモリは 8000 MHz ではなく、 |
|||
### 8000 + (2000 / 2) = 9000 MHz で動作します。 |
|||
##nvmlDeviceSetClockOffsets(myGPU, byref(infoMemP0)) |
|||
# ============ グラフィックス ============= |
|||
infoGraphicsP0 = c_nvmlClockOffset_t() |
|||
infoGraphicsP0.version = nvmlClockOffset_v1 |
|||
infoGraphicsP0.type = NVML_CLOCK_GRAPHICS |
|||
infoGraphicsP0.pstate = NVML_PSTATE_0 |
|||
infoGraphicsP0.clockOffsetMHz = ''270'' |
|||
## このオフセットの値は、周波数-電圧曲線が 270 MHz 上に上がることを意味します。 |
|||
## 例えば、本来 2070 MHz で動作する電圧では、 |
|||
## この設定により 2070 + 270 = 2340 MHz で動作するようになります。 |
|||
nvmlDeviceSetClockOffsets(myGPU, byref(infoGraphicsP0)) |
|||
nvmlShutdown() |
|||
}} |
|||
使用した関数の詳細は [https://docs.nvidia.com/deploy/nvml-api/index.html NVML API ドキュメント] Section 5.18 にあります。[https://www.reddit.com/r/linux_gaming/comments/1fm17ea/comment/lo7mo09/ この Reddit の投稿]では、低電圧化をクロックオフセットで行う理由について説明されています。 |
|||
このスクリプトは、GPU の最も高い [https://docs.nvidia.com/gameworks/content/gameworkslibrary/coresdk/nvapi/group__gpupstate.html P-state] における低電圧化しか行いません。P0 以外の P-state で設定したい場合は、[https://www.reddit.com/r/linux_gaming/comments/1fm17ea/comment/n4vmb4k この Reddit の投稿]を参考にしてください。 |
|||
{{Note|残念ながら、一部の GPU は、NVML API による電力制限の変更をサポートしていません。コマンド {{ic|nvidia-smi -pl ''000''}} を root ユーザとして実行することで、サポートの有無を確認できます。 |
|||
サポートがない場合は、スクリプトから電力制限の部分を削除あるいはコメントアウトし、最後の手段として [[#Dynamic_Boost|Dynamic Boost を設定]]する方法があります。}} |
|||
スクリプトを root ユーザとして手動で実行して GPU に設定を適用させ、[[ストレステスト|設定のテスト]]を行ってください。'''テストして問題が無いこと (つまり、設定が安定している) を確認せずに、設定を永続化しないでください。''' |
|||
良い設定値を見つけたら、起動毎に設定を適用させる必要があります。一つの方法は、systemd サービスです: |
|||
{{hc|/etc/systemd/system/nvidia-undervolt.service|2= |
|||
[Unit] |
|||
Description=Undervolt the NVIDIA GPU |
|||
[Service] |
|||
Type=oneshot |
|||
ExecStart=/bin/python ''/usr/local/sbin/''nvidia-undervolt.py |
|||
StandardOutput=journal |
|||
StandardError=journal |
|||
[Install] |
|||
WantedBy=graphical.target |
|||
}} |
|||
最後に、システムの起動時に設定を適用するために、このサービスを[[有効化]]してください。 |
|||
== カーネルモジュールパラメータ == |
== カーネルモジュールパラメータ == |
||
| 356行目: | 468行目: | ||
デフォルトでは、システムのサスペンドと復帰時に NVIDIA の Linux ドライバーは必須のビデオメモリの割り当てのみを保存し復元します。NVIDIA 曰く: |
デフォルトでは、システムのサスペンドと復帰時に NVIDIA の Linux ドライバーは必須のビデオメモリの割り当てのみを保存し復元します。NVIDIA 曰く: |
||
:結果として生じるビデオメモリの内容の消失は、ユーザスペースの NVIDIA ドライバ |
:結果として生じるビデオメモリの内容の消失は、ユーザスペースの NVIDIA ドライバや一部のアプリケーションによって部分的に補われます。しかし、電源管理サイクルの終了時にレンダリングの破損やアプリケーションのクラッシュなどの機能不全が発生する可能性があります。 |
||
"まだ実験段階の" インターフェイスを使用すれば、(ディスクまたは RAM に十分な領域があれば) ビデオメモリ全てを保存できるようになります。 |
"まだ実験段階の" インターフェイスを使用すれば、(ディスクまたは RAM に十分な領域があれば) ビデオメモリ全てを保存できるようになります。 |
||
ビデオメモリの内容を全て保存し復元するようにするには、{{ic|nvidia}} カーネルモジュールに対して {{ic|1= |
ビデオメモリの内容を全て保存し復元するようにするには、{{ic|nvidia}} カーネルモジュールに対して {{ic|1=NVreg_UseKernelSuspendNotifiers=1}} [[カーネルモジュールパラメータ]]を設定する必要があります。NVIDIA はこのパラメータをデフォルトで設定していませんが、一方 Arch Linux では、サポートされているドライバにおいてこのパラメータがデフォルトで設定されており、ビデオメモリはデフォルトで保持されます。 |
||
{{ic| |
{{ic|NVreg_UseKernelSuspendNotifiers}} が有効であるかを調べるには、以下を実行してください: |
||
# |
# sort /proc/driver/nvidia/params |
||
{{ic| |
{{ic|UseKernelSuspendNotifiers: 1}} という行と、{{ic|TemporaryFilePath: "/var/tmp"}} という行があるはずです (これらのパラメータについては以下で説明されています)。 |
||
サポートされているドライバ |
上流の要件通り、サポートされているドライバ上では、サービス {{ic|nvidia-suspend.service}}、{{ic|nvidia-hibernate.service}}、{{ic|nvidia-resume.service}} はデフォルトで無効化されています。バージョン 595 以降のオープンソースなカーネルモジュールでは、ビデオメモリの保持は、カーネルの suspend notifier によって処理されます。これにより、NVIDIA のサスペンド/ハイバネートサービスは必要ありません。 |
||
詳細は [https://download.nvidia.com/XFree86/Linux-x86_64/ |
詳細は [https://download.nvidia.com/XFree86/Linux-x86_64/575.64/README/powermanagement.html NVIDIA のドキュメント]を参照してください。 |
||
{{Accuracy|[[NVIDIA#早期ロード|KMS を早期開始]]する場合 (つまり、initramfs の段階で {{ic|nvidia}} モジュールがロードされる場合)、initramfs の時点では、以前のビデオメモリの内容が保存されている {{ic|NVreg_TemporaryFilePath}} にアクセスできません。つまり、ハイバーネートを使用する場合は、KMS の早期開始を使用するべきではありません。}} |
|||
{{Note| |
{{Note| |
||
* [[NVIDIA#DRM カーネルモード設定|Early KMS]] を使用する場合 (つまり、{{ic|nvidia}} モジュールのロードが initramfs の段階で起こる場合)、モジュールは {{ic|NVreg_TemporaryFilePath}} (前回のビデオメモリを保持しているパス) にアクセスできません。よって、ハイバネートを使用する場合は、early KMS を使用するべきではありません。 |
|||
* [[カーネルモジュール#/etc/modprobe.d/ 内のファイルを使う]] にある通り、[[NVIDIA#DRM カーネルモード設定|early KMS]] を使用している場合は [[initramfs を再生成する]]必要があります。 |
|||
* [[カーネルモジュール#/etc/modprobe.d/ 内のファイルを使う]] にある通り、early KMS を使用している場合は [[initramfs を再生成する]]必要があります。 |
|||
* 上流のデフォルトでは、ビデオメモリの内容は ([[tmpfs]] である) {{ic|/tmp}} に保存されます。NVIDIA は、最高のパフォーマンスを得るために[https://download.nvidia.com/XFree86/Linux-x86_64/565.77/README/powermanagement.html#PreserveAllVide719f0 他のファイルシステムを使うことを推奨]しています。また、{{ic|/tmp}} のサイズがメモリの容量に対して不十分である場合も、他のファイルシステムを使う必要があります。このような理由から、Arch Linux では、サポートされているドライバにおいて {{ic|1=nvidia.NVreg_TemporaryFilePath=/var/tmp}} パラメータがデフォルトで設定されています。 |
|||
* 上流のデフォルトでは、ビデオメモリの内容は ([[tmpfs]] である) {{ic|/tmp}} に保存されます。NVIDIA は、最高のパフォーマンスを得るために[https://download.nvidia.com/XFree86/Linux-x86_64/575.64/README/powermanagement.html#PreserveAllVide719f0 他のファイルシステムを使うことを推奨]しています。また、{{ic|/tmp}} のサイズがメモリの容量に対して不十分である場合も、他のファイルシステムを使う必要があります。このような理由から、Arch Linux では、サポートされているドライバにおいて {{ic|1=nvidia.NVreg_TemporaryFilePath=/var/tmp}} パラメータがデフォルトで設定されています。 |
|||
* ビデオメモリの内容を保存するファイルシステムは、無名一時ファイルをサポートし (例えば、ext4 や XFS)、かつビデオメモリの割り当てを保存するのに十分な容量がある必要があります (つまり、すべての NVIDIA GPU のメモリ容量合計の 1.05 倍以上)。コマンド {{ic|1=nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits}} を使えば、システム上のすべての GPU ビデオメモリの容量を一覧表示できます。 |
* ビデオメモリの内容を保存するファイルシステムは、無名一時ファイルをサポートし (例えば、ext4 や XFS)、かつビデオメモリの割り当てを保存するのに十分な容量がある必要があります (つまり、すべての NVIDIA GPU のメモリ容量合計の 1.05 倍以上)。コマンド {{ic|1=nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits}} を使えば、システム上のすべての GPU ビデオメモリの容量を一覧表示できます。 |
||
* NVIDIA は {{ic|nvidia-resume.service}} を有効化するのは必須であるとしていますが、これを有効化するのは任意です。このサービスの機能は {{man|8|systemd-sleep}} フック ({{ic|/usr/lib/systemd/system-sleep/nvidia}}) によって提供され、このフックは自動的に実行されるからです。ただし、[https://gitlab.gnome.org/GNOME/gdm/-/issues/784 GDM を Wayland で使用している場合]は、{{ic|nvidia-resume.service}} を明示的に有効化する必要があります。 |
|||
}} |
}} |
||
== Dynamic Boost == |
|||
主なシステム要件は、Ampere (及びそれより新しい) GPU が搭載されているラップトップであることです。 |
|||
Dynamic Boost は、システムのワークロードに応じて GPU 及び CPU の電力消費を管理する、システム全体で動作する電力制御ソフトウェアです。[https://download.nvidia.com/XFree86/Linux-x86_64/575.64/README/dynamicboost.html] 適宜、電力制限を上げることによって、特に GPU を使用するアプリケーションでパフォーマンスを向上させることができます。 |
|||
詳細は [[CPU 周波数スケーリング#nvidia-powerd]] を参照してください。 |
|||
{{Tip|電力制限を手動で設定できない人にとっては特に役立つでしょう。[[NVIDIA Optimus#消費電力 (TDP) が低いままになる]] を参照してください。}} |
|||
== ドライバーの持続 == |
== ドライバーの持続 == |
||
| 399行目: | 520行目: | ||
[[PRIME#GPU を使ってレンダリングするようにアプリケーションを設定する]] を参照してください。 |
[[PRIME#GPU を使ってレンダリングするようにアプリケーションを設定する]] を参照してください。 |
||
{{TranslationStatus|NVIDIA/Tips and tricks| |
{{TranslationStatus|NVIDIA/Tips and tricks|2026-03-29|870075}} |
||
2026年3月29日 (日) 10:18時点における最新版
ターミナルの解像度を修正する
NVIDIA#fbdev がデフォルトで有効であるため、Linux コンソールは追加の設定無しでモニタのネイティブな解像度を使用するはずです。
fbdev を無効化していたり、古いドライバを使用していたりする場合は、解像度が予想より小さい場合があります。回避策として、ブートローダーの設定で解像度を設定することができます。
GRUB を使用している場合、GRUB/ヒントとテクニック#フレームバッファの解像度を設定するを見てください。
systemd-boot を使用している場合、esp/loader/loader.conf 内で console-mode を設定してください。詳しくは systemd-boot#ローダー設定 をご覧ください。[1] [2]
rEFInd を使用している場合、esp/EFI/refind/refind.conf で use_graphics_for +,linux を設定してください。ちょっとした注意事項としては、これによりブート中にカーネルパラメータが表示されなくなります。
TV 出力を使う
Wikibooks:NVIDIA/TV-OUT を見てください。
X で TV (DFP) を唯一のディスプレイとして使う
モニターが自動的に検出されない場合、X サーバーは何かしらのデフォルトの解像度 (通常であれば 640x480) にフォールバックします。これは、DVI/HDMI/DisplayPort 接続の TV をメインディスプレイとして使用していて TV がオフまたは切断されているときに X が起動すると問題になります。
NVIDIA に正しい解像度を強制するには、EDID のコピーをファイルシステムのどこかに保存して、X がディスプレイから EDID を読み込まずにそのファイルをパースできるようにします。
EDID を取得するには、nvidia-settings を起動します。ツリー形式で情報が表示されますが、今は設定は無視して GPU を選択し (対応するエントリは GPU-0 などのような名前であるはずです)、DFP セクションをクリックして (DFP-0 などのような名前です)、Acquire Edid... ボタンをクリックしてファイルをどこかに保存してください (例: /etc/X11/dfp0.edid)。
フロントエンドにマウスやキーボードが接続されていない場合、コマンドラインを使って EDID を取得することもできます。EDID ブロックも出力するように引数を指定して X サーバーを起動します:
$ startx -- -logverbose 6
X サーバーが初期化を完了したら、サーバーを閉じ、nvidia-xconfig を使って Xorg のログファイルから EDID ブロックを抽出してください:
$ nvidia-xconfig --extract-edids-from-file ~/.local/share/xorg/Xorg.0.log --extract-edids-output-file ./dfp0.bin
Xorg の設定で以下を Device セクションに追加してください:
/etc/X11/xorg.conf.d/20-nvidia.conf
Option "ConnectedMonitor" "DFP" Option "CustomEDID" "DFP-0:/etc/X11/dfp0.bin"
ConnectedMonitor オプションはドライバーに強制的に DFP を認識させます。CustomEDID にはデバイスの EDID データを指定してください。TV/DFP が接続されているかのように X が起動するようになります。
ブート時に自動的にディスプレイマネージャを起動して適切な X ディスプレイが設定されてから TV の電源を入れることができます。
ヘッドレス (モニターなし) 解像度
ヘッドレスモードでは解像度は VNC や Steam Link で利用される 640x480 に落ちます。より高い解像度(例えば、1920x1080)で開始するには、xorg.conf 内の Screen サブセクションの下にある Virtual エントリ で指定します:
Section "Screen"
[...]
SubSection "Display"
Depth 24
Virtual 1920 1080
EndSubSection
EndSection
電源を確認
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.conf で ConnectToAcpid オプションを無効にすることでメッセージを消すことができます:
Section "Device" ... Driver "nvidia" Option "ConnectToAcpid" "0" ... EndSection
ノートパソコンを使っている場合、代わりに acpid デーモンをインストールして有効化すると良いかもしれません。
GPU の温度をシェルに表示する
GPU の温度を確認する方法は3つあります。nvidia-settings は X を使用する必要があります。X を使っていない場合は nvidia-smi や nvclock による方法を使って下さい。また、nvclock は GeForce 200 シリーズのカードや Zotac IONITX の 8800GS などの内蔵 GPU など新しい NVIDIA カードでは機能しません。
nvidia-settings
GPU の温度をシェルに表示するには、以下のように nvidia-settings を使って下さい:
$ nvidia-settings -q gpucoretemp
Attribute 'GPUCoreTemp' (hostname:0[gpu:0]): 49.
'GPUCoreTemp' is an integer attribute.
'GPUCoreTemp' is a read-only attribute.
'GPUCoreTemp' can use the following target types: GPU.
上記の場合、ボードの GPU 温度は 49 °C になります。
rrdtool や conky などのユーティリティで使うために温度だけを表示したいときは:
$ nvidia-settings -q gpucoretemp -t
49
nvidia-smi
X を全く使わず (例: Wayland を実行している場合やヘッドレスサーバの場合) GPU から直接温度を読み込むことができる nvidia-smi を使います。
GPU の温度をシェルに表示するには、nvidia-smi を使って下さい:
$ nvidia-smi
Wed Feb 28 14:27:35 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce GTX 1660 Ti Off | 00000000:01:00.0 On | N/A | | 0% 49C P8 9W / 120W | 138MiB / 6144MiB | 2% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | 0 N/A N/A 223179 G weston 120MiB | +-----------------------------------------------------------------------------------------+
温度だけ見るには:
$ nvidia-smi -q -d TEMPERATURE
==============NVSMI LOG==============
Timestamp : Wed Feb 28 14:27:35 2024
Driver Version : 550.54.14
CUDA Version : 12.4
Attached GPUs : 1
GPU 00000000:01:00.0
Temperature
GPU Current Temp : 49 C
GPU T.Limit Temp : N/A
GPU Shutdown Temp : 95 C
GPU Slowdown Temp : 92 C
GPU Max Operating Temp : 90 C
GPU Target Temperature : 83 C
Memory Current Temp : N/A
Memory Max Operating Temp : N/A
rrdtool や conky などのユーティリティで使うために温度だけを取得したいときは:
$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits
49
nvclock
nvclockAUR パッケージをインストールしてください。
たまに nvclock と nvidia-settings/nv-control が報告する温度が食い違うことがあります。nvclock の作者 (thunderbird) による この投稿 によると、nvclock の値のほうが正確なようです。
オーバークロックと冷却
nvidia-settings からオーバークロックを有効化する
- rootless モードで Xorg サーバを実行している場合、一部のオーバークロックの設定は適用できません。Xorg を root として実行することを検討してください。
- nvidia-settings は root として実行する必要があるかもしれません。
- DRM カーネルモードセッティングを有効にすると Coolbits の値に関わらずオーバークロックができなくなる場合があります。
ドライバのバージョンによっては、一部のオーバークロック機能がデフォルトで有効になっています。一部のサポートされていないオーバークロック機能は Device セクションで Coolbits オプションで有効化する必要があります:
Option "Coolbits" "値"
# nvidia-xconfig --cool-bits=value
Coolbits の値は2進数の構成ビットを足し合わせたものです。構成ビットは以下のとおりです:
8(ビット3) - nvidia-settings の PowerMizer ページの追加のオーバークロック機能を有効化します。Fermi や Fermi より新しいアーキテクチャでバージョン 337.12 から利用可能です。[3]16(ビット4) - nvidia-settings の CLI のオプションを使ってオーバーボルテージできるようにします。Fermi や Fermi より新しいアーキテクチャでバージョン 346.16 から利用可能です。[4]
サポートされていないバージョンのドライバを使用している場合は、以下のビットも使用する必要があるかもしれません:
1(ビット0) - nvidia-settings の Clock Frequencies ページで古い(Fermi以前)コアをオーバークロックできるようにします。バージョン 343.13 で削除されました。2(ビット1) - このビットがセットされると、ドライバは「ビデオメモリの容量が異なる複数の GPU を使用するときに SLI の初期化を試みます。」バージョン 470.42.01 で削除されました。4(ビット2) - nvidia-settings の Thermal Monitor ページで GPU ファンの速度を手動設定できるようにします。バージョン 470.42.01 で削除されました。
複数の機能を有効化するには Coolbits の値に上記の値を足し合わせてください。例えば、Fermi コアのオーバークロックとオーバーボルテージを有効化する場合は Option "Coolbits" "24" をセットします。
Coolbits に関するドキュメントは /usr/share/doc/nvidia/html/xconfigoptions.html とここにあります。
静的な 2D/3D クロックを設定する
カーネルモジュールパラメータを使用して PowerMizer を最大パフォーマンスレベルで有効化してください (この設定がないと VSync が機能しません):
/etc/modprobe.d/nvidia.conf
options nvidia NVreg_RegistryDwords="PerfLevelSrc=0x2222"
GPU のブーストクロックを下げる
Volta (NV140/GVXXX) GPU 及びそれ以降では、クロックブーストが異なる方法で動作します。最大クロックはブート時に、サポートされている最も高い制限値に設定されます。これが望ましい動作である場合は、設定は必要ありません。
これの欠点は、電力効率が低いことです。クロックが上がると、安定性のために電圧を上げる必要があります。その結果として、電力消費量、発熱、ファンの音量が非線形的に増加します。なので、ブーストクロックの制限を下げることで、電力効率を上げることができます。
ブーストクロックの制限は nvidia-smi を使用して変更できます:
- サポートされているクロックレートを表示:
$ nvidia-smi -q -d SUPPORTED_CLOCKS
- GPU のブーストクロックの制限を 1695 MHz に設定:
# nvidia-smi --lock-gpu-clocks=0,1695 --mode=1
- メモリのブーストクロックの制限を 5001 MHz に設定:
# nvidia-smi --lock-memory-clocks=0,5001
電力効率の最適化をするには、ゲームをプレイしながら nvidia-smi で GPU 使用率を確認してください。VSync はオンにしておく必要があります。ブーストクロックの制限を下げると、GPU 使用率が増加します。遅い GPU では、各フレームを描画するのにより長い時間がかかるからです。GPU 使用率が 100% になり、かつ、カクつきが発生しない程度にまでクロックを下げれば、効率は最大になります。このとき、各フレームはリフレッシュレートを維持するのにちょうど十分なほど高速に描画できていることになります。
例として、RTX 3090 Ti でデフォルトから上記の設定に変更した場合、Hitman 3 を 4K 60 FPS でプレイしたところ、電力消費量が 30% 減少し、温度は 75 度から 63 度に、ファンの速度は 73% から 57% に低下しました。
オーバークロックの設定を保存する
通常、nvidia-settings インターフェイスで設定したクロックと電圧のオフセットは保存されず、再起動すると消えてしまいます。幸い、プロプライエタリドライバにおいてオーバークロック用のインターフェイスを提供し、ユーザのオーバークロック設定を保存することが可能で、起動時に自動的に設定を適用するツールがあります。以下にその一部を挙げます:
- gweAUR - グラフィカル。デスクトップセッションの開始時に設定を適用します。
- nvclockAUR と systemd-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-tdp.timer を有効化してください。
ログイン時にファンの速度を設定する
nvidia-settings のコンソールインターフェイスを使ってグラフィックカードのファンの速度を調整することができます。まず、Xorg 設定の Coolbits オプションでビット2を有効化していることを確認してください。
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" &
GDM や KDM などのログインマネージャを使用している場合、デスクトップエントリファイルを作成して設定をさせることもできます。~/.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
複数のグラフィックカードのファン速度を調整できるようにしたい場合、以下のコマンドを実行:
$ nvidia-xconfig --enable-all-gpus $ nvidia-xconfig --cool-bits=4
NVML によるシンプルなオーバークロックスクリプト
Nvidia Management Library (NVML) は、GPU のコアとメモリのクロックオフセットと電力制限値を管理できる API を提供しています。これを使うには、python-nvidia-ml-py をインストールし、以下の Python スクリプトを所望の設定で使用してください。このスクリプトは、起動のたびに root として実行してオーバークロック/低電圧の設定を適用し直す必要があります。
#!/usr/bin/env python from pynvml import * nvmlInit() # 調節対象の GPU を指定する。以下でエラーが発生する場合や、複数の GPU が存在する場合、1 に設定するか、他の値を試してください myGPU = nvmlDeviceGetHandleByIndex(0) # 以下の行の "000" の部分を所望の GPU クロックオフセット値に置き換えてください。 nvmlDeviceSetGpcClkVfOffset(myGPU,000) # 以下の行の "000" の部分を、所望のメモリクロックオフセット値の「2倍」に置き換えてください。 # 例えば、オフセットが 500 である場合、以下の行には 1000 と記述してください。 nvmlDeviceSetMemClkVfOffset(myGPU,000) # 以下に電力制限値を mW で設定してください。例えば、216W は 216000 (mW) になります。電力制限値を調整したくない場合は以下の行を削除してください。 nvmlDeviceSetPowerManagementLimit(myGPU, 000000)
NVML で低電圧化
NVML API を用いることで GPU の低電圧化もできます。これにより、電力消費量を減らし、温度を下げることができます。パフォーマンスのロスは最小限であり、それどころか逆にパフォーマンスが向上することもあります。特にノート PC においては、低電圧化が望ましいかもしれません。
python-nvidia-ml-py をインストールし、以下のスクリプトを作成、そして実行可能にしてください。
/usr/local/sbin/nvidia-undervolt.py
#!/bin/env python
from pynvml import *
from ctypes import byref
nvmlInit()
# 電圧を調整する GPU の選択。複数 GPU の環境でエラーになる場合は、1など他の値に設定してください。
myGPU = nvmlDeviceGetHandleByIndex(0)
##print(f"myGPU value: {myGPU}")
# 許容最小・最大電力の取得。
##min_power, max_power = nvmlDeviceGetPowerManagementLimitConstraints(myGPU)
##print(f"Allowed range: {min_power} mW to {max_power} mW")
# この行で電力制限を mW 単位で設定できます (例: 216W は 216000 になります)。
# この値は、許容最小・最大電力の制限内に収まっていなければなりません。
# 電力制限を設定しない場合は、以下の行を削除あるいはコメントアウトしてください。
nvmlDeviceSetPowerManagementLimit(myGPU, 000000)
# 許容最小・最大クロックの定義。
# GPU によってサポートされているクロックは次のコマンドで確認できます:
# nvidia-smi -q -d SUPPORTED_CLOCKS
nvmlDeviceSetGpuLockedClocks(myGPU,210,2340)
####################################
# ============ P0 State ============
####################################
# ============ メモリ ============
# 必要に応じて以下のコードをアンコメント、編集してください。
# 注意: メモリクロックのオフセットは「2倍する」必要があります。
# 例えば、オフセットを 500 に設定したい場合は、
# clockOffsetMHz に 1000 を代入してください。
##infoMemP0 = c_nvmlClockOffset_t()
##infoMemP0.version = nvmlClockOffset_v1
##infoMemP0.type = NVML_CLOCK_MEM
##infoMemP0.pstate = NVML_PSTATE_0
##infoMemP0.clockOffsetMHz = 2000
### このオフセットは、メモリをどれだけより速くするかを表しています。
### 例えば、この場合、メモリは 8000 MHz ではなく、
### 8000 + (2000 / 2) = 9000 MHz で動作します。
##nvmlDeviceSetClockOffsets(myGPU, byref(infoMemP0))
# ============ グラフィックス =============
infoGraphicsP0 = c_nvmlClockOffset_t()
infoGraphicsP0.version = nvmlClockOffset_v1
infoGraphicsP0.type = NVML_CLOCK_GRAPHICS
infoGraphicsP0.pstate = NVML_PSTATE_0
infoGraphicsP0.clockOffsetMHz = 270
## このオフセットの値は、周波数-電圧曲線が 270 MHz 上に上がることを意味します。
## 例えば、本来 2070 MHz で動作する電圧では、
## この設定により 2070 + 270 = 2340 MHz で動作するようになります。
nvmlDeviceSetClockOffsets(myGPU, byref(infoGraphicsP0))
nvmlShutdown()
使用した関数の詳細は NVML API ドキュメント Section 5.18 にあります。この Reddit の投稿では、低電圧化をクロックオフセットで行う理由について説明されています。
このスクリプトは、GPU の最も高い P-state における低電圧化しか行いません。P0 以外の P-state で設定したい場合は、この Reddit の投稿を参考にしてください。
nvidia-smi -pl 000 を root ユーザとして実行することで、サポートの有無を確認できます。
サポートがない場合は、スクリプトから電力制限の部分を削除あるいはコメントアウトし、最後の手段として Dynamic Boost を設定する方法があります。スクリプトを root ユーザとして手動で実行して GPU に設定を適用させ、設定のテストを行ってください。テストして問題が無いこと (つまり、設定が安定している) を確認せずに、設定を永続化しないでください。
良い設定値を見つけたら、起動毎に設定を適用させる必要があります。一つの方法は、systemd サービスです:
/etc/systemd/system/nvidia-undervolt.service
[Unit] Description=Undervolt the NVIDIA GPU [Service] Type=oneshot ExecStart=/bin/python /usr/local/sbin/nvidia-undervolt.py StandardOutput=journal StandardError=journal [Install] WantedBy=graphical.target
最後に、システムの起動時に設定を適用するために、このサービスを有効化してください。
カーネルモジュールパラメータ
一部のオプションはカーネルモジュールパラメータから設定できます。パラメータの完全なリストは modinfo nvidia を実行するか nv-reg.h を見てください。Gentoo:NVidia/nvidia-drivers/ja#カーネルモジュールのパラメーター も見てください。
例えば、以下を有効化すると PAT 機能 [6] が有効になります。PAT 機能はメモリの割り当て方に影響を及ぼします。PAT は Pentium III に初めて導入され [7]、それよりも新しい CPU の殆どでサポートされています(wikipedia:Page attribute table#Processors を参照)。あなたのシステムでこの機能がサポートされている場合、パフォーマンスが向上するはずです。
/etc/modprobe.d/nvidia.conf
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 曰く:
- 結果として生じるビデオメモリの内容の消失は、ユーザスペースの NVIDIA ドライバや一部のアプリケーションによって部分的に補われます。しかし、電源管理サイクルの終了時にレンダリングの破損やアプリケーションのクラッシュなどの機能不全が発生する可能性があります。
"まだ実験段階の" インターフェイスを使用すれば、(ディスクまたは RAM に十分な領域があれば) ビデオメモリ全てを保存できるようになります。
ビデオメモリの内容を全て保存し復元するようにするには、nvidia カーネルモジュールに対して NVreg_UseKernelSuspendNotifiers=1 カーネルモジュールパラメータを設定する必要があります。NVIDIA はこのパラメータをデフォルトで設定していませんが、一方 Arch Linux では、サポートされているドライバにおいてこのパラメータがデフォルトで設定されており、ビデオメモリはデフォルトで保持されます。
NVreg_UseKernelSuspendNotifiers が有効であるかを調べるには、以下を実行してください:
# sort /proc/driver/nvidia/params
UseKernelSuspendNotifiers: 1 という行と、TemporaryFilePath: "/var/tmp" という行があるはずです (これらのパラメータについては以下で説明されています)。
上流の要件通り、サポートされているドライバ上では、サービス nvidia-suspend.service、nvidia-hibernate.service、nvidia-resume.service はデフォルトで無効化されています。バージョン 595 以降のオープンソースなカーネルモジュールでは、ビデオメモリの保持は、カーネルの suspend notifier によって処理されます。これにより、NVIDIA のサスペンド/ハイバネートサービスは必要ありません。
詳細は NVIDIA のドキュメントを参照してください。
- Early KMS を使用する場合 (つまり、
nvidiaモジュールのロードが initramfs の段階で起こる場合)、モジュールはNVreg_TemporaryFilePath(前回のビデオメモリを保持しているパス) にアクセスできません。よって、ハイバネートを使用する場合は、early KMS を使用するべきではありません。 - カーネルモジュール#/etc/modprobe.d/ 内のファイルを使う にある通り、early KMS を使用している場合は initramfs を再生成する必要があります。
- 上流のデフォルトでは、ビデオメモリの内容は (tmpfs である)
/tmpに保存されます。NVIDIA は、最高のパフォーマンスを得るために他のファイルシステムを使うことを推奨しています。また、/tmpのサイズがメモリの容量に対して不十分である場合も、他のファイルシステムを使う必要があります。このような理由から、Arch Linux では、サポートされているドライバにおいてnvidia.NVreg_TemporaryFilePath=/var/tmpパラメータがデフォルトで設定されています。 - ビデオメモリの内容を保存するファイルシステムは、無名一時ファイルをサポートし (例えば、ext4 や XFS)、かつビデオメモリの割り当てを保存するのに十分な容量がある必要があります (つまり、すべての NVIDIA GPU のメモリ容量合計の 1.05 倍以上)。コマンド
nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounitsを使えば、システム上のすべての GPU ビデオメモリの容量を一覧表示できます。
Dynamic Boost
主なシステム要件は、Ampere (及びそれより新しい) GPU が搭載されているラップトップであることです。
Dynamic Boost は、システムのワークロードに応じて GPU 及び CPU の電力消費を管理する、システム全体で動作する電力制御ソフトウェアです。[8] 適宜、電力制限を上げることによって、特に GPU を使用するアプリケーションでパフォーマンスを向上させることができます。
詳細は CPU 周波数スケーリング#nvidia-powerd を参照してください。
ドライバーの持続
NVIDIA はブート時に任意で実行できるデーモンを用意しています。標準的な単一 GPU の X デスクトップ環境では持続デーモンは必要ではなく、むしろ問題を引き起こします [9]。詳細については NVIDIA ドキュメントの Driver Persistence 章をご覧ください。
ブート時に持続デーモンを開始するには nvidia-persistenced.service を有効化してください。手動での使用については上流のドキュメントをご覧ください。
YCbCr 4:2:0 サブサンプリングを強制する
古い出力規格の制限に悩まされているが、YUV 4:2:0 を使用することで問題を緩和できるような場合は、NVIDIA ドライバに YUV420 を強制するためのドキュメント化されていない X11 オプションがあります:
Option "ForceYUV420" "True"
これで、より高い解像度とリフレッシュレートを利用できますが、画質に悪影響を及ぼします。
GPU を使ってレンダリングするようにアプリケーションを設定する
PRIME#GPU を使ってレンダリングするようにアプリケーションを設定する を参照してください。