インテルのみ表示可能 — GUID: yev1501701568282
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: yev1501701568282
Ixiasoft
8.7. ハードウェアとエミュレーターの結果の不一致
カーネルをエミュレーションすると、OpenCLシステムは、ハードウェアにコンパイルされたカーネルとは異なる結果を生成することがあります。シミュレーションでカーネルを実行することで、ハードウェアにカーネルをコンパイルする前にさらにカーネルをデバッグすることが可能です。
警告: この結果における不一致は、インテル FPGA SDK for OpenCL Emulatorがハードウェアの計算の一部を正確にモデル化できない場合、またはプログラムが未定義の動作に依存している場合に通常発生します。
エミュレーターとハードウェアの結果の不一致を引き起こす最も一般的な理由は次のとおりです。
- OpenCLカーネルコードが#pragma ivdepディレクティブを使用している。エミュレーターは、真の依存関係がpragma ivdepディレクティブによって壊されている場合、OpenCLシステムをモデル化しません。ハードウェアをフルコンパイルする際に、これは誤った結果として考えられます。
- OpenCLカーネルコードが、初期化されていないデータに依存している。初期化されていないデータとは、初期化されていない変数、初期化されていない、または部分的に初期化されたグローバルバッファー、ローカル配列、プライベート配列などです。
- OpenCLカーネルコードの動作が、正確な浮動小数点演算の結果に依存している。エミュレーターがCPUの浮動小数点計算ハードウェアを使用する一方で、ハードウェアの実行にはFPGAコアとして実装されている浮動小数点コアが使用されます。-fp-relaxedのaocオプションをOpenCLカーネルコードに使用すると、演算の順序が変わり、浮動小数点の計算結果がさらに変動する可能性があります。
注: OpenCLの標準は、各プラットフォームの浮動小数点計算の最下位ビットが1つ以上異なることを許容します。一方でそれは、どのプラットフォームでも正しいと見なされます。
- OpenCLカーネルコードの動作が、異なるカーネルのチャネルアクセスの順序に依存している。チャネル動作のエミュレーションには制限があります。特に、カーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまります。このような場合にエミュレーターは、ハードウェアとは異なる順序でチャネル動作を実行することがあります。
- OpenCLカーネルまたはホストコードが、範囲外のグローバルメモリーにアクセスしている。
重要:
- 初期化されていないメモリーの読み取りおよび書き込み動作は、プラットフォームに依存します。カーネル内のすべてのアドレスを使用している場合、clCreateBuffer関数呼び出しを割り当てている場合、clEnqueueReadBufferとclEnqueueWriteBuffer関数呼び出しを転送している場合は、グローバルメモリーのバッファーサイズを確認してください。
- Valgrindなどのソフトウェア・メモリー・リーク検出ツールをエミュレーションされたバージョンのOpenCLシステムで使用すると、メモリーに関する問題を分析できます。これらのツールからの警告がないということは、問題がないということを意味するわけではありません。これは単に、ツールが問題を検出できなかったことを意味するだけです。インテルではこのような状況において、OpenCLカーネルまたはホストコードの手動検証を推奨しています。
- OpenCLカーネルコードが、範囲外のローカルまたはプライベート変数にアクセスしている。例えば、範囲外のローカルまたはプライベート配列にアクセスしている場合や、スコープ外になったプライベート変数にアクセスしている場合です。
重要: 範囲外の変数へのアクセスは、通常ソフトウェアのスタックにおいて、アクセスされている変数付近の無関係な変数に影響を及ぼすため、これらの問題はソフトウェア用語でスタックの破損問題と呼ばれています。エミュレーションされたOpenCLカーネルは、通常のCPU機能として実装されており、破損する可能性のあるスタックを実際に持っています。ハードウェアをターゲットにしている場合はスタックが存在しないため、スタックの破損問題は必ず別の形で現れます。スタックの破損が疑われる場合は、Valgrindなどのメモリーリーク検証ツールを使用することが可能ですが、スタック関連の問題の特定は通常困難です。インテルでは、スタック関連の問題をデバッグするため、OpenCLカーネルコードを手動で検証することを推奨しています。
- OpenCLカーネルコードが、シフトされる型よりも大きいシフトを使用している。例えば64ビットの整数を65ビットでシフトしている場合などです。OpenCL specification version 1.0によると、このようなシフトの動作は未定義です。
- エミュレーションに向けてOpenCLカーネルをコンパイルする際のデフォルトのチャネル深度が、カーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なる。このチャネル深度の相違は、カーネルのエミュレーションは問題なく機能する一方で、ハードウェアでの実行はハングアップするという状況を引き起こす可能性があります。チャネル深度の相違を修正する方法については、チャネル深度のエミュレーション を参照してください。
- 出力されるラインの順序に関しては、printf関数で出力される順序がエミュレーターとハードウェアで異なる場合があります。これは、ハードウェアにおいてprintfデータはグローバル・メモリー・バッファーに格納され、カーネルの実行が完了した際、またはバッファーがフルになった際にのみバッファーからフラッシュされるためです。エミュレーターのprintf関数は、x86 stdoutを使用しています。
- 型のアップキャストでアライメントされていないロードやストアを実行すると、FPGAとエミュレーターでは異なる結果が生じる可能性があります。この型のロードおよびストアは、C99の仕様では定義されていません。
次例のような演算では、予期しない結果になる可能性があります。
int tmp = *((int *) (my_ptr + 5));