当我在 clEnqueueReadBuffer 上进行实验时,出现了一个异常:
线程“main”中的异常 java.lang.IllegalArgumentException:非阻塞读取操作只能使用指向直接缓冲区的指针来执行
在这一行:
ec.add(clEnqueueReadBuffer(commandQueue, zCacheMem, false, 0, Sizeof.cl_int*numWords, zCachePtr, 0 , null, readEvents[0]));
其中zCacheMem是cl_mem,zCachePtr指向int[]
我找不到任何解释此错误的文档。有人可以帮忙吗?
最佳答案
是的,您需要使用 ByteBuffer.allocateDirect() 来分配缓冲区,或者使用 JOCL 的分配器函数。
如果将 java 分配的数组(例如 byte[] 或 int[])包装到 Buffer 中,它将不起作用。
直接缓冲区可能会直接映射到设备的地址空间。这些在某种程度上位于 JVM“外部”。
非直接缓冲区在 java 堆中分配并由 JVM 管理(并受垃圾收集器等约束)
关于Java OpenCL 与 JOCL : What is a direct buffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12217199/