0

当我在 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[]

我找不到任何解释此错误的文档。有人可以帮忙吗?

4

2 回答 2

3

是的,您需要使用 ByteBuffer.allocateDirect() 分配缓冲区,或者使用 JOCL 的分配器函数。

如果将 java 分配的数组(如 byte[] 或 int[] 包装到 Buffer 中,它将不起作用。

直接缓冲区可能直接映射到设备的地址空间。这些以某种方式在 JVM 之外。

非直接缓冲区在 Java 堆中分配并由 JVM 管理(并受垃圾收集器等)

于 2013-05-11T18:08:31.623 回答
2

Direct ByteBuffer是一种在本机内存和 Java 之间有效地交换数据的常用方法。实际上,它们是 malloc 内存的包装器。

于 2012-08-31T14:17:28.610 回答