NVIDIA X Server设置中的NVIDIA按需选项是如何工作的?

我在Ubuntu 19.10上安装了Nvidia专有驱动程序。 在Prime Profiles部分,有三个选项: * NVIDIA(性能模式) * NVIDIA按需 * Intel(省电模式)
第一个和最后一个选项很明显,但是我不知道第二个选项是如何工作的。它如何检测哪个应用程序需要NVIDIA驱动程序,哪个不需要?

1在Ubuntu 20.04上使用nvidia-driver-440,选择"NVIDIA On-Demand"会在GNOME启动器中给我一个右键选项,可以选择"使用独立显卡启动"。通过这个选项启动应用程序后,在检查nvidia-settings工具时可以确认它们将使用独立显卡。 - Michael Noguera
4个回答

好的,我终于弄清楚了。 目前来看,NVIDIA可以为OpenGL和Vulkan应用程序进行离线渲染。 要启用这种离线渲染,您需要将Prime配置文件设置为"On-Demand",然后对于Vulkan离线渲染,您需要在/etc/environment文件中添加以下变量: __NV_PRIME_RENDER_OFFLOAD=1 对于OpenGL应用程序,您需要添加以下变量: __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia 重新启动后,它将开始进行离线渲染。
要检查使用的图形卡,请在终端中输入以下命令: glxinfo | grep vendor

12值得注意的是:与任何环境变量一样,您可以在运行特定应用程序时临时设置它们。例如,如果您想将glxgears转移到NVIDIA硬件上,请执行__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxgears -info-info应该让您检查它是否实际上在NVIDIA硬件上进行渲染)。 - Dominick Pastore
那是我在整个askubuntu.com上找到的最有帮助的评论了,自从我第一次登录这里以来。祝你2021年过得愉快,伙计! - Artur
我可以确认,在Kubuntu 20.04(在X11下)与Intel Haswell和Nvidia GTX 860M上运行正常。谢谢! - Aditya Kashi

从:第一部分。安装和配置说明

第35章 PRIME渲染卸载

PRIME渲染卸载是指一个X屏幕由一个GPU渲染,但可以选择在该X屏幕上渲染特定应用程序的不同GPU。这在与动态功耗管理结合使用时特别有用,可以让NVIDIA GPU在不需要渲染性能敏感的应用程序时保持关闭状态。

渲染大部分X屏幕的GPU被称为“接收端”,而将特定应用程序渲染“卸载”到的GPU被称为“源”。渲染卸载源生成的内容会显示在渲染卸载接收端上。NVIDIA驱动程序可以作为PRIME渲染卸载源,将GLX+OpenGL或Vulkan的渲染卸载到由xf86-video-modesetting X驱动程序驱动的X屏幕上。

X服务器要求

NVIDIA的PRIME渲染卸载支持需要在X.Org X服务器中进行以下git提交:

  • 7f962c70 - xsync:在SyncCreate中添加资源,导出SyncCreate

  • 37a36a6b - GLX:添加每个客户端的供应商映射

  • 8b67ec7c - GLX:使用发送客户端来查找XID

  • 56c0a71f - GLX:添加一个函数来更改客户端的供应商列表

  • b4231d69 - GLX:设置GlxServerExports::{major,minor}Version

截至本文撰写时,这些提交仅存在于X.Org X服务器的主分支中,尚未包含在任何官方的X.Org X服务器发布版本中。


作为对Md Narimani的回答的补充: 我可以确认,在我的Kubuntu 19.10上,使用Nvidia驱动版本440是有效的。
一些背景信息可以在第34章 PRIME Render Offload中找到。
你也可以在图形界面中设置“按需”选项:Nvidia X Server Settings - PRIME Profiles: NVIDIA On-Demand
enter image description here 然后重新启动。
然后,你可以通过环境变量直接从命令行启动应用程序,以根据需要切换GPU。
stefan@stefan-Zen:~$ glxheads :0
Name: :0
  Display:     0x556081a45d40
  Window:      0x7000002
  Context:     0x556081a64a70
  GL_VERSION:  3.0 Mesa 19.2.8
  GL_VENDOR:   Intel Open Source Technology Center
  GL_RENDERER: Mesa DRI Intel(R) UHD Graphics 630 (Coffeelake 3x8 GT2) 
stefan@stefan-Zen:~$ __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxheads :0
Name: :0
  Display:     0x55f6dd9097a0
  Window:      0x7000002
  Context:     0x55f6dd944878
  GL_VERSION:  4.6.0 NVIDIA 440.64
  GL_VENDOR:   NVIDIA Corporation
  GL_RENDERER: GeForce RTX 2060/PCIe/SSE2


根据@md-narimani和@dominick-pastore的答案,实际上已经有一些适用于此目的的shell脚本作为nvidia-prime-applet软件包的一部分随附提供。
而且你可以在任何通常使用的命令之前插入它们。
nvidia-optimus-offload-glx glxheads :0
nvidia-optimus-offload-vulkan vkcube

但是这只在Nvidia内核驱动正确加载且Xorg已正确生成Nvidia屏幕的情况下才能起作用,您可以通过以下方式进行测试:
cat /var/log/Xorg.0.log | grep -i NVIDIA
# it should output a bunch of lines with "NVIDIA(G0)"

如果屏幕无法正确检测,则创建/etc/X11/xorg.conf.d/nvidia.conf文件,并按照@stefan-krüger提到的第34章 PRIME渲染卸载中的说明填充其内容。