前のトピックで説明したように、C/C/C++ を使用した FPGA アクセラレーションのカーネルをコード記述する際には、重要な点がいくつかあります。
- 任意精度データ型
ap_int
およびap_fixed
を使用することを考慮します。 - カーネル インターフェイスを理解して、スカラー インターフェイスを使用するかメモリ インターフェイスを使用するかを決定します。リンク段階で別の DDR メモリ バンクを指定する場合は、
bundle
キーワードを使用して異なる名前を指定します。 - メモリ インターフェイスに対する読み出しおよび書き込みにはバースト コーディング スタイルを使用します。
- メモリ データのデータ入力および出力入力および出力の幅を選択する際は、データ転送に DDR バンクの全幅を使用することを考慮します。
- パイプライン処理およびデータフローを使用して最大限のパフォーマンスを得られるようにします。
-
v++
コンパイラで平坦化を実行してパイプラインを効果的に適用できるように、完全または半完全な入れ子のループを記述します。 - 反復回数が少なく、ループ本体内の演算数が少ないループを展開します。
- 配列のアクセス パターンを理解し、配列全体に
complete
分割を適用するのではなく、特定の次元にcomplete
分割を適用するか、block
またはcyclic
分割を適用します。 - カーネルのパフォーマンスを向上するため、ローカル キャッシュを使用して配列へのアクセスを最小限に抑えます。
- 関数 (特にパイプライン処理された領域内) をインライン展開することを考慮します。データフロー領域内の関数はインライン展開しないでください。
- デバイスの I/O ピン (イーサネット、SerDes) または別のカーネルからデータをストリーミングするデータ駆動型のデザインには、自動再起動カーネルを使用することを検討してください。