変数がCL_MEM_USE_HOST_PTRでカーネルに渡された場合、デバイスの変数の変更もホストメモリにも表示されますか?OpenCL:CL_MEM_USE_HOST_PTRでカーネルに渡される変数のデバイス/ホストメモリの一貫性
私は、GPUではなくデバイスとしてCPUを使用しているので、カーネルに渡されたすべてがCL_MEM_USE_HOST_PTRでマークされます。
これが当てはまる場合は、すべてをホストに戻す必要がなくなり、非常に便利です。
変数がCL_MEM_USE_HOST_PTRでカーネルに渡された場合、デバイスの変数の変更もホストメモリにも表示されますか?OpenCL:CL_MEM_USE_HOST_PTRでカーネルに渡される変数のデバイス/ホストメモリの一貫性
私は、GPUではなくデバイスとしてCPUを使用しているので、カーネルに渡されたすべてがCL_MEM_USE_HOST_PTRでマークされます。
これが当てはまる場合は、すべてをホストに戻す必要がなくなり、非常に便利です。
ご理解の一つの可能な落とし穴を除いて、正しいです:documentationは
のOpenCL実装は はデバイスメモリに
host_ptr
の指すバッファの内容をキャッシュするために許可されていると述べています。このキャッシュされたコピーは、カーネルがデバイス上で実行されたときに で使用できます。
これは、カーネルによって実行されるデータの変更がすぐにhost_ptr
に反映されない可能性があることを意味します。実際には、host_ptr
に有効なデータが含まれていてバッファに使用されているという保証はありません。
有効で最新のデータを取得するには、強制的に同期を行う必要があります。 offcialドキュメントはこの瞬間について少し曖昧ですが、buffer mapping/unmappingはdefinetly作品:バッファオブジェクトが mem_flags
にCL_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);
これは微妙な落とし穴であると私はあまりにもこれにかましてきたので、それはあなたがこれを育て良いことです。 – Ani
@aland私は非常に遅くて尋ねていると思う..しかし、私はイベントを使用して待っている場合メモリをマッピングする代わりに..それはホストデバイスで私の適切な配列を更新するのだろうか?私のために働いています(私はカーネルを終了させるためにイベントを使用しているかもしれません)。しかし、私はマッピングをスキップできますか? –
@Vishwadeepカーネルの実行が完了するのを待つだけで十分です(http://www.khronos.org/message_boards/showthread.php/6912-Clarify-CL_MEM_USE_HOST_PTR?p=22099&viewfull=1#post22099)。あなたのアプローチはうまくいくかもしれませんが、特にCPUを計算装置として使用するだけで良いのですが、それでも未定義の動作です。 – aland