カーネル実行モード で説明したよう、3 つの実行モードがあります。これらのモードは、関数の戻り値でカーネルに割り当てられているブロック プロトコルにより判断されます。ブロック プロトコルは、#pragma HLS INTERFACE
を使用して指定できます。次に、モードとそれらをイネーブルにするブロック プロトコルを示します。
- パイプライン
-
ap_ctrl_chain
のデフォルト ブロック プロトコルによりイネーブルになります。 - シーケンシャル
-
ap_ctrl_hs
によりイネーブルになりるシリアル アクセス モード。 - フリーランニング
-
ap_ctrl_none
によりイネーブルになります。
これらの実行モードの XRT でのサポートについては、サポートされるカーネル実行モデルを参照してください。
パイプライン モード
時間的なデータ並列処理: ホストからカーネルへのデータフロー で説明したように、カーネルが前のトランザクションからのデータを処理中にさらにデータを受信できる場合、XRT は次のデータ バッチを送信できます。パイプライン モードでは、複数のカーネル エンキューをオーバーラップさせることができ、全体的なスループットが向上します。
パイプライン モードをサポートするには、カーネルで ap_ctrl_chain
プロトコル (HLS で使用されるデフォルト プロトコル) を使用する必要があります。このプロトコルは、次の例に示すように、関数の戻り値に #pragma HLS
INTERFACE
を指定することによりイネーブルにすることもできます。
void kernel_name( int *inputs,
... )// Other input or Output ports
{
#pragma HLS INTERFACE ..... // Other interface pragmas
#pragma HLS INTERFACE ap_ctrl_chain port=return bundle=control
パイプライン モードが正しく動作するようにするには、カーネルのキューのレイテンシが長いことが必要です。そうでないとカーネルで各データ バッチを処理するのに十分な時間がなく、パイプラインの利点を活かすことができません。
以前の技術との互換性のため、カーネルではシーケンシャル モードもサポートされています。これは、#pragma HLS INTERFACE
で関数の戻り値に ap_ctrl_hs
ブロック プロトコルを使用することにより設定できます。パイプラインに設定されたカーネルでデータをパイプライン方式で処理できない場合は、シーケンシャル モードに戻ります。
フリーランニング モード
デフォルトでは、Vitis HLS で同期化がホスト アプリケーションで制御されるカーネルが生成されます。ホストでカーネルの開始と終了が制御および監視されます。ただし、プロセスまたはデータ ストリームを連続して実行する場合など、カーネルをホストで制御する必要がないこともあります。これは、制御ハンドシェイクがないので、フリーランニング カーネルと呼ばれます。次の例に示すように、Vitis ツールでは、これは #pragma HLS INTERFACE
で ap_ctrl_none
ブロック プロトコルを使用することによりサポートされます。
void kernel_top(hls::stream<ap_axiu >& input, hls::stream<ap_axiu >& output)
{
#pragma HLS interface axis port=input
#pragma HLS interface axis port=output
#pragma HLS interface ap_ctrl_none port=return // Special pragma for Free running kernel
#pragma HLS DATAFLOW
// The kernel is using DATAFLOW optimization
while(1) { ... }
}
カーネルに AXI4-Stream インターフェイスを使用した場合は、カーネルは入力にデータがある場合にのみ実行されます。入力にデータがない場合は、カーネルは停止し、データが入力されるまで待機します。詳細は、ストリーミング データ転送 を参照してください。