有没有办法在多GPU环境中以编程方式选择渲染GPU?(视窗)

Wou*_*orf 19 windows opengl multiple-monitors multi-gpu

我有一个OpenGL应用程序,可以在具有多种多GPU配置的机器上运行(可能还有不同的Windows版本,从XP到7).是否有一般方法可以选择独立于GPU组合的OpenGL渲染器的特定GPU(例如NVIDIA + NVIDIA,NVIDIA + AMD,NVIDIA + Intel等)?它必须是可以从应用程序代码应用的解决方案,即直接在C++或将从应用程序调用的脚本,而无需最终用户干预.

以下是我尝试寻找解决方案的几项测试的详细信息,从非常具体的案例开始,但也许有一个解决方案可以在所有或大多数情况下工作.

是否有任何可靠的方法来强制哪些GPU进行OpenGL渲染?

任何提示都将非常感激.提前致谢!

试过可能的解决方案

Windows XP 64带有两个NVIDIA Quadro

使用两个Quadro卡组合进行测试

  • Quadro FX 1700 + Quadro FX 570
  • Quadro FX 1700 + Quadro FX 540
  • Quadro FX 1700 + Quadro NVS 285

在Windows XP 64位下使用相同的驱动程序(版本275.36),我在各种方法上取得了相对成功,例如:

  • 让司机决定.
    只要两张卡使用相同的驱动程序并决定使用所需的卡,此解决方案就是好的.所以它太具体,可能无法预测.

  • 在让司机决定之前,使用NVAPI更改代码中的驱动程序设置.
    有了这个解决方案,理论上可以让驱动程序按我的意愿决定,但很难,需要两张卡使用相同的驱动程序而且并不总是有效(使用FX 1700 + NVS 285它不起作用).

  • 更改主屏幕.
    这具有默认情况下应用程序在所选主屏幕中打开的效果.该解决方案仅与FX 1700 + FX 570组合一起使用.使用FX 1700 + FX 540,渲染器取决于驱动程序设置,独立于主屏幕,而FX 1700 + NVS 285渲染器始终为FX 1700.

  • 当窗口在特定屏幕中时创建OpenGL上下文.
    窗口可以在所需的屏幕中创建,独立于主屏幕,但它具有与上述解决方案相同的问题.

  • 创建OpenGL上下文,仅启用所需图形卡中的屏幕,然后启用其他/ s.
    这是我发现使用NVS 285作为渲染器的唯一方法,但它很难看,我不知道它是否可自动化,或者它是否适用于所有情况.

  • 尝试使用WGL_NV_gpu_affinity扩展名选择渲染GPU .
    通过FX 1700和FX 570的组合,扩展程序将两个GPU报告为兼容,并且我可以将渲染仅限制为其中一个.使用FX 1700 + FX 540对,扩展仅报告一个兼容的GPU,即驱动程序决定用于OpenGL渲染的GPU.使用FX 1700 + NVS 285组合时,始终只报告FX 1700(我认为NVS 285不支持此扩展,因为如果它是唯一使用的卡,则扩展程序仍未报告).

Windows 7 64采用Intel和AMD

这个系统运行Windows 7 64位,显卡是一个Intel HD Graphics 2000(集成在CPU(Sandy Bridge)中)和一个AMD Radeon HD 6450.在所有情况下,渲染都适用于两个屏幕,但渲染GPU不同取决于一些变量:

  • 如果主屏幕连接到AMD并且在此屏幕中打开了窗口,则AMD是渲染器.
  • 如果主屏幕连接到AMD并且窗口在另一个屏幕中打开,那么渲染器是"GDI Generic",这非常慢.
  • 如果主屏幕连接到Intel,则Intel是渲染器,与窗口打开的位置无关.

有了这个系统,我也尝试了在OpenGL论坛中提出的解决方案.TL; DR:这是一种选择OpenGL使用的驱动程序的hacky方法,因此它可以在使用不同驱动程序的GPU之间进行选择,但不能在使用相同驱动程序的卡之间进行选择.我获得了以下结果:

  • 如果主屏幕连接到AMD,我可以选择任何GPU作为渲染器.
  • 如果主屏幕连接到英特尔,我可以选择英特尔作为渲染器(没用,因为这是自动的),但如果我尝试选择AMD,我会收到错误; 我认为这可能是驱动程序中的一个错误.

BЈо*_*вић 5

由于您使用的是nvidia Quadro显卡,因此可以使用WGL_NV_gpu_affinity扩展名来选择GPU.

我不确定ATI芯片,但我认为它是AMD_gpu_association