インテルのみ表示可能 — 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モジュールとパーシャル・リコンフィグレーションにおける潜在的な非互換性
インテルのみ表示可能 — Ixiasoft
6.6.4.1. 複数のFPGAデバイスのプログラミング
システムに複数のFPGAデバイスをインストールする場合、ホストコードを変更し、特定のFPGAデバイスをプログラムするようホスト・ランタイムに指示できます。
重要:
ホスト・アプリケーションをFCDにリンクすると、異なるカスタム・プラットフォームから複数のFPGAデバイスをターゲットにすることができます。ただし、16.1よりも前のバージョンのSDKと互換性のあるカスタム・プラットフォームにおいては、この機能に対するサポートが制限されています。
次のように、最大128のFPGAデバイスをシステムに提示できます。
- それぞれが単一のFPGAで構成されている複数のFPGAアクセラレーター・ボード
- PCIe®スイッチを介しホストシステムに接続する、単一アクセラレーター・ボード上の複数のFPGA
- 上記の組み合わせ
ホストランタイムは、それぞれのFPGAデバイスすべてにカーネルをロードすることができます。また、FPGAデバイスは並列に動作できます。
OpenCL FPGAデバイスの診断
ホストは、システムにインストールされているOpenCL™ FPGAのデバイス数を特定する必要があります。
- ご自身のマシンにインストールされたFPGA デバイスのリストを照会するには、 aocl diagnose コマンドを呼び出します。
- ホスト・アプリケーションに次のコード行を追加し、ホストにOpen CL FPGAのデバイス数を特定させます。
//Get the platform ciErrNum = clGetPlatformID(&cpPlatform); //Get the devices ciErrNum = clGetDeviceIDs(cpPlatform, CL_DEVICE_TYPE_ALL, 0, NULL, &ciDeviceCount); cdDevices = (cl_device_id * )malloc(ciDeviceCount * sizeof(cl_device_id)); ciErrNum = clGetDeviceIDs(cpPlatform, CL_DEVICE_TYPE_ALL, ciDeviceCount, cdDevices, NULL);
例えば、システムにOpenCL FPGAデバイスが2つある場合、ciDeviceCountの値は2になり、cdDevicesには、2つのデバイスID (cl_device_id) が含まれます。
デバイス情報の照会
OpenCL™ FPGAデバイスの情報を照会するよう、ホストに指示することができます。
システムにインストールされているOpenCL FPGAデバイスのリストを出力するようホストに指示するには、次のコード行をホスト・アプリケーションに追加します。
char buf[1024]; for (unsigned i = 0; i < ciDeviceCount; i++); { clGetDeviceInfo(cdDevices[i], CL_DEVICE_NAME, 1023, buf, 0); printf("Device %d: '%s'\n", i, buf); }
デバイス情報を照会すると、ホストは次のようにFPGAデバイスの一覧を表示します。
Device <N>: <board_name>: <name_of_FPGA_board>
以下が詳細になります。
- <N> はデバイスの番号です。
- <board_name> は、aocコマンドを呼び出す際にFPGAデバイスをターゲットにするボードの指定です。
- <name_of_FPGA_board> は、FPGAボードに公示されている名前です。
例えばシステムに同一のFPGAボードが2つある場合、ホストは次のような出力を生成します。
Device 0: board_1: Stratix V FPGA Board Device 1: board_1: Stratix V FPGA Board
注: clGetDeviceInfo関数は、 aoc -list-boards コマンドの呼び出し時にインテル FPGA SDK for OpenCLオフライン・コンパイラーが画面上に表示するボードタイプを返します (board_1など)。アクセラレーター・ボードにFPGAが複数含まれている場合、各デバイスは「ボード」として扱われ、一意の名前が付けられます。
複数のFPGAデバイスへのカーネルのロード
システムに複数のFPGAデバイスが含まれている場合、各FPGAに特定のcl_programオブジェクトを作成し、それらをOpenCL™ランタイムにロードすることができます。
次のホストコードは、複数のFPGAデバイスをプログラムするためのclCreateProgramWithBinaryと、createMultiDeviceProgram関数の使用方法を示しています。
cl_program createMultiDeviceProgram(cl_context context, const cl_device_id *device_list, cl_uint num_devices, const char *aocx_name); // Utility function for loading file into Binary String // unsigned char* load_file(const char* filename, size_t *size_ret) { FILE *fp = fopen(aocx_name,"rb"); fseek(fp,0,SEEK_END); size_t len = ftell(fp); char *result = (unsigned char*)malloc(sizeof(unsigned char)*len); rewind(fp); fread(result,len,1,fp); fclose(fp); *size_ret = len; return result; } //Create a Program that is compiled for the devices in the "device_list" // cl_program createMultiDeviceProgram(cl_context context, const cl_device_id *device_list, cl_uint num_devices, const char *aocx_name) { printf("creating multi device program %s for %d devices\n", aocx_name, num_devices); const unsigned char **binaries = (const unsigned char**)malloc(num_devices*sizeof(unsigned char*)); size_t *lengths=(size_t*)malloc(num_devices*sizeof(size_t)); cl_int err; for(cl_uint i=0; i<num_devices; i++) { binaries[i] = load_file(aocx_name,&lengths[i]); if (!binaries[i]) { printf("couldn't load %s\n", aocx_name); exit(-1); } } cl_program p = clCreateProgramWithBinary(context, num_devices, device_list, lengths, binaries, NULL, &err); free(lengths); free(binaries); if (err != CL_SUCCESS) { printf("Program Create Error\n"); } return p; } // main program main () { // Normal OpenCL setup } program = createMultiDeviceProgram(context, device_list, num_devices, "program.aocx"); clBuildProgram(program,num_devices,device_list,options,NULL,NULL);