Vitis ソフトウェア プラットフォームでは、カーネル オブジェクトに次の 2 つのタイプの引数を設定できます。
- スカラー引数は、定数またはコンフィギュレーション タイプのデータなどの小型のデータに使用します。これらは、ホスト アプリケーションの観点からは書き込み専用、つまりカーネルへの入力です。
- バッファー引数は、大型のデータ転送に使用します。値は、プログラムおよびカーネル オブジェクトに関連付けられたコンテキストを使用して作成されたメモリ オブジェクトへのポインターで、カーネルへの入力またはカーネルからの出力になります。
2 つのスカラーと 2 つのバッファー引数のカーネル引数を設定する次の例に示すように、カーネル引数は
clSetKernelArg
を使用して設定できます。
// Create memory buffers
cl_mem dev_buf1 = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, size, &host_mem_ptr1, NULL);
cl_mem dev_buf2 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, size, &host_mem_ptr2, NULL);
int err = 0;
// Setup scalar arguments
cl_uint scalar_arg_image_width = 3840;
err |= clSetKernelArg(kernel, 0, sizeof(cl_uint), &scalar_arg_image_width);
cl_uint scalar_arg_image_height = 2160;
err |= clSetKernelArg(kernel, 1, sizeof(cl_uint), &scalar_arg_image_height);
// Setup buffer arguments
err |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &dev_buf1);
err |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &dev_buf2);
重要:
OpenCL では、カーネルのエンキュー前であればいつでもカーネル引数を設定できますが、できるだけ早期に設定することをお勧めします。XRT では、デバイスのどこにバッファーを置くかわかる前にバッファーを移行しようとすると、エラー メッセージが表示されます。このため、カーネル引数はエンキュー (たとえば
clEnqueueMigrateMemObjects
) を実行する前にバッファーに設定するようにしてください。すべてのカーネル バッファー引数で、バッファーをデバイスのグローバル メモリにを割り当てる必要があります。ただし、バッファーの内容がカーネル実行の開始前に必要ではない場合もあります。たとえば、出力バッファーの内容はカーネルの実行中にのみ生成されるので、カーネルの実行前には重要ではありません。この場合、バッファーの移行がホストとデバイス間の DMA 動作を伴わないよう、clEnqueueMigrateMemObject
に CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED
フラグを指定して、パフォーマンスを向上させる必要があります。