インテル® FPGA SDK for OpenCL™プロ・エディション: プログラミング・ガイド

ID 683846
日付 4/01/2019
Public
ドキュメント目次

5.2.3. ループ開始間隔の指定 (II)

開始間隔 (II) は、連続するループの反復が開始されるまでのクロックサイクル数です。
iiプラグマを使用し、プラグマ宣言に続くループにIIの設定を試みるよう、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラー に指示します。オフライン・コンパイラーがそのループに対して指定されたIIを実現できない場合、コンパイルエラーが発生します。

iiプラグマは、ループがパイプライン化されている単一のワークアイテム・カーネル (シングルスレッド・カーネル) に適用されます。ループのパイプライン化および、カーネルをシングルスレッドとして処理するかどうかの、オフライン・コンパイラーの決定を左右するカーネル・プロパティーについての詳細は、 インテル® FPGA SDK for OpenCL™ : ベスト・プラクティス・ガイドの、シングル・ワーク・アイテム・カーネル対NDRangeカーネルの章を参照してください。

IIの値が高いほど、後続するループ反復の実行開始までの待機時間が長くなります。IIおよび、特定のループにおけるIIのパフォーマンスへの影響についての詳細を提供するコンパイラー・レポートに関しては、 インテル® FPGA SDK for OpenCL™ : ベスト・プラクティス・ガイドカーネルのreport.htmlファイルのレビューの章を参照ください。

カーネルのループによっては、デフォルトでコンパイラーが選択する値よりも高いIIの値をiiプラグマで指定すると、スループットを低下させることなくカーネルの最大動作周波数 (fMAX) を向上させることができます。

次の条件を満たすループは、iiプラグマの使用に適しています。
  • カーネルがシングルスレッドであるため、ループがパイプライン化されている。
  • カーネルのスループットに重要ではないループである。
  • ループの実行時間が、それに含まれる可能性のある他のループと比較して短い。
ループの開始間隔を指定するには、次のようにループの前にプラグマを指定します。
#pragma ii <desired_initiation_interval>
<desired_initiation_interval> パラメーターは、後続のループ反復の開始を実行するまでに待機するクロックサイクル数を指定する整数であり、必須です。

カーネルに、パイプライン化が可能な異なるループが2つある場合を考えます。1つはループに依存関係を持つ実行時間が短い初期化ループ、もう1つは処理の大部分を実行する実行時間が長いループです。この場合、初期化ループがデザインの全体的なスループットに与える影響が、もう一方のループに比べはるかに小さいことをコンパイラーは認識しません。可能な場合、コンパイラーは両方のループのIIを1でパイプライン化しようと試みます。

初期化ループにはループに依存関係があるため、生成されるハードウェアはフィードバック・パスを持つようになります。このようなフィードバック・パスでIIを実現すると、クロック周波数の一部が犠牲になる可能性があります。メインループのフィードバック・パスによっては、残りのデザインがより高い動作周波数で動作できる場合があります。

初期化ループに#pragma ii 2を指定すると、このループに対するIIの最適化をそれほど積極的に行う必要がないことをコンパイラーに通知します。最適化をあまり積極的に行わないことで、fmaxを制限しているパスをコンパイラーがパイプライン化できるようになり、カーネルのデザイン全体でより高いfmaxを実現できるようになります。

新しく指定されるIIにより、初期化ループの実行時間は長くなります。しかし、fmaxが高くなることでもう一方の長いループの実行時間が短縮されるため、初期化ループの実行時間の増加は補償されます。