「PRIME」の版間の差分
(同期) |
Kusanaginoturugi (トーク | 投稿記録) (カテゴリを修正) |
||
(5人の利用者による、間の20版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category:グラフィック]] |
+ | [[Category:グラフィックス]] |
[[en:PRIME]] |
[[en:PRIME]] |
||
− | [[zh- |
+ | [[zh-hans:PRIME]] |
+ | {{Related articles start}} |
||
− | PRIME は最近のノートパソコンで使われているハイブリッドグラフィック (NVIDIA の [[NVIDIA Optimus|Optimus]] や Radeon の AMD Dynamic Switchable Graphics) を管理するためのテクノロジーです。Linux カーネルでマルチプレクサを必要としないハイブリッドグラフィックを実現するものとして '''PRIME GPU オフロード'''と '''Reverse PRIME''' が存在します。 |
||
+ | {{Related|NVIDIA Optimus}} |
||
+ | {{Related|外付け GPU}} |
||
+ | {{Related articles end}} |
||
+ | PRIME は最近のデスクトップやノートパソコンで使われている[[ハイブリッドグラフィック]] ([[NVIDIA Optimus|NVIDIA の Optimus]] や Radeon の AMD Dynamic Switchable Graphics) を管理するためのテクノロジーです。Linux カーネルでマルチプレクサを必要としないハイブリッドグラフィックを実現するものとして '''PRIME GPU オフロード'''と '''Reverse PRIME''' が存在します。 |
||
== インストール == |
== インストール == |
||
− | === オープンソースドライバ |
+ | === オープンソースドライバ === |
− | クローズドソースのグラフィックドライバ |
+ | クローズドソースのグラフィックドライバを削除して、オープンソースのドライバで置き換えてください: |
* {{Pkg|xf86-video-nouveau}} |
* {{Pkg|xf86-video-nouveau}} |
||
15行目: | 19行目: | ||
* {{Pkg|xf86-video-intel}} |
* {{Pkg|xf86-video-intel}} |
||
− | 再起動して、使われているグラフィックドライバ |
+ | 再起動して、使われているグラフィックドライバのリストを確認: |
{{hc|$ xrandr --listproviders| |
{{hc|$ xrandr --listproviders| |
||
30行目: | 34行目: | ||
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile |
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile |
||
}} |
}} |
||
+ | |||
+ | {{Note|時々、表示されているプロバイダが {{ic|radeon}} ではなく {{ic|"HAINAN @ pci:0000:03:00.0"}} になることがあります。この場合、次のコマンドで {{ic|"HAINAN @ pci:0000:03:00.0"}} をプロバイダとして使用する必要があります。}} |
||
=== クローズドソースドライバー === |
=== クローズドソースドライバー === |
||
+ | プロプライエタリなドライバで PRIME を機能させる手順もほとんど同じです。以下の記事に従ってドライバをインストールしてください: |
||
− | [http://us.download.nvidia.com/XFree86/Linux-x86/364.15/README/randr14.html Nvidia の 364.15 Linux ドライバーのドキュメント] には [[#ディスクリートカードをプライマリ GPU にする]] と同じような情報が載っています。 |
||
+ | |||
+ | * [[AMDGPU PRO]]: AMD GPU 用ドライバをインストール |
||
+ | * [[NVIDIA]]: NVIDIA GPU 用ドライバをインストール |
||
+ | |||
+ | ドライバをインストールしたすぐ後に Xorg を再起動したり再実行したりしないでください。システム構成によっては設定を変更しないと Xorg が起動できなくなります。 |
||
+ | |||
+ | ユースケースに合わせて設定を行ってください。必ずしもオープンソースドライバをアンインストールする必要はありませんが、アンインストールしておいたほうが将来的に問題が発生する可能性を少なくできます。 |
||
== PRIME GPU オフロード == |
== PRIME GPU オフロード == |
||
− | + | 強力なカードでアプリケーションをレンダリングし、ディスプレイが接続されているカードにその結果を送信することが望ましいでしょう。 |
|
+ | |||
+ | コマンド {{ic|xrandr --setprovideroffloadsink provider sink}} を使うことで、レンダーオフロードプロバイダからシンクプロバイダ (ディスプレイに接続されているプロバイダ) に出力を送信することが可能です。プロバイダとシンクの識別子は、数字 (0x7d、0x56) あるいは大文字・小文字を区別する名前 (Intel、radeon) で指定することができます。 |
||
+ | |||
+ | {{Note| |
||
+ | * 公式リポジトリのほとんどデフォルト Xorg DDX ({{ic|xf86-video-*}} や組み込みの modesetting) ドライバでは、以下の設定はもはや必須ではありません。それらのドライバは、DRI3 がデフォルトで有効化されており、自動的にこれらの割り当てを行うからです。とはいえ、明示的に設定しても特に問題はありません。 |
||
+ | * GPU オフロードは、クローズドソースのドライバではサポートされていません (NVIDIA ドライバの場合は、もはやその限りではありません、以下の [[#PRIME レンダーオフロード]] を参照)。 |
||
+ | }} |
||
例: |
例: |
||
43行目: | 63行目: | ||
$ xrandr --setprovideroffloadsink radeon Intel |
$ xrandr --setprovideroffloadsink radeon Intel |
||
− | プロバイダ |
+ | プロバイダ名の代わりにプロバイダのインデックスを使うこともできます: |
$ xrandr --setprovideroffloadsink 1 0 |
$ xrandr --setprovideroffloadsink 1 0 |
||
+ | === オープンソースドライバの場合 - PRIME === |
||
− | これで、{{ic|DRI_PRIME=1}} 環境変数を付けることでグラフィック性能を必要とするアプリケーション (例えばゲームや 3D モデラーなど) でディスクリートカードを使うことができます: |
||
+ | ディスクリートカードを最も必要とするアプリケーション (例: ゲーム、3D モデラー) にそのカードを使わせるには、{{ic|1=DRI_PRIME=1}} 環境変数を (コマンドの) 先頭に追加してください: |
||
− | {{hc|<nowiki>$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"</nowiki>| |
||
+ | |||
+ | {{hc|1=$ DRI_PRIME=1 glxinfo {{!}} grep "OpenGL renderer"|2= |
||
OpenGL renderer string: Gallium 0.4 on AMD TURKS |
OpenGL renderer string: Gallium 0.4 on AMD TURKS |
||
}} |
}} |
||
+ | {{Note|数値の代わりに PCI デバイス名を指定することもできます。形式は {{ic|/sys/bus/pci/devices/}} と似たものが使用されますが、{{ic|pci-}} というプレフィックスが付け、セミコロンとドットはアンダースコアに置き換えてください。例えば、{{ic|1=DRI_PRIME=pci-0000_01_00_0}}。}} |
||
− | 他のアプリケーションは電力の消費量が少ない内蔵カードを使います。X サーバーを再起動すると上記の設定は消失するため、スクリプトを作成して、デスクトップ環境の起動時に自動でスクリプトが実行されるようにすると良いでしょう (もしくは、スクリプトを {{ic|/etc/X11/xinit/xinitrc.d/}} に保存)。バッテリーの持ちが良くなって熱が少なくなることもあるでしょう。 |
||
+ | |||
+ | 他のアプリケーションは、電力消費量の小さい統合カードを依然として使用します。これらの設定は、X サーバが再起動すると失われてしまいます。スクリプトを作成し、デスクトップ環境の起動時に自動的に実行されるようにすると良いかもしれません (あるいは、コードを {{ic|/etc/X11/xinit/xinitrc.d/}} に配置する)。しかし、これによりバッテリーの寿命が縮み、発熱が増えるかもしれません。 |
||
+ | |||
+ | 詳細は [[Gentoo:AMDGPU#Test, if a discrete graphics card is in use]] を参照してください。 |
||
+ | |||
+ | {{ic|DRI_PRIME}} を Vulkan アプリケーションで機能させるには、{{Pkg|vulkan-mesa-layers}} と、32 ビットアプリケーション用に {{Pkg|lib32-vulkan-mesa-layers}} をインストールする必要があります。 |
||
+ | |||
+ | === PRIME レンダーオフロード === |
||
+ | |||
+ | NVIDIA ドライバは、[https://download.nvidia.com/XFree86/Linux-x86_64/435.17/README/primerenderoffload.html バージョン 435.17]以降、この方法をサポートしています。modesetting ({{Pkg|xf86-video-amdgpu}} (450.57)) と {{Pkg|xf86-video-intel}} (455.38) が iGPU ドライバとして公式にサポートされています。 |
||
+ | |||
+ | {{Pkg|nvidia-prime}} によって提供されている {{ic|prime-run}} スクリプトを使うことで、NVIDIA カード上でプログラムを実行することができます: |
||
+ | |||
+ | $ prime-run glxinfo | grep "OpenGL renderer" |
||
+ | $ prime-run vulkaninfo |
||
+ | |||
+ | ==== PCI-Express Runtime D3 (RTD3) Power Management ==== |
||
+ | |||
+ | ===== オープンソースドライバ ===== |
||
+ | |||
+ | カーネルの PCI 電源管理は、PRIME オフロードや reverse PRIME が使用されていない時、GPU をオフにします。 |
||
+ | この機能は modesetting、{{Pkg|xf86-video-amdgpu}}、{{Pkg|xf86-video-intel}}、{{Pkg|xf86-video-nouveau}} ドライバによってサポートされています。 |
||
+ | |||
+ | 以下のコマンドにより、各 GPU の現在の[https://docs.kernel.org/power/pci.html#native-pci-power-management 電源状態]を確認することができます: |
||
+ | $ cat /sys/class/drm/card*/device/power_state |
||
+ | |||
+ | ===== NVIDIA ===== |
||
+ | |||
+ | {{Note|Ampere の場合は、この設定がデフォルトで有効化されているので、一般的に設定は必要ありません。一部の Ampere ユーザは、udev ルールが必要かもしれません。}} |
||
+ | |||
+ | Intel Coffee Lake 以降の CPU や (5800H などの) 一部の Ryzen CPU と、Turing 世代のカードの組み合わせの場合、[https://us.download.nvidia.com/XFree86/Linux-x86_64/525.89.02/README/dynamicpowermanagement.html GPU が使用されていないときに電源を完全に落とす]ことができます。 |
||
+ | |||
+ | 以下の [[udev]] ルールと: |
||
+ | |||
+ | {{hc|/etc/udev/rules.d/80-nvidia-pm.rules|2= |
||
+ | # Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind |
||
+ | ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto" |
||
+ | ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto" |
||
+ | |||
+ | # Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind |
||
+ | ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on" |
||
+ | ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on" |
||
+ | }} |
||
+ | |||
+ | 以下の[[モジュールパラメータ]]が必要です: |
||
+ | |||
+ | {{hc|/etc/modprobe.d/nvidia-pm.conf|2= |
||
+ | options nvidia "NVreg_DynamicPowerManagement=0x02" |
||
+ | }} |
||
+ | |||
+ | あるいは、これら2つの設定ファイルを提供する {{AUR|nvidia-prime-rtd3pm}} をインストールすることもできます。 |
||
+ | |||
+ | 先の [[udev]] ルールと[[モジュールパラメータ]]を手動あるいは AUR パッケージで設定したら、ノート PC を再起動する必要があります。 |
||
+ | |||
+ | 以下のコマンドで、NVIDIA GPU がオフになっているかどうか確かめることができます: |
||
+ | |||
+ | $ cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status |
||
+ | |||
+ | {{ic|suspended}} か {{ic|running}} のどちらかが表示されます。{{ic|suspended}} が表示されたら、GPU がオフになっています。これで、GPU の電力消費は 0 ワットになり、バッテリーがより長持ちするようになります。 |
||
+ | |||
+ | また、NVIDIA デバイスのリソースが利用されなくなったときにカーネルがデバイスの状態を破壊することを防ぐために、{{ic|nvidia-persistenced.service}} を[[有効化]]する必要があります。[https://us.download.nvidia.com/XFree86/Linux-x86_64/465.27/README/nvidia-persistenced.html] |
||
+ | |||
+ | ==== GPU を使ってレンダリングするようにアプリケーションを設定する ==== |
||
+ | |||
+ | Dynamic Power Management を有効化せずとも、アプリケーションのオフロードレンダリングが必要です。[https://web.archive.org/web/20211203072304/https://jeansenvaars.wordpress.com/2021/12/02/endeavouros-hybrid-gpu-benchmarks/] |
||
+ | |||
+ | Dynamic Power Management を有効にして NVIDIA GPU にオフロードしてアプリケーションを実行するには、以下の[[環境変数]]を追加してください: [https://download.nvidia.com/XFree86/Linux-x86_64/435.17/README/primerenderoffload.html] |
||
+ | |||
+ | __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia ''command'' |
||
+ | |||
+ | [[Steam]] ゲームで使用する際は、ランチャーコマンドラインを以下のように設定することができます: |
||
+ | |||
+ | __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command% |
||
+ | |||
+ | {{Note|__NV_PRIME_RENDER_OFFLOAD の値は、システムによっては 0 に設定する必要があります。この変数はどの GPU を使用するかを指定するので、どの GPU が 0 で、どれが 1 かを確認しておくことが推奨されます。}} |
||
+ | |||
+ | ==== Gnome 統合 ==== |
||
+ | |||
+ | GNOME 統合に関しては、{{Pkg|switcheroo-control}} を[[インストール]]し、{{ic|switcheroo-control.service}} を[[有効化]]してください。 |
||
+ | |||
+ | GNOME は [[デスクトップエントリ]] の {{ic|PrefersNonDefaultGPU}} プロパティに従います。あるいは、アイコンを右クリックし {{ic|Launch using Discrete Graphics Card}} を選択することで、アプリケーションを GPU で実行することが可能です。 |
||
+ | |||
+ | ==== トラブルシューティング ==== |
||
+ | |||
+ | {{Pkg|bumblebee}} がインストールされている場合、このパッケージは、X サーバがオフロードのために NVIDIA ドライバをロードする際に必要な {{ic|nvidia_drm}} ドライバをブラックリストに追加するので、削除する必要があります。 |
||
+ | |||
+ | === PRIME 同期 === |
||
+ | |||
+ | PRIME を使用している時、プライマリ GPU がスクリーンのコンテンツおよびアプリケーションをレンダリングし、その結果を表示用のセカンダリ GPU に渡します。[https://forums.developer.nvidia.com/t/prime-and-prime-synchronization/44423 とある NVIDIA のスレッド]を引用すると、(日本語訳)「従来の垂直同期は、アプリケーションのレンダリングとシステムメモリへのコピーを同期させることができます。しかし、システムメモリへのコピーと iGPU のディスプレイエンジンとを同期させるには、追加のメカニズムが必要になります。そのようなメカニズムは、従来の垂直同期とは異なり、dGPU のドライバと iGPU のドライバ間でコミュニケーションを取る必要があります。」 |
||
+ | |||
+ | この同期は、PRIME 同期を使用して達成されます。PRIME 同期は、ディスプレイに対して有効化されます。{{ic|xrandr --prop}} の出力を確認してください。 |
||
+ | |||
+ | 有効化するには、以下を実行してください: |
||
+ | |||
+ | $ xrandr --output <output-name> --set "PRIME Synchronization" 1 |
||
+ | |||
+ | {{Note| |
||
+ | * NVIDIA ドライバを用いる PRIME 同期の前提条件として、[[NVIDIA#DRM カーネルモード設定|モード設定が有効化されている]]というものがあります。 |
||
+ | * PRIME 同期は、[[AMDGPU]] DDX ドライバ ({{Pkg|xf86-video-amdgpu}}) では利用できません。 |
||
+ | }} |
||
+ | |||
+ | === Wayland 固有の設定 === |
||
+ | |||
+ | Wayland は Xorg よりも設定が少なくて済みます。また、[https://invent.kde.org/plasma/kwin/-/merge_requests/811 KDE の KWin] や GNOME の Mutter には GPU ホットプラグの予備的サポートも存在するようです ([https://gitlab.gnome.org/GNOME/mutter/-/issues/17 Issue 17] と[https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1562 マージリクエスト 1562])。 |
||
+ | |||
+ | ディスクリートカードを使用するには、{{ic|1=DRI_PRIME=}} [[環境変数]]を (コマンドの) 先頭に追加してください。以下の例では、システムに Intel 統合カード、NVIDIA 外部 GPU、そして AMD 外部 GPU が存在すると仮定します。 |
||
+ | |||
+ | 統合 Intel チップを使用する場合、変更は必要ありません。それがすでにデフォルトであるからです: |
||
+ | |||
+ | {{hc|glxinfo {{!}} grep 'OpenGL renderer'| |
||
+ | OpenGL renderer string: Mesa Intel(R) Xe Graphics (TGL GT2) |
||
+ | }} |
||
+ | |||
+ | AMD カードをオープンソースドライバで使用する場合: |
||
+ | |||
+ | {{hc|1=DRI_PRIME=pci-0000_06_00_0 glxinfo {{!}} grep 'OpenGL renderer'|2= |
||
+ | OpenGL renderer string: AMD Radeon RX 5700 XT (navi10, LLVM 14.0.6, DRM 3.46, 5.18.17-hardened1-1-hardened) |
||
+ | }} |
||
+ | |||
+ | NVIDIA カードをプロプライエタリドライバで使用する場合: |
||
+ | |||
+ | {{hc|1=DRI_PRIME=pci-0000_01_00_0 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo {{!}} grep 'OpenGL renderer string'|2= |
||
+ | OpenGL renderer string: NVIDIA GeForce RTX 3050 Ti Laptop GPU/PCIe/SSE2 |
||
+ | }} |
||
+ | |||
+ | Wayland では、複数の GPU を同時に同じマシン上で使用することができます。 |
||
+ | |||
+ | {{Note|外部 GPU のホットプラグは制限付きで有効化されます: 正しいカーネルモジュールをロードするには再ログインが必須です。}} |
||
+ | |||
+ | PRIME に関する mesa3d ドキュメントを参照: https://docs.mesa3d.org/envvars.html |
||
+ | |||
+ | すべての Xwayland アプリケーションは、Xorg で行うように、特に設定せずに動作するはずです。しかし、ドライババージョン 525.85 現在、[[NVIDIA#DRM カーネルモード設定|modesetting]] が有効化されている場合、ネイティブな Wayland アプリケーションは、OpenGL のみが動作します。 |
||
+ | |||
+ | Vulkan の Wayland アプリケーションは、NVIDIA ドライバが Intel や AMD の GPU には理解できないハードウェア固有のピクセルレイアウトを使用しているため、ウィンドウが見えなくなり、場合によってはクラッシュするかもしれません。詳細は NVIDIA の [https://github.com/NVIDIA/egl-wayland/issues/72 GitHub issue 72] を参照。 |
||
== Reverse PRIME == |
== Reverse PRIME == |
||
+ | {{Note| |
||
− | セカンダリ GPU の出力にプライマリ GPU からアクセスできない場合、'''Reverse PRIME''' を使って出力を利用することができます。プライマリ GPU を使って画像をレンダリングして、セカンダリ GPU に出力を渡します。 |
||
+ | * NVIDIA ドライバ 470 ベータより前では、Reverse PRIME は AMDGPU + NVIDIA の組み合わせの場合サポートされません。詳細は [https://forums.developer.nvidia.com/t/hp-omen-15-ryzen-4600h-nvidia-1660ti-no-display-over-hdmi/165265/2] を参照してください。古いバージョンの大対策として、[[#ディスクリートカードをプライマリ GPU にする]] で説明されているように NVIDIA をプライマリカードとして使用するという方法があります。 |
||
+ | * 現在、外部ディスプレイのみが有効化されている時に FPS がたったの 1 になってしまいます。詳細は [https://gitlab.freedesktop.org/xorg/xserver/-/issues/1028] を参照。 |
||
+ | }} |
||
+ | |||
+ | 2つ目の GPU がプライマリ GPU によってアクセスできない出力を行う場合、'''Reverse PRIME''' を使うことでその出力を使用することができます。この方法は、プライマリ GPU を使ってイメージをレンダリングし、その結果を2つ目の GPU に渡します。 |
||
+ | |||
+ | 設定せずに動作する場合もありますが、そうでない場合、以下のステップを踏んでください。 |
||
+ | |||
+ | === 設定 === |
||
+ | |||
+ | まず、統合 GPU の BusID を特定してください: |
||
+ | {{hc|lspci {{!}} grep VGA| |
||
+ | 00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile) |
||
+ | 01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1) |
||
+ | }} |
||
+ | |||
+ | 上記の例では、Intel カードは 00:02.0 であり、これは PCI:0:2:0 に変換されます。 |
||
+ | |||
+ | 以下のように xorg.conf をセットアップし、BusID を変更してください。 |
||
+ | {{hc|/etc/X11/xorg.conf| |
||
+ | Section "ServerLayout" |
||
+ | Identifier "layout" |
||
+ | Screen 0 "intel" |
||
+ | Inactive "nvidia" |
||
+ | Option "AllowNVIDIAGPUScreens" |
||
+ | EndSection |
||
+ | |||
+ | Section "Device" |
||
+ | Identifier "nvidia" |
||
+ | Driver "nvidia" |
||
+ | EndSection |
||
+ | |||
+ | Section "Screen" |
||
+ | Identifier "nvidia" |
||
+ | Device "nvidia" |
||
+ | EndSection |
||
+ | |||
+ | Section "Device" |
||
+ | Identifier "intel" |
||
+ | Driver "modesetting" |
||
+ | BusID "PCI:0:2:0" |
||
+ | EndSection |
||
+ | |||
+ | Section "Screen" |
||
+ | Identifier "intel" |
||
+ | Device "intel" |
||
+ | EndSection |
||
+ | }} |
||
+ | コマンド {{ic|xrandr --setprovideroutputsource provider source}} は、ソースの出力としてのプロバイダを設定します。例: |
||
− | 上記の構成の場合、以下を実行: |
||
$ xrandr --setprovideroutputsource radeon Intel |
$ xrandr --setprovideroutputsource radeon Intel |
||
− | + | これが終わったら、ディスクリートカードの出力が xrandr で利用可能になっているはずです。以下のようなことができるようになります: |
|
$ xrandr --output HDMI-1 --auto --above LVDS1 |
$ xrandr --output HDMI-1 --auto --above LVDS1 |
||
+ | |||
+ | これは、内部ディスプレイと外部ディスプレイの両方を設定します。 |
||
+ | |||
+ | === 問題 === |
||
+ | |||
+ | 再起動した後にプロバイダが1つしか無い場合、それはおそらく Xorg が起動した時に {{ic|nvidia}} モジュールがまだロードされていないからです。早期モジュールロードを有効化する必要があります。詳細は [[NVIDIA#早期ロード]] を参照。 |
||
+ | |||
+ | == ユーザのシナリオ == |
||
=== ディスクリートカードをプライマリ GPU にする === |
=== ディスクリートカードをプライマリ GPU にする === |
||
− | 次のようなシナリオを考えてみてください: LVDS1 (ノートパソコンの内蔵スクリーン) と VGA 出力の両方とも内蔵の Intel GPU からしかアクセスできず、ディスクリートの NVIDIA カードには HDMI と DisplayPort 端子が付いている。上述の |
+ | 次のようなシナリオを考えてみてください: LVDS1 (ノートパソコンの内蔵スクリーン) と VGA 出力の両方とも内蔵の Intel GPU からしかアクセスできず、ディスクリートの NVIDIA カードには HDMI と DisplayPort 端子が付いている。上述の [[#Reverse PRIME]] テクノロジーを使うことで4つの出力を全て使うことはできますが、どの出力も内蔵の Intel カードによって作成されるためパフォーマンスが遅くなります。このような状況を改善する方法として、ディスクリートの NVIDIA カードでレンダリングを行なってから、フレームバッファを Intel カードの LVDS1 と VGA 出力にコピーすることが可能です。 |
以下の Xorg 設定を作成してください: |
以下の Xorg 設定を作成してください: |
||
{{hc|<nowiki>/etc/X11/xorg.conf.d/10-gpu.conf</nowiki>| |
{{hc|<nowiki>/etc/X11/xorg.conf.d/10-gpu.conf</nowiki>| |
||
− | # Discrete Card as Primary GPU |
||
− | |||
Section "ServerLayout" |
Section "ServerLayout" |
||
Identifier "layout" |
Identifier "layout" |
||
104行目: | 314行目: | ||
EndSection |
EndSection |
||
}} |
}} |
||
+ | |||
+ | {{Note|プロプライエタリの NVIDIA ドライバーの場合、代わりに [https://us.download.nvidia.com/XFree86/Linux-x86_64/450.57/README/randr14.html] を見てください。}} |
||
Xorg を再起動してください。ディスクリートの NVIDIA カードが使われるようになっているはずです。HDMI と DisplayPort がメインの出力で LVDS1 と VGA の出力はオフになります。有効にするには次を実行: |
Xorg を再起動してください。ディスクリートの NVIDIA カードが使われるようになっているはずです。HDMI と DisplayPort がメインの出力で LVDS1 と VGA の出力はオフになります。有効にするには次を実行: |
||
110行目: | 322行目: | ||
上記のコマンドで xrandr でディスクリートの出力端子が使えるようになります。 |
上記のコマンドで xrandr でディスクリートの出力端子が使えるようになります。 |
||
+ | |||
+ | {{Note|NVIDIA がスクリーンのレンダリングに使用されている場合、スクロールが遅くなったり、スクリーンのティアリングが発生したりする場合があります。これを軽減する方法については [[NVIDIA/トラブルシューティング#画面のティアリングを抑える]] を確認してください。}} |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
+ | |||
+ | {{Accuracy|このセクション内の回避策の根拠となるソースが存在しません。}} |
||
+ | |||
+ | === XRandR の出力プロバイダを1つだけに指定する === |
||
+ | |||
+ | /etc/X11/xorg.conf ファイルおよび /etc/X11/xorg.conf.d/ の GPU に関連するその他のファイルを削除します。この変更後、X サーバを再起動します。 |
||
+ | |||
+ | ビデオドライバが {{ic|/etc/modprobe.d/}} にブラックリスト登録されている場合は、モジュールをロードして X を再起動します。NVIDIA GPU 用に bbswitch モジュールを使用している場合は、この問題が発生する可能性があります。 |
||
+ | |||
+ | もう1つ考えられる問題は、Xorg が2台目の GPU にモニタを自動的に割り当てようとする可能性があることです。ログを確認してください: |
||
+ | |||
+ | {{hc|<nowiki>$ grep "No modes" ~/.local/share/xorg/Xorg.0.log</nowiki>| |
||
+ | AMDGPU(0): No modes. |
||
+ | }} |
||
+ | |||
+ | これを解決するには、xorg.conf に非アクティブなデバイスの ServerLayout セクションを追加します。 |
||
+ | |||
+ | {{hc|<nowiki>/etc/X11/xorg.conf</nowiki>| |
||
+ | Section "ServerLayout" |
||
+ | Identifier "X.org Configured" |
||
+ | Screen 0 "Screen0" 0 0 # Screen for your primary GPU |
||
+ | Inactive "Card1" # Device for your second GPU |
||
+ | EndSection |
||
+ | }} |
||
=== ディスクリートカードを使ってアプリケーションをレンダリングした場合に、黒画面しか表示されない === |
=== ディスクリートカードを使ってアプリケーションをレンダリングした場合に、黒画面しか表示されない === |
||
117行目: | 355行目: | ||
場合によって PRIME を使うにはコンポジットマネージャが必要になることがあります。ウィンドウマネージャがコンポジットを行わない場合、ウィンドウマネージャに加えて [[xcompmgr]] を使用してください。 |
場合によって PRIME を使うにはコンポジットマネージャが必要になることがあります。ウィンドウマネージャがコンポジットを行わない場合、ウィンドウマネージャに加えて [[xcompmgr]] を使用してください。 |
||
− | Xfce を使用しているならば Menu |
+ | Xfce を使用しているならば ''Menu > Settings > Window Manager Tweaks > Compositor'' からコンポジットを有効にできます。有効にした後にアプリケーションを実行してみてください。 |
==== GL ベースのコンポジタで黒画面が表示される ==== |
==== GL ベースのコンポジタで黒画面が表示される ==== |
||
+ | |||
− | GL ベースのコンポジタと PRIME オフロードの組み合わせには問題が存在します。Xrender ベースのコンポジタ (xcompmgr, xfwm, compton のデフォルトバックエンド, cairo-compmgr など) に問題は起こりませんが、GL ベースのコンポジタ (Mutter/muffin, Compiz, GLX バックエンドの compton, Kwin の OpenGL バックエンドなど) では、まるでコンポジタが動いていないかのように黒画面が表示されます。オフロードしたウィンドウのサイズを変更することで画像を表示させることはできますが、フルスクリーンの Wine アプリケーションなどではどうしようもありません。GL ベースのコンポジタを使っている GNOME3 や Cinnamon などのデスクトップ環境でも PRIME オフロードを使用した場合に問題が発生します。 |
||
+ | GL ベースのコンポジタと PRIME オフロードの組み合わせには問題が存在します。Xrender ベースのコンポジタ (xcompmgr, xfwm, picom のデフォルトバックエンド, cairo-compmgr など) に問題は起こりませんが、GL ベースのコンポジタ (Mutter/muffin, Compiz, GLX バックエンドの picom, Kwin の OpenGL バックエンドなど) では、まるでコンポジタが動いていないかのように黒画面が表示されます。オフロードしたウィンドウのサイズを変更することで画像を表示させることはできますが、フルスクリーンの Wine アプリケーションなどではどうしようもありません。GL ベースのコンポジタを使っている GNOME3 や Cinnamon などのデスクトップ環境でも PRIME オフロードを使用した場合に問題が発生します。 |
||
さらに、Intel IGP を使用している場合、IGP で SNA ではなく UXA を使うことで GL コンポジットの問題を解決できることがありますが、オフロードに問題を起こしてしまうこともあります ({{ic|xrandr --listproviders}} でディスクリート GPU が表示されない)。 |
さらに、Intel IGP を使用している場合、IGP で SNA ではなく UXA を使うことで GL コンポジットの問題を解決できることがありますが、オフロードに問題を起こしてしまうこともあります ({{ic|xrandr --listproviders}} でディスクリート GPU が表示されない)。 |
||
詳しくは [https://bugs.freedesktop.org/show_bug.cgi?id=69101 FDO Bug #69101] を参照。 |
詳しくは [https://bugs.freedesktop.org/show_bug.cgi?id=69101 FDO Bug #69101] を参照。 |
||
+ | |||
+ | この問題に対する他の方法として、Intel ドライバで DRI3 を有効化するというものがあります。設定例は以下を見てください。 |
||
+ | |||
+ | ===== GNOME ===== |
||
+ | |||
+ | [[GNOME/トラブルシューティング#Intel HD Graphics のティアリング解消|fullscreen undirect を無効化する]]ことでフルスクリーンアプリケーションにおける PRIME オフロードが正しく機能するかもしれません。 |
||
=== PRIME を使用してウィンドウやワークスペースを切り替えたときにカーネルがクラッシュする === |
=== PRIME を使用してウィンドウやワークスペースを切り替えたときにカーネルがクラッシュする === |
||
+ | |||
{{Note|Intel + AMD の環境で確認済みです。}} |
{{Note|Intel + AMD の環境で確認済みです。}} |
||
143行目: | 389行目: | ||
=== Reverse PRIME を使用した場合にセカンドモニタで焼きつきなどの同期の問題が発生する === |
=== Reverse PRIME を使用した場合にセカンドモニタで焼きつきなどの同期の問題が発生する === |
||
− | [[i3]] などのウィンドウマネージャで[[ |
+ | [[i3]] などのウィンドウマネージャで[[コンポジットマネージャ]]を使わないとこの問題が発生します [https://bugs.freedesktop.org/show_bug.cgi?id=75579]。 |
GNOME で問題が発生するときは、{{ic|/etc/environment}} で以下の環境変数を設定してみてください [https://bbs.archlinux.org/viewtopic.php?id=177925]: |
GNOME で問題が発生するときは、{{ic|/etc/environment}} で以下の環境変数を設定してみてください [https://bbs.archlinux.org/viewtopic.php?id=177925]: |
||
149行目: | 395行目: | ||
CLUTTER_PAINT=disable-clipped-redraws:disable-culling |
CLUTTER_PAINT=disable-clipped-redraws:disable-culling |
||
CLUTTER_VBLANK=True |
CLUTTER_VBLANK=True |
||
+ | |||
+ | === GL アプリケーションを起動したときにエラー: "radeon: Failed to allocate virtual address for buffer:" === |
||
+ | |||
+ | カーネルドライバーの電源管理が実行されているときに発生するエラーです。 |
||
+ | ブートローダーのカーネルパラメータに {{ic|1=radeon.runpm=0}} を追加することでエラーを抑えることができます。 |
||
+ | |||
+ | === VSync とクローズドソースのドライバと reverse PRIME を使用した Vulkan アプリケーション/ゲームでハング/フリーズが発生する === |
||
+ | |||
+ | 一部の Vulkan アプリケーション (特に VK_PRESENT_MODE_FIFO_KHR や VK_PRESENT_MODE_FIFO_RELAXED_KHR を使用しているもの、DXVK で実行される Windows ゲームを含む) は、'''reverse PRIME''' を使用するシステムで実行すると、GPU が常に (約5~10秒間隔でフリーズ、約1秒は正常に動作する) [https://devtalk.nvidia.com/default/topic/1044496/linux/hangs-freezes-when-vulkan-v-sync-vk_present_mode_fifo_khr-is-enabled/] を繰り返したりします |
||
+ | |||
+ | GPU がハングアップすると、すべての入力が使用できなくなります (これには TTY の切り替えと SysRq 機能の使用が含まれます) 。 |
||
+ | |||
+ | この NVIDIA バグに対する解決策は知られていませんが、いくつかの回避策は存在します: |
||
+ | * Vsync をオフにする (一部のアプリケーションでは不可能) |
||
+ | * PRIME Synchronization [https://devtalk.nvidia.com/default/topic/957814/linux/prime-and-prime-synchronization/] をオフにする (画面のティアリングが発生してしまう): |
||
+ | xrandr --output HDMI-0 --set "PRIME Synchronization" 0 #replace HDMI-0 with your xrandr output ID |
||
+ | |||
+ | {{Pkg|vulkan-tools}} パッケージの {{ic|vkcube}} を実行するだけで、使用している構成がこの問題の影響を受けているかどうかを確認できます。 |
||
+ | |||
+ | === 一部のプログラムが Wayland で開く時に遅延する === |
||
+ | |||
+ | ([[#NVIDIA]] の) RTD3 が動作している場合、Wayland を使用していると、一部のプログラムを開く際に遅延が発生します。これは、RTD3 がまず先に GPU をオンにしようとし (これには約1秒以上かかります)、その後でプログラムを開こうとするためです。これは NVIDIA ドライバの問題です。[https://bbs.archlinux.org/viewtopic.php?pid=2094847#p2094847] |
||
+ | |||
+ | この問題を解決するには、以下を {{ic|/etc/environment}} ファイルに追加してください: |
||
+ | |||
+ | {{hc|<nowiki>/etc/environment</nowiki>|2= |
||
+ | export __EGL_VENDOR_LIBRARY_FILENAMES="/usr/share/glvnd/egl_vendor.d/50_mesa.json" |
||
+ | export __GLX_VENDOR_LIBRARY_NAME="mesa" |
||
+ | }} |
||
+ | |||
+ | === DXVK で Wine のゲームを実行するとエラー === |
||
+ | |||
+ | PRIME オフロードを使用している場合、{{ic|Major opcode of failed request: 156 (NV-GLX)}} というエラーが発生する既知の問題があります。唯一知られている回避策は、X セッションを[[NVIDIA Optimus#NVIDIA グラフィックスのみを使う|完全に NVIDIA GPU 上で]]起動させることです。NVIDIA のみのモードと PRIME オフロードを切り替えるユーザフレンドリーな方法は、[[NVIDIA Optimus#optimus-manager を使う|optimus-manager]] ユーティリティです。これを使わない場合は、自身で何らかの自動化スクリプトを書くことになります。 |
||
== 参照 == |
== 参照 == |
||
* [https://wiki.freedesktop.org/nouveau/Optimus/ Nouveau Optimus] |
* [https://wiki.freedesktop.org/nouveau/Optimus/ Nouveau Optimus] |
||
+ | |||
+ | {{TranslationStatus|PRIME|2023-09-10|786890}} |
2024年9月3日 (火) 22:41時点における最新版
関連記事
PRIME は最近のデスクトップやノートパソコンで使われているハイブリッドグラフィック (NVIDIA の Optimus や Radeon の AMD Dynamic Switchable Graphics) を管理するためのテクノロジーです。Linux カーネルでマルチプレクサを必要としないハイブリッドグラフィックを実現するものとして PRIME GPU オフロードと Reverse PRIME が存在します。
目次
- 1 インストール
- 2 PRIME GPU オフロード
- 3 Reverse PRIME
- 4 ユーザのシナリオ
- 5 トラブルシューティング
- 5.1 XRandR の出力プロバイダを1つだけに指定する
- 5.2 ディスクリートカードを使ってアプリケーションをレンダリングした場合に、黒画面しか表示されない
- 5.3 PRIME を使用してウィンドウやワークスペースを切り替えたときにカーネルがクラッシュする
- 5.4 Reverse PRIME を使用した場合にセカンドモニタで焼きつきなどの同期の問題が発生する
- 5.5 GL アプリケーションを起動したときにエラー: "radeon: Failed to allocate virtual address for buffer:"
- 5.6 VSync とクローズドソースのドライバと reverse PRIME を使用した Vulkan アプリケーション/ゲームでハング/フリーズが発生する
- 5.7 一部のプログラムが Wayland で開く時に遅延する
- 5.8 DXVK で Wine のゲームを実行するとエラー
- 6 参照
インストール
オープンソースドライバ
クローズドソースのグラフィックドライバを削除して、オープンソースのドライバで置き換えてください:
再起動して、使われているグラフィックドライバのリストを確認:
$ xrandr --listproviders
Providers: number : 2 Provider 0: id: 0x7d cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 3 outputs: 4 associated providers: 1 name:Intel Provider 1: id: 0x56 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 6 outputs: 1 associated providers: 1 name:radeon
2つのグラフィックカードが存在することを確認できます: 内蔵カードの Intel (id 0x7d) とディスクリートカードの Radeon (id 0x56) です。GPU を激しく消費するアプリケーションは後者を使うべきとなります。
デフォルトでは、Intel のカードが常時使用されます:
$ glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
クローズドソースドライバー
プロプライエタリなドライバで PRIME を機能させる手順もほとんど同じです。以下の記事に従ってドライバをインストールしてください:
- AMDGPU PRO: AMD GPU 用ドライバをインストール
- NVIDIA: NVIDIA GPU 用ドライバをインストール
ドライバをインストールしたすぐ後に Xorg を再起動したり再実行したりしないでください。システム構成によっては設定を変更しないと Xorg が起動できなくなります。
ユースケースに合わせて設定を行ってください。必ずしもオープンソースドライバをアンインストールする必要はありませんが、アンインストールしておいたほうが将来的に問題が発生する可能性を少なくできます。
PRIME GPU オフロード
強力なカードでアプリケーションをレンダリングし、ディスプレイが接続されているカードにその結果を送信することが望ましいでしょう。
コマンド xrandr --setprovideroffloadsink provider sink
を使うことで、レンダーオフロードプロバイダからシンクプロバイダ (ディスプレイに接続されているプロバイダ) に出力を送信することが可能です。プロバイダとシンクの識別子は、数字 (0x7d、0x56) あるいは大文字・小文字を区別する名前 (Intel、radeon) で指定することができます。
例:
$ xrandr --setprovideroffloadsink radeon Intel
プロバイダ名の代わりにプロバイダのインデックスを使うこともできます:
$ xrandr --setprovideroffloadsink 1 0
オープンソースドライバの場合 - PRIME
ディスクリートカードを最も必要とするアプリケーション (例: ゲーム、3D モデラー) にそのカードを使わせるには、DRI_PRIME=1
環境変数を (コマンドの) 先頭に追加してください:
$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Gallium 0.4 on AMD TURKS
他のアプリケーションは、電力消費量の小さい統合カードを依然として使用します。これらの設定は、X サーバが再起動すると失われてしまいます。スクリプトを作成し、デスクトップ環境の起動時に自動的に実行されるようにすると良いかもしれません (あるいは、コードを /etc/X11/xinit/xinitrc.d/
に配置する)。しかし、これによりバッテリーの寿命が縮み、発熱が増えるかもしれません。
詳細は Gentoo:AMDGPU#Test, if a discrete graphics card is in use を参照してください。
DRI_PRIME
を Vulkan アプリケーションで機能させるには、vulkan-mesa-layers と、32 ビットアプリケーション用に lib32-vulkan-mesa-layers をインストールする必要があります。
PRIME レンダーオフロード
NVIDIA ドライバは、バージョン 435.17以降、この方法をサポートしています。modesetting (xf86-video-amdgpu (450.57)) と xf86-video-intel (455.38) が iGPU ドライバとして公式にサポートされています。
nvidia-prime によって提供されている prime-run
スクリプトを使うことで、NVIDIA カード上でプログラムを実行することができます:
$ prime-run glxinfo | grep "OpenGL renderer" $ prime-run vulkaninfo
PCI-Express Runtime D3 (RTD3) Power Management
オープンソースドライバ
カーネルの PCI 電源管理は、PRIME オフロードや reverse PRIME が使用されていない時、GPU をオフにします。 この機能は modesetting、xf86-video-amdgpu、xf86-video-intel、xf86-video-nouveau ドライバによってサポートされています。
以下のコマンドにより、各 GPU の現在の電源状態を確認することができます:
$ cat /sys/class/drm/card*/device/power_state
NVIDIA
Intel Coffee Lake 以降の CPU や (5800H などの) 一部の Ryzen CPU と、Turing 世代のカードの組み合わせの場合、GPU が使用されていないときに電源を完全に落とすことができます。
以下の udev ルールと:
/etc/udev/rules.d/80-nvidia-pm.rules
# Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto" ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto" # Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on" ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on"
以下のモジュールパラメータが必要です:
/etc/modprobe.d/nvidia-pm.conf
options nvidia "NVreg_DynamicPowerManagement=0x02"
あるいは、これら2つの設定ファイルを提供する nvidia-prime-rtd3pmAUR をインストールすることもできます。
先の udev ルールとモジュールパラメータを手動あるいは AUR パッケージで設定したら、ノート PC を再起動する必要があります。
以下のコマンドで、NVIDIA GPU がオフになっているかどうか確かめることができます:
$ cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status
suspended
か running
のどちらかが表示されます。suspended
が表示されたら、GPU がオフになっています。これで、GPU の電力消費は 0 ワットになり、バッテリーがより長持ちするようになります。
また、NVIDIA デバイスのリソースが利用されなくなったときにカーネルがデバイスの状態を破壊することを防ぐために、nvidia-persistenced.service
を有効化する必要があります。[1]
GPU を使ってレンダリングするようにアプリケーションを設定する
Dynamic Power Management を有効化せずとも、アプリケーションのオフロードレンダリングが必要です。[2]
Dynamic Power Management を有効にして NVIDIA GPU にオフロードしてアプリケーションを実行するには、以下の環境変数を追加してください: [3]
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia command
Steam ゲームで使用する際は、ランチャーコマンドラインを以下のように設定することができます:
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%
Gnome 統合
GNOME 統合に関しては、switcheroo-control をインストールし、switcheroo-control.service
を有効化してください。
GNOME は デスクトップエントリ の PrefersNonDefaultGPU
プロパティに従います。あるいは、アイコンを右クリックし Launch using Discrete Graphics Card
を選択することで、アプリケーションを GPU で実行することが可能です。
トラブルシューティング
bumblebee がインストールされている場合、このパッケージは、X サーバがオフロードのために NVIDIA ドライバをロードする際に必要な nvidia_drm
ドライバをブラックリストに追加するので、削除する必要があります。
PRIME 同期
PRIME を使用している時、プライマリ GPU がスクリーンのコンテンツおよびアプリケーションをレンダリングし、その結果を表示用のセカンダリ GPU に渡します。とある NVIDIA のスレッドを引用すると、(日本語訳)「従来の垂直同期は、アプリケーションのレンダリングとシステムメモリへのコピーを同期させることができます。しかし、システムメモリへのコピーと iGPU のディスプレイエンジンとを同期させるには、追加のメカニズムが必要になります。そのようなメカニズムは、従来の垂直同期とは異なり、dGPU のドライバと iGPU のドライバ間でコミュニケーションを取る必要があります。」
この同期は、PRIME 同期を使用して達成されます。PRIME 同期は、ディスプレイに対して有効化されます。xrandr --prop
の出力を確認してください。
有効化するには、以下を実行してください:
$ xrandr --output <output-name> --set "PRIME Synchronization" 1
Wayland 固有の設定
Wayland は Xorg よりも設定が少なくて済みます。また、KDE の KWin や GNOME の Mutter には GPU ホットプラグの予備的サポートも存在するようです (Issue 17 とマージリクエスト 1562)。
ディスクリートカードを使用するには、DRI_PRIME=
環境変数を (コマンドの) 先頭に追加してください。以下の例では、システムに Intel 統合カード、NVIDIA 外部 GPU、そして AMD 外部 GPU が存在すると仮定します。
統合 Intel チップを使用する場合、変更は必要ありません。それがすでにデフォルトであるからです:
glxinfo | grep 'OpenGL renderer'
OpenGL renderer string: Mesa Intel(R) Xe Graphics (TGL GT2)
AMD カードをオープンソースドライバで使用する場合:
DRI_PRIME=pci-0000_06_00_0 glxinfo | grep 'OpenGL renderer'
OpenGL renderer string: AMD Radeon RX 5700 XT (navi10, LLVM 14.0.6, DRM 3.46, 5.18.17-hardened1-1-hardened)
NVIDIA カードをプロプライエタリドライバで使用する場合:
DRI_PRIME=pci-0000_01_00_0 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep 'OpenGL renderer string'
OpenGL renderer string: NVIDIA GeForce RTX 3050 Ti Laptop GPU/PCIe/SSE2
Wayland では、複数の GPU を同時に同じマシン上で使用することができます。
PRIME に関する mesa3d ドキュメントを参照: https://docs.mesa3d.org/envvars.html
すべての Xwayland アプリケーションは、Xorg で行うように、特に設定せずに動作するはずです。しかし、ドライババージョン 525.85 現在、modesetting が有効化されている場合、ネイティブな Wayland アプリケーションは、OpenGL のみが動作します。
Vulkan の Wayland アプリケーションは、NVIDIA ドライバが Intel や AMD の GPU には理解できないハードウェア固有のピクセルレイアウトを使用しているため、ウィンドウが見えなくなり、場合によってはクラッシュするかもしれません。詳細は NVIDIA の GitHub issue 72 を参照。
Reverse PRIME
2つ目の GPU がプライマリ GPU によってアクセスできない出力を行う場合、Reverse PRIME を使うことでその出力を使用することができます。この方法は、プライマリ GPU を使ってイメージをレンダリングし、その結果を2つ目の GPU に渡します。
設定せずに動作する場合もありますが、そうでない場合、以下のステップを踏んでください。
設定
まず、統合 GPU の BusID を特定してください:
lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile) 01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
上記の例では、Intel カードは 00:02.0 であり、これは PCI:0:2:0 に変換されます。
以下のように xorg.conf をセットアップし、BusID を変更してください。
/etc/X11/xorg.conf
Section "ServerLayout" Identifier "layout" Screen 0 "intel" Inactive "nvidia" Option "AllowNVIDIAGPUScreens" EndSection Section "Device" Identifier "nvidia" Driver "nvidia" EndSection Section "Screen" Identifier "nvidia" Device "nvidia" EndSection Section "Device" Identifier "intel" Driver "modesetting" BusID "PCI:0:2:0" EndSection Section "Screen" Identifier "intel" Device "intel" EndSection
コマンド xrandr --setprovideroutputsource provider source
は、ソースの出力としてのプロバイダを設定します。例:
$ xrandr --setprovideroutputsource radeon Intel
これが終わったら、ディスクリートカードの出力が xrandr で利用可能になっているはずです。以下のようなことができるようになります:
$ xrandr --output HDMI-1 --auto --above LVDS1
これは、内部ディスプレイと外部ディスプレイの両方を設定します。
問題
再起動した後にプロバイダが1つしか無い場合、それはおそらく Xorg が起動した時に nvidia
モジュールがまだロードされていないからです。早期モジュールロードを有効化する必要があります。詳細は NVIDIA#早期ロード を参照。
ユーザのシナリオ
ディスクリートカードをプライマリ GPU にする
次のようなシナリオを考えてみてください: LVDS1 (ノートパソコンの内蔵スクリーン) と VGA 出力の両方とも内蔵の Intel GPU からしかアクセスできず、ディスクリートの NVIDIA カードには HDMI と DisplayPort 端子が付いている。上述の #Reverse PRIME テクノロジーを使うことで4つの出力を全て使うことはできますが、どの出力も内蔵の Intel カードによって作成されるためパフォーマンスが遅くなります。このような状況を改善する方法として、ディスクリートの NVIDIA カードでレンダリングを行なってから、フレームバッファを Intel カードの LVDS1 と VGA 出力にコピーすることが可能です。
以下の Xorg 設定を作成してください:
/etc/X11/xorg.conf.d/10-gpu.conf
Section "ServerLayout" Identifier "layout" Screen 0 "nouveau" Inactive "intel" EndSection Section "Device" Identifier "nouveau" Driver "nouveau" BusID "PCI:x:x:x" # Sample: "PCI:1:0:0" EndSection Section "Screen" Identifier "nouveau" Device "nouveau" EndSection Section "Device" Identifier "intel" Driver "intel" BusID "PCI:x:x:x" # Sample: "PCI:0:2:0" EndSection Section "Screen" Identifier "intel" Device "intel" EndSection
Xorg を再起動してください。ディスクリートの NVIDIA カードが使われるようになっているはずです。HDMI と DisplayPort がメインの出力で LVDS1 と VGA の出力はオフになります。有効にするには次を実行:
$ xrandr --setprovideroutputsource Intel nouveau
上記のコマンドで xrandr でディスクリートの出力端子が使えるようになります。
トラブルシューティング
XRandR の出力プロバイダを1つだけに指定する
/etc/X11/xorg.conf ファイルおよび /etc/X11/xorg.conf.d/ の GPU に関連するその他のファイルを削除します。この変更後、X サーバを再起動します。
ビデオドライバが /etc/modprobe.d/
にブラックリスト登録されている場合は、モジュールをロードして X を再起動します。NVIDIA GPU 用に bbswitch モジュールを使用している場合は、この問題が発生する可能性があります。
もう1つ考えられる問題は、Xorg が2台目の GPU にモニタを自動的に割り当てようとする可能性があることです。ログを確認してください:
$ grep "No modes" ~/.local/share/xorg/Xorg.0.log
AMDGPU(0): No modes.
これを解決するには、xorg.conf に非アクティブなデバイスの ServerLayout セクションを追加します。
/etc/X11/xorg.conf
Section "ServerLayout" Identifier "X.org Configured" Screen 0 "Screen0" 0 0 # Screen for your primary GPU Inactive "Card1" # Device for your second GPU EndSection
ディスクリートカードを使ってアプリケーションをレンダリングした場合に、黒画面しか表示されない
場合によって PRIME を使うにはコンポジットマネージャが必要になることがあります。ウィンドウマネージャがコンポジットを行わない場合、ウィンドウマネージャに加えて xcompmgr を使用してください。
Xfce を使用しているならば Menu > Settings > Window Manager Tweaks > Compositor からコンポジットを有効にできます。有効にした後にアプリケーションを実行してみてください。
GL ベースのコンポジタで黒画面が表示される
GL ベースのコンポジタと PRIME オフロードの組み合わせには問題が存在します。Xrender ベースのコンポジタ (xcompmgr, xfwm, picom のデフォルトバックエンド, cairo-compmgr など) に問題は起こりませんが、GL ベースのコンポジタ (Mutter/muffin, Compiz, GLX バックエンドの picom, Kwin の OpenGL バックエンドなど) では、まるでコンポジタが動いていないかのように黒画面が表示されます。オフロードしたウィンドウのサイズを変更することで画像を表示させることはできますが、フルスクリーンの Wine アプリケーションなどではどうしようもありません。GL ベースのコンポジタを使っている GNOME3 や Cinnamon などのデスクトップ環境でも PRIME オフロードを使用した場合に問題が発生します。
さらに、Intel IGP を使用している場合、IGP で SNA ではなく UXA を使うことで GL コンポジットの問題を解決できることがありますが、オフロードに問題を起こしてしまうこともあります (xrandr --listproviders
でディスクリート GPU が表示されない)。
詳しくは FDO Bug #69101 を参照。
この問題に対する他の方法として、Intel ドライバで DRI3 を有効化するというものがあります。設定例は以下を見てください。
GNOME
fullscreen undirect を無効化することでフルスクリーンアプリケーションにおける PRIME オフロードが正しく機能するかもしれません。
PRIME を使用してウィンドウやワークスペースを切り替えたときにカーネルがクラッシュする
内蔵カードの設定ファイルで DRI3 を使うようにすることで問題が解決します。
DRI3 を有効にするには、内蔵カードの設定に DRI3 オプションを追加してください:
Section "Device" Identifier "Intel Graphics" Driver "intel" Option "DRI" "3" EndSection
上記の設定をした後、DRI_PRIME=1 を使うことで DRI3 がオフロードを行うようになります。xrandr --setprovideroffloadsink radeon Intel
を実行する必要はありません。
Reverse PRIME を使用した場合にセカンドモニタで焼きつきなどの同期の問題が発生する
i3 などのウィンドウマネージャでコンポジットマネージャを使わないとこの問題が発生します [7]。
GNOME で問題が発生するときは、/etc/environment
で以下の環境変数を設定してみてください [8]:
CLUTTER_PAINT=disable-clipped-redraws:disable-culling CLUTTER_VBLANK=True
GL アプリケーションを起動したときにエラー: "radeon: Failed to allocate virtual address for buffer:"
カーネルドライバーの電源管理が実行されているときに発生するエラーです。
ブートローダーのカーネルパラメータに radeon.runpm=0
を追加することでエラーを抑えることができます。
VSync とクローズドソースのドライバと reverse PRIME を使用した Vulkan アプリケーション/ゲームでハング/フリーズが発生する
一部の Vulkan アプリケーション (特に VK_PRESENT_MODE_FIFO_KHR や VK_PRESENT_MODE_FIFO_RELAXED_KHR を使用しているもの、DXVK で実行される Windows ゲームを含む) は、reverse PRIME を使用するシステムで実行すると、GPU が常に (約5~10秒間隔でフリーズ、約1秒は正常に動作する) [9] を繰り返したりします
GPU がハングアップすると、すべての入力が使用できなくなります (これには TTY の切り替えと SysRq 機能の使用が含まれます) 。
この NVIDIA バグに対する解決策は知られていませんが、いくつかの回避策は存在します:
- Vsync をオフにする (一部のアプリケーションでは不可能)
- PRIME Synchronization [10] をオフにする (画面のティアリングが発生してしまう):
xrandr --output HDMI-0 --set "PRIME Synchronization" 0 #replace HDMI-0 with your xrandr output ID
vulkan-tools パッケージの vkcube
を実行するだけで、使用している構成がこの問題の影響を受けているかどうかを確認できます。
一部のプログラムが Wayland で開く時に遅延する
(#NVIDIA の) RTD3 が動作している場合、Wayland を使用していると、一部のプログラムを開く際に遅延が発生します。これは、RTD3 がまず先に GPU をオンにしようとし (これには約1秒以上かかります)、その後でプログラムを開こうとするためです。これは NVIDIA ドライバの問題です。[11]
この問題を解決するには、以下を /etc/environment
ファイルに追加してください:
/etc/environment
export __EGL_VENDOR_LIBRARY_FILENAMES="/usr/share/glvnd/egl_vendor.d/50_mesa.json" export __GLX_VENDOR_LIBRARY_NAME="mesa"
DXVK で Wine のゲームを実行するとエラー
PRIME オフロードを使用している場合、Major opcode of failed request: 156 (NV-GLX)
というエラーが発生する既知の問題があります。唯一知られている回避策は、X セッションを完全に NVIDIA GPU 上で起動させることです。NVIDIA のみのモードと PRIME オフロードを切り替えるユーザフレンドリーな方法は、optimus-manager ユーティリティです。これを使わない場合は、自身で何らかの自動化スクリプトを書くことになります。