カーネルからグローバル メモリ バンク インターフェイスへのアクセスには、長いレイテンシがありますので、グローバル メモリ転送はバーストで実行する必要があります。バースト転送の詳細は、 『Vitis 高位合成ユーザー ガイド』 (UG1399) のバースト転送の最適化を参照してください。
ヒント:
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
}