ホスト プログラムとハードウェア カーネル間の送受信方法は、バッファーの転送とデバイス内のメモリを転送されるデータによって異なります。このプロセスでは、
clCreateBuffer
や clEnqueueMigrateMemObjects
のような関数を使用します。
メモリ バッファーの割り当てとデータの転送には、次の 2 つの方法があります。
XRT でバッファーを割り当てる場合は、enqueueMapBuffer
を使用してバッファー ハンドルを取得します。2 つ目の方法では、CL_MEM_USE_HOST_PTR
でバッファーを直接割り当てるので、ハンドルを取得する必要はありません。
最大限のパフォーマンスおよび詳細な制御をするためのさまざまなコーディング プラクティスがあります。OpenCL API では、バッファーの読み出しおよび書き込み用に追加のコマンドがサポートされていますが、たとえば、
clEnqueueWriteBuffer
と
clEnqueueReadBuffer
コマンドを clEnqueueMigrateMemObjects
の代わりに使用できます。ただし、これらのコマンドの中には効果の異なるものもあるので、よく理解してから使用するようにしてください。たとえば、
clEnqueueReadBufferRect
はバッファー オブジェクトの矩形領域をホスト アプリケーションに読み出すことはできますが、デバイスのグローバル メモリからはホストにデータを転送しません。まず clEnqueueReadBuffer
を使用してデバイスのグローバル メモリからデータを転送し、その後に clEnqueueReadBufferRect
を使用して必要な矩形領域をホスト アプリケーションに読み出す必要があります。