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

Posted

技术标签:

【中文标题】有没有办法在多 GPU 环境中以编程方式选择渲染 GPU? (视窗)【英文标题】:Is there a way to programmatically select the rendering GPU in a multi-GPU environment? (Windows) 【发布时间】:2011-09-12 11:12:57 【问题描述】:

问题

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

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

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

任何提示将不胜感激。提前致谢!

尝试了可能的解决方案

带有两个 NVIDIA Quadro 的 Windows XP 64

使用两张 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 渲染的一个。使用 FX 1700 + NVS 285 组合,始终只报告 FX 1700(我认为 NVS 285 不支持此扩展,因为如果它是唯一使用的卡,扩展仍然不会报告)。

采用 Intel 和 AMD 的 Windows 7 64

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

如果主屏幕连接到 AMD 并在此屏幕中打开窗口,则 AMD 是渲染器。 如果主屏连接AMD,在另一个屏打开窗口,那么渲染器是“GDI Generic”,很慢。 如果主屏幕连接到 Intel,则 Intel 是渲染器,与打开窗口的位置无关。

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

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

【问题讨论】:

奇怪的是,Direct3D 渲染可以在两个屏幕上开箱即用,即使是 FX 1700 + NVS 285 组合。 论坛链接失效。你能复述一下这个想法吗? 新链接:community.khronos.org/t/… 【参考方案1】:

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

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

【讨论】:

感谢您的回答。我已经尝试过 WGL_NV_gpu_affinity 扩展(忘了在问题中提及它,抱歉),虽然结果并不令人满意:它只在一种情况下检测到两个 GPU,在其余情况下只检测到一个 GPU,所以它没用 :( 我将使用 WGL_NV_gpu_affinity 扩展对我的结果进行更详细的解释来编辑问题。

以上是关于有没有办法在多 GPU 环境中以编程方式选择渲染 GPU? (视窗)的主要内容,如果未能解决你的问题,请参考以下文章

在 ios 中以编程方式获取墙纸

在 C# 中以编程方式设置 Windows XP Embedded 区域设置

有没有办法在 JooQ 中以编程方式回滚事务?

有没有办法从我的 Joomla 组件中以编程方式添加菜单项?

如何在 Simulink Scope 中以编程方式“打印到图形”

有没有办法以编程方式测试浏览器 GPU 加速?