问题
我有一个OpenGL应用程序,它将在具有不同多GPU配置(可能有不同的Windows版本,从XP到7(的机器上运行。有没有一种通用的方法可以选择独立于GPU组合(例如NVIDIA + NVIDIA,NVIDIA + AMD,NVIDIA + Intel等(充当OpenGL渲染器的特定GPU?它必须是可以从应用程序代码应用的解决方案,即直接在C++中应用,或者是从应用程序调用的脚本,无需最终用户干预。
以下是我为尝试找到解决方案而进行的几项测试的详细信息,从非常具体的情况开始,但也许有一种解决方案可以在所有或大多数情况下工作。
是否有任何可靠的方法来强制哪个GPU进行OpenGL渲染?
任何提示将不胜感激。提前感谢!
尝试了可能的解决方案
Windows XP 64 与两个 NVIDIA Quadro
使用两个 Quadro 卡的组合进行测试
- 四重奏 FX 1700 + 四重奏 FX 570
- 四重奏 FX 1700 + 四重奏 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 上下文时,仅启用所需显卡中的屏幕,然后启用其他屏幕。
这是我发现使用 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 与英特尔和 AMD
该系统在Windows 7 64位上运行,显卡是一个Intel HD Graphics 2000(集成在CPU(Sandy Bridge(中(和一个AMD Radeon HD 6450。在所有情况下,渲染都可以在两个屏幕上工作,但渲染 GPU 因某些变量而异:
- 如果主屏幕连接到 AMD 并且在此屏幕中打开窗口,则 AMD 是渲染器。
- 如果主屏幕连接到AMD,并且窗口在另一个屏幕中打开,则渲染器是"GDI通用",这非常慢。
- 如果主屏幕连接到英特尔,则英特尔是渲染器,与窗口打开的位置无关。
有了这个系统,我还尝试了OpenGL论坛上提出的解决方案。TL;DR:选择OpenGL使用的驱动程序是一种黑客方法,因此它可以在使用不同驱动程序的GPU之间进行选择,但不能在使用相同驱动程序的卡之间进行选择。我得到了以下结果:
- 如果主屏幕连接到 AMD,我可以选择任何 GPU 作为渲染器。
- 如果主屏幕连接到英特尔,我可以选择英特尔作为渲染器(没用,因为这是自动的(,但是如果我尝试选择 AMD,我会出错;我认为这可能是驱动程序中的错误。
由于您使用的是 nvidia Quadro 卡,因此您可以使用 WGL_NV_gpu_affinity 扩展来选择 GPU。
我不确定ATI芯片,但我认为它是AMD_gpu_association