プロセス実行モード - 2020.1 Japanese

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

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

カーネル実行モード で説明したよう、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 INTERFACEap_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 インターフェイスを使用した場合は、カーネルは入力にデータがある場合にのみ実行されます。入力にデータがない場合は、カーネルは停止し、データが入力されるまで待機します。詳細は、ストリーミング データ転送 を参照してください。