我有一个OpenGL应用程序,可以在具有多种多GPU配置的机器上运行(可能还有不同的Windows版本,从XP到7)。是否有一般方法可以选择独立于GPU组合的OpenGL渲染器的特定GPU(例如NVIDIA + NVIDIA,NVIDIA + AMD,NVIDIA + Intel等)?它必须是一个可以从应用程序代码应用的解决方案,即直接在C ++中或从应用程序调用的脚本,而无需最终用户干预。
以下是我尝试寻找解决方案时所做的几项测试的详细信息,从非常具体的案例开始,但也许有一种解决方案可以在所有或大多数情况下都有效。
是否有任何可靠的方法来强制哪些GPU进行OpenGL渲染?
任何提示都将非常感激。提前谢谢!
使用两张Quadro卡的组合进行测试
在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>
这个系统运行Windows 7 64位,显卡是一个Intel HD Graphics 2000(集成在CPU(Sandy Bridge)中)和一个AMD Radeon HD 6450.在所有情况下,渲染都适用于两个屏幕,但是渲染GPU因某些变量而异:
通过这个系统,我也尝试了a solution proposed in the OpenGL forums。 TL; DR:这是一种选择OpenGL使用的驱动程序的hacky方法,因此它可以在使用不同驱动程序的GPU之间进行选择,但不能在使用相同驱动程序的卡之间进行选择。我获得了以下结果:
答案 0 :(得分:5)
由于您使用的是nvidia Quadro显卡,因此您可以使用WGL_NV_gpu_affinity扩展名来选择GPU。
我不确定ATI芯片,但我认为它是AMD_gpu_association