【问题标题】:How to detect the default GPU at Runtime?如何在运行时检测默认 GPU?
【发布时间】:2016-07-20 23:41:14
【问题描述】:

我在这里遇到了一个奇怪的问题,我很难找到答案。

我有一个 C++ 3D 引擎,我正在使用 OpenCL 进行优化和 OpenGL 互操作性。

在我的机器上,我安装了两个 GPU,一个 GTX 960 和一个 AMD R9 280X。

一切正常,包括检测 GPU 和 CPU 以及 图形互操作性运行得非常快。

但是,在一台机器上,我们总是在系统上有一个默认的 GPU(这是在 windows 上设置的,具体取决于我们安装驱动程序的顺序)。

所以,当我开始读取所有设备并检测 GPU 时,当我尝试创建互操作性上下文时,我遇到了一个奇怪的情况:

当我将 AMD 作为默认 GPU 时: 在 NVIDIA 设备的情况下,OpenCL 向我返回一个错误,通知它不可能创建 CL 上下文(因为不是默认 GPU),并且当我为 AMD GPU 创建 OpenGL 上下文时,上下文已正确创建。

当我将 NVIDIA 作为默认 GPU 时: 在 NVIDIA 设备的情况下,上下文创建正确,但是当我尝试创建 AMD 上下文时,返回一个错误,系统崩溃!

所以,我的主要问题是如何在运行时检测默认 GPU 以创建互操作性上下文,仅适用于默认 GPU,因为 AMD 正在崩溃而不是返回错误...(因为错误我可以设置一个标志通知基于此结果的默认 GPU...)。

有人知道如何在运行时使用 C++ 检测默认 GPU 吗?

亲切的问候。

【问题讨论】:

    标签: c++ opengl interop opencl gpu


    【解决方案1】:

    一种技术是向 OpenGL 询问设备名称并使用它来选择 OpenCL 设备。注意:您可以在比较之前将这些减少为枚举,因为字符串不匹配(例如 AMD 与 ATI)。

    【讨论】:

    • 我喜欢它,我会尝试找出如何做到这一点。
    • glGetString(GL_VENDOR) -- 将“AMD”、“ATI”和“Advanced Micro Devices”全部映射到您的 AMD 枚举,将“NVIDIA”映射到 NVIDIA 枚举,将“Intel”和“INTEL”映射到英特尔枚举。然后clGetDeviceInfoCL_DEVICE_VENDOR 进行类似的映射。然后比较枚举。
    • 非常感谢!效果很好!
    【解决方案2】:

    您很可能正在混合来自两个 GPU 的内容。例如,使用默认 GPU 的设备为非默认 GPU 创建上下文。在为 OpenCL 使用 Khronos C++ 绑定时,您可能会遇到此类问题。无论未显式创建并设置为非默认 GPU 的默认值,它将由包装器使用默认 GPU 为您创建。

    其他 C++ 包装器可能会遇到类似的问题。不看源码很难说更多。

    【讨论】:

    • 是的,我正在从头开始编写我自己的优化组件,并且我混合了许多上下文,因为我有多个设备。
    【解决方案3】:

    终于经过大量测试,它按预期工作并且非常快!!!

    基本上我有两个组件:

    01) OpenGL 组件

    02) OpenCL 组件

    因此,在 OpenGL 组件中,我从创建的图形上下文中提取 GPU 供应商(因为 GL 上下文是系统上创建的第一件事,以使在窗口中渲染图形成为可能)。

    在这个初始化之后,我开始初始化传递给它的 OpenCL 组件,OpenGL 收集的供应商,因为它是系统上注册的默认 GPU 卡。

    在设备初始化期间,我放置了一个标志,标记默认 GPU 用于 OpenGL 互操作,因此对于所有其他设备,创建正常执行上下文,并为默认 GPU 设备创建互操作上下文。

    之后,当我请求内核执行时,我将使用它的组件名称传递给它,如果此组件是普通组件,则使用用于异构计算的 CPU 和第二 GPU 设备,如果此调用来自 3D用于OpenGL互操作的GPU组件!!!

    真的很酷!!!

    我测试了将默认 GPU 从 NVIDIA 转换为 AMD 和 AMD 转换为 NVIDIA ,效果很好!!!

    我测试了将我的数学和物理组件指向第二个 GPU,并将 3D 图形组件指向默认 GPU,我取得了很好的结果!

    该软件现在像 Monster Dragster 一样运行!!!

    非常感谢您的帮助!

    亲切的问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2018-11-21
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多