2011-10-23 9 views
1

私はCL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITEフラグで作成されたバッファを持っています。これを1つのカーネルで使用して、バッファを作成したときにデータをホストメモリセットに戻しました(queue.enqueueReadBuffer(...))。私はCPU上でこれらのデータを変更しましたが、別のカーネルでこれらのデータを使用したいと思います。 ノンブロッキング書き込みを使用して手動でデータをアップロードし(queue.enqueueWriteBuffer)、このバッファを引数としてカーネルをエンキューすると、エラーCL_OUT_OF_RESOURCESが返されました。ブロッキングの書き込みはうまくいきました。インオーダーキューへの非ブロック書き込み

どうしてですか?私はブロック/ノンブロッキングバージョンは、enqueueWriteBuffer呼び出しが返った後にCPU上のメモリで作業できるかどうかだけを制御し、インオーダーキューはカーネルに違いがないはずだと考えました。 2番目の質問は、手動でアップロードする必要があるかどうかです。CL_MEM_USE_HOST_PTRは、一部のカーネルがバッファを引数として使用するたびにデータをホストからデバイスにアップロードする必要があるのですか?私がそれらを必要とするときに手動でデータをダウンロードしなければならないので、上記のフラグには何の賛成ですか?私はあなたのCL_OUT_OF_RESOURCESエラーの特定の問題を確認することはできません

おかげ

答えて

1

。このエラーは、システム内の問題のキャッチオールの一種として提起されているようです。実際のエラーは、プログラム内の何か(おそらくカーネル)によって引き起こされる可能性があります。

CL_MEM_USE_HOST_PTRを使用する場合でも、引き続き手動でデータをアップロードする必要があります。 OpenCL仕様では、次のように記述しています。

このフラグは、host_ptrがNULLでない場合にのみ有効です。指定されている場合、 は、アプリケーションがOpenLakeの実装で、メモリ オブジェクトのストレージビットとしてhost_ptrによって参照されるメモリ を使用することを要求していることを示します。 OpenCLの実装では、バッファメモリ をデバイスメモリのhost_ptrが指すようにキャッシュすることができます。このキャッシュされたコピーはカーネルがデバイス上で実行されるときに使用されます。

一部のデバイスでは、データはデバイスメモリにキャッシュされます。データを同期させるには、clEnqueueReadBuffer/clEnqueueWriteBufferまたはclEnqueueMapBuffer/clEnqueueUnmapBufferを使用する必要があります。離散的なCPU + GPUの組み合わせ(すなわち、別個のGPUカード)については、データがキャッシュされるので、CL_MEM_USE_HOST_PTRを実行すると何のメリットがあるかわかりません。明細書を読めば

は、clEnqueueMapBuffer/clEnqueueUnmapBuffer代わりのclEnqueueReadBuffer/clEnqueueWriteBufferを使用するためのいくつかのパフォーマンス上の利点があるかもしれませんが、私は、実際のデバイスのためにこれをテストしていません。

運が良かった!

関連する問題