バースト読み出しおよび書き込み - 2020.2 Japanese

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

Document ID
UG1393
Release Date
2021-03-22
Version
2020.2 Japanese

カーネルからグローバル メモリ バンク インターフェイスへのアクセスには、長いレイテンシがありますので、グローバル メモリ転送はバーストで実行する必要があります。バースト転送の詳細は、 Vitis HLS フローバースト転送の最適化 を参照してください。

ヒント: Vitis HLS の 合成サマリ レポートには、カーネルのバースト転送に関する詳細情報が含まれます。ただし、このレポートを確認するには、ツールを起動する必要があります。

バーストを推論するには、次のパイプライン ループを使用したコーディング スタイルをお勧めします。

hls::stream<datatype_t> str;

INPUT_READ: for(int i=0; i<INPUT_SIZE; i++) {
  #pragma HLS PIPELINE
  str.write(inp[i]); // Reading from Input interface
}

このコード例では、パイプライン処理された for ループが使用され、入力メモリ インターフェイスからデータを読み出し、内部 hls::stream 変数に書き込んでいます。上記のコーディング スタイルにより、データはグローバル メモリ バンクからバーストで読み出されます。

データフロー最適化 で説明したように、上記の for ループを異なる関数内に含め、最上位で dataflow 最適化を適用するコーディング スタイルをお勧めします。次はそのコード例で、コンパイラに読み出し関数、実行関数、書き込み関数間のデータフローを作成させています。

top_function(datatype_t * m_in, // Memory data Input
  datatype_t * m_out, // Memory data Output
  int inp1,     // Other Input
  int inp2) {   // Other Input
#pragma HLS DATAFLOW

hls::stream<datatype_t> in_var1;   // Internal stream to transfer
hls::stream<datatype_t> out_var1;  // data through the dataflow region

read_function(m_in, inp1, in_var1); // Read function contains pipelined for loop 
                           // to infer burst

execute_function(in_var1, out_var1, inp1, inp2); // Core compute function

write_function(out_var1, m_out); // Write function contains pipelined for loop 
                                 // to infer burst
}