2

(解决了)

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

{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-64 位,OpenTK 作为 opengl 部分,来自 Khronos 站点的 opencl 1.2 C++ 包装器作为 opencl 部分。

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

4

2 回答 2

4

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

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

于 2013-08-14T18:16:51.563 回答
1

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

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

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

于 2013-08-14T18:05:00.393 回答