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

时间:2013-08-14 15:56:45

标签: c# c++ opengl opencl

(解决)

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

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

现在同样的事情在Java + jocl + lwjgl中没有问题。

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

问题:当我使用两个cl-kernel而不是一个时,为什么我不能再添加GL-buffers? 第二个内核是作为单独的程序从单独的字符串(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位目标buid,windows7-64bit,OpenTK作为opengl部分,来自Khronos网站的opencl 1.2 C ++包装器作为opencl部件。

编辑:纯粹的open-cl计算的多个内核可以正常运行。当包含GL缓冲区时,它会出错。只有单个opencl内核和opengl可以配合我的windows7-64位+ HD7870 WHQL 13.4 + opentk + opencl 1.2 c ++包装。

2 个答案:

答案 0 :(得分:3)

听起来更像是在这里遇到同步问题。并且内核的添加将其带到了表面。一旦开始大量共享资源,您需要确保您的OpenGL和OpenCL上下文不会同时使用它们。

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

答案 1 :(得分:1)

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

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

你使用什么硬件,例如Nvidia或AMD GPU?