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

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

5.2.1. ループ展開 (unroll Pragma)

ループ展開は、ループ本体を複数回複製し、ループのトリップカウントを減らすことで行われます。ループの展開は、FPGAでのループ制御オーバーヘッドの削減、または防止のために行います。ループに依存関係がなく、オフライン・コンパイラーがループの反復処理を並列して実行できる場合は、ループを展開することでFPGAのレイテンシーとオーバーヘッドを低減させることもできます。

インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは、プラグマでアノテートされていない場合でも、単純なループを展開する場合があります。
ループを展開するよう、または明示的にループを展開しないようオフライン・コンパイラーに指示するには、カーネルコードの展開するループの前に、unrollカーネルプラグマを挿入します。
重要:
  • 可能な限り展開係数を指定してください。展開係数Nを指定するには、#pragma unroll <N> ディレクティブをカーネルコードのループの前に挿入します。
    オフライン・コンパイラーは、ループ展開を最大 <N> 回試みます。
    コードの一部を下記に示します。展開係数に2の値を割り当てることにより、ループを2回展開するよう、オフライン・コンパイラーに指示しています。
    #pragma unroll 2
    for(size_t k = 0; k < 4; k++)
    {
       mac += data_in[(gid * 4) + k] * coeff[k];
    }
  • ループを完全に展開する場合、カーネルコードのループの前に#pragma unrollディレクティブのみを挿入し、展開係数を省略することができます。
    オフライン・コンパイラーは、トリップカウントを認識すると完全なループ展開を試みます。展開要求が実行できない場合、オフライン・コンパイラーは警告を発行します。
  • ループが展開されないようにするには、展開係数に1を指定します (#pragma unroll 1)。