我目前正在使用OpenCL编写烟雾模拟,其中我使用OpenGL(freeglut)来可视化烟雾。
我的电脑是一台华硕Zenbook,配备了英特尔i7 CPU和英特尔HD 4000 GPU,它们都被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,它已经得到了回答,但说实话我并不真正理解答案。
所以,我的问题是:
是否可能在OpenCL和OpenGL之间创建共享上下文,使用多个CL设备?
如果是这样...
我正在使用的创建上下文的方法是否正确,还是有另一种设置OCL/OGL上下文的方式,可以使用多个设备?