複数の順序どおりのコマンド キュー - 2019.2 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2020-02-28
Version
2019.2 Japanese

次の図に、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");