web-dev-qa-db-ja.com

19.10にアップデートした後、Nvidia dGPUが検出されない

主題から推測できるように、私はOptimusラップトップを持っています。 19.04を実行している限り、Primeを使用して(prime-select {intel|nvidia}コマンドを使用して)Nvidia dGPUに切り替えたり、元に戻したりすることができました。ただし、19.10へのアップグレード後に状況は変わりました。アップグレードの翌日、rmmodタスクなど、一部のタスクがスタックしているという問題でカーネルがシステムをフリーズさせました。私はなんとかchrootルートログイン環境でprime-select nvidiaを実行してシステムを元に戻すことができました。

IGPU/dGPUドライバーをinitramfsから削除するなどの詳細についてはあまり説明しません(とにかくこれらはinitramfsに何をする必要がありますか?)少なくとも、dGPUがアクティブ化されているかどうかに関係なく起動します。

そこで問題が発生するのはここです。 Intelプロファイルをアクティブにしてシステムを起動した場合、dGPUがハードウェアで検出されないため、nvidiaプロファイルへの切り替えが機能しません。実際、lspciのリストにはありません。 dGPUを再度検出するには、再起動する必要があります。したがって、システムをシャットダウンするときは、常に事前にnvidiaプロファイルをアクティブ化することを検討する必要があります。そうしないと、次回使用できるように再起動する必要があります。

それが私の主な問題です。別の、それほど煩わしくないものは、nvidiaからintelに切り替えるときに、常にgdmサービスを再起動する必要があることです。私はそれに耐えることはできますが、19.04にはなかった問題です。

この問題に関するアドバイスは大歓迎です!ハードウェアリストからdGPUが消えないようにするか、システムを再起動せずにシステムがdGPUを再び検出するようにします。

Fwiw、私のiGPUはIntel HD Graphics 4600で、私のdGPUはNvidia GTX 880Mです。

編集: @Syfer Polski、有益な返信をありがとう!

オンデマンドプロファイルがあることに気づきましたが、実際に動作するOptimusの実装がすぐには来ないほど前に読んだので、それをいくつかの無駄な試みとして破棄しました...そのreadmeを読んでおくべきでした!

そのため、すぐにそのオンデマンドプロファイルを試しました。私はそれをサポートしていない430ドライバーを持っていたので、最初は機能しませんでした。サポートされているバージョンを実行していない人のプロファイルを有効にすることを拒否するドライバーチェックがあったはずです。そのため、システムがクラッシュしました。アップグレード中にオンデマンドプロファイルが自動的にアクティブになったためです(ただし、私はt時に確認します)。

とにかく...私は435ドライバーをインストールし、実際にオンデマンドプロファイルが機能します。ただし、使用していないとGPUの電源がオフにならないため、十分に満足できるとは言えません。 ACPIの直接呼び出しで電源を切ってみましたが、実際には電源が​​切れていましたが、

NVRM: GPU at PCI:0000:01:00: GPU-9b8a3387-4913-0c33-619e-da118e532a5f
NVRM: Xid (PCI:0000:01:00): 79, pid=29013, GPU has fallen off the bus.
NVRM: GPU 0000:01:00.0: GPU has fallen off the bus.
NVRM: A GPU crash dump has been created. If possible, please run
NVRM: nvidia-bug-report.sh as root to collect this data before
NVRM: the NVIDIA kernel module is unloaded.

ですから、残念なことに、私が使用していないときにプロプライエタリドライバーが私のdGPUの電源を切ることができない限り、私は古典的なIntel/Nvidiaプロファイルシステムを使い続けると思います。

これにより元の質問に戻ります、インテルモードを有効にして起動した場合:再起動せずにdGPUを戻すにはどうすればよいですか?

再スキャン(echo 1 >/sys/bus/pci/rescan)すると、ログに表示されます。

pci 0000:01:00.0: [10de:1198] type 00 class 0x030000
pci 0000:01:00.0: reg 0x10: [mem 0xf6000000-0xf6ffffff]
pci 0000:01:00.0: reg 0x14: [mem 0xe0000000-0xefffffff 64bit pref]
pci 0000:01:00.0: reg 0x1c: [mem 0xf0000000-0xf1ffffff 64bit pref]
pci 0000:01:00.0: reg 0x24: [io  0xe000-0xe07f]
pci 0000:01:00.0: reg 0x30: [mem 0xf7000000-0xf707ffff pref]
pci 0000:01:00.0: 32.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x16 link at 0000:00:01.0 (capable of 126.016 Gb/s with 8 GT/s x16 link)
pci 0000:01:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none

