Opengl和opencl在一个共享上下文中只能使用一个内核

Opengl and opencl can use only 1 kernel in a single shared context

本文关键字:一个 内核 上下文 opencl Opengl 共享      更新时间:2023-10-16

(已解决)

安装其中一个时出现问题:

{OpenTK,JIT(C#),错误的依赖项,错误的DLL,GPU驱动程序,me}

现在,在Java+jocl+lwjgl中,同样的事情可以毫无问题地工作。

在一个简单的opencl opengl互操作程序中,内核使用GL缓冲区(顶点、颜色等)和CL缓冲区(以毫秒为单位的时间和过滤数据)来更改网格的顶点。当共享上下文中只有一个内核时,它就会工作。

问题:当我使用两个cl内核而不是一个时,为什么不能再添加GL缓冲区?第二个内核是由单独的字符串(C99代码)作为单独的程序构建的

OpenCL的缓冲区是用C++代码创建的:

 //raises System.AccessViolationException at C# if there are more than 1 kernel
 glBuf1=cl::BufferGL(ctx,CL_MEM_READ_WRITE,glBufName,0); // exception is exactly here
 //no error even with multiple kernels
 buf1=cl::Buffer(ctx,CL_MEM_READ_WRITE,sizeof(cl_float) * 1);//single time variable
 buf2=cl::Buffer(ctx,CL_MEM_READ_WRITE,sizeof(cl_float) * bufferN*3);// some filter data
 buf3=cl::Buffer(ctx,CL_MEM_READ_WRITE,sizeof(cl_float) * bufferN*3);// some filter data

OpenGL的缓冲区是用C#代码创建的:

 GL.GenBuffers(1,&name); // and name is passed to opencl wrapper as glBufName.

是否有类似的规则"如果要在opengl和opencl之间共享上下文,每个内核必须在一个单独的上下文中,并且每个上下文必须具有与其他上下文不同的缓冲区"

编辑:64位目标构建,windows7-64位,OpenTK作为opengl部分,Khronos网站的opencl 1.2 C++包装器作为opencl部分。

编辑:用于纯开放cl计算的多个内核可以毫无问题地工作。当包含GL缓冲区时,它会出错。对于我的windows7-64位+HD7870 WHQL 13.4+opentk+opencl 1.2 c++包装器,只有单个opencl内核和opengl可以合作。

这里听起来更像是遇到了同步问题。内核的加入使它浮出水面。一旦开始大量共享资源,就需要确保OpenGL和OpenCL上下文不会同时使用它们。

在最简单的层面上,glFinish (...)可能会有所帮助。否则,您将不得不使用更复杂(且不太便携)的OpenCL/OOpenGL同步技术,如栅栏。

当它不起作用时,会收到什么错误消息?

没有一条规则要求每个内核必须在单独的上下文中。您应该能够在一个cl_program中拥有多个内核,并在一个上下文中具有多个程序。

您使用的硬件是什么,例如Nvidia或AMD GPU?