前回は、”
Vitis 2019.2 アプリケーション・プロジェクトのホスト・コード作成手順”でしたが、今回は、Vitis 2019.2 アプリケーション・プロジェクトの C/C++ カーネル・コード作成手順をまとめていきたいと思う。
今回参照するのは、”
Vitis 統合ソフトウェア プラットフォームの資料 アプリケーション アクセラレーション開発 UG1393 (v2019.2) 2019 年 11 月 11 日”の 68 ページの”第 7 章 C/C ++ カーネル”
カーネルはVivado HLS で高位合成される C/C++ のコードとなる。ただしVitis 用のルールがある。
Vitis_Accel_Examples/cpp_kernels/dataflow_stream/src/adder.cpp を参考にして自分で書いた square.cpp の C++ カーネルを例に説明する。
extern "C" {
void square(int *inm, int *outm, int size){
#pragma HLS INTERFACE m_axi port = inm offset = slave bundle = gmem
#pragma HLS INTERFACE m_axi port = outm offset = slave bundle = gmem
#pragma HLS INTERFACE s_axilite port = size bundle = control
#pragma HLS INTERFACE s_axilite port = return bundle = control
static hls::stream<int> ins;
static hls::stream<int> outs;
#pragma HLS STREAM variable = ins depth = 32
#pragma HLS STREAM variable = outs depth = 32
#pragma HLS dataflow
read_dma(inm, ins, size);
square_stream(ins, outs, size);
write_dma(outs, outm, size);
}
}
C/C++ カーネルの書き方1. extern "C" { } でハードウェア化する関数を囲む
2. ハードウェア化する関数の戻り値の型を void にする(int にするとビルドできてもカーネルの結果が 0 だった)
3. インターフェースは AXI4 Master とする(複数のAXI4 インターフェースを使用しても良い。複数のAXI4 インターフェースを使用する場合は bundle で変更する bundle = gmem)
#pragma HLS INTERFACE m_axi port = inm offset = slave bundle = gmem
4. スカラー値を設定するインターフェースの AXI4 Lite は 1 つにする必要がある(bundle = control)
#pragma HLS INTERFACE s_axilite port = size bundle = control
5. 使用できるデータ型
int、float、double などの通常の C 言語のデータ型
任意精度整数型(ap_int<11> aaa, ap_uint<12> bbb)
任意精度固定小数点データ型(ap_fixed<9, 1, AP_TRN_ZERO, AP_SAT>、ap_fixed<4, 3, AP_TRN_ZERO, AP_WRAP>)
こんなところかな?後は一般的なVivado HLS の書き方でOK
なお、 square() では、
read_dma(inm, ins, size); がDMA Read して HLS ストリームに変換する関数
square_stream(ins, outs, size); がHLS ストリームを入力したデータを 2 乗して HLS ストリームで出力する関数
write_dma(outs, outm, size); が HLS ストリームを DMA Write する関数
の 3 つの関数を並列動作させるために dataflow 指示子を追加してある。このように書くのがお勧め。
- 2019年12月13日 04:15 |
- Vitis
-
| トラックバック:0
-
| コメント:0