当我在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[]
我找不到任何解释此错误的文档。有人能帮帮忙吗?
发布于 2013-05-12 02:08:32
是的,您需要使用ByteBuffer.allocateDirect()或使用JOCL的分配器函数来分配缓冲区。
如果将java分配的数组(如byte[]或int[] )包装到缓冲区中,它将无法工作。
直接缓冲区可以直接映射到设备的地址空间。这些在某种程度上“在”JVM之外。
非直接缓冲区是在java堆中分配的,并由JVM管理(并受制于垃圾收集器等)。
发布于 2012-08-31 22:17:29
直接ByteBuffer是一种在本机内存和Java之间高效交换数据的常用方法。它们实际上是malloc‘’ed内存的包装器。
https://stackoverflow.com/questions/12217199
复制相似问题