2012-09-05 4 views
5

変数がCL_MEM_USE_HOST_PTRでカーネルに渡された場合、デバイスの変数の変更もホストメモリにも表示されますか?OpenCL:CL_MEM_USE_HOST_PTRでカーネルに渡される変数のデバイス/ホストメモリの一貫性

私は、GPUではなくデバイスとしてCPUを使用しているので、カーネルに渡されたすべてがCL_MEM_USE_HOST_PTRでマークされます。

これが当てはまる場合は、すべてをホストに戻す必要がなくなり、非常に便利です。

答えて

8

ご理解の一つの可能​​な落とし穴を除いて、正しいです:documentation

のOpenCL実装は はデバイスメモリにhost_ptrの指すバッファの内容をキャッシュするために許可されていると述べています。このキャッシュされたコピーは、カーネルがデバイス上で実行されたときに で使用できます。

これは、カーネルによって実行されるデータの変更がすぐにhost_ptrに反映されない可能性があることを意味します。実際には、host_ptrに有効なデータが含まれていてバッファに使用されているという保証はありません。

有効で最新のデータを取得するには、強制的に同期を行う必要があります。 offcialドキュメントはこの瞬間について少し曖昧ですが、buffer mapping/unmappingはdefinetly作品:バッファオブジェクトが mem_flagsCL_MEM_USE_HOST_PTRセットで作成されている場合は

を、clCreateBufferで指定host_ptrは に保証されている最新のビットが含まれています領域は、 clEnqueueMapBufferコマンドが完了したときにマップされます。ポインタ値 がclEnqueueMapBufferによって返された場合、バッファオブジェクトの作成時に指定されたhost_ptr から派生します。ここで

Khronos group forum postから適応例である:

cl_mem device_output = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, original_output, NULL); 
// run the kernel 
void* pointer = clEnqueueMapBuffer(queue, device_output, CL_TRUE, CL_MAP_READ, size, 0, 0, NULL, NULL, NULL); 
// work with 'original_output' 
clEnqueueUnmapMemObject(queue, device_output, pointer, 0, NULL, NULL); 
clReleaseMemObject(device_output); 
+2

これは微妙な落とし穴であると私はあまりにもこれにかましてきたので、それはあなたがこれを育て良いことです。 – Ani

+0

@aland私は非常に遅くて尋ねていると思う..しかし、私はイベントを使用して待っている場合メモリをマッピングする代わりに..それはホストデバイスで私の適切な配列を更新するのだろうか?私のために働いています(私はカーネルを終了させるためにイベントを使用しているかもしれません)。しかし、私はマッピングをスキップできますか? –

+1

@Vishwadeepカーネルの実行が完了するのを待つだけで十分です(http://www.khronos.org/message_boards/showthread.php/6912-Clarify-CL_MEM_USE_HOST_PTR?p=22099&viewfull=1#post22099)。あなたのアプローチはうまくいくかもしれませんが、特にCPUを計算装置として使用するだけで良いのですが、それでも未定義の動作です。 – aland

関連する問題