(解决)
安装其中一个时出现问题:
{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 ++包装。
答案 0 :(得分:3)
听起来更像是在这里遇到同步问题。并且内核的添加将其带到了表面。一旦开始大量共享资源,您需要确保您的OpenGL和OpenCL上下文不会同时使用它们。
在最简单的级别,glFinish (...)
可能有所帮助。否则,您将不得不使用更复杂(且不太便携)的OpenCL / OpenGL同步技术,如围栏。
答案 1 :(得分:1)
当它不起作用时会得到什么错误消息?
没有规则要求每个内核必须位于单独的上下文中。您应该能够在单个cl_program中拥有多个内核,并在上下文中拥有多个程序。
你使用什么硬件,例如Nvidia或AMD GPU?