我目前正在 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 上下文?