カーネルをキューに追加するオーバーヘッドの削減 - 2020.1 Japanese

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

Document ID
UG1393
Release Date
2020-08-20
Version
2020.1 Japanese

OpenCL API 実行モデルでは、データ並列およびタスク並列のプログラミング モデルがサポートされます。カーネルは通常 OpenCL ランタイムにより複数回エンキューされてから、デバイスで実行されるようにスケジュールされます。次のいずれかの方法でカーネルを開始するコマンドを送信する必要があります。

  • データ並列には clEnqueueNDRange API を使用
  • タスク並列には clEnqueueTask を使用

この送信プロセスはホスト プロセッサで実行されます。カーネルのコマンドおよび引数は、Alveo カードの場合は PCIe® バスを介して、アクセラレータに送信する必要があります。ザイリンクス ランタイム (XRT) ライブラリでは、アクセラレータへのコマンドおよび引数の送信のオーバーヘッドは、カーネルの引数の数によって 30 µs ~ 60 µs になります。このオーバーヘッドの影響は、カーネルを実行する必要のある回数を最小限にすることで削減ができます。

データ並列の場合、ザイリンクスでは、ホスト コードとカーネルのサイズに合わせて、グローバル ワーク サイズがローカル ワーク サイズの数倍になるようにサイズを選択することをお勧めします。理想的なのは、次のコード例のようにグローバル ワーク サイズとローカル ワーク サイズを同じにすることです。

size_t global = 1;
size_t local = 1;
clEnqueueNDRangeKernel(world.command_queue, kernel, 1, nullptr,
                       &global, &local, 2, write_events.data(),
                       &kernel_events[0]));

カーネル実行のオーバーヘッド削減の詳細は、カーネル実行 を参照してください。