次の図に、2 つの順序どおりのコマンド キュー (CQ0 および CQ1) の例を示します。スケジューラは各キューからのコマンドを順序どおりに実行しますが、CQ0 および CQ1 からのコマンドはどの順序でも取り出すことができます。必要な場合は、CQ0 および CQ1 間の同期を管理する必要があります。
図 1. 2 つの順序どおりのコマンド キューの例
次は、concurrent_kernel_execution_c 例の host.cpp からのコードで、複数の順序どおりのコマンド キューを設定し、各キューにコマンドをエンキューしています。
OCL_CHECK(err,
cl::CommandQueue ordered_queue1(
context, device, CL_QUEUE_PROFILING_ENABLE, &err));
OCL_CHECK(err,
cl::CommandQueue ordered_queue2(
context, device, CL_QUEUE_PROFILING_ENABLE, &err));
...
printf("[Ordered Queue 1]: Enqueueing scale kernel\n");
OCL_CHECK(
err,
err = ordered_queue1.enqueueNDRangeKernel(
kernel_mscale, offset, global, local, nullptr, &kernel_events[0]));
set_callback(kernel_events[0], "scale");
...
printf("[Ordered Queue 1]: Enqueueing addition kernel\n");
OCL_CHECK(
err,
err = ordered_queue1.enqueueNDRangeKernel(
kernel_madd, offset, global, local, nullptr, &kernel_events[1]));
set_callback(kernel_events[1], "addition");
...
printf("[Ordered Queue 2]: Enqueueing matrix multiplication kernel\n");
OCL_CHECK(
err,
err = ordered_queue2.enqueueNDRangeKernel(
kernel_mmult, offset, global, local, nullptr, &kernel_events[2]));
set_callback(kernel_events[2], "matrix multiplication");