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

我有一个OpenGL应用程序,可以运行在具有不同多GPUconfiguration的机器上(也可能有不同的Windows版本,从XP到7)。 是否有一种通用的方式来select独立于GPU组合(如NVIDIA + NVIDIA,NVIDIA + AMD,NVIDIA + Intel等)的独立GPU作为OpenGL渲染器? 它必须是一个解决scheme,可以从应用程序代码中直接应用,也就是直接用C ++或从应用程序中调用的脚本,而不需要最终用户的干预。

下面是我尝试寻找解决scheme的几个testing的细节,从非常具体的案例开始,但也许有一个解决scheme,可以在所有或大多数情况下工作。

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

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

试过可能的解决scheme

带有两个NVIDIA Quadro的Windows XP 64

testing两个Quadro卡的组合

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

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

  • 让司机决定。
    只要两张卡使用相同的驱动程序,并且决定使用所需的卡,此解决scheme就是好的。 所以它太具体,也许不可预测。

  • 在让驱动程序决定之前,用NVAPI更改代码中的驱动程序设置。
    有了这个解决scheme,理论上可以让驾驶员根据自己的意愿做出决定,但是很难,两张卡都需要使用相同的驱动程序,而且并不总是能够正常工作(对于FX 1700 + NVS 285而言,这是行不通的)。

  • 改变主屏幕。
    这具有应用程序在默认情况下在选定的主屏幕中打开的效果。 该解决scheme仅在FX 1700 + FX 570组合的情况下才能使用。 对于FX 1700 + FX 540,渲染器取决于驱动程序设置,与主屏幕无关,而FX 1700 + NVS 285则渲染器始终为FX 1700。

  • 当窗口在特定的屏幕上时创buildOpenGL上下文。
    窗口可以在所需的屏幕上创build,与哪个主窗口无关,但与上述解决scheme有相同的问题。

  • 创buildOpenGL上下文只启用了所需的graphics卡中的屏幕,然后启用其他/ s。
    这是我发现使用NVS 285作为渲染器的唯一方式,但它很丑,我不知道它是否可以自动化,或者在任何情况下都能正常工作。

  • 尝试使用WGL_NV_gpu_affinity扩展select渲染GPU。
    FX 1700和FX 570的组合,扩展报告两个GPU是兼容的,我可以限制渲染仅限于其中一个。 使用FX 1700 + FX 540对时,扩展报告只有一个兼容的GPU,这是驱动程序决定用于OpenGL渲染的那个。 使用FX 1700 + NVS 285组合,只有FX 1700被报告,总是(我想NVS 285不支持这个扩展,因为如果它是唯一使用的卡,它仍然没有被扩展报告)。

与英特尔和AMD的Windows 7 64

该系统在Windows 7 64位下运行,graphics卡是一个Intel HD Graphics 2000(集成在CPU(Sandy Bridge)中)和一个AMD Radeon HD 6450.在任何情况下,渲染都可以在两个屏幕上运行,但渲染GPU变化取决于一些variables:

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

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

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

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

我不清楚ATI芯片,但我认为它是AMD_gpu_association