ホスト アプリケーションで必要とされる演算負荷の高いタスクは、1 つのカーネル内で定義でき、そのカーネルを一度実行するだけでデータ範囲全体が処理されるようにできることがよくあります。複数のカーネル実行に関連するオーバーヘッドがある場合、1 つのモノリシック カーネルでパフォーマンスが改善されることがあります。この場合、カーネルを 1 回実行するだけでデータの範囲全体が処理されますが、並列処理はカーネル ハードウェア内の FPGA で達成されます。カーネルは命令レベルの並列処理 (ループ パイプライン) および関数レベルの並列処理 (データフロー) などのさまざまな方法を使用して並列処理を達成します。これらのさまざまなカーネル コーディング手法については、C/C ++ カーネル を参照してください。
カーネルが FPGA の 1 つのハードウェア インスタンス (または CU) にコンパイルされる場合、次のように clEnqueueTask
を使用するのがカーネルを実行する最も簡単な方法です。
err = clEnqueueTask(commands, kernel, 0, NULL, NULL);
XRT はワークロード (カーネル引数を使用し、OpenCL バッファーを介して渡されるデータ) をスケジュールし、さらに ザイリンクス FPGA 上のアクセラレータで実行されるようにカーネル タスクをスケジュールします。
clEnqueueNDRangeKernel
の使用はサポートされますが (OpenCL カーネルのみ)、ザイリンクスでは clEnqueueTask
を使用することをお勧めしています。ただし、カーネルを実行するのに 1 つの clEnqueueTask を使用するのは、さまざまな現実的な理由から、常に実現可能なわけではありません。たとえば、カーネル コードですべての演算負荷の高いタスクを 1 つの実行で処理されるようにすると、大きく複雑になりすぎて、最適化ができないことがあります。FPGA の異なるタスクが並列で実行されるように複数カーネルを設計できることはありますが、エンキュー コマンドが複数必要になります。そうしないと、ホスト アプリケーションがデータを受信するのに時間がかかったり、すべてのデータを一度に処理できないことがあります。このため、状況およびアプリケーションによって、データおよびタスクを複数の clEnqueueTask
コマンドに分割する方法を使用できます。この場合、コマンド キュー に説明するように、順不同コマンド キューまたは順序どおりのコマンド キューによって、カーネル タスクの処理方法を決定できます。さらに、イベントの同期化 に説明するように、複数のカーネル タスクをブロッキング イベントまたはノンブロッキング イベントとしてインプリメンテーションすることもできます。これらのは、すべてデザインのパフォーマンスに影響を与える可能性があります。
次のトピックでは、カーネルを実行したり、複数のカーネルを実行したり、アクセラレータ上の同じカーネルの複数インスタンスを実行するのに使用可能なさまざまな手法について説明します。