ループの結合 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

非展開ループからは、少なくとも 1 つのステートを持つ有限ステート マシン (FSM) が作成されます。複数のシーケンシャル ループがある場合、余分なクロック サイクルが追加されるので、これ以上の最適化ができなくなります。

次の図は、簡潔に見えるコーディング スタイルが RTL デザインのパフォーマンスに悪影響を与えている例を示しています。

図 1. ループ指示子

前の図の (A) は、デザインの非展開ループそれぞれで少なくとも FSM の 1 ステートが作成されるところを示しています。このようなステート間の移行では、クロック サイクルが浪費されます。各ループの反復に 1 クロック サイクルかかるとすると、両方のループを実行するのに 11 サイクルかかります。

  • Add ループに入るのに 1 クロック サイクル。
  • Add ループを実行するのに 4 クロック サイクル。
  • Add ループを抜けて Sub ループに入るのに 1 クロック サイクル。
  • Sub ループを実行するのに 4 クロック サイクル。
  • Sub ループを抜けるのに 1 クロック サイクル。
  • 合計 11 クロック サイクル。

この単純な例の場合は、Add ループの else 分岐でも問題を解決できることは明らかですが、より複雑なコードでは簡単にはわからないことありるので、よりわかりやすいコーディング スタイルを使用した方が有益です。

LOOP_MERGE 最適化指示子を使用すると、ループが自動的に結合されるようにできます。ループ結合最適化指示子は、適用されたスコープ内のループすべてを結合しようとします。上記の例の場合、ループの結合により、終了するのに 6 クロックしか必要のない前の図の (B) のような制御構造が作成されます。

ループを結合すると、ループ内のロジックが一緒に最適化されるようになります。ループ結合の変更には制限があり、常に正常に結合できるとは限りません。ただし、コードをリファクタリングすることで、手動でループを結合できます。上記の例の場合、デュアル ポート ブロック RAM を使用すると、加算および乗算が並列で実行できるようになります。