2012-08-31 32 views
0

當我嘗試在clEnqueueReadBuffer,我得到了一個例外:JOCL的Java OpenCL:什麼是直接緩衝區?

在線程異常「主」 java.lang.IllegalArgumentException異常:非阻塞讀操作只能用指針來進行直接緩衝區

在此行:

ec.add(clEnqueueReadBuffer(commandQueue, zCacheMem, false, 0, Sizeof.cl_int*numWords, zCachePtr, 0 , null, readEvents[0])); 

哪裏zCacheMem是cl_mem,zCachePtr指向一個INT []

我找不到這也解釋了這個錯誤的任何文件。有人可以幫忙嗎?

回答

3

是的,您需要使用ByteBuffer.allocateDirect()分配緩衝區,或使用JOCL的分配器函數。

如果將一個java分配的數組(如byte []或int [])包裝到Buffer中,它將不起作用。

直接緩衝區可能會直接映射到設備的地址空間。這些在JVM之外是「外部」的。

非直接緩衝區分配在java堆中,並由JVM管理(並受垃圾收集器等的限制)

2

直接ByteBuffer是有效地在本機內存和Java之間交換數據的常用方式。實際上,它們是malloc化內存的包裝。