Opengl和opencl在一个共享上下文中只能使用一个内核
Opengl and opencl can use only 1 kernel in a single shared context
(已解决)
安装其中一个时出现问题:
{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?
- C++ 异步仅在一个内核上运行?
- 在CUDA内核中传递一个常数整数
- 如何开发仅使用一个内核的程序
- 是否可以在同一设备缓冲区上一个接一个地调用 OpenCL 内核?
- 异步是否总是在C++中使用另一个线程/内核/进程
- 为什么在循环中重复一个内核会使CUDA代码明显较慢
- 只有一个线程执行 CUDA 内核
- 为什么这C++代码没有达到一个内核的 100% 使用率?
- 如何使用多个 SVM 分类器(每个分类器都有一个特定的内核)作为"one vs rest classification"方案?
- 想要用cuda内核执行一个循环直到用户取消
- 一个包含多个OpenCL内核的程序相对于多个分别包含一个内核的程序的优势
- CUDA 如何欺骗内核认为它在另一个线程中?
- JNI 中的 Java 线程C++仅使用一个内核的环境.Arm 处理器和 Ubuntu
- 如何使用linux系统调用编写一个c++程序,该调用提供有关可用内存、已用内存和内核版本的输出
- Cuda:同步n个内核函数中的一个
- Opengl和opencl在一个共享上下文中只能使用一个内核
- 是否有可能在CUDA的另一个内核函数中调用一个内核函数?
- 从一个内核启动到另一个内核启动的共享内存持久化
- 编写一个CUDA内核来替换一个等效的cpu函数
- 如何强制编译器只使用一个内核