我有一个奇怪的问题,我有很多困难找到答案。
我有一个C ++ 3D引擎,我使用OpenCL进行优化和OpenGL互操作性。
在我的机器中,我安装了两个GPU,一个GTX 960和一个AMD R9 280X。
一切正常,包括检测GPU和CPU 图形互操作性的运行速度非常快。
但是,总的来说,在一台机器上我们在系统上有一个默认的GPU(这是根据我们安装驱动程序的顺序在Windows上设置的。)
所以,当我开始阅读所有设备并检测GPU时,当我尝试创建互操作性上下文时,我有一个奇怪的情况:
当我将AMD作为默认GPU时: 在NVIDIA设备的情况下,OpenCL向我返回一个错误,通知它不可能创建CL上下文(Becouse不是默认的GPU),当我为AMD GPU创建OpenGL上下文时,正确创建上下文。
当我将NVIDIA作为默认GPU时: 在NVIDIA设备的情况下,上下文是正确创建的,但是当我尝试创建AMD上下文时,反而给我一个错误,系统崩溃!
所以,我的主要问题是如何在运行时检测默认GPU以创建互操作性上下文,仅针对默认GPU,因为AMD正在崩溃而不是返回错误...(因为错误我可以设置一个标志通知基于此结果的默认GPU ...)。
任何人都知道如何使用C ++在运行时检测默认GPU?
亲切的问候。
答案 0 :(得分:1)
一种技术是向OpenGL询问设备名称,并使用它来选择OpenCL设备。注意:您可以在比较之前将这些减少到枚举,因为字符串不匹配(例如AMD与ATI)。
答案 1 :(得分:0)
你最有可能混合来自两个GPU的东西。例如,使用来自默认GPU的设备为非默认GPU创建上下文。在为OpenCL使用Khronos C ++绑定时,您可能会遇到这类问题。无论是非显式创建并设置为非默认GPU的默认值,它都将由包装器为您使用默认GPU创建。
其他C ++包装器可能会遇到类似的问题。如果没有看到源代码,就很难说些什么。
答案 2 :(得分:0)
经过大量测试后,它按预期工作并且真的很快!!!
基本上我有两个组成部分:
01)OpenGL组件
02)OpenCL组件
因此,在OpenGL组件中,我从创建的图形上下文中提取GPU供应商(因为GL上下文是系统上创建的第一个可以在窗口中渲染图形的东西)。
在初始化之后,我开始将OpenCL组件传递给它,由OpenGL收集供应商,因为它是在系统上注册的默认GPU卡。
在设备初始化期间,我设置了一个标记用于OpenGL互操作的默认GPU的标志,因此对于所有其他设备,将创建正常的执行上下文,并且对于默认的GPU设备,将创建互操作上下文。
之后,当我请求内核执行时,我使用它传递组件名称,如果此组件是普通组件,则使用用于异构计算的CPU和第二GPU设备,如果此调用来自3D用于OpenGL互操作的GPU组件!!!
Reeaaallly Cool !!!
我测试了将默认GPU从NVIDIA反转到AMD和AMD到NVIDIA,并且非常有效!
我测试了将我的数学和物理组件指向第二个GPU和3D图形组件到默认GPU,我的效果很好!
软件现在像Monster Dragster一样运行!!!
非常感谢你的帮助!
亲切的问候。