gpt4 book ai didi

opengl - OpenCL/OpenGL 与多个 GPU 互操作

转载 作者:行者123 更新时间:2023-12-01 23:53:53 26 4
gpt4 key购买 nike

我在使用多个 GPU 进行 OpenCL/OpenGL 互操作时遇到问题。我正在尝试编写一个应用程序来呈现密集计算的结果。最后它会运行一个优化问题,然后根据结果将一些内容渲染到屏幕上。作为测试用例,我从本类(class)中的粒子模拟示例代码开始:http://web.engr.oregonstate.edu/~mjb/sig13/

示例代码创建 OpenGL 上下文,然后使用 cl_khr_gl_sharing 扩展创建共享状态的 OpenCL 上下文。当我使用单个 GPU 时,一切工作正常。创建上下文如下所示:

3. create an opencl context based on the opengl context:
cl_context_properties props[ ] =
{
CL_GL_CONTEXT_KHR, (cl_context_properties) glXGetCurrentContext( ),
CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay( ),
CL_CONTEXT_PLATFORM, (cl_context_properties) Platform,
0
};

cl_context Context = clCreateContext( props, 1, Device, NULL, NULL, &status );
if( status != CL_SUCCESS)
{
PrintCLError( status, "clCreateContext: " );
exit(1);
}

稍后,该示例使用 clCreateFromGLBuffer 创建共享 CL/GL 缓冲区。

现在,我想从两个 GPU 设备创建一个上下文:

cl_context Context = clCreateContext( props, 2, Device, NULL, NULL, &status );

我已成功打开这些设备,并且可以查询它们是否都支持 cl_khr_gl_sharing,并且都可以单独工作。但是,当尝试创建上述上下文时,我得到

CL_INVALID_OPERATION 

这是 cl_khr_gl_sharing 扩展添加的错误代码。在扩展描述(上面链接)中它说

  • CL_INVALID_OPERATION if a context or share group object was specified for one of CGL, EGL, GLX, or WGL and any of the following conditions hold:

    • The OpenGL implementation does not support the window-system binding API for which a context or share group objects was specified.
    • More than one of the attributes CL_CGL_SHAREGROUP_KHR, CL_EGL_DISPLAY_KHR, CL_GLX_DISPLAY_KHR, and CL_WGL_HDC_KHR is set to a non-default value.
    • Both of the attributes CL_CGL_SHAREGROUP_KHR and CL_GL_CONTEXT_KHR are set to non-default values.
    • Any of the devices specified in the argument cannot support OpenCL objects which share the data store of an OpenGL object, as described in section 9.12."

这个描述似乎并不完全符合我的情况。是否无法与多个 GPU 进行 OpenCL/OpenGL 互操作?或者是我有异构硬件?我从枚举的设备中打印出了一些参数。我刚刚随机拿了两个 GPU 来使用。

PlatformID: 18483216
Num Devices: 2

-------- Device 00 ---------
CL_DEVICE_NAME: GeForce GTX 285
CL_DEVICE_VENDOR: NVIDIA Corporation
CL_DEVICE_VERSION: OpenCL 1.0 CUDA
CL_DRIVER_VERSION: 304.88
CL_DEVICE_MAX_COMPUTE_UNITS: 30
CL_DEVICE_MAX_CLOCK_FREQUENCY: 1476
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU

-------- Device 01 ---------
CL_DEVICE_NAME: Quadro FX 580
CL_DEVICE_VENDOR: NVIDIA Corporation
CL_DEVICE_VERSION: OpenCL 1.0 CUDA
CL_DRIVER_VERSION: 304.88
CL_DEVICE_MAX_COMPUTE_UNITS: 4
CL_DEVICE_MAX_CLOCK_FREQUENCY: 1125
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU

cl_khr_gl_sharing is supported on dev 0.
cl_khr_gl_sharing is supported on dev 1.

请注意,如果我创建没有互操作部分的上下文(使得 props 数组如下所示),那么它会成功创建上下文,但显然无法与应用程序的 OpenGL 端共享缓冲区。

cl_context_properties props[ ] =
{
CL_CONTEXT_PLATFORM, (cl_context_properties) Platform,
0
};

最佳答案

几个相关问题和示例


bool stageProducer::preExecution()
{
if(!glContext::getInstance().makeCurrent(_rc))
{
window::getInstance().messageBoxWithLastError("wglMakeCurrent");
return false;
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fboID);
return true;
}

特定于 OpenCL,但与此问题相关:

“如果您将写入写入队列A(设备A)上的缓冲区,则OpenCL将使用该设备来执行写入操作。但是,如果您随后在同一上下文中使用队列B(设备B)上的缓冲区,OpenCL会识别出 deviceA 拥有最新的数据,并在使用之前将其移至 deviceB。简而言之,只要您使用事件来确保没有两个设备试图同时访问同一内存对象,OpenCL 就会确保每次使用内存对象时都拥有最新的数据,无论最后一次使用的是哪个设备。”

我假设当您将 OpenGL 排除在 GPU 之间共享内存的方程式之外时,会按预期工作吗?

关于opengl - OpenCL/OpenGL 与多个 GPU 互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17956821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com