0

clEnqueueReadBuffer を試していたときに、例外が発生しました。

スレッド「メイン」の例外 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 のアロケータ関数を使用する必要があります。

byte[] や int[] などの Java 割り当て配列を Buffer にラップすると、機能しません。

直接バッファは、デバイスのアドレス空間に直接マップされる場合があります。これらは何らかの形で JVM の「外部」にあります。

非直接バッファーは Java ヒープに割り当てられ、JVM によって管理されます (ガベージ コレクターなどの対象となります)。

于 2013-05-11T18:08:31.623 に答える
2

Direct ByteBufferは、ネイティブ メモリと Java の間でデータを効率的に交換する一般的な方法です。事実上、それらは malloc されたメモリのラッパーです。

于 2012-08-31T14:17:28.610 に答える