多设备OpenCL/OpenGL上下文

3

我目前正在使用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上下文的方式,可以使用多个设备?

但是gl只能在单个设备或一些sli/crossfire设置中运行。你能用这些设备启用它吗?你尝试过使用gl进行软件渲染吗?也许有像T&L加速开始时期的非常古老的游戏那样的东西。 - huseyin tugrul buyukisik
@huseyintugrulbuyukisik 我不知道如何启用SLI/Crossfire。我对这些设置并不是很确定。我还没有尝试过软件渲染,那会如何帮助或回答我的问题呢? - Ferenziz
由于硬件限制,可能无法使用这两个设备创建上下文,因此 OpenCL 驱动程序不允许为它们创建上下文。通常情况下,应该可以创建上下文,但这并非强制性要求。 - Chanakya.sun
1个回答

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接