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

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

12.5. カーネル内に登録される割り当ての組み込み関数

インテル® FPGA SDK for OpenCL™ プロ・エディションは、OpenCLカーネルコードに含むことのできる組み込み関数__fpga_reg() を提供します。
__fpga_reg() 関数は、オペランドと関数呼び出しの戻り値の間に最低1つのレジスターを挿入するよう、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーに指示します。

通常、望まれるパフォーマンスを達成するために__fpga_reg() 関数をカーネルコードに含める必要はありません。

重要: インテルでは、 インテル® Quartus® Primeプロ・エディション・ソフトウェアを使用し特定のデバイスをターゲットにする高度な最適化に熟練している方のみが、__fpga_reg() 関数を使用することを強く推奨しています。この関数の使用には、FPGAでのデータパスの部分的な配置に関する十分な知識が必要です。

__fpga_reg()組み込み関数のプロトタイプ

T __fpga_reg(T op)

このTは、標準のOpenCLデバイスのデータ型や、OpenCL型を含むユーザー定義の構造体など、任意のサイズの型にすることができます。

__fpga_reg() 関数は次のような目的で使用します。

  • 大規模なストリックアレイを処理する要素間など、空間的に離れたデータパスの間のクリティカル・パスの切断
  • 空間的に異なるカーネル実装によって発生する配置とルーティング・エフォートの負荷の軽減

__fpga_reg() 関数は、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーに対し、オペランドを戻り値に割り当てる信号パスに、ハードウェアをパイプライン化するレジスターを最低1つ挿入することを指示します。この組み込み関数は、OpenCLプログラミング言語で割り当てとして機能し、ここでオペランドは戻り値に割り当てられます。この割り当てには、標準のC代入を超える暗黙的な意味や機能的な意味はありません。機能的に__fpga_reg() 関数は、オフライン・コンパイラーの最適化によって常に削除されていると考えることができます。

注: オフライン・コンパイラーは、__fpga_reg() 関数呼び出しを挿入する適切なコード位置についてのフィードバックは提供しません。 インテル® Quartus® Primeプロ・エディション・ソフトウェアで呼び出しを挿入する位置を決定し、パフォーマンスの特定の側面に対処してください。

ネスト化された__fpga_reg() 関数呼び出しをカーネルコードに導入し、オフライン・コンパイラーが割り当てパスに挿入する最小レジスター数を増やすことができます。各関数呼び出しは、少なくとも1つのレジスター・ステージの挿入を保証しているため、呼び出し数はレジスター数に下限を与えます。

次に例を示します。

int out=__fpga_reg(__fpga_reg(in));

このコード行はオフライン・コンパイラーに対し、割り当てパスに少なくとも2つのレジスターを挿入するよう指示します。オフライン・コンパイラーは、2つより多くのレジスターをパスに挿入する場合があります。