【问题标题】:Opengl and opencl can use only 1 kernel in a single shared contextOpengl 和 opencl 在单个共享上下文中只能使用 1 个内核
【发布时间】:2013-08-16 01:39:43
【问题描述】:

(已解决)

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

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

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

【问题讨论】:

    标签: c# c++ opengl opencl


    【解决方案1】:

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

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

    【讨论】:

    • 程序甚至没有进入执行阶段。只是停留在 cl::bufferGL 创建部分。在创建 cl 缓冲区之前还有一个 GL.Finish()。
    • 我只是偶然发现了 CL_CONTEXT_INTEROP_USER_SYNC 并会尝试,因为你建议同步。我为 gl-cl 互操作创建了具有足够属性的上下文。
    • 尝试了两个命令队列,每个队列都有不同的内核,并且都在一个共享上下文中,但这也不起作用。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我正在使用 AMD 7870 gpu。错误是 C# 的访问违规,但根据我的经验,它通常是 C++ 的段错误。
    • 当我为第二个内核添加不同的上下文时,缓冲区数据变为垃圾或零,即使在 opencl 内核和 GL 操作之间执行了 finish()。
    • 您可能没有在上下文之间共享资源。在 Win32 中,您将使用 wglShareLists (...) 来共享服务器资源(例如缓冲区对象)
    • @Andon 我在哪里使用 wglShareList ?在上下文属性中?
    • @ANDon 我创建的只有多个上下文是 OpenCL。只有一个 opengl 上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2018-10-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多