草庐IT

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

coder 2023-11-09 原文

问题

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

下面是我为找到解决方案而进行的几种测试的详细信息,从非常特殊的情况开始,但是也许有一种解决方案可以在所有或大多数情况下使用。

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

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

尝试了可能的解决方案

Windows XP 64和两个NVIDIA Quadro

使用两个Quadro卡的组合进行测试

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

  • 在64位Windows XP下使用相同的驱动程序(版本275.36),我在各种方法上都取得了相对成功,例如:
  • 让驱动程序决定。
    仅当两张卡使用相同的驱动程序并且决定使用所需的卡时,此解决方案才有效。因此,它过于具体,可能无法预测。
  • 在让驱动程序决定之前,使用NVAPI更改代码中的驱动程序设置。
    通过这种解决方案,理论上可以让驱动程序根据我的意愿做出决定,但是这很困难,需要两块卡使用相同的驱动程序并且不能始终工作(对于FX 1700 + NVS 285则行不通)。
  • 更改主屏幕。
    这具有默认情况下该应用程序在选定的主屏幕中打开的效果。仅FX 1700 + FX 570组合可单独使用此解决方案。对于FX 1700 + FX 540,渲染器取决于驱动程序设置,而与主屏幕无关,而对于FX 1700 + NVS 285,渲染器始终为FX1700。
  • 当窗口位于特定屏幕中时创建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不支持此扩展,因为如果它是唯一使用的卡,则扩展仍不会报告)。

  • 装有Intel和AMD的Windows 7 64

    该系统在Windows 7 64位系统上运行,并且图形卡是一个Intel HD Graphics 2000(集成在CPU(Sandy Bridge)中)和一个AMD Radeon HD6450。在所有情况下,渲染都可以在两个屏幕上进行,但是渲染GPU有所不同取决于一些变量:
  • 如果主屏幕连接到AMD,并且在此屏幕中打开了窗口,则AMD是渲染器。
  • 如果主屏幕连接到AMD,并且在另一个屏幕中打开了窗口,则渲染器为“GDI Generic”,这非常慢。
  • 如果主屏幕连接到Intel,则Intel是渲染器,与打开窗口的位置无关。

  • 使用此系统,我还尝试了a solution proposed in the OpenGL forums。 TL; DR:这是一种选择OpenGL使用的驱动程序的方法,因此可以在使用不同驱动程序的GPU之间进行选择,但不能在使用同一驱动程序的卡之间进行选择。我获得了以下结果:
  • 如果主屏幕连接到AMD,则可以选择任何GPU作为渲染器。
  • 如果主屏幕连接到Intel,则可以选择Intel作为渲染器(无用,因为这是自动的),但是如果尝试选择AMD,则会出错。我认为这可能是驱动程序中的错误。
  • 最佳答案

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

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

    关于windows - 有没有办法在多GPU环境中以编程方式选择渲染GPU? ( Windows ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6306190/

    有关windows - 有没有办法在多GPU环境中以编程方式选择渲染GPU? ( Windows )的更多相关文章

    1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

      我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

    3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    4. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

      question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

    5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

      这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

    6. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

      我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

    7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

      在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

    8. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

      之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

    9. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

      深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

    10. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

      这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

    随机推荐