ホスト プログラムとハードウェア カーネル間の送受信方法は、デバイス内のグローバル メモリを転送されるデータによって異なります。FPGA とデータの送受信を実行するには、
clCreateBuffer
、
clEnqueueWriteBuffer
および
clEnqueueReadBuffer
コマンドを使用します。
推奨:
ザイリンクスでは、
clEnqueueReadBuffer
および clEnqueueWriteBuffer
ではなく、clEnqueueMigrateMemObjects
を使用することをお勧めしています。これを次のコード例に示します。
int host_mem_ptr[MAX_LENGTH]; // host memory for input vector
// Fill the memory input
for(int i=0; i<MAX_LENGTH; i++) {
host_mem_ptr[i] = <... >
}
cl_mem dev_mem_ptr = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
sizeof(int) * number_of_words, NULL, NULL);
err = clEnqueueWriteBuffer(commands, dev_mem_ptr, CL_TRUE, 0,
sizeof(int) * number_of_words, host_mem_ptr, 0, NULL, NULL);
重要: 現時点では、ホストからグローバル メモリまでのスループットを最大化するために 4 GB を上回るバッファーは使用できませんが、ザイリンクス ではバッファー サイズをできれば少なくとも 2 MB に抑えることをお勧めしています。
単純なアプリケーションの場合、このサンプル コードでホストからデバイス メモリにデータを問題なく転送できますが、パフォーマンスおよび詳細な制御を最大にするために従う必要のあるコーディング プラクティスも多くあります。
OpenCL API では、バッファーの読み出しおよび書き込み用に追加のコマンドがサポートされていますが、これらの一部の効果は異なるので、それをよく理解してから使用するようにしてください。たとえば、
clEnqueueReadBufferRect
はバッファー オブジェクトの矩形領域をホスト アプリケーションに読み出すことはできますが、デバイスのグローバル メモリからはホストにデータを転送しません。まず clEnqueueReadBuffer
を使用してデバイスのグローバル メモリからデータを転送し、その後に clEnqueueReadBufferRect
を使用して必要な矩形領域をホスト アプリケーションに読み出す必要があります。