しかし、lspciは黙っています。 ACPI呼び出しでデバイスの電源をオン/オフにできます。カーネルは再スキャン時にそれを表示しますが、その結果、ロードされないドライバーによって検出されません。何かする必要がありますが、何ですか?

3
NovHak

解決策が見つかりました! orderでいくつかのことをしていませんでした。したがって、dGPUを元に戻す手順は次のとおりです。

  1. プロファイルをnvidiaまたはon-demandに設定します(ドライバーでサポートされている場合):prime-select {nvidia|on-demand}

  2. DGPUをオンにします。 BIOSは通常、起動時に電源をオンにするため、ここでは問題はありません。その間にオフにした場合は、オンに戻す方法を知っていると思います。他の理由でオフになっている場合は、apt install acpi-call-dkmsで運を試してください。 /usr/share/doc/acpi-call-dkms/examplesに役立つ例があります。システムをひどくクラッシュさせる可能性があるので、注意して処理してください!私の場合、次のACPI呼び出しでdGPUがオンになります:\_SB_.PCI0.PEG0.PEGP._ON。私は私の例を挙げます、あなたのそれは全く同じではないかもしれません。もしあればバックスラッシュをエスケープすることを忘れないでください。

  3. PCIバスを再スキャンします:echo 1 >/sys/bus/pci/rescan。ただし、バスの一部のみを再スキャンするだけで十分な場合があります。

  4. (オプションの場合があります)nvidiaモジュールをロードします:modprobe nvidia

警告:ドライバーにバインドされていないことが確実でない限り、直接ACPI呼び出しでGPUの電源をオフにしないでください(より単純に、nvidiaモジュールをアンロードする必要があります)、またはドライバーがクラッシュします(質問のクラッシュ例)。

読み込まれている限り、GPUを駆動するドライバーであり、予期せずにステアリングホイールを握っても、通常はあまり効果がありません。

ただし、 Nvidiaドライバーには電源管理機能があります デフォルトではオフになっていますが、nvidiaモジュールにパラメーターNVreg_DynamicPowerManagement=0x01を渡すことでアクティブ化できます。残念ながら、これはTuring以降のGPUでのみ機能します(つまり、私のケプラーではありません)... /usr/src/nvidia-435.21/nvidia/nv-reg.hから取得:

/*
 * Option: DynamicPowerManagement
 *
 * This option controls how aggressively the NVIDIA kernel module will manage
 * GPU power through kernel interfaces.
 *
 * Possible Values:
 *
 *  0: Never allow the GPU to be powered down (default).
 *  1: Power down the GPU when it is not initialized.

 *  2: Power down the GPU after it has been inactive for some time.

 */
1
NovHak

nvidia-primeはUbuntu 19.04と19.10の間で再び変更されました。

Ubuntu 16.04とUbuntu 18.04の間で、Ubuntuはコミュニティが構築したカーネルモジュールであるbbswitchを使用して、OptimusラップトップのNvidia GPUをオフにしました。ただし、モジュールのメンテナンスが停止したため、Ubuntu 18.10では(Ubuntu 18.04にバックポートされたため)、オープンソースのnouveauドライバーをロードすることでGPU間の切り替えが処理されていました。ただし、これではGPUが完全にオフにはなりませんでした(まだ2Wを使用していました)。

同時に、Nvidiaはついに他のGPUドライバーとの共存に取り組んでいました。 GLVND(グラフィックライブラリベンダーニュートラルディスプレイ)はXorg 1.20で採用され、複数のGPUドライバーをロードしてディスプレイサーバーに電力を供給することができました。これにより、きめ細かい制御が可能になります-各アプリケーションは個別のドライバーを使用できます。実際には、ほとんどの場合、OptimusラップトップのIntelおよびNvidia GPUについてです。現在、3つのモードがありますprime-selectでは、次の中から選択できます。

  • インテル
  • オンデマンド
  • nVIDIA

intelモードは、Nvidia GPUを物理的にオフにして追加の電力を節約しますが、オンにするには、ログアウトだけでなく、再起動が必要です。 nvidiaはその逆です。

モードを頻繁に切り替える人には、オンデマンドモードをお勧めします-on-demand、プログラムの描画に使用されるGPUは、環境変数によって決定されます。 OpenGLアプリケーションとVulkanアプリケーションには異なる環境変数があり、それらが設定されていない場合は、統合(Intel)GPUが使用されます。関連する環境変数の完全な説明については NvidiaのREADME を参照してください(__NV_PRIME_RENDER_OFFLOAD__GLX_VENDOR_LIBRARY_NAMEおよび__VK_LAYER_NV_optimus

GPUをサポートするドライバーのシリーズによっては、オンデマンドプロファイルが機能しない場合があります。サポートされている最も古いドライバーは435シリーズのようです。

4
Syfer Polski