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]));
推奨: タスク並列の場合、ザイリンクスでは
clEnqueueTask
の呼び出しを最小限にすることをお勧めします。理想的なのは、すべてのワークロードが clEnqueueTask
の呼び出し 1 つで終了するようにすることです。カーネル実行のオーバーヘッド削減の詳細は、カーネル実行 を参照してください。