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

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

12.1.1.8. RTLモジュールと外部メモリーの通信

RTLモジュールと外部メモリーの通信は、通信が必要かつ避けられない場合にのみ行うようにしてください。

重要: RTLモジュールを外部メモリーと通信させるために推奨される手法は、OpenCLカーネルをグローバルメモリーにアクセスさせ、そのメモリーコンテンツをRTLモジュールに供給することです。カーネルの呼び出しごとに外部メモリーから読み書きを行う動作の場合、OpenCL™カーネルに動作を行うように指示します。これを実行するために、OpenCLカーネルのOpenCLヘルパー関数を、RTLモジュールと同じ インテル® FPGA SDK for OpenCL™ ライブラリーに作成できます。

次の例は、OpenCLライブラリーへの容易な統合を行うためのRTLモジュールのコード構築方法を示しています。

表 10.  外部メモリーと通信するRTLモジュールのコード例
複雑なRTLモジュール 簡潔化されたRTLモジュール
// my_rtl_fn does:
// out_ptr[idx] = fn(in_ptr[idx])
my_rtl_fn (in_ptr, out_ptr,idx);
int in_value = in_ptr[idx];
// my_rtl_fn now does: out = fn(in)
int out_value = my_rtl_fn (in_value);
out_ptr[idx] = out_value;

左側の複雑なRTLモジュールは、外部メモリーから値を読み出し、その値にスカラー関数を実行し値をグローバルメモリーに書き戻します。このようなRTLモジュールは、OpenCLライブラリーに統合する際の記述が困難です。さらに、このRTLモジュールの検証は難しく、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーにおいて非常に控えめなポインター分析が行われます。

右側の簡潔化されたRTLモジュールは、複雑なRTLモジュールと全体的には同じ機能を提供します。ただし、簡潔化されたRTLモジュールは、グローバルメモリーに接続せずにスカラーからスカラーの計算のみを行います。この簡潔なRTLモジュールをOpenCLライブラリーに統合することで、オフライン・コンパイラーは作成されるOpenCLカーネルをより容易に分析できるようになります。

RTLモジュールは、外部メモリーと通信するためのAvalon®-MMポートを必要とする場合があります。このAvalon-MMポートは、OpenCLカーネルの他のグローバルロードおよびストアユニットの接続先と同じアービトレーション・ネットワークに接続します。

RTLモジュールがメモリーポインターを引数として受け取ると、オフライン・コンパイラーは次のメモリーモデルを強制します。

  • RTLモジュールがポインターへ書き込む場合、OpenCLカーネルの他の部分はこのポインターに対する読み書きはできません。
  • RTLモジュールがポインターから読み取る場合、OpenCLカーネルの他の部分および他のRTLモジュールもまた、このポインターから読み取ることができます。
  • MEM_INPUT属性のaccessフィールドを設定することで、RTLモジュールのメモリーポインターの使用方法を指定できます。値を検証する方法がないため、アクセスを行うための値が正しく設定されていることを確認してください。