3

我目前正在 OpenCL 中编写烟雾模拟,我使用 OpenGL (freeglut) 来可视化烟雾。

我的计算机是带有 Intel i7 CPU 和 Intel HD 4000 GPU 的 Asus Zenbook,它们都被 OpenCL“识别”(HD 4000 = CL_DEVICE_TYP_GPU & Intel i7 = CL_DEVICE_TYPE_CPU)并包含在我的设备列表中。两种设备都支持“cl_khr_gl_sharing”。

我正在设置 OGL/OCL 上下文及其属性,如下所示:

cl_context_properties props[] = 
{
    CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), 
    CL_WGL_HDC_KHR,     (cl_context_properties)wglGetCurrentDC(), 
    CL_CONTEXT_PLATFORM, (cl_context_properties)m_platformID,
    NULL
};
cl_device_id devices[32];
size_t size;
clGetGLContextInfoKHR_fn clGetGLContextInfo = (clGetGLContextInfoKHR_fn)clGetExtensionFunctionAddressForPlatform(m_platformID, "clGetGLContextInfoKHR"); 
clGetGLContextInfo(props, CL_DEVICES_FOR_GL_CONTEXT_KHR, 32 * sizeof(cl_device_id), devices, &size);
cl_uint deviceCount = (cl_uint)(size/sizeof(cl_device_id));

cl_context cntxt = clCreateContext(props, deviceCount, devices, NULL, NULL, &status);

但是 clCreateContext 函数返回 -33,这是“INVALID_DEVICE”的错误代码。在上面的代码中,我的“devicecount”变量等于 2,这意味着两个设备都与当前的 GL 上下文相关联。

只有在分别传入两个设备中的任何一个时才能创建上下文,并且在这些情况下模拟运行良好(尽管在 CPU 上当然非常慢)。

一个类似的问题是this one,它已经得到回答,但老实说,我并不真正理解答案。

所以,我的问题是:

是否可以使用多个CL 设备在 OpenCL 和 OpenGL 之间创建共享上下文?

如果是这样..

我用来创建上下文的方法是否正确,或者是否有另一种方法可以使用多个设备设置 OCL/OGL 上下文?

4

1 回答 1

0

是的,您可以创建具有一个 GL 设备和多个 CL 设备的上下文。如果相应供应商支持 GPU 间互操作,则每个 GL 设备都可以与任何 CL 设备进行互操作。

于 2020-12-08T09:59:54.140 回答