ループ展開では、ループをほどいて複数の反復を同時に実行できるようにし、ループの全体的なトリップカウントを減らします。
前述の工場のたとえを使用すると、工場がカーネル、組立ラインがデータフロー パイプライン、工程が計算関数となります。ループを展開すると、ベルトコンベヤーに同時に到着する複数のオブジェクトを処理可能な工程が作成されるので、パフォーマンスが向上します。
図 1. ループ展開
ループを展開すると、指定した係数によって結果のデータパスの幅を広くできます。通常これにより並列処理されるサンプル数が多くなるため、帯域幅要件が増加します。次の 2 点に注意してください。
- 関数 I/O の幅とデータパスの幅は同じである必要があります。
- I/O 要件がカーネル ポートの最大サイズ (512 ビット/64 バイト) を超えるほどループを展開してデータパスの幅を広くする必要はありません。
ループ展開を最適に使用するには、次のガイドラインに従ってください。
- ループ ネスト内の最内ループから開始します。
- すべてのループ運搬依存をなくす展開係数を特定します。
- より効率的な結果を得るには、ループを固定トリップカウント数で展開します。
- 展開されたループ内に関数呼び出しがある場合は、これらの関数をインライン処理すると、リソース共有が良くなり、結果を改善できますが、合成にかかる時間は長くなります。また、インターコネクトが複雑になるほど、後で配線で問題が発生する可能性が高くなることに注意してください。
- ループはむやみに展開せず、特定の結果を念頭に置いて実行するようにしてください。