インテルのみ表示可能 — GUID: ewa1412885766352
Ixiasoft
1. インテル® FPGA SDK for OpenCL™ の概要
2. インテル® FPGA SDK for OpenCL™オフライン・コンパイラーのカーネル・コンパイル・フロー
3. ソフトウェア、コンパイラー、カスタム・プラットフォームに関する一般的な情報の取得
4. FPGAボードの管理
5. OpenCLカーネルの構築
6. ホスト・アプリケーションの設計
7. OpenCL カーネルのコンパイル
8. OpenCLカーネルのエミュレーションとデバッグ
9. カーネルのreport.htmlファイルのレビュー
10. OpenCLカーネルのプロファイリング
11. インテル® Code Builder for OpenCL™ を使用するOpenCL™アプリケーションの開発
12. インテル® FPGA SDK for OpenCL™ のアドバンスト機能
A. OpenCL機能のサポート状況
B. インテル® FPGA SDK for OpenCL™ プロ・エディション・プログラミング・ガイドの改訂履歴
3.1. ソフトウェア・バージョンの表示 (version)
3.2. コンパイラー・バージョンの表示 (-version)
3.3. インテル FPGA SDK for OpenCL ユーティリティー・コマンド・オプション・リストの表示 (help)
3.4. インテル FPGA SDK for OpenCL オフライン・コンパイラー・コマンド・オプション・リストの表示 (引数なし、-help、-h)
3.5. 利用可能なFPGAボードとカスタム・プラットフォームのリスト表示 (-list-boardsおよび-list-board-packages)
3.6. OpenCLバイナリーのコンパイル環境の表示 (env)
5.1. カーネルの命名ガイドライン
5.2. データの処理効率を最適化するためのプログラミング手法
5.3. ローカル・メモリー・サイズへのポインターの最適化に向けたプログラミング手法
5.4. インテル® FPGA SDK for OpenCL™ チャネル拡張の実装
5.5. OpenCLパイプの実装
5.6. 任意精度での整数の実装
5.7. 条件付きコンパイルにおける定義済みプリプロセッサー・マクロの使用
5.8. __constantアドレス空間修飾子の宣言
5.9. 構造体データ型をOpenCLカーネルに引数として含める
5.10. レジスターの推論
5.11. 倍精度浮動小数点演算の有効化
5.12. 単一ワークアイテム・カーネルに向けた単一サイクル浮動小数点アキュムレーター
5.13. 整数のプロモーション規則
6.6.2.1. ホスト・アプリケーションとKhronos ICD Loader Libraryのリンク
6.6.2.2. ホスト・アプリケーションをコンパイルするためのフラグの表示 (compile-config)
6.6.2.3. OpenCLホスト・ランタイム・ライブラリーおよびMMDライブラリーへのパスの表示 (ldflags)
6.6.2.4. OpenCLホスト・ランタイム・ライブラリーおよびMMDライブラリーのリスト表示 (ldlibs)
6.6.2.5. OpenCLホスト・ランタイム・ライブラリーおよびMMDライブラリーに関する情報の表示 (link-config または linkflags)
7.1. ハードウェアのコンフィグレーション・ファイルを作成するためのカーネルのコンパイル
7.2. ハードウェアを構築せずに行うカーネルのコンパイル (-c)
7.3. ハードウェアを構築せずに行うカーネルまたはオブジェクト・ファイルのコンパイルおよびリンク (-rtl)
7.4. ヘッダーファイル位置の指定 (-I=<directory>)
7.5. インテル® FPGA SDK for OpenCL™オフライン・コンパイラーの出力ファイル名の指定 (-o <filename>)
7.6. 特定のFPGAボードとカスタム・プラットフォームに対するカーネルのコンパイル (-board=<board_name>) および (-board-package=<board_package_path>)
7.7. カーネルコンパイル時のハードウェア生成フィッティング・エラーの解決 (-high-effort)
7.8. カーネルのFmaxターゲットのスケジュール指定 (-fmax=<fmax target in MHz>)
7.9. カーネル・パラメーターを指定するためのプリプロセッサー・マクロの定義 (-D<macro_name>)
7.10. コンパイル進捗レポートの生成 (-v)
7.11. リソース推定使用率要約の画面表示 (-report)
7.12. インテル® FPGA SDK for OpenCL™オフライン・コンパイラーの警告メッセージの抑制 (-W)
7.13. インテル® FPGA SDK for OpenCL™オフライン・コンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)
7.14. コンパイラー・レポートのデバッグデータの削除および.aocxファイルのソースコードの削除 (-g0)
7.15. グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=<global_memory_type>)
7.16. グローバルメモリーのリング型相互接続の強制 (-global-ring)
7.17. グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)
7.18. コンスタント・メモリー・キャッシュ・サイズのコンフィグレーション (-const-cache-bytes=<N>)
7.19. 浮動小数点演算処理順序の緩和 (-fp-relaxed)
7.20. 浮動小数点演算における丸め処理の削減 (-fpc)
7.21. OpenCLコンパイルの高速化 (-fast-compile)
7.22. カーネルのインクリメンタル・コンパイル (-incremental)
7.23. メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)
7.24. ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)
7.25. ハンドシェイク・プロトコルの変更 (-hyper-optimized-handshaking)
8.1. 高速エミュレーターの設定
8.2. エミュレーションに向けたチャネル・カーネル・コードの変更
8.3. エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)
8.4. OpenCLカーネルのエミュレーション
8.5. LinuxにおけるOpenCLカーネルのデバッグ
8.6. インテル® FPGA SDK for OpenCL™ Emulatorの制限
8.7. ハードウェアとエミュレーターの結果の不一致
8.8. 高速エミュレーターの環境変数
8.9. 高速エミュレーターでサポートされている拡張機能
8.10. 高速エミュレーターの既知の問題
8.11. レガシー・エミュレーターの使用
12.1.1. RTLモジュールとOpenCLパイプラインの理解
12.1.2. OpenCLライブラリーに向けたOpenCLヘルパー関数ファイルのパッケージ化
12.1.3. OpenCLライブラリーに向けたRTLコンポーネントのパッケージ化
12.1.4. RTLモジュールの検証
12.1.5. 複数のオブジェクト・ファイルのライブラリー・ファイルへのパッケージ化
12.1.6. OpenCLカーネルコンパイル時のOpenCLライブラリーの指定
12.1.7. シミュレーションによるOpenCLライブラリーのデバッグ (プレビュー)
12.1.8. シンプルな関数で動作するOpenCLライブラリーの使用 (例1)
12.1.9. 外部メモリーと動作するOpenCLライブラリーの使用 (例2)
12.1.10. OpenCLライブラリーのコマンドライン・オプション
12.1.1.1. インテルFPGA SDK for OpenCLパイプラインのアプローチの概要
12.1.1.2. RTLモジュールのインテル FPGA SDK for OpenCLパイプラインへの統合
12.1.1.3. ストールのないRTL
12.1.1.4. RTLモジュール・インターフェイス
12.1.1.5. Avalon Streaming (Avalon-ST) インターフェイス
12.1.1.6. RTLリセットおよびクロック信号
12.1.1.7. RTLモジュールのXML構文
12.1.1.8. RTLモジュールと外部メモリーの通信
12.1.1.9. RTLモジュールに入るスレッドの順序
12.1.1.10. RTLモジュールのOpenCL Cモデル
12.1.1.11. RTLモジュールとパーシャル・リコンフィグレーションにおける潜在的な非互換性
インテルのみ表示可能 — GUID: ewa1412885766352
Ixiasoft
6.7. SoCをターゲットとするOpenCL カーネルへの共有メモリーの割り当て
インテルでは、 インテル® SoCで動作するOpenCL™カーネルは、FPGA DDRメモリーではなく共有メモリーにアクセスすることを推奨しています。 FPGA DDRメモリーには、非常に高い帯域幅でカーネルがアクセス可能です。ただし、ARM® CPUからFPGA DDRメモリーへの読み出しおよび書き込み動作は、ダイレクト・メモリー・アクセス (DMA) を使用していないため非常に低速です。FPGA DDRメモリーは、テスト目的でカーネル間または単一のカーネル内で一時データを渡すためだけに予約ください。
注:
- カーネル間の共有バッファーは揮発性としてマークし、あるカーネルによるバッファーの変更が他のカーネルも認識できるようにしてください。
- 共有メモリーにアクセスするにはホストコードの変更のみが必要です。カーネルコードの変更は必要ありません。
- ライブラリー関数mallocまたはnew演算子で、物理的に共有されたメモリーを割り当てることはできません。また、CL_MEM_USE_HOST_PTRフラグは共有メモリーでは機能しません。
DDRメモリーでは、共有メモリーは物理的に連続している必要があります。FPGAは、SG-DMAコントローラー・コアなしでは実質的に連続したメモリーを消費することができません。malloc関数およびnew演算子は、実質的に連続したメモリーへアクセスするためのものです。
- 共有メモリーのCPUキャッシュは無効になっています。
- 共有メモリーを使用する際は、データのコピー1つがホストとカーネルの両方で使用されます。このメモリーを使用すると、OpenCLメモリーの呼び出しは、バッファー読み取り、バッファー書き込み、マッピングおよびアンマッピングに対し、ゼロコピー転送で実行されます。
ARM CPUとFPGAは、共有メモリーに同時にアクセスできます。clEnqueueReadBufferおよびclEnqueueWriteBuffer呼び出しをホストコードに含め、FPGAまたはCPUにデータを認識させる必要はありません。
- 共有メモリーの割り当てとアクセスには、次の例のようなホストコードを構築します。
cl_mem src = clCreateBuffer(…, CL_MEM_ALLOC_HOST_PTR, size, …); int *src_ptr = (int*)clEnqueueMapBuffer (…, src, size, …); *src_ptr = input_value; //host writes to ptr directly clSetKernelArg (…, src); clEnqueueNDRangeKernel(…); clFinish(); printf (“Result = %d\n”, *dst_ptr); //result is available immediately clEnqueueUnmapMemObject(…, src, src_ptr, …); clReleaseMemObject(src); // actually frees physical memory
CONFIG_CMA_SIZE_MBYTESカーネル・コンフィグレーション・オプションを含め、割り当てに有効な共有メモリーの最大総量を制御することができます。実際には、割り当てられた共有メモリーの総量は、CONFIG_CMA_SIZE_MBYTESの値よりも小さくなります。重要:- ターゲットボードに複数のDDRメモリーバンクがある場合、clCreateBuffer(..., CL_MEM_READ_WRITE, ...)関数は、メモリーを非共有DDRメモリーバンクに割り当てます。ただし、FPGAが共有メモリーである単一DDRバンクへアクセスできる場合、clCreateBuffer(..., CL_MEM_READ_WRITE, ...) は、CL_MEM_ALLOC_HOST_PTRフラグを使用するのと同様に、メモリーを共有メモリーに割り当てます。
- clCreateBuffer(..., CL_MEM_ALLOC_HOST_PTR, size, ...)関数で要求する共有メモリーは、Linux OpenCLカーネルドライバーに割り当てられ、Linuxカーネルの連続したメモリー割り当て (CMA) 機能に依存します。CMAを有効にしコンフィグレーションする方法に関しては、Intel FPGA SDK for OpenCL Intel Arria 10 SoC Development Kit Reference Platform Porting GuideのRecompiling the Linux Kernel for the Intel Arria 10 SoC Development Kit およびCompiling and Installing the OpenCL Linux Kernel Driverの章を参照ください。
- 共有ハード・プロセッサー・システム (HPS) DDRからFPGA DDRへの効率的なデータ転送に向け、memcpy関数を実行するカーネルを次のように含めます。
__attribute__((num_simd_work_items(8))) mem_stream(__global uint * src, __global uint * dst) { size_t gid = get_global_id(0); dst[gid] = src[gid]; }
重要: CL_MEM_ALLOC_HOST_PTRフラグを使用し、srcポインターをHPS DDRに共有メモリーとして割り当てます。 - ホストがコンスタント・メモリーを共有HPS DDRシステムに割り当て、カーネル実行後にそれを変更すると、変更が有効にならない可能性があります。その結果、続くカーネル実行に古いデータが使用される可能性があります。カーネルの実行に古いコンスタント・メモリーが使用されないようにするため、次のいずれかを実行してください。
- コンスタント・メモリーの初期化後は、それを変更しない
- 複数の__constantデータセットが必要な場合、複数のコンスタント・メモリー・バッファーを作成する
- 可能であれば、アクセラレーター・ボードのFPGA DDRにコンスタント・メモリーを割り当てる