带有JOCL的Java OpenCL:什么是直接缓冲区?

时间:2012-08-31 14:15:31

标签: java opencl jocl

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

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

2 个答案:

答案 0 :(得分:3)

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

如果将一个java分配的数组(如byte []或int [])包装到Buffer中,它将无效。

直接缓冲区可能直接映射到设备的地址空间。这些在某种程度上“在JVM之外”。

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

答案 1 :(得分:2)

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