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

时间:2011-06-10 12:13:21

标签: 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不支持此扩展,因为如果它是唯一使用的卡,则扩展程序仍未报告)。 / p>

使用Intel和AMD的Windows 7 64

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

  • 如果主屏幕连接到AMD并且在此屏幕中打开了窗口,那么AMD就是渲染器。
  • 如果主屏幕连接到AMD并且窗口在另一个屏幕中打开,则渲染器为“GDI Generic”,这非常慢。
  • 如果主屏幕连接到英特尔,则英特尔是渲染器,与窗口的打开位置无关。

通过这个系统,我也尝试了a solution proposed in the OpenGL forums。 TL; DR:这是一种选择OpenGL使用的驱动程序的hacky方法,因此它可以在使用不同驱动程序的GPU之间进行选择,但不能在使用相同驱动程序的卡之间进行选择。我获得了以下结果:

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

1 个答案:

答案 0 :(得分:5)

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

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