カーネル プロパティ で説明するように、XRT 管理のカーネルには、2 種類の実行モードがあります。これらのモードは、カーネル コンパイル中に Vitis HLS でカーネルに割り当てられるブロック プロトコルにより決定されます。ブロック プロトコルは、#pragma HLS INTERFACE
を使用して指定できます。次に、モードとそれらをイネーブルにするブロック プロトコルを示します。
- パイプライン
-
ap_ctrl_chain
のデフォルトのブロック プロトコルによってイネーブルになるので、1 つのカーネルで実行中にカーネルを重複でき、次のタスクの実行を開始しながら 1 つのタスクの実行を終了できます。 - シーケンシャル
-
ap_ctrl_hs
でイネーブルになったシリアル アクセス モードの場合、次のタスクを開始する前に、カーネルが 1 つのタスクの実行を完了する必要があります。
これらの実行モードの XRT でのサポートについては、サポートされるカーネル実行モデルを参照してください。
パイプラインの実行
時間的なデータ並列処理: ホストからカーネルへのデータフロー で説明したように、カーネルが前のトランザクションからのデータを処理中にさらにデータを受信できる場合、XRT は次のデータ バッチを送信できます。パイプライン モードでは、複数のカーネル実行を重複させることができるので、全体的なスループットが向上します。
パイプライン モードをサポートするには、カーネルで ap_ctrl_chain
プロトコル (Vitis HLS で使用されるデフォルト プロトコル) を使用する必要があります。このプロトコルは、次の例に示すように、関数の戻り値に #pragma HLS INTERFACE
を指定することによりイネーブルにすることもできます。
void kernel_name( int *inputs,
... )// Other input or Output ports
{
#pragma HLS INTERFACE ap_ctrl_chain port=return bundle=control
パイプライン実行が正しく動作するようにするには、カーネルのキューのレイテンシを長くする必要があります。そうでないと、カーネルで各データ バッチを処理するのに十分な時間がなく、パイプラインの利点を活かすことができないことがあります。パイプラインに設定されたカーネルでデータをパイプライン方式で処理できない場合は、シーケンシャル実行に戻ります。
以前の技術との互換性のため、XRT 管理のカーネルでは純粋なシーケンシャル モードもサポートされています。これは、#pragma HLS
INTERFACE
で関数の戻り値に ap_ctrl_hs
ブロック プロトコルを使用すると設定できます。
終了しないモード
デフォルトでは、Vitis HLS でホスト アプリケーションで同期が制御されたカーネルが生成されます。ホストでカーネルの開始と終了が制御および監視されます。ただし、連続するデータ ストリームの場合など、カーネルをホストで制御する必要がないこともあります。これらのカーネルは、ユーザー管理の終わらないカーネルでのデータのストリーミング で説明するように、ap_ctrl_chain
ブロック プロトコルの auto_restart
信号を使用できます。これは、ユーザーが ap_start
ビットと auto_restart
ビットを設定してカーネル実行の開始を指定するので、ユーザー管理のカーネルとみなされますが、初期起動以降はソフトウェアで制御されないカーネルが主に使用されます。