204
インテル ® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus ® Prime 開発デザインスイートの更新情報: 19.1 更新情報 フィードバック UG-OCL002 | 2019.04.01 最新版をウェブからダウンロード: PDF | HTML

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

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

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

インテルreg FPGA SDK for OpenCLtradeプロエディションプログラミングガイド

インテルreg Quartusreg Prime 開発デザインスイートの更新情報 191

更新情報フィードバック

UG-OCL002 | 20190401

新版をウェブからダウンロード PDF | HTML

目次

1 インテルreg FPGA SDK for OpenCLtrade の概要711 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前

提条件 712 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー8

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフロー1021 シンプルなカーネルに向けたワンステップコンパイル 1122 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー 12

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得 1631 ソフトウェアバージョンの表示 (version) 1632 コンパイラーバージョンの表示 (-version) 1733 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help) 17

331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示(help ltcommand_optiongt) 17

34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示(引数なし-help-h) 17

35 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages)18

36 OpenCL バイナリーのコンパイル環境の表示 (env) 19

4 FPGA ボードの管理 2041 FPGA ボードのインストール (install) 2142 FPGA ボードのアンインストール (uninstall) 2243 FPGA ボードのデバイス名の照会 (diagnose) 2344 ボード診断テストの実行 (diagnose ltdevice_namegt)2445 オフラインまたはホストなしでの FPGA のプログラミング (program ltdevice_namegt)2446 フラッシュメモリーのプログラミング (flash ltdevice_namegt)24

5 OpenCL カーネルの構築2651 カーネルの命名ガイドライン 2652 データの処理効率を 適化するためのプログラミング手法 27

521 ループ展開 (unroll Pragma) 28522 ネスト化されたループの結合 28523 ループ開始間隔の指定 (II) 30524 ループの並列性 (max_concurrency Pragma) 31525 ループの投機的実行 (speculated_iterations Pragma) 32526 ワークグループサイズの指定32527 計算ユニット数の指定33528 SIMD ワークアイテム数の指定 34529 メモリー属性の指定 34

53 ローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 3554 インテル FPGA SDK for OpenCL チャネル拡張の実装 36

541 インテル FPGA SDK for OpenCL チャネル拡張の概要36542 チャネルにおけるデータの動作37543 チャネルに対する複数のワークアイテムの順序付け 38

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

2

544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約39545 OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化41

55 OpenCL パイプの実装53551 OpenCL パイプ機能の概要 53552 パイプデータの動作 54553 パイプにおける複数のワークアイテムの順序付け 55554 OpenCL のパイプ実装における制約56555 カーネルに向けた OpenCL パイプの有効化 58556 ホストパイプを介したカーネルとの直接通信 67

56 任意精度での整数の実装 7057 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用 7158 __constant アドレス空間修飾子の宣言 7259 構造体データ型を OpenCL カーネルに引数として含める73

591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致73592 データ構造パディング挿入の無効化75593 構造体のアライメントの指定 75

510 レジスターの推論 765101 シフトレジスターの推論76

511 倍精度浮動小数点演算の有効化78512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター78

5121 アキュムレーターを推論するためのプログラミング手法 79513 整数のプロモーション規則80

6 ホストアプリケーションの設計 8161 ホストのプログラミング要件81

611 ホストマシンのメモリー要件 81612 ホストバイナリーの要件81613 複数のホストスレッド82614 順不同のコマンドキュー 82615 カーネルを同時に実行するための複数のコマンドキューにおける要件82

62 グローバルメモリーの手動分割における OpenCL バッファーの割り当て 82621 同じメモリータイプの複数のインターフェイスでのバッファーの分割 82622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 84623 ホストアプリケーションでのパイプオブジェクトの作成 85

63 カーネル実行中におけるプロファイルデータの収集86631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング88632 プロファイルデータの取得 89633 複数の自動実行プロファイリング呼び出し 89

64 カスタムプラットフォーム固有の関数へのアクセス9065 構造パラメーター変換に向けたホストプログラムの変更 9166 ホストアプリケーションの管理92

661 Makefile フラグメント例の表示 (example-makefile または makefile) 92662 ホストアプリケーションのコンパイルとリンク93663 OpenCL ICD 拡張 API の使用97664 ホストを経由した FPGA のプログラミング 97665 ランタイム環境の終了とエラー回復 102

67 SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て 10268 徐々に速度低下する OpenCL システムのデバッグ104

目次

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

3

7 OpenCL カーネルのコンパイル10571 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル10572 ハードウェアを構築せずに行うカーネルのコンパイル (-c) 10673 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)10674 ヘッダーファイル位置の指定 (-I=ltdirectorygt) 10775 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o

ltfilenamegt)10876 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) 10877 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) 11078 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt) 11179 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) 111710 コンパイル進捗レポートの生成 (-v) 112711 リソース推定使用率要約の画面表示 (-report) 113712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)114713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセ

ージへの変換 (-Werror) 114714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) 114715 グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt)115716 グローバルメモリーのリング型相互接続の強制 (-global-ring) 115717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)116718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt) 116719 浮動小数点演算処理順序の緩和 (-fp-relaxed) 116720 浮動小数点演算における丸め処理の削減 (-fpc) 117721 OpenCL コンパイルの高速化 (-fast-compile)117722 カーネルのインクリメンタルコンパイル (-incremental) 118

7221 インクリメンタルコンパイルレポート 1197222 インクリメンタルコンパイルのその他のコマンドオプション1207223 インクリメンタルコンパイルフィーチャーの制限123

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)123724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) 123725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) 124

8 OpenCL カーネルのエミュレーションとデバッグ 12581 高速エミュレーターの設定12582 エミュレーションに向けたチャネルカーネルコードの変更 126

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション 127822 チャネル深度のエミュレーション128

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) 12884 OpenCL カーネルのエミュレーション 12985 Linux における OpenCL カーネルのデバッグ 13086 インテル FPGA SDK for OpenCL Emulator の制限 13187 ハードウェアとエミュレーターの結果の不一致13188 高速エミュレーターの環境変数 13389 高速エミュレーターでサポートされている拡張機能 133810 高速エミュレーターの既知の問題134811 レガシーエミュレーターの使用 135

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

4

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) 135

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション1368113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ 137

9 カーネルの reporthtml ファイルのレビュー 139

10 OpenCL カーネルのプロファイリング140101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) 140102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) 141103 自動実行カーネルのプロファイリング 142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発143111 Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフラインコンパイ

ラープラグインのコンフィグレーション143112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインの

コンフィグレーション 143113 インテル Code Builder for OpenCL でのセッションの作成144114 セッションのコンフィグレーション 145

12 インテル FPGA SDK for OpenCL のアドバンスト機能147121 OpenCL ライブラリー147

1211 RTL モジュールと OpenCL パイプラインの理解1481212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 1611213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化1621214 RTL モジュールの検証1641215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 1641216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 1651217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) 1651218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)1681219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) 16912110 OpenCL ライブラリーのコマンドラインオプション 170

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性 1711221 変数固有の属性を使用する際の制約173

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性1731231 カーネルインターフェイスに向けたハードウェア 173

124 num_compute_units(XYZ) 属性を使用したカーネルの複製 1761241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ 1771242 カーネルコピーでのチャネル使用 178

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

A OpenCL 機能のサポート状況 181A1 OpenCL10 の機能のサポート状況181

A11 OpenCL10 C プログラミング言語の実装 181A12 OpenCL C プログラミング言語の制約183A13 組み込みジオメトリック関数の引数型184A14 数値コンプライアンスの実装 184A15 イメージのアドレス指定とフィルタリングの実装 185A16 アトミック関数 185A17 埋め込みプロファイルの実装 185

目次

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

5

A2 OpenCL 12 の機能のサポート状況186A21 OpenCL 12 のランタイムの実装186A22 OpenCL 12 C プログラミング言語の実装 186

A3 OpenCL 20 の機能のサポート状況187A31 OpenCL 20 のヘッダー 187A32 OpenCL 20 ランタイムの実装 188A33 OpenCL 20 C プログラミング言語のパイプにおける制約 188

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限 189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴190

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

6

1 インテルreg FPGA SDK for OpenCLtrade の概要

インテルreg FPGA SDK for OpenCLtrade プログラミングガイド は インテル SDK (ソフトウェア開発キット) for OpenCL のコンパイラーとツールに関する説明推奨事項ならびに使用方法を提供します インテル FPGA SDK for OpenCL (1) は インテル FPGA 製品に向けた OpenCL(2) ベースの異種並列プログラミング環境です

11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件

インテル FPGA SDK for OpenCL プロエディションプログラミングガイド はOpenCL の概念とアプリケーションプログラミングインターフェイス (API) について精通されている方がご利用になることを前提としていますまたOpenCL アプリケーションの作成経験がありOpenCL Specificationversion 10 を理解されていることも前提としています

インテル FPGA SDK for OpenCL またはOpenCL 向けのインテル FPGA ランタイム環境 (RTE)を使用しデバイスをプログラムする前にそれぞれのスタートガイドを十分に理解してから作業を開始してくださいなおこのプログラミングガイドは次の作業をすでに実行していることを前提としています

bull OpenCL カーネルを開発および展開するための tar ファイルのダウンロードまたインストーラーを実行し SDK インテル Quartusreg Prime 開発ソフトウェアプロエディションデバイスサポートのインストール

bull OpenCL カーネルを展開するための RTE のダウンロードおよびインストール

bull SDK もしくは RTE を使用しインテル SoC FPGA をプログラムする場合は インテル SoC FPGAエンベデッド開発スイート (EDS) プロエディションのダウンロードとインストール

bull FPGA ボードのインストールと設定

bull ボードのインストールが正常に終了し正確に機能するかの確認

上記作業を実行していない場合はSDK のスタートガイドを参照し詳細を確認ください

関連情報bull OpenCL References Pages

bull OpenCL Specification version 10

bull インテル FPGA SDK for OpenCL スタートガイド

bull Intel FPGA RTE for OpenCL Pro Edition Getting Started Guide

(1) インテル FPGA SDK for OpenCL は Khronos 社が公開している仕様に基づいておりKhronosConformance Testing Process に合格しています現在の規格適合状況については wwwkhronosorgconformance を参照してください

(2) OpenCL および OpenCL のロゴは Apple Incの商標でありKhronos Grouptradeの許可を得て使用しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

12 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

インテル FPGA SDK for OpenCL を使用しているアプリケーションには2 つのメインコンポーネントがあります1 つは FPGA プログラミングビットストリームでありもう 1 つはアプリケーションとFPGA アクセラレーターを管理するホストプログラムです インテル FPGA SDK for OpenCL オフラインコンパイラーはまずホストプログラムが FPGA のプログラミングに使用するイメージファイルにご自身の OpenCL カーネルをコンパイルしますホスト側の C コンパイラーはホストプログラムをコンパイルしそれをインテル FPGA SDK for OpenCL ランタイムライブラリーにリンクします

図 -1 インテル FPGA SDK for OpenCL プログラミングモデルの回路図

インテル FPGA for OpenCL

ランタイム環境

システムのホスト コンパイラー

 ホストソースコード

(cまたは cpp)

ホストバイナリー

SDKオフライン コンパイラー

カーネルソースコード

( cl)

FPGAイメージ(aocx)

ホストアプリケーションを

ホストで実行

Quartus Prime開発ソフトウェアデザインスイート

ボード固有のカスタムプラットフォーム  デザイン

ターゲットプラットフォームに向けたポーティングまたはカスタ

マイズ

バージョンに互換性のあるターゲットプラットフォームに向けたSDKのボードディレクトリー

最終的な計算結果

ランタイムの実行

ホストアプリケーションのコードパス OpenCL Kernelのコードパス カスタムプラットフォームのパス

(カスタムプラットフォームはOpenCLボードとともに提供されます)

ボード開発者が作成するアイテム

SDKユーザーが作成するアイテム

インテルが提供するツールまたはデザイン

ボード開発者が提供するアイテム

サードパーティーが提供するツールまたはオープンソースツール

ツールが生成するアイテム プロセスまたはアクション

Intel FPGA SDK for OpenCLリファレンスプラットフォーム    デザイン

次の SDK コンポーネントと連携しインテル FPGA のプログラムを作成します

bull ホストアプリケーションとホストコンパイラー

bull OpenCL カーネルとオフラインコンパイラー

bull カスタムプラットフォーム

カスタムプラットフォームはボードサポートパッケージを提供しますボードメーカーは通常特定の OpenCL ボードをサポートするカスタムプラットフォームを開発しますオフラインコンパイラーはOpenCL カーネルをコンパイルしハードウェアプログラミングイメージを生成する際にカスタムプラットフォームをターゲットにしますホストはその後ホストアプリケーションを実行し通常ハードウェアイメージを FPGA にプログラムし実行します

例えば従来のプロセッサーなどでのシーケンシャルなプログラムの実装ではプログラムカウンターがハードウェアで実行される命令のシーケンスとハードウェアで順次実行される命令を制御しますインテル FPGA SDK for OpenCL などでの空間的なプログラムの実装では前提条件となるデータが利用可能になるとすぐに命令が実行されますプログラムはデータの依存関係を表す連続した流れとして解釈されます

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

8

図 -2 FPGA データフローアーキテクチャー

ロード ロード

ストア

FPGA領域(空間的な計算)

42

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

9

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフロー

インテル FPGA SDK for OpenCL オフラインコンパイラーではご自身の FPGA プログラミングイメージファイル (aocxファイル) を単一または複数のプロセスで作成可能ですご自身のカーネルの複雑さに応じて推奨されるコンパイル方法が決まります

図 -3 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

カーネルソースコード2 ( cl )

カーネルソースコード1 ( cl )

カーネルソースコード3 ( cl )

ホストバイナリー

標準Cコンパイラー

ホストコード

OpenCL Kernelのオフラインコンパイラー

カーネルバイナリーA(aocx )

FPGAのプログラミングに向けてaocxをメモリーにロード

PCIe

PCIe

ランタイムのプログラミング

統合されたカーネルバイナリー A(aoco aocx)

5 ( cl )4 (cl ) 6 (cl )

統合されたカーネルバイナリーB(aoco aocx )

カーネルバイナリーB(aocx )

OpenCLカーネルのオフラインコンパイラー

カーネルソースコード

カーネルソースコード

カーネルソースコード

ランタイムのプログラミング

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

OpenCL カーネルソースファイル (cl) はFPGA で動作する OpenCL カーネルのソースコードを含みますオフラインコンパイラーは1 つもしくは複数のカーネルを一時ファイルにグループ化した後この一時ファイルをコンパイルして以下のファイルとフォルダーを生成します

bull 中間オブジェクトファイルであるaoco オブジェクトファイルこのファイルにはコンパイルの後半段階に向けての情報が含まれます

bull ハードウェアコンフィグレーションファイルであるaocxイメージファイルこのファイルはランタイムに FPGA をプログラミングするために必要な情報を含みます

bull aocxファイルの作成に必要なデータを含む作業フォルダーまたはサブディレクトリーデフォルトの状態で作業ディレクトリーの名前はご自身のclファイル名です複数のカーネルソースファイルをコンパイルする場合作業ディレクトリーの名前は aocコマンドラインの 後にリストしたclファイル名です

aocxファイルはホストアプリケーションがターゲット FPGA のプログラムオブジェクトを作成するために使用するデータを含みますプログラムオブジェクトはOpenCL ランタイム API の概念ですホストアプリケーションはまずこれらのプログラムオブジェクトをメモリーにロードしますホストランタイムはその後これらのプログラムオブジェクトを使用しホストプログラムのカーネル起動動作の要求に基づきターゲット FPGA をプログラムします

21 シンプルなカーネルに向けたワンステップコンパイル

デフォルトでインテル FPGA SDK for OpenCL は1 つもしくは複数の OpenCL カーネルのコンパイルとハードウェアコンフィグレーションファイルの作成を一度の作業で行いますご自身のアプリケーションの OpenCL カーネルが 1 つの場合や複数のカーネルがアプリケーションにある場合でも 小のイタレーションのみを必要とする場合にこのコンパイルオプションを選択します

次の図はワンステップでコンパイルを行う OpenCL カーネルのデザインフローを表しています

図 -4 ワンステップでの OpenCL カーネルのコンパイルフロー

ltyour_kernel_filenamegtcl

aoc ltyour_kernel_filenamegtcl [-report]コンパイルの時間 (数時間)

説明

ファイル コマンド カーネルの実行

ltyour_kernel_filenamegtaocxltyour_kernel_filenamegtaoco ltyour_kernel_filenamegtaocr

FPGAにおける実行

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

11

コンパイルが正常に終了すると次のファイルとレポートが作成されます

bull aocoファイル

bull aocrファイル

bull aocxファイル

bull ltyour_kernel_filenamegtreportsreporthtmlファイルの概算リソース使用率の要約では暫定的に評価されたエリア使用率が提供されます単一ワークアイテムのカーネルの場合は 適化に向けたレポートでボトルネックが特定されます

注意 ワンステップのコンパイルフローでデザインのイタレーションを行うとイタレーションごとに FPGA のハードウェアをフルコンパイルしなければならないため非常に長い時間を費やしますその後 FPGA でカーネルを実行しパフォーマンスの測定をする必要があります

関連情報ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル (105 ページ)

22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

デザインの 適化に向けたイタレーションやその他の修正を繰り返し行う場合は複数のステップによるインテル FPGA SDK for OpenCL プロエディションのデザインフローを選択してください

次の図はSDK のデザインフローを段階で表していますデザインフローの各ステップは機能的なエラーとパフォーマンスのボトルネックを特定するためのチェックポイントとしての役割を果たしますこれによりイタレーションごとにフルコンパイルを実行することなくOpenCL のカーネルコードを修正することができるようになりますコンパイルステップは一部もしくはすべてを実行することのどちらも可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

12

図 -5 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

ltyour_kernel_filenamegtaocx

ltyour_kernel_filenamegtcl

aoc -march=emulator ltyour_kernel_filenamegtclコンパイル時間 (数秒)

エミュレーションは成功したか

aoc ltyour_kernel_filenamegtclコンパイル時間 (数時間)

カーネルのパフォーマンスに満足しているか

エミュレーション

フルデプロイメント

カーネルをFPGAで実行

NO

YES

NO

説明

ファイルコマンドカーネルの実行

カーネルパフォーマンスの

概算データは許容可能か

NO

aoc -c ltyour_kernel_filenamegtcl [-report]コンパイル時間 (数秒から数分)

中間コンパイル (-c)

ltyour_kernel_filenamegtaocr

注)HTMLレポートとカーネルのプロファイリングについては「Intel FPGA SDK for OpenCL ベストプラクティスガイド」を参照ください

ltyour_kernel_filenamegtreportsreporthtml

HTMLレポートのレビュー

aoc -profile ltyour_kernel_filenamegtcl [-fast-compile] [-incremental]コンパイル時間 (数時間)

プロファイリング

aoc -fast-compile ltyour_kernel_filenamegt clコンパイル時間 (数分から数時間)

デザイン変更はわずかである

aoc -incremental ltyour_kernel_filenamegtcl [-fast-compile]

インクリメンタルコンパイル高速コンパイル

ltyour_kernel_filenamegtaoco

aoc -rtl ltyour_kernel_filenamegtcl [-report]

中間コンパイル (-rtl)

ハードウェアの実行は

成功したか

YES

NO

NO YES

YES

YES

シミュレーションは成功したか

YES

NO

aoc -march=simulator [-ghdl]ltyour_kernel_filenamegtcl コンパイル時間 (数分)

シミュレーション

ltyour_kernel_filenamegtaocx

コンパイル時間 (数秒から数分)

コンパイル時間 (数分から数時間)

SDK のデザインフローには次のステップがあります

1 エミュレーション

x86-64 ホストシステムの 1 つもしくは複数のエミュレーションデバイスで OpenCL カーネルを実行しその機能性を評価しますLinux システムではエミュレーターはシンボリックデバッグのサポートを提供しますシンボリックデバッグを使用するとカーネルコードの機能的なエラーの原因を特定できます

2 中間コンパイル

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

13

中間コンパイルを行う方法は 2 つありますデザインフローにはこの 2 つの方法のうち 1 つもしくは両方を含むことが可能です

bull -cフラグを使用し 1 つもしくは複数のclカーネルソースファイルをコンパイルする方法これによりOpenCL パーサーからの出力を含むaocoオブジェクトファイルを生成するようオフラインコンパイラーに命令が出されます

bull -rtlフラグを使用し 1 つもしくは複数のclカーネルソースファイルまたはaocoファイルをコンパイルする方法ただしコンパイルはどちらか一方のファイルになりますこれによりオフラインコンパイラーに以下のタスクを実行するよう命令が出されます

mdash 入力ファイルがclファイルの場合オフラインコンパイラーはaocoファイルを各カーネルソースファイルに生成しそれらをリンクしaocrファイルを生成します

mdash 入力ファイルがaocoファイルの場合オフラインコンパイラーはそれらをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt ディレクトリーを作成します

オフラインコパイラーはaocrファイルを使用し 終的なaocxハードウェアコンフィグレーションファイルを生成します

注意

デフォルトのボードが X の環境において-cフラグでカーネルをコンパイルしデフォルトのボードが Y の環境においてaocoファイルを-rtlフラグでコンパイルする場合オフラインコンパイラーはaocoファイルからボード X を読み出しそれを続くコンパイルの段階へ渡します

3 HTML レポートのレビュー

OpenCL アプリケーションの ltyour_kernel_filenamegtreportsreporthtmlファイルをレビューし概算のカーネルのパフォーマンスデータが許容できるかを判断しますHTML レポートではパフォーマンスを向上させるためのカーネルの修正案も提供されます

4 シミュレーション (プレビュー)

OpenCL カーネルをシミュレーションで実行しその機能性を評価しますシミュレーションではコンパイルに長時間を費やすことなくカーネルの機能の正確性および動的なパフォーマンスの評価を行うことができますカーネルのデバッグに向けカーネルの波形をキャプチャーし表示することが可能です

5 高速コンパイル

ハードウェアでの OpenCL カーネルの機能性を評価します高速コンパイルステップはフルコンパイルに比べわずかな時間でaocxファイルを生成します インテル FPGA SDK for OpenCLオフラインコンパイラーは簡単な 適化のみを実行しコンパイル時間を削減します

6 インクリメンタルコンパイル

ハードウェアでの OpenCL カーネルの機能性を評価しますインクリメンタルコンパイルでは修正したカーネルのみをコンパイルしaocxファイルを生成します インテル FPGA SDK forOpenCL オフラインコンパイラーはデザイン全体のサイズではなく変更したデザインのサイズによってコンパイル時間をスケーリングし生産性を向上させます

7 プロファイリング

FPGA プログラミングイメージにパフォーマンスカウンターを挿入するようインテル FPGASDK for OpenCL オフラインコンパイラーに命令します実行中カウンターは性能情報を集めますその情報は インテル FPGA Dynamic Profiler for OpenCL GUI で確認することが可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

14

8 フルデプロイメント

デザインフロー全体における OpenCL カーネルのパフォーマンスに納得したらフルコンパイルを実行します実行後デプロイメントに適したaocxファイルが生成されます

HTML レポートとカーネルのプロファイリングについては インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

関連情報bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ)

bull OpenCL コンパイルの高速化 (-fast-compile) (117 ページ)

bull カーネルの reporthtml ファイルのレビュー (139 ページ)

bull OpenCL カーネルのコンパイル (105 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

bull OpenCL カーネルのプロファイリング (140 ページ)

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

15

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得

インテル FPGA SDK for OpenCL には2 つのコマンドオプションのセットが含まれます1 つはSDK ユーティリティーコマンド ( aocl ltcommand_optiongt )もう 1 つがインテル FPGASDK for OpenCL オフラインコンパイラーコマンド ( aoc ltcommand_optiongt ) ですそれぞれのコマンドセットにはソフトウェアコンパイラーおよびカスタムプラットフォームに関する一般的な情報を入手するために呼び出すことができるオプションが含まれています

注意 bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプション ( aocltcommand_optiongt ) は現在二重ダッシュ (--) ではなく単一ダッシュ (-) を使用します二重ダッシュの規則は 171 のリリースにて非推奨となり今後のリリースで削除される予定です

bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションは現在ltcommand_optiongt=ltvaluegt の規則に従っていますこの規則において valueはユーザー入力値をコンマで区切ったリストとすることが可能です -option value1 -optionvalue2の使用は 171 リリースで非推奨となり今後のリリースでは削除される予定です

ソフトウェアバージョンの表示 (version) (16 ページ)

コンパイラーバージョンの表示 (-version) (17 ページ)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help) (17ページ)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h) (17 ページ)

利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

OpenCL バイナリーのコンパイル環境の表示 (env) (19 ページ)

31 ソフトウェアバージョンの表示 (version)

インテル FPGA SDK for OpenCL のバージョンを表示するにはversionユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl version コマンドを呼び出します出力例

aocl ltversiongtltbuildgt (Intel(R) FPGA SDK for OpenCL(TM)Version ltversiongt Build ltbuildgt Copyright (C) ltyeargt IntelCorporation)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

32 コンパイラーバージョンの表示 (-version)

インテル FPGA SDK for OpenCL オフラインコンパイラーのバージョンを表示するには-versionコンパイラーコマンドを呼び出します

bull コマンドプロンプトで aoc -version コマンドを呼び出します出力例

Intel(R) FPGA SDK for OpenCL(TM) 64-Bit Offline CompilerVersion ltversiongt Build ltbuildgtCopyright (C) ltyeargt Intel Corporation

33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションに関する情報を表示するにはhelpユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl help コマンドを呼び出しますSDK はユーティリティーコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)

インテル FPGA SDK for OpenCL の特定のユーティリティーコマンドオプションについての情報を表示するにはhelp ユーティリティーコマンドの引数としてコマンドオプションを含めます

bull コマンドプロンプトで aocl help ltcommand_optiongt コマンドを呼び出します

例えばinstallユーティリティーコマンドオプションについての詳細情報を取得するにはaocl help install コマンドを呼び出します

出力例

aocl install - Installs a board onto your host system

Usage aocl install

DescriptionThis command installs a boards drivers and other necessary software for the host operating system to communicate with the boardFor example this might install PCIe drivers

34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションに関する情報を表示するには引数なしでコンパイラーコマンドを呼び出すか-helpまたは -hコマンドオプションでコンパイラーコマンドを呼び出します

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

17

bull コマンドプロンプトで次のコマンドのいずれかを呼び出します

mdash aoc

mdash aoc -help

mdash aoc -h

SDK はオフラインコンパイラーのコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

35 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示(-list-boards および-list-board-packages)

カスタムプラットフォームで利用可能な FPGA ボードのリストを表示するには-list-boardsオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -list-boards コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは以下のような出力を生成します

Board list ltboard_name_1gt ltboard_name_2gt

この ltboard_name_Ngt は特定の FPGA ボードをターゲットにするために aocコマンドで使用するボード名です

bull 複数のカスタムプラットフォームがインストールされている場合に特定のカスタムプラットフォームで利用可能な FPGA ボードの一覧を表示するには-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めますコマンドプロンプトで次のようにコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -list-boards

インテル FPGA SDK for OpenCL オフラインコンパイラーはカスタムプラットフォームで利用可能なボードの一覧を表示します

bull システムで利用可能なカスタムプラットフォームを一覧表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のような出力を生成します

Installed board packagesltboard_package_1gtltboard_package_2gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_3gtltboard_package_4gt

この ltboard_package_Ngt はご自身のシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

18

36 OpenCL バイナリーのコンパイル環境の表示 (env)

インテル FPGA SDK for OpenCL オフラインコンパイラーの入力引数およびコンパイルされたOpenCL デザインの環境を表示するにはenvユーティリティーコマンドを呼び出します

bull コマンドプロンプトでaocl env ltobject_file_namegt または aocl envltexecutable_file_namegt コマンドを呼び出します

ここで ltobject_file_namegt はOpenCL カーネルのaocoファイル名でltexecutable_file_namegt はカーネルのaocxファイル名です

aocl env vector_addaocxコマンドの出力例

INPUT_ARGS=-march=emulator -v devicevector_addcl -o binvector_addaocxBUILD_NUMBER=90ACL_VERSION=1610OPERATING_SYSTEM=linuxPLATFORM_TYPE=s5_net

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

19

4 FPGA ボードの管理

インテル FPGA SDK for OpenCL はご自身の FPGA ボードのインストールアンインストール診断およびプログラミングを行うために呼び出すことができるユーティリティーコマンドを含んでいます

aocl installユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストール可能ですカスタムプラットフォームのサブディレクトリーにはboard_envxmlファイルが含まれます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGAクライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFPGA クライアントドライバーの旧称はアルテラクライアントドライバー (ACD) です

aocl installユーティリティーを実行すると FCD が設定されますインストールされた BSP はシステムにレジスターされるためランタイムおよび SDK ユーティリティーは必要な BSP ファイルを見つけることができます

重要 インストール後は BSP を別のディレクトリーに移動させないでくださいBSP を移動する場合は以下を実行します

1 aocl uninstallユーティリティーを使用し現在の位置から BSP をアンインストールします

2 BSP ディレクトリーを変更します

3 aocl installユーティリティーを使用し新しい位置に BSP を再インストールします

FPGA ボードのインストール (install) (21 ページ)

FPGA ボードのアンインストール (uninstall) (22 ページ)

FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)

オフラインまたはホストなしでの FPGA のプログラミング (program ltdevice_namegt) (24 ページ)

フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)

関連情報bull FPGA ボードのインストール (install) (21 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

41 FPGA ボードのインストール (install)

FPGA アクセラレーターボードまたは SoC デバイスに向けた OpenCL アプリケーションを作成する前にボードメーカーが提供するカスタムプラットフォームをダウンロードおよびインストールする必要がありますほとんどのカスタムプラットフォームインストーラーには管理者権限が必要ですaocl install ltpath_to_customplatformgt ユーティリティーコマンドを呼び出しご自身のボードをホストシステムにインストールしてください

以下にボードのインストール手順を説明します一部のカスタムプラットフォームには下記以外のインストール手順が加わります詳細に関してはボードメーカーより提供されている資料を参照してください

注意 インテル Arriareg 10 SoC 開発キットを インテル Arria 10 SoC 開発キットリファレンスプラットフォーム (a10soc) とともに使用する場合のインストールについてはInstalling the Intel Arria 10Development Kit を参照ください

注意 インテル FPGA SDK for OpenCL を インテル Arria 10 GX FPGA 開発キットと使用する場合アプリケーションノートの AN 807 Configuring the Intel Arria 10 GX FPGA Development Kitfor the Intel FPGA SDK for OpenCLを参照ください

1 ボードメーカーが案内している手順に従いFPGA ボードをシステムに接続します

2 ボードメーカーの Web サイトからご自身の FPGA ボード用のカスタムプラットフォームをダウンロードします インテル FPGA SDK for OpenCL リファレンスプラットフォームのダウンロードついては インテル FPGA SDK for OpenCL プラットフォームのページを参照ください

ヒント

インテル FPGA SDK for OpenCL とともに提供されている BSP (a10_ref s10_refa10soc など) をインストールする場合はカスタムプラットフォームのインストールは不要ですBSP ファイルは INTELFPGAOCLSDKROOThldboardsにあります手順 4(21 ページ) に進んでください

3 システムフォルダー以外の任意のフォルダーにカスタムプラットフォームをインストールします

複数のカスタムプラットフォームでの aocl diagnoseなどSDK ユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストールできますカスタムプラットフォームのサブディレクトリーはboard_envxmlファイルを含みます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGA クライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFCDがカスタムプラットフォームに対し正しく設定されている限りFCD はインストールされているボードすべてをランタイムに検出します

4 QUARTUS_ROOTDIR_OVERRIDE ユーザー環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアのインストールディレクトリーを指定するように設定します

5 カスタムプラットフォームライブラリーへのパス (ボードサポートパッケージの MMD ライブリーへのパスであればltpath_to_customplatformgtwindows64binなど) をPATH(Windows) もしくは LD_LIBRARY_PATH (Linux) 環境変数設定に追加します

インテル FPGA SDK for OpenCL スタートガイドはinit_openclスクリプトに関するより詳細な情報を提供していますユーザー環境変数の設定および init_openclスクリプトの実行に関しては インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章を参照ください

6 コマンドプロンプトで aocl install ltpath_to_customplatformgt を呼び出します

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

21

aocl install ltpath_to_customplatformgt を呼び出すとFCD とボードドライバーがインストールされホストアプリケーションとハードウェアのカーネルプログラムの通信が可能になります

注意

bull ボードのインストールには管理者権限が必要ですWindows コマンドプロンプトを管理者として実行するにはStart gt All Programs gt Accessories をクリックしますAccessories の Command Prompt を右クリックし右クリックメニューにあるRun as Administrator をクリックします

Windows 81 または Windows 10 のシステムでは署名付きドライバーの検証を無効にしなければならない場合があります詳細については以下の内容を参照してください

mdash Windows 8 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-basesolutionsfb321729html

mdash Windows 10 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-baseembedded2017Why-does-aocl-diagnose-fail-while-using-Windows-10html

bull システムにドライバーがすでにインストールされており管理者権限なしで FCD をインストールする必要がある場合以下のように aocl installコマンドを-fcd-onlyフラグとともに呼び出しFCD インストールのプロンプトに従ってください

aocl install ltpath_to_customplatformgt -fcd-only

7 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出しますソフトウェアはltdevice_namegt を含む出力を生成しますltdevice_namegt はacl0 からacl127 の acl 番号です

注意

aocl diagnoseユーティリティーを実装した後に発生する可能性があるエラーに関してはIntel Arria 10 GX FPGA Development Kit Reference Platform Porting GuideのPossible Errors After Running the diagnose Utility の章を参照くださいご自身のアクセラレーターボードの ltdevice_namegt の照会に関してはFPGA ボードのデバイス名の照会の章を参照ください

8 FPGA ボードが正常にインストールされていることを確認するには aocl diagnoseltdevice_namegt コマンドを呼び出しボードメーカーが推奨する診断テストを実行します

関連情報bull FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

bull インテル FPGA SDK for OpenCL FPGA プラットフォームページ

42 FPGA ボードのアンインストール (uninstall)

FPGA ボードをアンインストールするにはuninstallユーティリティーコマンドを呼び出しカスタムプラットフォームのアンインストール後に関連する環境変数の設定を解除します

FPGA ボードをアンインストールするには次の手順を行います

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

22

1 ボードメーカーから提供されている手順に従いマシンからボードを外します

2 aocl uninstall ltpath_to_customplatformgt ユーティリティーコマンドを呼び出し現在のホストコンピュータードライバーを削除します (PCIeregドライバーなど) インテルFPGA SDK for OpenCL はFPGA ボードと通信するためにそれらのドライバーを使用します

注意

bull カスタムプラットフォームのアンインストールにはroot権限が必要ですドライバーを維持しながらインストールされている FCD を削除するには以下のように aocluninstall コマンドを-fcd-onlyフラグとともに呼び出しFCD のアンインストールのプロンプトに従ってください

aocl uninstall ltpath_to_customplatformgt -fcd-only

bull Linux システムにおいてFCD をデフォルトディレクトリーである opt Intel OpenCL Boards 以外の特定のディレクトリーにインストールした場合アンインストールを実行する前に環境変数 ACL_BOARD_VENDOR_PATHがその特定の FCD のインストールディレクトリーを指すよう設定されていることを確認してください

3 カスタムプラットフォームをアンインストールします

4 LD_LIBRARY_PATH 環境変数 (Linux の場合) または PATH 環境変数 (Windows の場合) の設定を解除します

43 FPGA ボードのデバイス名の照会 (diagnose)

一部の OpenCL ソフトウェアユーティリティーコマンドにはデバイス名 (ltdevice_namegt) を指定する必要がありますltdevice_namegt はFPGA デバイスに対応する acl 番号を参照します (例えば acl0 から acl127) アクセラレーターボードのリストを照会するとOpenCL ソフトウェアは使用するマシンにインストールされているデバイスのリストをデバイス名の順に生成します

bull マシンにインストールされているデバイスのリストを照会するにはコマンドプロンプトに aocldiagnose と入力しますソフトウェアは以下の例のような出力を生成します

aocl diagnose Running diagnostic from ALTERAOCLSDKROOTboardltboard_namegtltplatformgtlibexec

Verified that the kernel mode driver is installed on the host machine

Using board package from vendor ltboard_vendor_namegtQuerying information for all supported devices that are installed on the host machine

device_name Status Information

acl0 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 020000 at Gen 2 with 8 lanes FPGA temperature=430 degrees C

acl1 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 030000 at Gen 2 with 8 lanes FPGA temperature = 350 degrees C

Found 2 active device(s) installed on the host machine to perform a full diagnostic on a specific device please run aocl diagnose ltdevice_namegt

DIAGNOSTIC_PASSED

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

23

関連情報OpenCL FPGA デバイスの診断 (99 ページ)

44 ボード診断テストの実行 (diagnose ltdevice_namegt)

特定の FPGA ボードで詳細な診断を実行するにはdiagnose ユーティリティーコマンドの引数として ltdevice_namegt を含みます

bull コマンドプロンプトで aocl diagnose ltdevice_namegt コマンドを呼び出しますここで ltdevice_namegt はご自身の FPGA デバイスに対応する (acl0 から acl127 の) acl 番号です

システムにインストールされたボードのリストを照会するとltdevice_namegt を識別することができます

複数の FPGA ボードで diagnoseユーティリティーコマンドを使用し診断テストを実行する場合のボードに関する詳細はボードメーカーより提供されている資料を参照ください

45 オフラインまたはホストなしでの FPGA のプログラミング (programltdevice_namegt)

オフラインまたはホストなしで FPGA デバイスをプログラミングするにはprogramユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl program ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

注意 SoC をプログラミングするにはprogramユーティリティーコマンドを呼び出す際にデバイスのフルパスを次の例のように指定してください aocl program devltdevice_namegtltyour_kernel_filenamegtaocx

46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)

カスタムプラットフォームでサポートされている場合はflashユーティリティーコマンドを呼び出し指定されたスタートアップコンフィグレーションで FPGA を初期化します

注意 インテル Arria 10 SoC 開発キットなどのSoC ボードのマイクロ SD フラッシュカードのプログラミング例に関してはIntel FPGA SDK for OpenCL Intel Arria 10 SoC Development KitReference Platform Porting Guide のBuilding the SD Card Image の章を参照ください

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

24

bull コマンドプロンプトで aocl flash ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

関連情報Building the SD Card Image for the Intel Arria 10 SoC Development Kit

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

25

5 OpenCL カーネルの構築

インテルではOpenCL カーネルコードの構築方法に関する推奨事項を提供していますカーネルを作成する際もしくは別のアーキテクチャーをターゲットとして書かれたカーネルを変更する際はこのプログラミングにおける推奨事項を実行することを検討ください

カーネルの命名ガイドライン (26 ページ)

データの処理効率を 適化するためのプログラミング手法 (27 ページ)

ローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35 ページ)

インテル FPGA SDK for OpenCL チャネル拡張の実装 (36 ページ)

OpenCL パイプの実装 (53 ページ)

任意精度での整数の実装 (70 ページ)

条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用 (71 ページ)

__constant アドレス空間修飾子の宣言 (72 ページ)

構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

レジスターの推論 (76 ページ)

倍精度浮動小数点演算の有効化 (78 ページ)

単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター (78 ページ)

整数のプロモーション規則 (80 ページ)

51 カーネルの命名ガイドライン

インテルではファイル名に英数字のみを含めることを推奨しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ファイル名は英数字で始めてください

OpenCL アプリケーションのファイル名が英数字以外で始まっている場合以下のコンパイルエラーが発生します

Error Quartus compilation FAILEDSee quartus_sh_compilelog for the output log

bull 英数字以外の文字を使用しファイル名を区別しないでください

インテル FPGA SDK for OpenCL オフラインコンパイラーは英数字以外の文字をアンダースコア ( _ ) に変換しますファイル名の末尾のみを英数字以外の異なる文字にし2 つのファイルを区別すると (例えばmyKernelclと myKernelclなど)オフラインコンパイラーはその 2 つのファイル名をどちらもltyour_kernel_filenamegt _cl (前述の例の場合myKernel_cl) に変換します

bull Windows システムの場合カーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えないようにしてください

64 ビットの Windows 7 および Windows 81 にはファイルパスの長さに 260 文字の制限がありますカーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えるとオフラインコンパイラーは次のエラーメッセージを生成します

The filename or extension is too long The system cannot find the path specified

コンパイラーのエラーメッセージに加え次のメッセージが ltyour_kernel_filenamegtquartus_sh_compilelog ファイルに表示されます

Error Canrsquot copy ltfile_typegt files Canrsquot open ltyour_kernel_filenamegt for write No such file or directory

Windows 10 では260 文字の制限を除外することができます詳しくはWindows 10 の資料を参照してください

bull OpenCL のカーネルソースファイル (cl) に予約されているキーワードである「kernel」「Verilog」または「VHDL」の名前を付けないでください

ソースファイルに kernelclVerilogclまたは VHDLclの名前を付けるとオフラインコンラパイラーは特定の内部ファイルと同じ名前の中間デザインファイルを生成するためコンパイルエラーが発生します

52 データの処理効率を最適化するためのプログラミング手法

カーネルのデータ処理効率はループ展開ワークグループサイズの設定計算ユニットとワークアイテムの指定などの手法を実行し 適化してください

ループ展開 (unroll Pragma) (28 ページ)

ネスト化されたループの結合 (28 ページ)

ループ開始間隔の指定 (II) (30 ページ)

ループの並列性 (max_concurrency Pragma) (31 ページ)

ループの投機的実行 (speculated_iterations Pragma) (32 ページ)

ワークグループサイズの指定 (32 ページ)

計算ユニット数の指定 (33 ページ)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

27

SIMD ワークアイテム数の指定 (34 ページ)

メモリー属性の指定 (34 ページ)

521 ループ展開 (unroll Pragma)

ループ展開はループ本体を複数回複製しループのトリップカウントを減らすことで行われますループの展開はFPGA でのループ制御オーバーヘッドの削減または防止のために行いますループに依存関係がなくオフラインコンパイラーがループの反復処理を並列して実行できる場合はループを展開することで FPGA のレイテンシーとオーバーヘッドを低減させることもできますインテル FPGA SDK for OpenCL オフラインコンパイラーはプラグマでアノテートされていない場合でも単純なループを展開する場合がありますループを展開するようまたは明示的にループを展開しないようオフラインコンパイラーに指示するにはカーネルコードの展開するループの前にunrollカーネルプラグマを挿入します

注意

bull 可能な限り展開係数を指定してください展開係数 N を指定するにはpragma unrollltNgt ディレクティブをカーネルコードのループの前に挿入します

オフラインコンパイラーはループ展開を 大 ltNgt 回試みます

コードの一部を下記に示します展開係数に 2 の値を割り当てることによりループを 2 回展開するようオフラインコンパイラーに指示しています

pragma unroll 2for(size_t k = 0 k lt 4 k++) mac += data_in[(gid 4) + k] coeff[k]

bull ループを完全に展開する場合カーネルコードのループの前にpragma unrollディレクティブのみを挿入し展開係数を省略することができます

オフラインコンパイラーはトリップカウントを認識すると完全なループ展開を試みます展開要求が実行できない場合オフラインコンパイラーは警告を発行します

bull ループが展開されないようにするには展開係数に 1 を指定します (pragma unroll 1)

522 ネスト化されたループの結合

loop_coalesceプラグマを使用しループの機能に影響を与えずにネスト化されたループを 1 つのループに結合するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示しますループの結合はコンパイラーにループ制御に必要なオーバーヘッドを削減するよう指示することによりカーネルの使用領域を削減することができます

ネスト化されたループを結合するとコンポーネントのレイテンシーも低減されるためカーネルの使用領域をさらに削減することも可能ですただし場合によってはループを結合させることで重要なループを開始させるパスの間隔が長くなる場合があるためループの結合がカーネルすべてに適しているとは限りません

NDRange カーネルではloop_coalesceプラグマによりアノテートされていない場合でもコンパイラーは自動的にループ結合を試みますNDRange カーネルでループを結合することによりスループットが向上するとともにカーネルの使用領域が低減しますloop_coalesceプラグマを使用するとNDRange カーネルにおけるループの自動結合を防ぐことができます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

28

ネスト化されたループを結合するには次のようにプラグマを指定します

pragma loop_coalesce ltloop_nesting_levelgt

ltloop_nesting_levelgt パラメーターはコンパイラーが結合を試みるネスト化されたループのレベル数をオプションで指定する整数ですltloop_nesting_levelgt パラメーターを指定しない場合コンパイラーはネスト化されたループすべてを結合しようと試みます

ネスト化されたループの例を以下に示します

for (A) for (B) for (C) for (D) for (E)

ループ (A) の前にプラグマを配置するとこのループのネストレベルは次のように定義されます

bull ループ (A) のループネストレベルは 1

bull ループ (B) のループネストレベルは 2

bull ループ (C) のループネストレベルは 3

bull ループ (D) のループネストレベルは 4

bull ループ (E) のループネストレベルは 3

指定したループネストレベルによってコンパイラーは異なるループ結合を試みます

bull pragma loop_coalesce 1をループ (A) に指定した場合コンパイラーはこのネスト化されたループの結合を試みません

bull pragma loop_coalesce 2をループ (A) に指定した場合コンパイラーはループ (A) と(B) の結合を試みます

bull pragma loop_coalesce 3を (A) に指定した場合コンパイラーはループ (A)(B)(C)(E)の結合を試みます

bull pragma loop_coalesce 4をループ (A) に指定した場合コンパイラーはループ (A) からループ (E) すべてのループの結合を試みます

重要 pragma loop_coalesce 1を NDRange カーネルのループに指定するとそのループの自動ループ結合を防ぐことができます

以下はコンパイラーが 2 つのループを 1 つのループに結合する方法を簡単な例にて示しています

下記はネスト化された単純なループです

pragma loop_coalescefor (int i = 0 i lt N i++) for (int j = 0 j lt M j++) sum[i][j] += i+j

コンパイラーは 2 つのループを結合し次のような 1 つのループであるかのように実行します

int i = 0int j = 0while(i lt N) sum[i][j] += i+j j++

if (j == M)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

29

j = 0 i++

523 ループ開始間隔の指定 (II)

開始間隔 (II) は連続するループの反復が開始されるまでのクロックサイクル数です iiプラグマを使用しプラグマ宣言に続くループに II の設定を試みるよう インテル FPGA SDK for OpenCL オフラインコンパイラー に指示しますオフラインコンパイラーがそのループに対して指定された II を実現できない場合コンパイルエラーが発生します

iiプラグマはループがパイプライン化されている単一のワークアイテムカーネル (シングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルプロパティーについての詳細はインテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照してください

II の値が高いほど後続するループ反復の実行開始までの待機時間が長くなりますII および特定のループにおける II のパフォーマンスへの影響についての詳細を提供するコンパイラーレポートに関しては インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

カーネルのループによってはデフォルトでコンパイラーが選択する値よりも高い II の値を iiプラグマで指定するとスループットを低下させることなくカーネルの 大動作周波数 (fMAX) を向上させることができます

次の条件を満たすループはiiプラグマの使用に適しています

bull カーネルがシングルスレッドであるためループがパイプライン化されている

bull カーネルのスループットに重要ではないループである

bull ループの実行時間がそれに含まれる可能性のある他のループと比較して短い

ループの開始間隔を指定するには次のようにループの前にプラグマを指定します

pragma ii ltdesired_initiation_intervalgt

ltdesired_initiation_intervalgt パラメーターは後続のループ反復の開始を実行するまでに待機するクロックサイクル数を指定する整数であり必須です

カーネルにパイプライン化が可能な異なるループが 2 つある場合を考えます1 つはループに依存関係を持つ実行時間が短い初期化ループもう 1 つは処理の大部分を実行する実行時間が長いループですこの場合初期化ループがデザインの全体的なスループットに与える影響がもう一方のループに比べはるかに小さいことをコンパイラーは認識しません可能な場合コンパイラーは両方のループの IIを 1 でパイプライン化しようと試みます

初期化ループにはループに依存関係があるため生成されるハードウェアはフィードバックパスを持つようになりますこのようなフィードバックパスで II を実現するとクロック周波数の一部が犠牲になる可能性がありますメインループのフィードバックパスによっては残りのデザインがより高い動作周波数で動作できる場合があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

30

初期化ループにpragma ii 2を指定するとこのループに対する II の 適化をそれほど積極的に行う必要がないことをコンパイラーに通知します 適化をあまり積極的に行わないことでfmax を制限しているパスをコンパイラーがパイプライン化できるようになりカーネルのデザイン全体でより高いfmax を実現できるようになります

新しく指定される II により初期化ループの実行時間は長くなりますしかしfmax が高くなることでもう一方の長いループの実行時間が短縮されるため初期化ループの実行時間の増加は補償されます

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

524 ループの並列性 (max_concurrency Pragma)

max_concurrencyプラグマを使用しコンポーネントのループの並列性を制限できます

ループの並列性とはそのループの反復を同時に何回進行することができるかということですデフォルトにおいてインテル FPGA SDK for OpenCL はループの並列性を 大化しコンポーネントが 大のスループットで動作するように試みます

max_concurrencyプラグマはループがパイプライン化されている単一のワークアイテムカーネル (つまりシングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルのプロパティーについては インテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照ください

max_concurrencyプラグマを使用するとループのパイプライン化に必要なオンチップメモリーリソースを制御できるようになりますループ反復の同時実行を実現するためオフラインコンパイラーは単一の反復に専用のメモリーコピーを作成する必要がありますこのコピーはプライベートコピーと呼ばれます許可される並列性が高いほどより多くのプライベートコピーをコンパイラーは作成しなければなりません

カーネルの HTML レポート (reporthtml) はループの並列性に関する以下の情報を提供します

bull オフラインコンパイラーが選択した 大の並列性

この情報はループ解析レポートとカーネルメモリービューアーで確認できます

mdash ループ解析レポートの Details ペインのメッセージは同時実行の 大数は N に制限されていると報告します

注意 符号なしの N は0 以上の値になることが可能ですN = 0 は並列性が無制限であることを意味します

mdash カーネルメモリービューアーのローカルメモリーのバンクビューはプライベートコピーの数を図式化し表示します

bull メモリー使用量への影響

この情報はエリア解析レポートで確認可能ですDetails ペインのメッセージはオフラインコンパイラーが N 個のループ反復を同時実行するためN 個の独立したメモリーコピーを作成したことを報告します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

31

パフォーマンスよりも物理メモリーの低減を優先する場合以下のようにpragmamax_concurrency ltNgt をループに適用しますこのプラグマを適用するとオフラインコンパイラーは同時に実行するループの反復回数を N に制限しますループのメモリーのプライベートコピー数も N に減少します

pragma max_concurrency 1for (int i = 0 i lt N i++) int arr[M] Doing work on arr

ローカルメモリーに作成されループでアクセスされるプライベートコピーの数も__attribute__((max_concurrency(N))) を使用し制御することができます属性に関する詳細はカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) を参照ください__attribute__((max_concurrency(N))) を持つローカルメモリーにpragma max_concurency Mをともなうループでアクセスするとオフラインコンパイラーは同時に実行されるループの反復数を min(MN) に制限します

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

525 ループの投機的実行 (speculated_iterations Pragma)

speculated_iterationsプラグマを使用し インテル FPGA SDK for OpenCL オフラインコンパイラーにパイプライン化されたループのパフォーマンス向上を指示します

speculated_iterationsプラグマはループに適用されるため(他のループプラグマの位置と同様に) ループの直前に配置する必要があります以下に例を示します

pragma speculated_iterations k where k gt= 0

インテル FPGA SDK for OpenCL オフラインコンパイラーは他に影響を与えることなくk回の反復を追加し実行するハードウェアを生成しますこれによりループの II の短縮または fmax の増加どちらかが可能になります決定を左右するのはループの終了条件を計算する速度です計算に多くのサイクルを費やす場合はspeculated_iterationsを大きくすることを推奨します

注意 反復を追加することでループの次の呼び出しが開始されるまでの時間が長くなりますループの実際の反復回数が非常に少ない場合 (5 から 10 以下または同様の場合) はこれが要因の可能性がありますその場合pragma speculated_iterationsの値を 0 に指定すると後続のループの反復がすぐ開始されるようになります一方でこれはII を大きくし終了条件の算出に時間を与えることになりますHLD レポートのループ解析レポートを参照し終了条件が II のボトルネックであるかを確認してください

526 ワークグループサイズの指定

大のまたは必要なワークグループサイズを可能な限り指定してください インテル FPGA SDK forOpenCL オフラインコンパイラーはこの指定されたサイズに基づきOpenCL カーネルのハードウェア使用率を過剰なロジックをともなうことなく 適化します

max_work_group_sizeまたは reqd_work_group_size属性をカーネルで指定しない場合ワークグループサイズはコンパイル時間とランタイムの制約に応じたデフォルト値になります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

32

bull カーネルにバリアーが含まれる場合オフラインコンパイラーはデフォルトの 大ワークグループサイズである 256 ワークアイテムを設定します

bull カーネルが異なるスレッドの異なる動作を可能にする OpenCL 組み込み関数 (ローカルまたはグローバルスレッド IDワークグループ ID) の問い合わせを行わない場合オフラインコンパイラーはシングルスレッド実行モードを想定し 大ワークグループサイズを (111) に設定しますこの場合 OpenCL ランタイムもまたグローバルエンキューサイズを (111) に強制するためループのパイプライン化の 適化がオフラインコンパイラーで有効になります

ワークグループサイズを指定するには次のようにカーネルコードを修正します

bull カーネルのワークグループに向けてオフラインコンパイラーが規定するワークアイテムの 大数を指定するにはmax_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((max_work_group_size(51211)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

bull カーネルのワークグループにオフラインコンパイラーが規定するワークアイテムの必要数を指定するにはreqd_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((reqd_work_group_size(6411)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

527 計算ユニット数の指定

OpenCL カーネルのデータ処理効率を向上させるためカーネルの計算ユニットを複数生成するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示することができます各計算ユニットは複数のワークグループを同時に実行することができます

注意 カーネルの計算ユニット数を増加するとデータのスループットが向上する一方でFPGA リソースの消費率が増加しグローバルメモリーの帯域幅の競合が計算ユニット間で起こります

bull カーネルの計算ユニット数を指定するにはカーネルソースコードにnum_compute_units(N) 属性を挿入します

以下にコードの一部を例として示しますこのコードはカーネルに 2 つの計算ユニットをインスタンス化するようオフラインコンパイラーに指示しています

__attribute__((num_compute_units(2)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

33

size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは指定された数の計算ユニットにワークグループを動的に分配します

注意

ワークアイテムが実行されている特定の計算ユニットを識別するには組み込み関数のget_compute_id() を呼び出します詳細はget_compute_id() 関数を使用した複製カーネルのカスタマイズを参照ください

関連情報get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

528 SIMD ワークアイテム数の指定

手動でカーネルコードをベクトル化することなく複数のワークアイテムを SIMD (シングルインストラクションマルチプルワークアイテム) で実行しOpenCL カーネルのデータ処理効率を向上させることもできます インテル FPGA SDK for OpenCL オフラインコンパイラーにSIMD またはベクトル化された状態で実行するワークグループのワークアイテム数を指定してください

重要 reqd_work_group_size属性とともにnum_simd_work_items属性を導入します指定する num_simd_work_items属性はreqd_work_group_size属性に指定するワークグループサイズを均等に分割する必要があります

bull ワークグループの SIMD ワークアイテム数を指定するにはnum_simd_work_item(N) 属性をカーネルソースコードに挿入します

次のコード例は64 ワークアイテムの固定ワークグループサイズをカーネルに割り当てていますその後各ワークグループのワークアイテムを 4 つの SIMD ベクトルレーンに統合します

__attribute__((num_simd_work_items(4)))__attribute__((reqd_work_group_size(6411)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは可能な限りnum_simd_work_itemsに指定された値に従いカーネルのデータパスをベクトル化します

529 メモリー属性の指定

OpenCL カーネルの配列宣言にメモリー属性を適用することができます

int __attribute__((max_concurrency(k)) local_A[M]

この k は符号なしであり0 以上の値を取ることができますk の値は配列への 大同時アクセス数です インテル FPGA SDK for OpenCL オフラインコンパイラーは配列のコピーを k 個作成しますk=0 はスループットを 大化するためにオフラインコンパイラーが配列への 大同時アクセス数を小 16 までの範囲で選択することを示しますこれはメモリー属性を適用しないデフォルトの動作で

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

34

次の例は外側のループが 4 つのローカル配列を宣言しています

for (int i = 0 i lt N i++) int local_A[M] int local_B[M] int local_C[M] int local_D[M]

Step 1 for (int j = 0 j lt M j++) local_A[j ] = initA()

Step 2 for (int j = 0 j lt M j++) local_B[j] = initB(local_A[j])

Step 3 for (int j = 0 j lt M j++) local_C[j] = initC(local_B[j])

Step 4 for (int j = 0 j lt M j++) local_D[j] = initD(local_C[j])

この例において外側のループは 4 つのステップを含み各ステップは内側のループに対応していますステップ 1 では 初のローカル配列 local_A が初期化されますステップ 2 ではlocal_A の読み取りが行われますが書き込みはされませんこれは外側のループでの local_A の 後の使用になります同様に local_B はステップ 2 で 初に使用され初期化されますステップ 3 では local_B を読み取りますが書き込みはされませんそしてこれが 後の local_B の使用になります同様に local_Cはステップ 3 と 4 でのみで使用されます インテル FPGA SDK for OpenCL オフラインコンパイラーは16 個のコピーを作成し各配列をプライベート化しますこのコピーは外側のループでの 16 の並行処理をサポートするのに十分ですがこれらのローカル配列の実際の範囲は外側のループ全体に及ばないため外側のループのスループットを 大化するために 16 のコピーすべては必要ありませんこれはコピーを作成するために消費される領域が必要以上に大きいことを意味しますこの場合max_concurrency属性を適用しローカル配列のコピー数を制御すると外側のループのスループットを維持しながら使用される領域を減らすことができます

53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法

ローカルカーネルへのポインター引数を使用しローカルメモリーの割り当てを作成する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA に構築するローカルメモリーシステムのサイズをランタイムではなくコンパイル時に決定する必要があります clSetKernelArgでランタイムに要求するサイズを指定することでメモリーサイズを 適化できますこのサイズを指定することでオフラインコンパイラーはポインター引数に正しいサイズのローカルメモリーシステムを構築できるようになりますこのサイズを指定しない場合はオフラインコンパイラーはデフォルトのサイズを使用します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

35

bull デフォルトの 16 キロバイト (kB) 以外のサイズを指定するにはlocal_mem_size(N) 属性をカーネルソースコードのポインター宣言に含めます

N の値は要求するメモリーサイズをバイト単位で指定します効率を高めるためN は 2 のべき乗にしてください

__kernel void myLocalMemoryPointer( __local float A __attribute__((local_mem_size(1024))) __local float B __attribute__((local_mem_size(32768))) __local float C) statements

myLocalMemoryPointerカーネルにおいてローカルメモリーの 16 KB (デフォルト) はポインター Aに1 KB はポインター Bにそして 32 KB はポインター Cに割り当てられています

注意 ローカルカーネルへのポインター引数を使用する代わりにインテルではカーネルスコープにローカルメモリーシステムを定義することを推奨しています

54 インテル FPGA SDK for OpenCL チャネル拡張の実装

インテル FPGA SDK for OpenCL のチャネル拡張はカーネル間のデータの受け渡しおよびカーネルの同期を高効率かつ低レイテンシーで行うメカニズムを提供します

注意 チャネル機能の活用を求める一方で他の SDK を使用しカーネルプログラムを実行する機能がある場合はOpenCL パイプを代わりに使用しデザインを実装してください

関連情報OpenCL パイプの実装 (53 ページ)

541 インテル FPGA SDK for OpenCL チャネル拡張の概要

インテル FPGA SDK for OpenCL のチャネル拡張によりカーネルは FIFO バッファーを介し互いに直接通信できるようになります

チャネルの実装は並行して実行されているカーネル間のデータ移動をホストプロセッサーから切り離します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

36

図 -6 チャネル実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Channel

Host Processor

Initialize ( )

IO Channel

FIFO

542 チャネルにおけるデータの動作

チャネルに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りチャネルに残りますつまりチャネルに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり持続しますただしFPGA デバイスの再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたりデータが持続するわけではありません

OpenCL の実装においてデバイスの再プログラミング動作を回避するよう 適化を実行した場合でもチャネルのデータはコンテキストプログラムデバイスカーネルまたはプラットフォームのリリース間では持続しません例えば同じaocxファイルを使用しホストプログラムを 2 回実行する場合やホストプログラムがコンテキストをリリースし再取得した場合チャネルのデータは動作全体にわたって持続したりしなかったりする可能性がありますFPGA デバイスのリセット動作がチャネルのデータを消去するオブジェクトリリースの裏で発生する可能性があります

次のコードを例に示します

channel int c0

__kernel void producer() for (int i = 0 i lt 10 i++) write_channel_intel (c0 i)

__kernel void consumer (__global uint restrict dst) for (int i = 0 i lt 5 i++) dst[i] = read_channel_intel(c0)

図 -7 チャネルデータ FIFO の順序付け

9 012345678Producer Consumer

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

37

カーネルの producerは10 の要素 ([0 9]) をチャネルに書き込みますカーネルのコンシューマーにはワークアイテムの識別子の問い合わせが含まれていませんよって暗黙的なreqd_work_group_size属性 (111) を受け取りますこの暗黙的な属性reqd_work_group_size(111) は単一のワークアイテムカーネルとしてコンシューマーを起動させる必要があることを意味します上記例において consumerは1 回の呼び出しに 5 つの要素をチャネルから読み取ります 初の呼び出し中にカーネルの consumerは0 から 4 の値をチャネルより読み取りますデータは NDRange の呼び出し間で持続するため2 回目にカーネルconsumerを実行する際は5 から 9 の値が読み取られます

この例の場合デッドロックの発生を回避するためカーネル producerの呼び出しごとにカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとチャネルの容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回より多い場合はチャネルに十分なデータがないため consumerがストールします

543 チャネルに対する複数のワークアイテムの順序付け

OpenCL Specification はワークアイテムの順序を定義していません インテル FPGA SDK forOpenCL ではチャネルの読み書き動作の合理化を容易にするためワークアイテムの順序を強制します

複数のワークアイテムのチャネルへのアクセスはいくつかのシナリオにおいて有効です例えばチャネルのデータワードが独立している場合やチャネルがコントロールロジックに向けて実装されている場合などです複数のワークアイテムがチャネルにアクセスする際の主な注意事項はカーネルがチャネルにデータを書き込みチャネルからデータを読み取る順序ですSDK のチャネル拡張はチャネルへのワークアイテムの読み書き動作を可能な限り決定論的な順序で処理しますこれにより読み取りおよび書き込み動作はカーネル呼び出し間で一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK は以下の特性に基づきチャネルのアクセスがワークアイテムに対し不変であることを確認します

bull カーネルを通るすべてのパスが必ずチャネルアクセスを実行しているか

bull 上記要件が満たされない場合チャネル呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

bull カーネルが単一のワークアイテムカーネルとして推測されていないか

複数のワークアイテムのチャネルへのアクセスにおいて決定論的な順序付けを保証できない場合SDK はチャネルの順序付けが適切に定義されない可能性があり非決定論的な実行が行われる可能性があることを警告しますSDK は主にチャネル呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合決定論的な順序付けを提供することができません次に例を示します

__kernel void ordering (__global int restrict check __global int restrict data) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_channel_intel (req data[i]) else process(data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

38

5431 チャネルのワークアイテムのシリアル実行

ワークアイテムのシリアル実行とは順序付けられた実行動作のことでワークアイテムのシーケンシャル ID が計算ユニットでの実行順序を決定します

カーネルにチャネルを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は計算ユニットに同時に 大 1 つのインフライトのワークグループを持っているのと同等であるということを適用しますコンパイラーもまたカーネルがチャネルをシリアル実行することを保証しますよってカーネルはID の小さいワークアイテムから実行しますワークアイテムは識別子 (xyzgroup) を持ちますこの xyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

ワークアイテム ID (x0y0z0group0) は次の条件のいずれかが当てはまる場合ID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1 z0 lt z1の場合

bull group0 = group1 z0 = z1 y0 lt y1の場合

bull group0 = group1 z0 = z1 y0 = y1 x0 lt x1の場合

インクリメンタル ID をともなうワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) をともなうワークアイテムはチャネル書き込み呼び出しをまず実行しますその後ID (x1y0z0group0) をともなうワークアイテムが呼び出しを実行しますこの順序を定義することでシステムが外部モデルと検証可能になるよう保証しています

複数のワークアイテムをともなうループのチャネル実行

次のように複数のワークアイテムがあるループの本体にチャネルが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data int X) int n = 0 while (n lt X) write_channel_intel (req data[get_global_id(0)]) n++

544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約

OpenCL アプリケーションへのチャネル実装には一定のデザイン上の制約があります

複数のチャネル呼び出しサイト

カーネルは同じチャネルを複数回読み取ることが可能ですが複数のカーネルが同じチャネルから読み取ることはできません同様にカーネルは同じチャネルに複数回書き込むことはできますが複数のカーネルが同じチャネルに書き込むことはできません

__kernel void k1() read_channel_intel (channel1) read_channel_intel (channel1) read_channel_intel (channel1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

39

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコードをコンパイルすることができずエラーが発生します

__kernel void k1() write_channel_intel (channel1 1)

__kernel void k2() write_channel_intel (channel1 2)

フィードバックチャネルとフィードフォワードチャネル

カーネルのチャネルはread_onlyまたは write_onlyのどちらかになります同じチャネルに対して読み書きを行うカーネルのパフォーマンスは低下する可能性があります

静的なインデックス化

インテル FPGA SDK for OpenCL のチャネル拡張はチャネル ID の配列へのインデックス化をサポートしますが非効率なハードウェアにつながります

次に例を示します

channel int ch[WORKGROUP_SIZE]

__kernel void consumer()

int gid = get_global_id(0) int value = read_channel_intel(ch[gid])

statements

この例をコンパイルすると次の警告メッセージが表示されます

Compiler Warning Dynamic access into channel array ch was expanded into predicated static accesses on every channel of the array

アクセスが動的で配列のチャネルのサブセットのみにアクセスできることが明確な場合はswitch ステートメントを使用しわずかに効率的なハードウェアを生成することができます

channel int ch[WORKGROUP_SIZE] __kernel void consumer() int gid = get_global_id(0) int value

switch(gid) case 0 value = read_channel_intel(ch[0]) break

case 2 value = read_channel_intel(ch[2]) break case 3 value = read_channel_intel(ch[3]) break statements case WORKGROUP_SIZE-1read_channel_intel(ch[WORKGROUP_SIZE-1]) break

statements

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

40

カーネルのベクトル化に対するサポート

チャネルを使用するカーネルをベクトル化することはできませんしたがってカーネルコードにnum_simd_work_itemsカーネル属性を含めないでくださいチャネルを使用するカーネルをベクトル化すると同じカーネルで複数のチャネルアクセスが発生し調停が必要になりますこれはベクトル化の利点を無効にしますよって SDK のチャネル拡張はカーネルのベクトル化をサポートしません

read_channel_intel および write_channel_intel 呼び出しにおける命令レベルの並列処理

データの依存性が read_channel_intelと write_channel_intel呼び出し間に存在しない場合オフラインコンパイラーはそれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこの read_channel_intelと write_channel_intel呼び出しをOpenCL カーネルコードに表現されているシーケンスとは異なる順序で実行する場合があります

次のコードのシーケンスを例に示します

in_data1 = read_channel_intel(channel1)in_data2 = read_channel_intel(channel2)in_data3 = read_channel_intel(channel3)

read_channel_intel呼び出し間にデータの依存性がないためオフラインコンパイラーはこれらを任意の順序で実行できます

545 OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化

インテル FPGA SDK for OpenCL のチャネル拡張を実装するにはチャネル固有のプラグマと API 呼び出しを含むように OpenCL カーネルを修正します

チャネル拡張を有効にするには次のプラグマを使用しますpragma OPENCL EXTENSION cl_intel_channels enable

チャネル宣言は特定の OpenCL カーネルプログラムに固有のものですチャネルのインスタンスもまた各 OpenCL カーネルプログラムのデバイスペアに固有ですランタイムに単一の OpenCL カーネルプログラムを複数のデバイスにロードする場合各デバイスはチャネルのコピーを 1 つ保有するようになりますただしこのチャネルのコピーは独立しておりデバイス間でデータを共有しません

5451 チャネルのハンドル宣言

チャネル変数を使用しカーネル間またはカーネルと IO 間の接続性を定義します

チャネルから読み書きするにはカーネルはチャネル変数を対応する各 API 呼び出しに渡す必要があります

bull 以下の規則を使用しカーネルのソースコードにファイルスコープ変数としてチャネルのハンドルを宣言しますchannel lttypegt ltvariable_namegt

例 channel int c

bull インテル FPGA SDK for OpenCL のチャネル拡張はデータ構造で宣言された複数の変数による同時チャネルアクセスをサポートします次の方法でstructデータ構造をチャネルに宣言します

typedef struct type_ int a int b type_t

channel type_t foo

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

41

5452 ブロッキングのチャネル書き込みの実装

write_channel_intel API 呼び出しはチャネルを介したデータ送信を可能にします

bull ブロッキングのチャネル書き込みの実装には次の write_channel_intel関数シグネチャーを使用します

void write_channel_intel (channel lttypegt channel_id constlttypegt data)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますまた対応する読み取りチャネル(read_channel_intel) の channel_idと一致しなければなりません

dataはチャネル書き込み動作がチャネルに書き込むデータです

ltTypegt はチャネルのデータ幅を定義しますOpenCL 変換規則に従いカーネルがチャネルに書き込むデータがlttypegt に変換できるようにしてください

以下にwrite_channel_intel API 呼び出しを実装するコード例を示します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from global memory and passes this data to the channel __kernel void kernel_write_channel( __global const long src ) for (int i = 0 i lt N i++) Writes the eight bytes to the channel write_channel_intel(chan src[i])

注意 write_channel_intel API 呼び出しを使用しチャネルを介してデータを送信する際はチャネルの容量がフルの場合 (FIFO バッファーがデータでフルの場合) カーネルがストールしFIFO バッファーのデータスロットが 低 1 つ利用可能になるまで待機することに注意してください インテル FPGADynamic Profiler for OpenCL を使用しチャネルのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

54521 ノンブロッキングのチャネル書き込みの実装

ノンブロッキングのチャネル書き込みを行うとフルの状態の FIFO バッファーに書き込みFIFO バッファーのスロットが利用可能になるまでカーネルがストールすることのないアプリケーションが容易にできるようになりますノンブロッキングのチャネル書き込みはデータがチャネルに正常に書き込まれた (チャネルがフルではなかった) ことを示すブール値を返します

アプリケーションにデータプロデューサーが 1 つと同一のワーカーが 2 つあるシナリオを例とします各ワーカーがメッセージの処理に要する時間はデータの内容によって異ると想定しますこの場合一方のワーカーはビジー状態でもう一方のワーカーはフリーの状態になる可能性がありますノンブロッキングの書き込みは両方のワーカーがビジー状態になるワークの分配を促進します

bull ノンブロッキングのチャネル書き込みを実装するには次の write_channel_nb_intel関数シグネチャーを含めます

bool write_channel_nb_intel(channel lttypegt channel_id constlttypegt data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

42

次に示すコードのカーネル producerはノンブロッキングのチャネル書き込み拡張を使用しワークの分配を促進しています

channel long worker0 worker1__kernel void producer( __global const long src ) for(int i = 0 i lt N i++) bool success = false do success = write_channel_nb_intel(worker0 src[i]) if(success) success = write_channel_nb_intel(worker1 src[i]) while(success)

5453 ブロッキングのチャネル読み取りの実装

read_channel_intel API 呼び出しはチャネルを介したデータの受信を可能にします

bull ブロッキングのチャネルの読み取りを実装するには次の read_channel_intel関数シグネチャーを含めます

lttypegt read_channel_intel(channel lttypegt channel_id)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますこれは対応する書き込みチャネル (write_channel_intel) の channel_idと一致している必要があります

lttypegt はチャネルのデータ幅を定義しますチャネルデータを読み取るためにカーネルが割り当てる変数がlttypegt から変換可能であることを確認してください

read_channel_intel API 呼び出しを実装するコード例を以下に表します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from the channel and writes it back to global memory__kernel void kernel_read_channel (__global long dst) for (int i = 0 i lt N i++) Reads the eight bytes from the channel dst[i] = read_channel_intel(chan)

注意 チャネルが空の場合 (FIFO バッファーが空の場合)read_channel_intel API 呼び出しで読み出しチャネルを介したデータの受信はできませんこれを行うと 低 1 つのデータ要素が FIFO バッファーで利用可能になるまでカーネルはストールします

54531 ノンブロッキングのチャネル読み取りの実装

ノンブロッキングの読み取りを行うとデータが必ずしも利用可能ではない場合でもデータが利用可能になるまで動作が待機することのないアプリケーションを容易にできるようになりますノンブロッキング読み取りシグネチャーはブロッキング読み取りと類似していますが読み取り動作がチャネルからデータを正常に読み取ったかどうかを示すブールポインター validが指定するアドレスを生成します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

43

読み取りが正常に行われた場合 (validが true に設定される)チャネルから読み取った値はread_channel_nb_intel関数により返されます読み取りが失敗した場合 (validが false に設定される)read_channel_nb_intel関数の戻り値は定義されません

bull ブロッキングのチャネル読み取りを実装するには次の read_channel_nb_intel関数シグネチャーを使用します

lttypegt read_channel_nb_intel(channel lttypegt channel_id bool valid)

次のコードはノンブロッキングのチャネル読み取り拡張機能の使用方法を表しています

channel long chan

__kernel void kernel_read_channel (__global long dst) int i = 0 while (i lt N) bool valid0 valid1 long data0 = read_channel_nb_intel(chan ampvalid0) long data1 = read_channel_nb_intel(chan ampvalid1) if (valid0) process(data0) if (valid1) process(data1)

5454 io チャネル属性を使用した IO チャネルの実装

io属性をチャネル宣言に含めFPGA ボードの入力または出力フィーチャーと接続する特別な IO チャネルを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますこの chan_id はカスタムプラットフォームの board_specxmlにリストされている IO インターフェイス名です

ペリフェラルインターフェイスの使用方法はデバイスの種類によって異なるためIO チャネルをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいご自身の OpenCL カーネルコードはペリフェラルインターフェイスが生成するデータと互換性がある必要があります

注意 bull ボードに直接接続しIO チャネルを介してペリフェラルデバイスと通信するチャネルには暗黙的なデータの依存関係が存在する可能性があります インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらの依存関係に対する可視性を持たないためこの暗黙的なデータの依存関係は予期しない動作を引き起こす可能性があります

bull 同じペリフェラルと通信する外部 IO チャネルはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを参照しご自身の FPGA ボードで使用可能な入力および出力フィーチャーを特定してください

例えばboard_specxmlファイルには次のような IO フィーチャー情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

44

chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256 chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのチャネルで使用されるデータタイプの幅をビットで指定します上の例の場合uintと floatのデータタイプはどちらも 32 ビット幅です他のより大きいデータタイプやベクトル化されたデータタイプはboard_specxmlファイルで指定されている適切なビット幅と一致している必要があります

2 次のコード例で示されているように ioチャネル属性を実装しますioチャネル属性の名前はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) と一致していなければなりません

channel QUDPWord udp_in_IO __attribute__((depth(0))) __attribute__((io(eth0_in))) channel QUDPWord udp_out_IO __attribute__((depth(0))) __attribute__((io(eth0_out)))

__kernel void io_in_kernel (__global ulong4 mem_read uchar read_from int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) if (read_from amp 0x01) data = read_channel_intel(udp_in_IO) else data = mem_read[index] write_channel_intel(udp_in data) index++

__kernel void io_out_kernel (__global ulong2 mem_write uchar write_to int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) ulong4 data = read_channel_intel(udp_out) if (write_to amp 0x01) write_channel_intel(udp_out_IO data) else only write data portion ulong2 udp_data udp_datas0 = datas0 udp_datas1 = datas1 mem_write[index] = udp_data index++

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

45

注意 board_specxmlファイルのXML (eXtensible Markup Language) チャネル要素で指定されている各 IO チャネルに固有の io(chan_id) ハンドルを宣言してください

5455 IO チャネルのエミュレーション

io属性で宣言されたチャネルをともなうカーネルをエミュレーションするとIO チャネル入力はファイルからの読み取りによってエミュレーションされチャネル出力はファイルへの書き込みによってエミュレーションされます

エミュレーションを実行する際読み取りまたは書き込みに使用されるファイル名は io属性名と一致します例えば次のようなチャネル宣言をする場合エミュレーションは myIOChannelというファイルに対し読み取りまたは書き込みを行います (どちらか一方のみ)

channel uint chanA __attribute__((io(myIOChannel)))

IO チャネルの方向性は単方向ですチャネルへは読み取りもしくは書き込みのどちらかが可能で両方を行うことはできませんただし同じ io属性値を持つ読み取りチャネルと書き込みチャネルをそれぞれ持つことは可能です

channel uint readChannel __attribute__((io(myIOChannel)))channel uint writeChannel __attribute__((io(myIOChannel)))

IO チャネル読み取りのエミュレーション

読み取りが io属性を持つ myfileというチャネルから発行される場合ディスクの myfileというファイルに読み取りの試みは行われますmyfileが存在しない場合やファイルから読み取るデータが不十分な場合呼び出しタイプによって以下のように動作を行います

Non-blockingread

ファイルが存在しない場合やデータが不十分な場合読み取りの試みが失敗したことを示すメッセージを返します

Blockingread

ファイルが存在しない場合やデータが不十分な場合ディスクにファイルが作成されるかファイルに十分なデータが含まれるまでプログラムをブロックします

IO チャネル書き込みのエミュレーション

書き込みが io属性を持つ myfileというチャネルへ発行される場合ディスクの myfileというファイルに書き込みの試みが行われますmyfileファイルが存在しない場合通常ファイルが作成されそのファイルに書き込みが行われますmyfileが存在する場合はそれに上書きします書き込みが失敗した場合呼び出しタイプによって以下のように動作を行います

Non-blocking write 書き込みの試みが失敗した場合エラーが返されます

Blocking write 書き込みの試みが失敗した場合書き込みの試みがさらに行われます

5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例

カーネルの同時実行はFPGA のチャネルの効率を向上させることができます同時実行を実現するためホストはカーネルを並列して起動します該当する場合カーネルはチャネルを介して互いに通信できます

次に示すモデルは安全かつ効率的な同時実行の活用方法の概要を示しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

46

フィードフォワードのデザインモデル

フィードフォワードのデザインモデルを実装しサイクルを作成せずに 1 つのカーネルから次のカーネルにデータを送信します次のコードを参照ください

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i] = read_channel_intel(c0) dst[2i+1] = read_channel_intel(c1)

producerカーネルはデータをチャネル c0と c1に書き込みますconsumerカーネルはc0とc1からデータを読み取ります下の図は2 つのカーネル間のフィードフォワードのデータフローを表しています

図 -8 フィードフォワードのデータフロー

Producer Consumer

バッファー管理

フィードフォワードのデザインモデルではデータは producerと consumerのカーネル間を一度に1 ワードずつ移動します複数のワードから構成される大きなデータメッセージの転送を容易にするため通信用アプリケーションで一般的に見られるデザインパターンであるピンポンバッファーを実装することができます次の図はカーネルとピンポンバッファー間の通信を表しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

47

図 -9 バッファー管理をともなうフィードフォワードのデザインモデル

Producer Consumer

Manager

Buffer

managerカーネルはproducerカーネルと consumerカーネル間における循環バッファーの割り当ておよび割り当て解除を管理しますconsumerカーネルがデータを処理した後managerはconsumerが解放したメモリー領域を受け取り再度使用するために producerに送信しますmanagerはまた使用されていない位置の初期セット (トークンの初期セット) を producerカーネルに送信しそこに producerがデータを書き込めるようにします

次の図はバッファー管理の際に発生するイベントのシーケンスを表しています

図 -10 バッファー管理時のカーネルの通信

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

(1) (4)(3)(2)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

48

1 Managerカーネルはトークンのセットを producerカーネルに送信しメモリー内のどの領域が現在使用されておらずproducerが利用できるかを示します

2 managerがメモリー領域を割り当てた後producerはピンポンバッファーのその領域にデータを書き込みます

3 producerは書き込み動作完了後consumerカーネルに同期トークンを送信し処理するデータが含まれるメモリー領域を示します次に consumerカーネルはピンポンバッファーの該当領域からデータを読み取ります

注意

producerconsumermanagerカーネルは並行して実行されるためconsumerが読み取り動作を実行している間producerは他の使用されていないメモリー位置へ処理を行うデータを書き込むことができます

4 consumerは読み出し動作が完了後メモリー領域を解放しトークンを managerに送り返します次に managerカーネルはその領域をリサイクルしproducerが使用できるようにします

OpenCL カーネルへのバッファー管理の実装

SDK が適切なバッファー管理を実行するためにはチャネルの読み取りおよび書き込みの順序が重要です次のカーネル例を参照ください

__kernel void producer (__global const uint restrict src __global volatile uint restrict shared_mem const uint iterations) int base_offset for (uint gID = 0 gID lt iterations gID++) Assume each block of memory is 256 words uint lID = 0x0ff amp gID

if (lID == 0) base_offset = read_channel_intel(req)

shared_mem[base_offset + lID] = src[gID]

Make sure all memory operations are committed before sending token to the consumer mem_fence(CLK_GLOBAL_MEM_FENCE | CLK_CHANNEL_MEM_FENCE)

if (lID == 255) write_channel_intel(c base_offset)

このカーネルにおいて以下のコード行は独立しているため インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらを同時に実行するようスケジュールすることができます

shared_mem[base_offset + lID] = src[gID]

および

write_channel_intel(c base_offset)

base_offsetにデータを書き込みbase_offsetをチャネルへ書き込むことはグローバルメモリーへデータを書き込むよりもはるかに早い可能性がありますconsumerカーネルは次にチャネルから base_offsetを読み取りそれをグローバルメモリーから読み取るためのインデックスとして使

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

49

用します同期がなければshared_mem[base_offset + lID] = src[gID]の実行が終了する前にconsumerが producerからデータを読み取る可能性がありますその結果consumerは無効なデータを読み取ることになりますこのシナリオを回避するにはproducerカーネルがデータをメモリーに収納した後に同期トークンが発生しなければなりませんつまりconsumerカーネルはproducerがグローバルメモリーにデータを正常に格納するまでproducerカーネルからデータを消費することはできません

この順序を維持するにはOpenCL mem_fenceトークンをカーネルに含めますmem_fence構造はCLK_GLOBAL_MEM_FENCEと CLK_CHANNEL_MEM_FENCEの 2 つのフラグを持ちますmem_fenceはmem_fence呼び出し前後に発生する動作間に制御フローの依存性を効率的に作成しますCLK_GLOBAL_MEM_FENCEフラグはグローバルメモリー動作が制御フローに従う必要があることを示しますCLK_CHANNEL_MEM_FENCEはチャネル動作が制御フローに従う必要があることを示しますそのためこの例にある write_channel_intel呼び出しはグローバルメモリー動作が共有メモリーバッファーに格納されるまで開始できません

5457 depth 属性を使用するバッファーされたチャネルの実装

カーネルプログラムはバッファーされたチャネルとバッファーされていないチャネルを含むことが可能です チャネルの読み取り動作と書き込み動作が不均衡な場合チャネル宣言に depth属性を含めバッファーされたチャネルを作成しカーネルがストールするのを防ぎますバッファーされたチャネルは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたチャネルはスループットの制限や共有メモリーへのアクセスの同期化といったデータトラフィックの制御に使用することが可能ですバッファーされていないチャネルでは読み取り動作がデータの値を読み取るまで書き込み動作を開始できませんバッファーされたチャネルではデータの値がバッファーにコピーされるまで書き込み動作を開始できませんバッファーがフルの場合は読み取り動作がデータの一部を読み取りそれをチャネルから削除するまで動作を開始することができません

bull チャネルに対する消費率と生産率の一時的な不一致が予想される場合depthチャネル属性を使用しバッファーサイズを設定します

次の例は インテル FPGA SDK for OpenCL のチャネル拡張を実装するカーネルコードでのdepthチャネル属性の使用方法を示していますdepth(N) 属性はバッファーされたチャネルの 小深度を指定しますこの N はデータ値の数を表します

channel int c __attribute__((depth(10)))

__kernel void producer (__global int in_data) for (int i = 0 i lt N i++) if (in_data[i]) write_channel_intel(c in_data[i])

__kernel void consumer (__global int restrict check_data __global int restrict out_data) int last_val = 0

for (int i = 0 i lt N i++) if (check_data[i]) last_val = read_channel_intel(c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

50

out_data[i] = last_val

この例において書き込み動作はブロッキングをすることなく 10 個のデータ値をチャネルに書き込むことができますチャネルがフルになると関連する読み取り動作がチャネルに発生するまで書き込み動作を進めることはできません

チャネルの読み取りと書き込みの呼び出しは条件付きステートメントのためチャネルの読み取りと書き込みの呼び出しが不均衡になる可能性がありますチャネルにバッファー容量を追加することでproducerカーネルと consumerカーネルを確実に分離することができますこの手順はconsumerカーネルがチャネルからデータを読み取っていないときにproducerカーネルがデータを書き込んでいる場合に特に重要です

5458 チャネルの呼び出し順序の強制

チャネルの呼び出し順序を強制するにはカーネルプログラムにメモリーフェンスもしくはバリアー機能を導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンスの前後におけるチャネルアクセスに制御フローの依存性を作るために必要です

計算ユニットを生成する際 インテル FPGA SDK for OpenCL オフラインコンパイラーはそれぞれが独立している命令のすべてに命令レベルの並列性を必ず作成するわけではありませんそのためチャネル読み取りと書き込み動作の間に制御やデータの依存性がない場合でもそれぞれが独立して実行されない場合がありますチャネル呼び出しが相互に通信する際またはチャネルが外部デバイスにデータを書き込む際にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますチャネル c0とc1はバッファーされていないチャネルですc0と c1からのチャネル読み出し動作のスケジュールはc0と c1へのチャネル書き込み動作とは逆の順序で発生する可能性がありますつまりproducerカーネルはまず c0に書き込みますがconsumerカーネルは c1を 初に読み取る場合がありますこのチャネル呼び出しのスケジューリングの変更はconsumerカーネルが空のチャネルから読み取っているためデッドロックを引き起こす可能性があります

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) During compilation the AOC might reorder the way the consumer kernel writes to memory to optimize memory access Therefore c1 might be read before c0 which is the reverse of what appears in code

dst[2i+1] = read_channel_intel(c0) dst[2i] = read_channel_intel(c1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

51

bull デッドロックの発生を防ぐにはカーネルにメモリーフェンス関数 (mem_fence) を含めチャネル呼び出しの順序を強制します

各カーネルのチャネルフラグとともに mem_fence呼び出しを挿入すると書き込みと読み取りのチャネル呼び出しにシーケンシャルな順序付けが適用されます次は変更された producerとconsumerカーネルのコードです

channel uint c0 __attribute__((depth(0)))channel uint c1 __attribute__((depth(0)))

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i+1] = read_channel_intel(c0) mem_fence(CLK_CHANNEL_MEM_FENCE) dst[2i] = read_channel_intel(c1)

この例で producerカーネルの mem_fenceはc0へのチャネル書き込み動作が c1よりも前に発生するようにしています同様に consumerカーネルの mem_fenceはc0のチャネル読み取り動作が c1よりも前に発生するようにしています

54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義

OpenCL Specification version 10 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしチャネルを使用するカーネルは共通グローバルメモリーバッファーおよび同期されたメモリーアクセスを介しデータを共有することができます チャネルに書き込まれたデータがメモリーフェンスが渡された後に読み取りチャネルから確実に見えるようにするためメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull チャネルの同期呼び出しとメモリー動作間の制御フローの依存性を作成するにはCLK_GLOBAL_MEM_FENCEフラグを mem_fenceコールに追加します

__kernel void producer( __global const uint src const uint iterations ) for(int i=0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

52

write_channel_intel(c1 src[2i+1])

このカーネルにおいて mem_fence関数はc0への書き込み動作と src[2i]へのメモリーアクセスがc1への書き込み動作と src[2i+1]へのメモリーアクセスよりも先に実行されるようにしていますこれによりデータが c1に書き込まれる前にc0に書き込まれたデータが読み取りチャネルから見えるようになります

55 OpenCL パイプの実装

インテル FPGA SDK for OpenCL はOpenCL パイプ機能に対する暫定サポートを提供しますOpenCL パイプは OpenCL Specification version 20 の一部であり高効率かつ低レイテンシーなカーネルへのデータの受け渡しおよびカーネルの同期を可能にするメカニズムを提供します

OpenCL カーネルが他の SDK と互換性があることが重要な場合にパイプを実装してください

OpenCL C プログラミング言語の仕様およびパイプに関する概要についてはOpenCLSpecification version 20 を参照ください

インテル FPGA SDK for OpenCL のパイプの実装はパイプの仕様全体を網羅するものではありませんそのためOpenCL Specification version 20 に完全には準拠していませんSDK のパイプ実装の目的はOpenCL 20 に準拠する異なるデバイスにおいて一貫して機能するソリューションを提供することです インテル FPGA 製品に向けてパイプを有効にするにはご自身のデザインが特定の追加要件を満たしている必要があります

関連情報OpenCL Specification version 20 (API)

551 OpenCL パイプ機能の概要

OpenCL パイプはカーネルが FIFO バッファーを介し互いに直接通信できるようにします

図 -11 パイプネットワーク実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Pipe

Host Processor

Initialize ( )

IO Pipe

FIFO

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

53

パイプを実装するとカーネルの実行がホストプロセッサーから切り離されます インテル FPGA SDKfor OpenCL パイプサポートの基本はSDK のチャネル拡張ですただしパイプの関数の構文はチャネルの構文とは異なります

重要 チャネルとは異なりパイプのデフォルトの動作はノンブロッキングです

ブロッキングおよびノンブロッキング機能に関してはチャネルに関する次の章をそれぞれ参照ください

関連情報bull ブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ)

bull ブロッキングのチャネル読み取りの実装 (43 ページ)

552 パイプデータの動作

パイプに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りパイプに残りますつまりパイプに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり維持されますただしFPGA の再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたってデータが維持されることはありません

次のコードを例に示します

__kernel void producer (write_only pipe uint __attribute__((blocking)) c0) for (uint i = 0 i lt 10 i++) write_pipe (c0 ampi)

__kernel void consumer (__global uint restrict dst read_only pipe uint __attribute__((blocking)) __attribute__((depth(10))) c0) for (int i = 0 i lt 5 i++) read_pipe (c0 ampdst[i])

パイプへの読み取り操作では 初 にパイプに書き込まれたデータがまず読み出されますパイプデータはパイプ内の FIFO の順序を維持します

図 -12 パイプにおけるデータ FIFO の順序

9 012345678Producer Consumer

カーネル producerは10 個の要素 ([0 9]) をパイプに書き込みますカーネル consumerはNDRange の呼び出しごとにパイプから 5 個の要素を読み出します 初の呼び出しにおいてカーネル consumerは0 から 4 の値をパイプから読み出しますデータは NDRange 呼び出しにわたり維持されるため2 回目のカーネル consumer実行時には5 から 9 の値が読み出されます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

54

この例の場合デッドロックの発生を防ぐためカーネル producerの 1 回の呼び出しに対しカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとパイプ容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回を超えるとパイプ内のデータが不足するため consumerがストールします

553 パイプにおける複数のワークアイテムの順序付け

OpenCL Secification はワークアイテムの順序付けを定義していません インテル FPGA SDK forOpenCL はパイプの読み取りおよび書き込み動作の一貫性を維持するためワークアイテムの順序を強制します

複数のワークアイテムによるパイプへのアクセスはいくつかのシナリオでは有効です例えばパイプのデータワードが独立している場合やパイプが制御ロジックに向け実装されている場合に効果があります複数のワークアイテムがパイプにアクセスにする際に も注意しなければならないのはカーネルがデータをパイプへ書き込みパイプからデータを読み出す順序ですOpenCL パイプは可能な限りワークアイテムのパイプへの読み書き動作を決定論的な順序で処理しますそのため読み出し動作と書き込み動作はカーネル呼び出し間において一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK はパイプ呼び出しがワークアイテムに対し不変であることを次の点に基づき確認します

bull カーネルを通るすべてのパスがパイプ呼び出しを実行しているか

bull 上の要件が満たされない場合パイプ呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

SDK は複数のワークアイテムのパイプへのアクセスにおいて決定論的な順序を保証できない場合パイプが非決定論的な実行をともない適切な順序に定義されない可能性があることを警告しますSDKは通常パイプ呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合に決定的な順序付けを行うことができません

__kernel voidordering (__global int check global int data write_only pipe int __attribute__((blocking)) req) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_pipe (req ampdata[i]) else process(data)

5531 パイプにおけるワークアイテムのシリアル実行

ワークアイテムのシリアル実行とはワークアイテムのシーケンシャル ID が計算ユニットにおける実行順序を決定する順序付けられた実行動作のことです

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

55

カーネルにパイプを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は 大 1 つのインフライトのワークグループを保有しているのと同等であるということを強制しますオフラインコンパイラーはまたカーネルがワークアイテムのシリアル実行でパイプを実行するよう保証しますここでカーネルは小さな ID を有するワークアイテムをまず実行しますワークアイテムは(xyzgroup)の識別子を持ちxyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

次のいずれかの条件が当てはまる場合ワークアイテム ID (x0y0z0group0) はID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1z0 lt z1の場合

bull group0 = group1z0 = z1y0 lt y1の場合

bull group0 = group1z0 = z1y0 = y1x0 lt x1の場合

インクリメンタル ID を持つワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) を持つワークアイテムは書き込みチャネル呼び出しを 初に実行します次にID(x1y0z0group0) を持つワークアイテムが呼び出しを実行しますこの順序を定義することでシステムを外部モデルと検証することが可能になります

複数のワークアイテムを持つループでのパイプの実行

次に示すように複数のワークアイテムを持つループの本体にパイプが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data write_only pipe int __attribute__((blocking)) req) write_pipe (req ampdata[get_global_id(0)])

554 OpenCL のパイプ実装における制約

OpenCL アプリケーションへのパイプの実装においては一定のデザイン上の制約があります

デフォルト動作

デフォルトではパイプはノンブロッキング動作を行いますカーネルのパイプにブロッキング動作をさせる場合は読み取りパイプおよび書き込みパイプを宣言する際にブロッキング属性(__attribute__((blocking))) を指定してください

エミュレーションのサポート

インテル FPGA SDK for OpenCL Emulator はパイプを含むカーネルのエミュレーションをサポートしていますエミュレーターのサポート範囲はFPGA ハードウェアに実装される OpenCL パイプサポートのサブセットと一致します

パイプ API のサポート

現在 SDK のパイプの実装はOpenCL Specification version 20 の組み込みパイプ関数のすべてをサポートしているわけではありませんパイプ API におけるサポートの有無についてはOpenCL 20C プログラミング言語のパイプにおける制約の一覧を参照ください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

56

シングルコールサイト

パイプの読み取りおよび書き込み動作は決定論的に機能しないためカーネルにはパイプ ID ごとに 1つの呼び出しサイトしか割り当ることができません例えば インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコード例をコンパイルすることができません

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe1 ampin_data3)

pipe1への 2 回目の read_pipe呼び出しはpipe1への 2 つ目の呼び出しサイトを作成するためコンパイルは失敗します

特定のパイプから複数のデータを収集するには以下に示すようにパイプを複数のパイプに分割します

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe3 ampin_data3)

1 つのパイプ ID に対し 1 つの呼び出しサイトしか割り当てることができないためパイプを含むループを展開することはできません次のコードを参照ください

pragma unroll 4for (int i = 0 i lt 4 i++) read_pipe (pipe1 ampin_data1)

オフラインコンパイラーはコンパイル中に次の警告メッセージを発行します

Compiler Warning Unroll is required but the loop cannot beunrolled

フィードバックパイプとフィードフォワードパイプ

カーネルのパイプはread_onlyまたは write_onlyのどちらかです同じパイプを読み書きするカーネルのパフォーマンスは低下します

カーネルのベクトル化に対するサポート

パイプを使用するカーネルをベクトル化することはできませんつまりカーネルコードにnum_simd_work_itemsのカーネル属性を含めることはできませんパイプを使用するカーネルをベクトル化すると複数のパイプマスターが作成され調停が必要になりますこれは OpenCL パイプの仕様ではサポートされていません

read_pipe と write_pipe 呼び出しにおける命令レベルの並列性

read_pipeと write_pipe呼び出し間にデータの依存性がない場合オフラインコンパイラーはこれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこのread_pipeと write_pipe呼び出しをOpenCL のカーネルコードで表現されているシーケンスに従わない順序で実行する可能性があります

次のコードのシーケンスを例に示します

in_data1 = read_pipe(pipe1)in_data2 = read_pipe(pipe2)in_data3 = read_pipe(pipe3)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

57

read_pipe呼び出し間にデータの依存性がないためオフラインコンパイラーは任意の順序でそれらを実行することができます

関連情報OpenCL 20 C プログラミング言語のパイプにおける制約 (188 ページ)

555 カーネルに向けた OpenCL パイプの有効化

パイプを実装するにはご自身の OpenCL カーネルを変更しパイプ固有の API 呼び出しを含めてください

パイプ宣言は特定の OpenCL カーネルプログラムに固有のものですまたパイプのインスタンスはOpenCL カーネルのプログラムとデバイスのペアごとに一意のものですランタイムに単一の OpenCLカーネルプログラムを複数のデバイスにロードすると各デバイスは各パイプのコピーを 1 つ持つようになりますただしこれらのパイプのコピーは独立しておりデバイス間でデータを共有しません

5551 他の OpenCL SDK との互換性の確保

インテルによる OpenCL パイプの実装は現在OpenCL Specification version 20 に部分的に準拠しています 他の OpenCL SDK からのパイプを実装するカーネルを インテル FPGA SDK forOpenCL にポートする場合はホストコードとカーネルコードを変更する必要がありますこの変更はこのアプリケーションの他の OpenCL SDK に対する移植性に影響しません

ホストコードの変更

以下は変更されたホストアプリケーションの例です

include ltstdiohgtinclude ltstdlibhgtinclude ltstringhgtinclude CLopenclhdefine SIZE 1000

const char kernel_source = __kernel void pipe_writer(__global int in write_only pipe int p_in)n n int gid = get_global_id(0)n write_pipe(p_in ampin[gid])n n __kernel void pipe_reader(__global int out read_only pipe int p_out)n n int gid = get_global_id(0)n read_pipe(p_out ampout[gid])n n

int main() int input = (int )malloc(sizeof(int) SIZE) int output = (int )malloc(sizeof(int) SIZE) memset(output 0 sizeof(int) SIZE) for (int i = 0 i = SIZE ++i) input[i] = rand()

cl_int status cl_platform_id platform cl_uint num_platforms status = clGetPlatformIDs(1 ampplatform ampnum_platforms)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

58

cl_device_id device cl_uint num_devices status = clGetDeviceIDs(platform CL_DEVICE_TYPE_ALL 1 ampdevice ampnum_devices)

cl_context context = clCreateContext(0 1 ampdevice NULL NULL ampstatus)

cl_command_queue queue = clCreateCommandQueue(context device 0 ampstatus)

size_t len = strlen(kernel_source) cl_program program = clCreateProgramWithSource(context 1 (const char )ampkernel_source amplen ampstatus)

status = clBuildProgram(program num_devices ampdevice NULL NULL)

cl_kernel pipe_writer = clCreateKernel(program pipe_writer ampstatus) cl_kernel pipe_reader = clCreateKernel(program pipe_reader ampstatus)

cl_mem in_buffer = clCreateBuffer(context CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR sizeof(int) SIZE input ampstatus) cl_mem out_buffer = clCreateBuffer(context CL_MEM_WRITE_ONLY sizeof(int) SIZE NULL ampstatus)

cl_mem pipe = clCreatePipe(context 0 sizeof(cl_int) SIZE NULL ampstatus)

status = clSetKernelArg(pipe_writer 0 sizeof(cl_mem) ampin_buffer) status = clSetKernelArg(pipe_writer 1 sizeof(cl_mem) amppipe) status = clSetKernelArg(pipe_reader 0 sizeof(cl_mem) ampout_buffer) status = clSetKernelArg(pipe_reader 1 sizeof(cl_mem) amppipe)

size_t size = SIZE cl_event sync status = clEnqueueNDRangeKernel(queue pipe_writer 1 NULL ampsize ampsize 0 NULL ampsync) status = clEnqueueNDRangeKernel(queue pipe_reader 1 NULL ampsize ampsize 1 ampsync NULL) status = clFinish(queue)

status = clEnqueueReadBuffer(queue out_buffer CL_TRUE 0 sizeof(int) SIZE

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

59

output 0 NULL NULL)

int golden = 0 result = 0 for (int i = 0 i = SIZE ++i) golden += input[i] result += output[i]

int ret = 0 if (golden = result) printf(FAILED) ret = 1 else printf(PASSED) printf(n)

return ret

カーネルコードの変更

カーネルコードがOpenCL Specification version 20 に準拠する OpenCL SDK で実行される場合 インテル FPGA SDK for OpenCL で実行する前にこのコードを変更する必要があります次のようにカーネルコードを変更してください

bull パイプ引数の名前が両方のカーネルにおいて同一になるように変更します例えばp_inとp_outを pに変更します

bull パイプ引数に depth属性を指定しますホストで保持するためにパイプが作成する 大パケット数に等しい値をdepth属性に割り当てます

bull インテル FPGA SDK for OpenCL にはオフラインコンパイラーがあるためオフラインコンパイルモードでカーネルプログラムを実行します

変更後のカーネルコードは次のようになります

define SIZE 1000

__kernel void pipe_writer(__global int in write_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) write_pipe(p ampin[gid])

__kernel void pipe_reader(__global int out read_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) read_pipe(p ampout[gid])

5552 パイプハンドルの宣言

pipe変数を使用しカーネル間またはカーネルと IO 間の静的なパイプ接続を定義します

パイプの読み書きを行うにあたりカーネルはパイプ変数を対応する各 API 呼び出しに渡す必要があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

60

bull 以下の規則に従いパイプハンドルをファイルスコープ変数としてカーネルのソースコードに宣言します ltaccess qualifiergt pipe lttypegt ltvariable_namegt

パイプの lttypegt はスカラーサイズが 1024 ビット以下の任意の OpenCL 組み込みスカラーまたはベクトルデータ型にすることができますまたスカラーサイズで 1024 ビット以下のスカラーまたはベクトルデータ型で構成される任意のユーザー定義の型にすることも可能です

次のパイプハンドル宣言を参照ください

__kernel void first (pipe int c)

__kernel void second (write_only pipe int c)

初の例ではint型の読み出し専用パイプハンドルをカーネル firstで宣言しています2 番目の例では書き込み専用パイプをカーネル secondで宣言していますカーネル firstはパイプ cからの読み取りのみを行うことができカーネル secondはパイプ cへの書き込みのみを行うことができます

重要

インテル FPGA SDK for OpenCL オフラインコンパイラーではパイプ引数の名前を一致させることでシステム内のパイプの接続性を静的に推測します上記例においてカーネルfirstはカーネル secondにパイプ cで接続しています

インテル OpenCL システムでは1 つのカーネルのみがパイプを読み取ることができます同様に1 つのカーネルのみがパイプに書き込むことができますIO 以外のパイプに対応する読み取り動作と書き込み動作が少なくとも 1 つずつない場合オフラインコンパイラーはエラーを発行します

インテル FPGA SDK for OpenCL IO パイプの実装についてはio 属性を使用した IO パイプの実装を参照してください

関連情報io 属性を使用した IO パイプの実装 (64 ページ)

5553 パイプ書き込みの実装

write_pipe API 呼び出しはパイプを介したデータ送信を可能にします

インテルではwrite_pipe関数の簡易版のみをサポートしていますデフォルトで write_pipe呼び出しはノンブロッキングです受信するパケットを収容する容量がパイプにある場合にのみパイプ書き込み動作は成功します

bull パイプ書き込みを実装するには次の write_pipe関数シグネチャーを含めます

int write_pipe (write_only pipe lttypegt pipe_id const lttypegtdata)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応する読み出しパイプ(read_pipe) の pipe_idと一致する必要があります

dataはパイプ書き込み動作がパイプに書き込むデータですこれはパイプのパケットタイプへのポインターになりますパイプへの書き込みはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はパイプのデータ幅を定義します戻り値はパイプ書き込み動作が成功したかどうかを示します成功した場合の戻り値は 0 となりパイプの書き込みが失敗した場合の戻り値は-1 です

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

61

以下はwrite_pipe API 呼び出しの実装を表すコード例です

Declares the writable nonblocking pipe p which contains packets of type int__kernel void kernel_write_pipe (__global const long src write_only pipe int p) for (int i = 0 i lt N i++) Performs the actual writing Emulates blocking behavior via the use of a while loop while (write_pipe(p ampsrc[i]) lt 0)

blocking 属性を指定する場合whileループは不要ですより良いハードウェアの実装を実現するためにインテルではカーネルのパイプ引数宣言にブロッキング属性(__attribute__((blocking))) を指定することでブロッキングの write_pipe呼び出し機能を提供しますブロッキングの write_pipe呼び出しは必ず成功を返します

注意 write_pipe API 呼び出しを使用しブロッキングの書き込みパイプを介しデータを送信する際はパイプがフル (FIFO バッファーがデータでフル) の場合はカーネルがストールすることに注意してください インテル FPGA Dynamic Profiler for OpenCL を使用しパイプのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

5554 パイプ読み出しの実装

read_pipe API 呼び出しはパイプを介したデータ受信を可能にします

インテルではread_pipe関数の簡易版のみをサポートしていますread_pipe呼び出しはデフォルトではノンブロッキングです

bull パイプ読み出しを実装するには次の read_pipe関数シグネチャーを含めます

int read_pipe (read_only_pipe lttypegt pipe_id lttypegt data)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応するパイプ書き込み動作(write_pipe) の pipe_idと一致する必要があります

dataはパイプ読み出し動作がパイプから読み取るデータですこれはデータ位置へのポインターになりますread_pipe呼び出しはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はデータのパケットサイズを定義します

以下はread_pipe API 呼び出しの実装を表すコード例です

Declares the read_only_pipe that contains packetsof type longDeclares that read_pipe calls within the kernel will exhibitblocking behavior__kernel void kernel_read_pipe(__global long dst read_only pipe long __attribute__((blocking)) p) for (int i = 0 i lt N i++) Reads from a long from the pipe and stores it

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

62

into global memory at the specified location read_pipe(p ampdst[i])

より良いハードウェア実装を実現するためにインテルではカーネルのパイプ引数宣言にプロッキング属性 (__attribute__((blocking))) を指定することでブロッキングの read_pipe呼び出し機能を提供しますブロッキングの read_pipe呼び出しは必ず成功が返されます

注意 パイプが空 (FIFO バッファーが空) の場合read_pipe API 呼び出しでブロッキングの読み出しパイプを介したデータ受信はできませんこれを行うとカーネルがストールします

5555 depth 属性を使用するバッファーされたパイプの実装

カーネルプログラムにはバッファーされたパイプとバッファーされていないパイプを含むことができます パイプの読み出し動作と書き込み動作が不均衡な場合はパイプ宣言に depth属性を含めることでバッファーされたパイプを作成しカーネルのストールを防ぎますバッファーされたパイプは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたパイプを使用しスループットの制限や共有メモリーのアクセスの同期化といったデータのトラフィックを制御できますバッファーされていないパイプにおいて書き込み動作は読み出し動作がデータの読み取りをしようとしている場合にのみ開始できますバッファーされていないパイプは並行して実行されるカーネルでのブロッキングの読み書き動作と組み合わせて使用してくださいバッファーされていないパイプは自己同期型のデータ転送を効率的に提供します

バッファーされたパイプにおいて書き込み動作は受信するパケットを収容する容量がパイプにある場合にのみ進めることが可能です読み出し動作は少なくとも 1 つのパケットがパイプになければ実行することができません

パイプ呼び出しが書き込みカーネルと読み出しカーネルで異なって表されている場合にバッファーされたパイプを使用するとカーネルは並行して実行されません

bull パイプに対する消費率と生産率の一時的な不一致が予想される場合はdepth属性を使用しバッファーサイズを設定します

次の例はOpenCL パイプを実装するカーネルコードにおける depth属性の使用方法を示していますdepth(N)属性はバッファーされたパイプの 小深度を指定しますこの N はデータ値の数です読み出しカーネルと書き込みカーネルが特定のバッファーされたパイプに異なる深度を指定する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーは 2 つの深度のうち大きい深度を使用します

__kernel voidproducer (__global int in_data write_only pipe int __attribute__((blocking)) __attribute__((depth(10))) c) for (i = 0 i lt N i++) if (in_data[i]) write_pipe( c ampin_data[i] )

__kernel voidconsumer (__global int check_data __global int out_data read_only pipe int __attribute__((blocking)) c ) int last_val = 0

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

63

for (i = 0 i lt N i++) if (check_data[i]) read_pipe( c amplast_val ) out_data[i] = last_val

この例において書き込み動作は10 個のデータ値をパイプに正常に書き込むことができますパイプがフルの状態になると書き込みカーネルは読み出しカーネルがパイプのデータの一部を消費するまで失敗を返します

パイプの読み出しと書き込みの呼び出しは条件付きステートメントのためパイプの読み出しおよび書き込みの呼び出しには不均衡が発生する可能性がありますパイプにバッファー容量を追加するとproducerと consumerカーネルを切り離すことができますこの方法はconsumerカーネルがパイプからデータを読み取っていない際にproducerカーネルがパイプにデータを書き込んでいる場合に特に重要です 

5556 io 属性を使用した IO パイプの実装

OpenCL パイプ宣言に io属性を含めFPGA ボードの入力または出力フィーチャーと接続する特別なIO パイプを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

インテル FPGA SDK for OpenCL チャネル拡張の io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますchan_id 引数はカスタムプラットフォームの board_specxmlファイルにある IO インターフェイスの名前です同じ IO フィーチャーを使用しIO パイプを識別することができます

ペリフェラルインターフェイスの使用法は各デバイスのタイプによって異なる可能性があるためIO パイプをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいOpenCL カーネルのコードはペリフェラルインターフェイスが生成するデータの型と互換性がなければなりません外部 IO パイプとカーネルのバイトの順序が異なる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはバイトの順序を入出時にシームレスに変換します

注意 bull ボードに直接接続しておりIO パイプを介してペリフェラルデバイスと通信するパイプには暗黙的なデータの依存性が存在する可能性がありますオフラインコンパイラーはそれらの依存関係を認識できないためこの暗黙的なデータの依存性はコンパイルの問題を引き起こす可能性があります

bull 同一のペリフェラルと通信する外部 IO パイプはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを確認しFPGA ボードで使用可能な入力および出力フィーチャーを特定ください

例えばboard_specxmlファイルにはIO フィーチャーに関する次のような情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256 chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

64

chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのパイプで使用されるデータの型の幅をビット単位で指定します上記例の場合uintと floatのデータ型はどちらも 32 ビット幅ですその他のより大きなデータ型やベクトル化されたデータ型はboard_specxmlファイルで指定されている適切なビット幅に一致している必要があります

2 次のコード例で示されているように io属性を実装しますio属性名はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) に一致しなければなりません

__kernel void test (pipe uint pkt __attribute__((io(ldquoenetrdquo))) pipe float data __attribute__((io(ldquopcierdquo))))

注意 board_specxmlファイル内のチャネルの XML 要素で指定されている各 IO パイプに固有の io(chan_id) ハンドルを宣言してください

5557 パイプ呼び出し順序の強制

パイプの呼び出し順序を強制するにはメモリーフェンスもしくはバリアー機能をカーネルプログラムに導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンス前後におけるパイプの同期呼び出し間に制御フローの依存性を作成するために必要です

インテル FPGA SDK for OpenCL オフラインコンパイラーが計算ユニットを生成する際それぞれが独立している命令のすべてに対し命令レベルの並列性を構築するわけではありませんそのためパイプの読み出しおよび書き込み動作はそれらに制御やデータの依存性がない場合でも互いに独立して実行されない可能性がありますパイプ呼び出しが相互に通信する場合やパイプが外部デバイスにデータを書き込む場合にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますパイプ c0と c1はバッファーされていないパイプですc0と c1からのパイプ読み出し動作のスケジュールはc0とc1へのパイプ書き込み動作と逆の順序になる可能性がありますつまりproducerカーネルが 初に c0に書き込む一方でconsumerカーネルは c1から読み出す可能性があるということですconsumerカーネルが空のパイプから読み出しているためこのパイプ呼び出しにおけるスケジューリングの変更はデッドロックを発生させる可能性があります

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe (c0 ampsrc[2i ]) write_pipe (c1 ampsrc[2i+1])

__kernel void consumer (__global uint restrict dst const uint iterations read_only pipe uint __attribute__((blocking)) c0 read_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) read_pipe (c0 ampdst[2i+1]) read_pipe( c1 ampdst[2i])

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

65

bull パイプ呼び出しの順序を強制しデッドロックが発生しないようにするにはメモリーフェンス関数(mem_fence) をカーネルに含めます

各カーネルのパイプフラグとともに mem_fence呼び出しを挿入すると書き込みおよび読み出しのパイプ呼び出しにシーケンシャルな順序付けが適用されます次に変更後の producerとconsumerカーネルコードを示します

__kernel void producer (__global const uint src const uint iterations write_only_pipe uint __attribute__((blocking)) c0 write_only_pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_pipe(c1 ampsrc[2i+1])

__kernel void consumer (__global uint dst const uint iterations read_only_pipe uint __attribute__((blocking)) c0 read_only_pipe uint __attribute__((blocking)) c1) for(int i = 0 i lt iterations i++) read_pipe(c0 ampdst[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) read_pipe(c1 ampdst[2i+1])

この例ではproducerカーネルの mem_fenceはc0へのパイプ書き込み動作が c1より先に発生するようにしています同様に consumerカーネルの mem_fenceはc0からの読み取り動作が c1より先に行われるようにしています 

55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義

OpenCL Specification version 20 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしパイプを使用するカーネルは共通のグローバルメモリーバッファーと同期化されたメモリーアクセスを介しデータを共有できます メモリーフェンスが渡された後にパイプに書き込まれたデータが読み出しパイプから確実に見えるようにするにはメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull パイプの同期呼び出しとメモリー動作における制御フローの依存性を作成するにはmem_fence呼び出しに CLK_GLOBAL_MEM_FENCEフラグを追加します

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

66

write_pipe(c1 ampsrc[2i+1])

このカーネルで mem_fence関数はc0への書き込み動作と src[2i] へのメモリーアクセスがc1への書き込み動作と src[2i+1] へのメモリーアクセスの前に必ず実行されるようにしていますこれによりc0に書き込まれたデータはc1にデータが書き込まれる前に読み出しパイプから見えるようになります 

556 ホストパイプを介したカーネルとの直接通信

cl_intel_fpga_host_pipe拡張機能はカーネルとホストプログラムにおいてポイントとポイントのパイプ通信を可能にしますこの拡張を行わない場合OpenCL 内のパイプはカーネル間の通信にのみ使用することができホストプログラムとの直接通信に使用することはできません

この拡張機能はclCreatePipeの flags引数に 2 つの新しい値を認証しパイプホストをアクセス可能にしますまた4 つの新しい API 関数を追加し (clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGA)ホストのアクセスを有効にすることで作成したパイプをホストが読み書きできるようにします新しいカーネル引数属性のオプションが追加されカーネル言語においてパイプカーネル引数の反対側の端をホストプログラムに指定することでパイプが別のカーネルに接続されなくなりますカーネルの定義においてパイプカーネル引数はホストパイプまたは他のカーネルのどちらかへの接続に限定されておりランタイムにこの 2 つを動的に切り替えることはできません

パイプカーネル引数にホストアクセス可能のマークが付けられている場合カーネル言語のパイプアクセサーは2x 関数のサブセットに制限され (予約はサポートされていません)メモリーの一貫性または可視性の保証はOpenCL 同期ポイントを超えて行われます

ホストがアクセス可能なパイプのサポートはcl_intel_fpga_host_pipeと公示されているデバイスプロパティーです

注意 bull このホストパイプの実装における制限はプラットフォームが 2 つのホストパイプしかサポートしていないことです1 つは読み出し用もう一つは書き出し用ですさらにコパイラーは 32 ビット幅のパイプのみを許容しますよって cl_intel_fpga_host_pipe拡張機能の使用例の章でulong4が使用されています

bull cl_intel_fpga_host_pipe拡張を使用しているホストプログラムはOpenCL 20 の機能のサポート状況 (187 ページ) に記されているようにCLcl_ext_intelfpgahヘッダーファイルを含みOpenCL 20 のサポートを有効にする必要があります

関連情報cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

5561 intel_host_accessible カーネル引数属性オプション

cl_intel_fpga_host_pipe拡張機能によりオプションの intel_host_accessibleカーネル引数属性が追加されますこの属性をカーネルパイプ引数に適用することでホストはカーネルパイプ引数をホストがアクセス可能なパイプに接続し他のカーネルパイプ引数に接続しないことを指定します

__attribute__((intel_host_accessible))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

67

5562 ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数

clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGAのホスト API 関数を追加するとホストプログラムはホストがアクセス可能なパイプカーネル引数に (clSetKernelArg引数を使用し) バインドされたcl_memパイプオブジェクトに読み書きできるようになります

bull clReadPipeIntelFPGAおよび clWritePipeIntelFPGA関数はパイプ幅のシングルワードで動作します

bull clMapHostPipeIntelFPGA関数はホストパイプで多数のワードの読み取りまたは書き込みを実行する際のレイテンシーとオーバーヘッドを低減する高度なメカニズムです

bull clUnmapHostPipeIntelFPGA関数を使用するとホストプログラムは先にclMapHostPipeIntelFPGA関数呼び出しが作成したマップ領域の一部または全体に書き込みもしくは読み出しを行ったことを OpenCL ランタイムに通知することができるようになります

表 1 バインドされた cl_mem オブジェクトの API 関数

関数 説明

cl_int clReadPipeIntelFPGA (cl_mem pipe gentype ptr)

以下の特性を持つパイプからデータパケットを読み取ります1 CL_MEM_HOST_READ_ONLYフラグで作成されている2 write_only定義と intel_host_accessibleカーネル

引数属性を持つカーネル引数にバインドされている各 clReadPipeIntelFPGA関数呼び出しは1 パケットをパイプから読み取ります動作はノンブロッキングでありデータがパイプ内で正常に読み取れるようになるまで待機しません

cl_int clWritePipeIntelFPGA (cl_mem pipe gentype ptr)

次の特性を持つパイプにデータパケットを書き込みます1 CL_MEM_HOST_WRITE_ONLYフラグを使用し作成されている2 read_only定義と intel_host_accessible引数属性を

持つカーネル引数にバインドされている各 clWritePipeIntelFPGA関数呼び出しは1 パケットをパイプに書き込みます動作はノンブロッキングであり正常に書き込める容量がパイプにできるまで待機しません返されるステータスのCL_SUCCESSはカーネルの読み取りにデータが利用可能なことを意味するわけではありませんホストパイプに以前にマップされたバッファーのマップが解除されるとデータは 終的にカーネルの読み取りに利用可能になります

void clMapHostPipeIntelFPGA (cl_mem pipe cl_map_flags map_flags size_t requested_size size_t mapped_size cl_int errcode_ret)

ホストアドレス空間にvoid を返しますCL_MEM_HOST_WRITE_ONLYフラグで作成されている場合パイプはこのアドレス空間にデータを書き込むことができますまたCL_MEM_HOST_READ_ONLYフラグで作成されている場合パイプはこのアドレス空間からデータを読み取ることができますmapped_size引数はメモリーのランタイムによって決定するホストがアクセス可能な 大バイト数を指定しますmapped_size で指定される値は呼び出し側が指定する requested_size引数以下の値になります返された void に対する読み出しまたは書き込み後ホストは 1 回以上の clUnmapHostPipeIntelFPGA関数呼び出しを実行しデバイスに転送するデータが準備できていること (書き込み時) およびメモリーを再利用できること (読み込みおよび書き込みに時) をランタイムに通知する必要があります前回のclMapHostPipeIntelFPGA関数呼び出しでマッピングされたメモリーをclUnmapHostPipeIntelFPGA関数が解除する前に新

continued

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

68

関数 説明

たに clMapHostPipeIntelFPGA関数が呼び出された場合2 回目の clMapHostPipeIntelFPGA関数呼び出しで返されるバッファーは 初の呼び出しで返されたバッファーと重複しません

cl_int clUnmapHostPipeIntelFPGA ( cl_mem pipe void mapped_ptr size_t size_to_unmap size_t unmapped_size )

clMapHostPipeIntelFPGA関数によって返されたホストがアドレス指定可能なバッファーの size_to_unmapバイトをホストがすでに使用していないことをランライムに通知します書き込み可能なホストパイプの場合clUnmapHostPipeIntelFPGAを呼び出すとマッピングが解除されたデータをカーネルが利用できるようになりますsize_to_unmapの値が clMapHostPipeIntelFPGA関数で指定された mapped_sizeの値より小さい場合clUnmapHostPipeIntelFPGA関数を複数回呼び出しバッファー全容量のマッピングを解除する必要がありますclUnmapHostPipeIntelFPGA関数呼び出しを複数回含めclMapHostPipeIntelFPGA関数呼び出しで返されたバッファーの一連のバイトのマッピングをclMapHostPipeIntelFPGA呼び出しで定義された mapped_sizeの値まで解除することができます

5563 ホストがアクセス可能なパイプの作成

OpenCL 22 API Specification の Section 541 で定義されている clCreatePipe関数はflagsパラメーターを含んでいますclCreatePipe関数の flagsの有効値はCL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSです flagsへ渡された値が 0 の場合このフラグはどちらも暗黙的にデフォルトとして渡されると Specification は定義しています

ホストのパイプへのアクセス (読み取りまたは書き込み) を有効にするためcl_intel_fpga_host_pipe拡張機能は次の 2 つの flags値を clCreatePipeに対し正当なものにします

bull CL_MEM_HOST_READ_ONLY

bull CL_MEM_HOST_WRITE_ONLY

この flagsのうち 1 つが clCreatePipe関数に渡されると対応する cl_memオブジェクトは初の引数として clReadPipeIntelFPGAと clWritePipeIntelFPGA関数に渡されます

cl_intel_fpga_host_pipe拡張の残りの部分においてこのようなパイプはホストパイプとして表されます

警告 CL_MEM_HOST_READ_ONLYと CL_MEM_HOST_WRITE_ONLYを同じパイプに指定することまたはこのどちらかの値を CL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSのどちらかもしくは両方と混在させることは不当です無効な flagsの組み合わせは OpenCL ランタイムに検出されclCreatePipeがCL_INVALID_VALUEエラーを返す原因になります

5564 cl_intel_fpga_host_pipe 拡張機能の使用例

以下はcl_intel_fpga_host_pipe拡張のカーネルとホストコードの例です

カーネルコード

pragma OPENCL EXTENSION cl_intel_fpga_host_pipe enable

kernel void reader(__attribute__((intel_host_accessible)) __read_only pipe ulong4 host_in) ulong4 val if (read_pipe(host_in ampval))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

69

kernel void writer(__attribute__((intel_host_accessible)) __write_only pipe ulong4 device_out) ulong4 val if (write_pipe(device_out ampval))

ホストコード

cl_kernel read_kern = clCreateKernel(program reader NULL)

cl_kernel write_kern = clCreateKernel(program writer NULL)

cl_mem read_pipe = clCreatePipe(context CL_MEM_HOST_READ_ONLY sizeof( cl_ulong4 ) 128 Number of packets that can be buffered NULL amperror)

cl_mem write_pipe = clCreatePipe(context CL_MEM_HOST_WRITE_ONLY sizeof( cl_ulong4 ) 64 Number of packets that can be buffered NULL amperror)

Bind pipes to kernelsclSetKernelArg(read_kern 0 sizeof(cl_mem) (void )ampwrite_pipe)clSetKernelArg(write_kern 0 sizeof(cl_mem) (void )ampread_pipe)

Enqueue kernels

cl_ulong4 valif (clReadPipeIntelFPGA (read_pipe ampval)) cl_int result = clWritePipeIntelFPGA (write_pipe ampval) Check write successfailure and handle

56 任意精度での整数の実装

インテル FPGA SDK for OpenCL の任意精度での整数拡張を使用しカスタムビット幅で整数を定義します整数のカスタムビット幅は 大 64 ビットまで定義できます

任意精度の整数拡張機能を使用するにはカーネルコードのヘッダーファイルのリストに次の行を含めます

include ihc_apinth

ihc_apinthヘッダーファイルを含むカーネルをコンパイルする際は-I$INTELFPGAOCLSDKROOTincludekernel_headersオプションを aocコマンドとともに含める必要があります以下に例を示します

aoc ltother command optionsgt -I $INTELFPGAOCLSDKROOTincludekernel_headers ltmy_kernel_filegt

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

70

ヘッダーは任意精度の整数拡張を有効にし符号付きおよび符号なしの任意精度の整数に対する C スタイル宣言を定義するマクロを次のように備えています

define ap_intltdgt intd_tdefine ap_uintltdgt uintd_t

例えば 10 ビットの符号付きおよび符号なしの任意精度の整数は次のように宣言できます

int10_t x_signeduint10_t x_unsigned

任意精度の整数は 大 64 ビット幅まで宣言することが可能です

ヘッダーファイルを使用せずに整数を任意の精度で利用するには次のプラグマディレクティブで拡張を有効にします

pragma OPENCL EXTENSION cl_intel_arbitrary_precision_integers enable

プラグマ宣言の後次のように任意の精度で整数を宣言することができます

ap_intltdgt intd_t my_signed_integerap_uintltdgt uintd_t my_unsigned_integer

結果のビット幅が引数のビット幅より大きい演算を行う場合は引数の 1 つを結果のビット幅に明示的にキャストする必要があります

例えば次の演算を行った場合結果は宣言された整数のサイズをオーバーフローします

int10_t aint10_t bint20_t res

res = a b

この例においてコンパイラーは2 つの 10 ビットの整数を乗算する乗数をインスタンス化し結果を別の 10 ビットの整数に納めようと試みます結果は符号拡張されるか20 ビットまでゼロ拡張されます

オーバーフローを防ぐには次のように引数の 1 つを結果のビット幅に明示的にキャストします

res = ((int20_t)a) b

注意 x86-64 のプラットフォームに向けてプログラムをコンパイルすると任意の精度での整数のビット幅は32 ビットまたは 64 ビットに切り上げられますFPGA プラットフォームにカーネルをコンパイルするとビット幅は切り上げられず任意の精度の整数は宣言されたビット幅のまま維持されます

その結果x86-64 のプログラムで正しく動作するように見える演算を FPGA カーネルにコンパイルするとオーバーフローし精度を失う可能性がありますx86-64 プラットフォームにおいてビット幅を切り上げることで与えられる追加精度はFPGA カーネルのコンパイル時に発生する可能性があるオーバーフローと精度損失の問題をマスクします

57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用

定義済みプリプロセッサーマクロを活用するとカーネルコードの一部を条件付きでコンパイルできるようになります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

71

bull デバイス固有のコード (例えば FPGA_board_1) をカーネルプログラムに含めるにはカーネルプログラムを次のように構成します

if defined(AOCL_BOARD_FPGA_board_1) FPGA_board_1-specific statementselse FPGA_board_2-specific statementsendif

カーネルのコンパイルを特定のボードに対して行うと定義済みプリプロセッサーマクロAOCL_BOARD_ltboard_namegt が 1 に設定されますltboard_namegt がFPGA_board_1 の場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA_board_1 に固有のパラメーターとフィーチャーをコンパイルします

bull インテル FPGA SDK for OpenCL オフラインコンパイラー固有のコンパイラーフィーチャーと適化を導入するにはカーネルプログラムを次のように構成します

if defined(INTELFPGA_CL) statementselse statementsendif

この INTELFPGA_CLは インテル にて定義済みのオフラインコンパイラー用のプリプロセッサーマクロです

関連情報カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)(111 ページ)

58 __constant アドレス空間修飾子の宣言

__constantアドレス空間修飾子をカーネルに含める際にはいくつかの考慮すべき制限と回避策があります

関数スコープ__constant 変数

インテル FPGA SDK for OpenCL オフラインコンパイラーは関数スコープの__constant変数をサポートしません関数スコープの__constant変数はファイルスコープの constant 変数に置き換えてくださいまた関数スコープの__constant変数をホストがカーネルに渡す__constantバッファーに置き換えることも可能です

ファイルスコープ__constant 変数

ホストが常に同じ定数データをカーネルに渡す場合そのデータを初期化された constant ファイルスコープ配列としてカーネルファイルで宣言することを検討ください初期化された constant ファイルスコープ配列宣言はデータを格納するための ROM をハードウェアに直接作成しますこの ROM はNDRange のすべてのワークアイテムが利用可能です

以下に例を示します

__constant int my_array[8] = 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7

__kernel void my_kernel (__global int my_buffer) size_t gid = get_global_id(0) my_buffer[gid] += my_array[gid 8]

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

72

この場合ファイルスコープの定数データはカーネルの呼び出しにわたって変化しないためオフラインコンパイラーは my_arrayの値を ROM に設定します

ホストから__constant パラメーターへのポインター

カーネルの呼び出しにわたってデータが固定されていない場合ファイルスコープの定数データをカーネルコードの__constantパラメーターへのポインターに置き換えることが可能ですその後次の方法でホストアプリケーションを修正する必要があります

1 グローバルメモリーのポインターに関連付けられた cl_memメモリーオブジェクトを作成します

2 カーネルを実行する前にclEnqueueWriteBufferで定数データを cl_memオブジェクトにロードします

3 clSetKernelArg関数でcl_memオブジェクトをカーネルに引数として渡します

constant 変数が複合型の場合は次の表で示されているように typedef引数を使用し簡潔にします

表 2 ファイルスコープ__constant 変数と__constant パラメーターへのポインターの置き換え

元のソースコードの構成 以下のような構文に書き換え

__constant int Payoff[2][2] = 1 3 5 3__kernel void original(__global int A) A = Payoff[1][2] and so on

__kernel void modified(__global int A__constant Payoff_type PayoffPtr ) A = (PayoffPtr)[1][2] and so on

注意 ホストアプリケーションとカーネルでは同じ型定義を使用してください

59 構造体データ型を OpenCL カーネルに引数として含める

OpenCL カーネルの構造体パラメーター (struct) は値もしくは構造体へのポインターとして渡します

注意 __global struct引数は構造体を格納するためにホストプログラムに作成する必要があるバッファーを指定しますポインターのエイリアシングを防ぐため構造体へのポインター宣言にrestrict修飾子を含めます

591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致

OpenCL カーネルで構造体データ型 (struct) を引数として使用する場合ホストアプリケーションとカーネルコードにおいてメンバーのデータ型を一致させデータメンバーのアライメントを揃えてください

メンバーのデータ型を一致させるにはカーネルコードのデータ型に対応するデータ型の cl_バージョンをホストアプリケーションで使用しますデータ型の cl_バージョンはopenclhヘッダーファイルにあります例えばカーネルコードに float4型のデータメンバーがある場合ホストアプリケーションにおいて宣言する対応するデータメンバーはcl_float4です

ホストとカーネルアプリケーションにおける構造とstructデータメンバーのアライメントを揃えます異なるホストコンパイラー間においては変動性があるためアライメントは慎重に管理してください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

73

例えば構造体にfloat4の OpenCL データ型がある場合これらのデータアイテムのアライメントはOpenCL Specification を満たす必要があります (float4に対しては 16 バイトのアライメント)

インテル FPGA SDK for OpenCL オフラインコンパイラーが OpenCL カーネルをコンパイルする際は次の規則が適用されます

1 組み込みのスカラー型とベクトル型のアラインメントはOpenCL Specification version 10 のSection 615 で説明されている規則に従います

オフラインコンパイラーは通常サイズに基づいてデータ型のアライメントを行いますただしコンパイラーは 3 要素ベクトルの値を4 要素ベクトルと同じ方法でアライメントします

2 配列はその要素の 1 つと同じアラインメントを有します

3 struct (または union) はそのデータメンバーのいずれかに必要な 大アライメントと同じアライメントを有します

以下に例を示します

struct my_struct char data[3] float4 f4 int index

データ型が float4であるためオフラインコンパイラーは上記の struct要素を 16 バイトの境界でアライメントしますその結果dataと indexもまた 16 バイトのアライメント境界を有します

4 オフラインコンパイラーは structのデータメンバーを並び替えません

5 オフラインコンパイラーは通常各データメンバーのアライメント要件を満たすためstructのデータメンバー間に 小限のデータ構造パディングを挿入します

a OpenCL カーネルコードではpacked属性を struct宣言に適用することでデータのパッキングを指定することができます (すなわちデータ構造パディングを挿入しない)データのパッキングを課す場合はデータメンバーのアラインメントが OpenCL のアラインメント要件を満たしていることを確認してください インテル FPGA SDK for OpenCL はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

b OpenCL カーネルコードではaligned(N) 属性をデータメンバーに適用しデータ構造パディングの量を指定することができますここで N はパディングの量を表しますSDK はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

Windows システムにおいてMicrosoft Visual Studio コンパイラーの一部のバージョンではデフォルトで構造体データ型をパッキングしますデータのパッキングが不要な場合はデータ構造パディングの量を次のように指定してください

struct my_struct __declspec(align(16)) char data[3]

Note that cl_float4 is the only known float4 definition on the host __declspec(align(16)) cl_float4 f4 __declspec(align(16)) int index

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

74

ヒント データ構造パディングを追加することに代わりchar型または char配列のダミーの structメンバーを挿入する方法もあります

関連情報bull 構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

bull OpenCL Specification version 10

592 データ構造パディング挿入の無効化

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造体のメンバー間への自動的なパディング挿入を無効にする指示を出すことができます

bull 自動パディング挿入を無効にするにはカーネルソースコードの structデータ構造の前にpacked属性を挿入します

例えば次のようになります

struct __attribute__((packed)) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float restrict A __global struct Context restrict c) if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

593 構造体のアライメントの指定

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造に特定のアライメントを設定するよう指示を出すことができます

bull 構造のアライメントを指定するにはカーネルソースコードの structデータ構造の前にaligned(N) 属性を挿入します

次に例を示します

struct __attribute__((aligned(2))) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float A __global struct Context restrict c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

75

if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

510 レジスターの推論

インテル FPGA SDK for OpenCL オフラインコンパイラーではプライベートアドレス空間のデータをレジスターまたはブロック RAM に実装することが可能です 変数へのアクセスが固定されており動的インデックスを必要としない場合オフラインコンパイラーは通常レジスターを選択します可変インデックスで配列にアクセスすると配列は通常ブロック RAM に実装されますプライベートデータをレジスターとして実装することは単一のサイクルで発生する必要があるデータのアクセス (例えば単一ワークアイテムのループでのフィードバックなど) に有効です

オフラインコンパイラーはプライベート配列を単一の値のレジスターまたは区分的なレジスターとして推論します区分的な実装は非常に効率的なハードウェアをもたらしますがオフラインコンパイラーがデータのアクセスを静的に決定できなければなりません区分的な実装を容易にするためにアクセスポイントを配列にハードコードしますまた配列にアクセスするループを展開することでレジスターの推論を容易にすることもできます

配列のアクセスを静的に推論できない場合オフラインコンパイラーは配列をレジスターとして推論する場合がありますただしオフラインコンパイラーは単一のワークアイテムカーネルに対しそれらの配列のサイズを 64 バイトに制限します複数のワークアイテムを有するカーネルには実質的にサイズ制限はありません

次のコードを例に示します

int array[SIZE]for (int j = 0 j lt N ++j) for (int i = 0 i lt SIZE - 1 ++i) array[i] = array[i + 1]

array[i]へのインデックスはループが展開されていないため静的に推論することができませんarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイト以下である場合オフラインコンパイラーは array[SIZE]を単一の値としてレジスターに実装しますarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイトより大きい場合オフラインコンパイラーは配列全体をブロック RAM に実装します複数のワークアイテムカーネルの場合サイズが 1 キロバイト (KB) 未満である限りオフラインコンパイラーは単一の値として array[SIZE]をレジスターに実装します

5101 シフトレジスターの推論

シフトレジスターのデザインパターンは多くのアプリケーションを効率的に FPGA へ実装するために非常に重要なデザインパターンですしかしシフトレジスターのデザインパターンを実装することに対し 初は違和感を抱くかもしれません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

76

次のコードを例に示します

channel int in out

define SIZE 512Shift register size must be statically determinable

__kernel void foo() int shift_reg[SIZE] The key is that the array size is a compile time constant

Initialization loop pragma unroll for (int i=0 i lt SIZE i++) All elements of the array should be initialized to the same value shift_reg[i] = 0 while(1) Fully unrolling the shifting loop produces constant accesses pragma unroll for (int j=0 j lt SIZEndash1 j++) shift_reg[j] = shift_reg[j + 1] shift_reg[SIZE ndash 1] = read_channel_intel(in)

Using fixed access points of the shift register int res = (shift_reg[0] + shift_reg[1]) 2

lsquooutrsquo channel will have running average of the input channel write_channel_intel(out res)

各クロックサイクルでカーネルは新しい値を配列にシフトしますこのシフトレジスターをブロックRAM に配置することにより インテル FPGA SDK for OpenCL オフラインコンパイラーは配列への複数のアクセスポイントを効率的に処理できますシフトレジスターのデザインパターンはフィルター (例えばSobel フィルターなどのイメージフィルターや有限インパルス応答 (FIR) フィルターなどの時間遅延フィルター) を実装する際に理想的な方法です

カーネルコードにシフトレジスターを実装する際は次の点に注意してください

1 シフトループを展開し配列のすべての要素にアクセスできるようにします

2 すべてのアクセスポイントは一定のデータアクセスを持つ必要があります例えば複数のアクセスポイントを使用しネスト化されたループに計算を書き込む場合はこれらのループを展開し一定のアクセスポイントを確立します

3 配列の要素すべてを同じ値に初期化します特定の初期値が不要な場合は要素を初期化せずに維持することも可能です

4 大規模な配列へのアクセスが静的に推論できない場合オフラインコンパイラーは非効率なハードウェアを作成することになりますそれらのアクセスが必要な場合は__privateメモリーの代わりに__localメモリーを使用してください

5 大規模なシフトレジスターを条件付きでシフトしないでください非効率なハードウェアの作成を防ぐためシフトはシフトコードを含むループの反復で必ず行わなければなりません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

77

511 倍精度浮動小数点演算の有効化

インテル FPGA SDK for OpenCL ではすべての倍精度浮動小数点関数に対し暫定的なサポートを提供します

OpenCL カーネルで倍精度浮動小数点のデータ型を宣言する前に次の OPENCL EXTENSIONプラグマをカーネルコードに含めます

pragma OPENCL EXTENSION cl_khr_fp64 enable

512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター

ループ内で累算を実行する単一ワークアイテムカーネルは インテル FPGA SDK for OpenCL オフラインコンパイラーの単一サイクル浮動小数点アキュムレーターの機能を活用することができますオフラインコンパイラーはそれらのカーネルのインスタンスを探索しループで実行される累積をアキュムレーター構造へマッピングしようと試みます

オフラインコンパイラーは値を加算または減算するアキュムレーターをサポートしますこの機能を活用するにはオフラインコンパイラーがアキュムレーターを推論できるように累算を記述します

注意 bull アキュムレーターはArria 10 デバイスでのみ利用可能です

bull アキュムレーターはループの一部である必要があります

bull アキュムレーターは初期値の 0 を持つ必要があります

bull アキュムレーターを条件付きにすることはできません

次はオフラインコンパイラーによる正しいアキュムレーターの推論をもたらす記述例です

channel float4 RANDOM_STREAM

__kernel void acc_test(__global float a int k) Simplest example of an accumulator In this loop the accumulator acc is incremented by 5 int i float acc = 00f for (i = 0 i lt k i++) acc+=5 a[0] = acc

__kernel void acc_test2(__global float a int k) Extended example showing that an accumulator can be conditionally incremented The key here is to describe the increment as conditional not the accumulation itself int i float acc = 00f for (i = 0 i lt k i++) acc += ((i lt 30) 5 0) a[0] = acc

__kernel void acc_test3(__global float a int k) A more complex case where the accumulator is fed by a dot product int i float acc = 00f for (i = 0 i lt k i++ ) float4 v = read_channel_intel(RANDOM_STREAM) float x1 = vx float x2 = vy

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

78

float y1 = vz float y2 = vw acc += (x1y1+x2y2) a[0] = acc

__kernel void loader(__global float a int k) int i float4 my_val = 0 for(i = 0 i lt k i++) if ((i4) == 0) write_channel_intel(RANDOM_STREAM my_val) if ((i4) == 0) my_valx = a[i] if ((i4) == 1) my_valy = a[i] if ((i4) == 2) my_valz = a[i] if ((i4) == 3) my_valw = a[i]

5121 アキュムレーターを推論するためのプログラミング手法

単一サイクル浮動小数点アキュムレーター機能の活用はカーネルコードのアキュムレーターの記述を変更し効率を改善したりプログラミングの制約を回避したりすることで行うことができます

複数のループを使用するアキュムレーターの記述

複数のループを使用し一部のループを展開した状態でアキュムレーターを記述する場合を以下に示します

float acc = 00ffor (i = 0 i lt k i++) pragma unroll for(j=0j lt 16 j++) acc += (x[i+j]y[i+j])

この場合-fp-relaxedの インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションでカーネルをコンパイルし累積が公開されるようにオフラインコンパイラーが操作を再配置できるようにすることが重要です-fp-relaxedでカーネルをコンパイルしない場合アキュムレーターの構成は高いイニシエーションインターバル (II) をともなうことになりますイニシエーションインターバルは連続するループ反復の開始から開始までのサイクル数ですイニシエーションインターバルの値が大きいほどアキュムレーター構造体が次のループ反復を処理するまでの時間が長くなります

複数ループのアキュムレーターの記述変更

-fp-relaxedオフラインコンパイラーのコマンドオプションでアキュムレーターの記述をコンパイルできない場合はコードを書き換え累積を公開します

上記コード例の場合は次のように書き換えます

float acc = 00ffor (i = 0 i lt k i++) float my_dot = 00f pragma unroll for(j=0j lt 16 j++) my_dot += (x[i+j]y[i+j]) acc += my_dot

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

79

変数またはゼロ以外の初期値を含むアキュムレーターの記述変更

ゼロ以外の値で始まるアキュムレーターの記述にオフセットを適用する場合を下に示します

float acc = array[0]for (i = 0 i lt k i++) acc += x[i]

アキュムレーターハードウェアは記述に変数またはゼロ以外の初期値をサポートしないため記述を書き換える必要があります

float acc = 00ffor (i = 0 i lt k i++) acc += x[i]acc += array[0]

上記のように記述を書き換えるとカーネルはループでアキュムレーターを使用できるようになりますその後のループ構造にはarray[0]のインクリメントが続きます

513 整数のプロモーション規則

intX_tのデータ型を使用する際に適用される整数のプロモーション規則はCC++の標準規則とは異なります以下の異なる規則を考慮しカーネルをデザインしてください

bull 両方のオペランドが標準の整数型 (charや shortなど) の場合整数は CC++標準に従ってプロモートされますつまり演算は32 ビット以上の 大オペランドのデータ型とサイズで実行されますこの式はより大きい方のデータ型で結果を返します

bull オペランドがどちらも intX_tデータ型の場合データ型が 32 ビットより小さい場合でも 大の intX_tデータ型で演算は実行されますこの式はそのデータ型で結果を返します

bull 式に標準データ型 1 つと intX_tデータ型 1 つが含まれる場合intX_tデータ型のプロモーション規則が適用されますこの式の型は常に intX_tデータ型になります例えば 大のデータ型が標準整数型の shortの場合結果で返されるデータ型は int16_tです

bull リテラルは CC++のデフォルトにおいて intデータ型のためキャストなしでリテラルを使用すると式の型は常に少なくとも 32 ビットになります例えば次のようなコードの場合比較は 32 ビットで行われます

int5_t apif (ap lt 4)

bull オペランドの符号が異なり符号なしの型が少なくとももう一方の型と同じサイズである場合演算は符号なしで実行されますそれ以外の場合は符号なしオペランドは符号付きの値に変換されます

例えば次のようなコードの場合-1 は 32 ビットの負の値 (0xffffffff) に拡張されuint3_tは 32 ビットの正の値 7 (0x00000007) となり等しくなりません

uint3_t x = 7if (x = -1) FAIL

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

80

6 ホストアプリケーションの設計

インテルではホストに対する要件についてのガイドラインおよびホストアプリケーション構築における手順を提供しています該当する場合はOpenCL カーネルのホストアプリケーションを作成または変更する際にこれらのデザイン戦略を実行してください

ホストのプログラミング要件 (81 ページ)

グローバルメモリーの手動分割における OpenCL バッファーの割り当て (82 ページ)

カーネル実行中におけるプロファイルデータの収集 (86 ページ)

カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

ホストアプリケーションの管理 (92 ページ)

SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て (102 ページ)

徐々に速度低下する OpenCL システムのデバッグ (104 ページ)

61 ホストのプログラミング要件

インテル FPGA SDK for OpenCL で使用するために OpenCL ホストアプリケーションをデザインする際はアプリケーションが次のホストプログラミング要件を満たしていることを確認ください

611 ホストマシンのメモリー要件

ホストアプリケーションを実行するマシンは複数のコンポーネントを同時にサポートするための十分なホストメモリーが必要です

ホストマシンは次のコンポーネントをサポートする必要があります

bull ホストアプリケーションおよびオペレーティングシステム

bull ホストアプリケーションのワーキングセット

bull 一度に割り当てることのできる OpenCL メモリーバッファーの 大量デバイス側の cl_memバッファーはすべてホストプロセスの対応するストレージエリアに関連付けられますしたがってホストメモリーに必要な容量はFPGA がサポートしている外部メモリーの量と同等になる可能性があります

612 ホストバイナリーの要件

ホストアプリケーションをコンパイルする際はx86-64 (64 ビット) または ARMreg 32-bit ARMV7-A for SoC のいずれかのアーキテクチャーをターゲットにしてください インテル FPGA SDK forOpenCL のホストランタイムはx86-32 (32 ビット) バイナリーをサポートしません

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

613 複数のホストスレッド

インテル FPGA SDK for OpenCL のホストライブラリーはスレッドセーフです

clSetKernelArg関数を除く OpenCL API はすべてスレッドセーフです

clSetKernelArgの同時呼び出しが異なる cl_kernelオブジェクトで実行される限り任意のホストスレッドから clSetKernelArgを呼び出しても再入可能な方法で呼び出しても安全です

関連情報マルチスレッドホストアプリケーション

614 順不同のコマンドキュー

OpenCL ホストランタイムのコマンドキューは順不同なコマンドの実行をサポートしません

615 カーネルを同時に実行するための複数のコマンドキューにおける要件

同じ OpenCL プログラムオブジェクトにあるカーネルを同時実行するには同時に実行する各カーネルに個別のコマンドをインスタンス化します

62 グローバルメモリーの手動分割における OpenCL バッファーの割り当て

グローバルメモリーバッファーを手動で分割するとバッファー間のメモリーアクセスを制御しメモリー帯域幅を 大化することができますバッファーの分割は同じメモリータイプのインターフェイス間または異なるメモリータイプのインターフェイス間で行うことが可能です

621 同じメモリータイプの複数のインターフェイスでのバッファーの分割

同じメモリータイプの複数のインターフェイスにおいてメモリーを分割する際はOpenCL カーネルコンパイル中のバーストインターリーブを 初に無効にする必要があります次にOpenCL バッファーを割り当てるメモリーバンクをホストアプリケーションに指定する必要があります

デフォルトで インテル FPGA SDK for OpenCL オフラインコンパイラーは各グローバルメモリータイプをバーストインターリーブ方式でコンフィグレーションしますバーストインターリーブ方式のコンフィグレーションは通常メモリーバンク間に 良のロードバランスをもたらしますただしインターリーブ領域以外へのメモリー分割がより効率的な場合もあります

次の図はバーストインターリーブでのメモリー分割とインターリーブ以外のメモリー分割における違いを表しています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

82

0x7FFF_FFFFAddress

0x7FFF_FC000x7FFF_FBFF

0x7FFF_F800

0x0000_0FFF

0x0000_0C000x0000_0BFF

0x0000_08000x0000_07FF

0x0000_04000x0000_03FF

0x0000_0000

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Address0x7FFF_FFFF

0x4000_00000x3FFF_FFFF

0x0000_0000

Burst-Interleaved Separate Partitions

使用可能なグローバルメモリータイプの一部またはすべてを手動で分割するには次の作業を実行します

1 OpenCL カーネルを -no-interleaving=ltglobal_memory_typegt フラグでコンパイルし指定されたメモリータイプのメモリーバンクを個別のアドレスでコンフィグレーションします

-no-interleaving=ltglobal_memory_typegt フラグの使用方法に関してはグローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) の章を参照ください

2 ホストアプリケーションに OpenCL バッファーを作成しCL_CHANNELフラグでバッファーをいずれかのバンクへ割り当てます

mdash CL_CHANNEL_1_INTELFPGAを指定しバッファーを使用可能な 下位メモリー領域に割り当てます

mdash CL_CHANNEL_2_INTELFPGAを指定しメモリーを 2 番目のバンクに割り当てます (利用可能な場合)

注意

それぞれのバッファーは単一メモリーバンクにのみ割り当ててくださいランタイムに 2 番目のバンクが利用できない場合メモリーは 1 番目のバンクに割り当てられますグローバルメモリーが利用できない場合はclCreateBuffer呼び出しは失敗しエラーメッセージCL_MEM_OBJECT_ALLOCATION_FAILUREが表示されます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

83

関連情報グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) (115 ページ)

622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割

FPGA ボードのボードサポートパッケージでは異なるメモリーテクノロジー (DRAM や SRAM など) で構成されるグローバルメモリースペースを組み立てることが可能ですボードサポートパッケージは複数のインターフェイスで構成されるそのようなメモリーの 1 つをデフォルトのメモリーとして指定しますバッファーはすべてそこにあります

異種メモリーを使用するにはclファイルのコードを次のように変更します

1 次のいずれかの方法でFPGA ボードで使用可能なグローバルメモリータイプの名前を確認してください

mdash ボードメーカーの資料を参照する

mdash ボードのカスタムプラットフォームの board_specxmlファイルで名前を検索する各グローバルメモリータイプの名前はglobal_mem要素の name属性に割り当てられた一意の文字列です

2 特定のグローバルメモリータイプにバッファーを割り当てるようにホストに指示するにはbuffer_location(ltmemory_typegt) 属性を挿入しますここで ltmemory_typegtはボードメーカーより提供されているグローバルメモリータイプの名前です

__kernel void foo(__global __attribute__((buffer_location(DDR))) int x __global __attribute__((buffer_location(QDR))) int y)

buffer_location属性を指定しない場合ホストはバッファーをデフォルトのメモリータイプに自動的に割り当てますデフォルトのメモリータイプを確認するにはボードメーカーから提供されている資料を参照してくださいまたはカスタムプラットフォームの board_specxmlファイルで 初に定義されているメモリータイプもしくは属性 default=1が割り当てられたメモリータイプを検索します

インテルでは次のように buffer_location属性をプリプロセッサーマクロに定義し再利用を容易にすることを推奨しています

define QDR__global __attribute__((buffer_location(QDR))) define DDR__global __attribute__((buffer_location(DDR)))__kernel void foo (QDR uint data DDR uint lup) statements

注意

カーネル引数をデフォルト以外のメモリーに割り当てる場合 (上記コードであれば QDRuint dataおよび DDR uint lup)その引数を constantキーワードで宣言することはできませんさらにその引数から派生するポインターでアトミック操作を実行することはできません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

84

clCreateProgramWithBinary関数を使用し OpenCL ランタイムにカーネルをロードするとデフォルトでホストはバッファーをメインメモリーに割り当てますカーネルの呼び出し中にホストはカーネル引数にバインドされている異種メモリーバッファーをメインメモリーに自動的に再配置します

3 異種メモリーバッファーが 初にメインメモリーに割り当てられるのを防ぐにはclCreateBuffer関数を呼び出す際にCL_MEM_HETEROGENEOUS_INTELFPGAフラグを含めますまた clSetKernelArgを使用し cl_memバッファーを buffer_location属性を使用した引数にまずバインドした後にそのバッファーに対する読み取りまたは書き込みを実行してください次に例を示します

mem = clCreateBuffer(context flags|CL_MEM_HETEROGENEOUS_INTELFPGA memSize NULL amperrNum)

clSetKernelArg(kernel 0 sizeof(cl_mem) ampmem)clEnqueueWriteBuffer(queue mem CL_FALSE 0 N 0 NULL ampwrite_event)clEnqueueNDRangeKernel(queue kernel 1 NULL global_work_size NULL 0 NULL ampkernel_event)

例えば次の clCreateBuffer呼び出しはデフォルト以外のメモリーバンクの使用可能な下位メモリー領域にメモリーを割り当てます

mem = clCreateBuffer(context (CL_MEM_HETEROGENEOUS_INTELFPGA|CL_CHANNEL_1_INTELFPGA) memSize NULL amperrNum)

clCreateBuffer呼び出しはカーネル引数で指定した内容に基づきメモリーを特定のグローバルメモリータイプに割り当てますメモリータイプにあるメモリーオブジェクト (cl_mem)が異なるメモリーテクノロジーに対応するカーネル引数として設定されている場合ホストはカーネルをキューする際にそのメモリーオブジェクトを自動的に移動しますバッファーは複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

異種グローバルメモリーアクセスの 適化に関する詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの異種メモリーバッファーとグローバルメモリーの手動分割の章を参照ください

関連情報bull グローバルメモリーの手動分割

bull 異種メモリーバッファー

623 ホストアプリケーションでのパイプオブジェクトの作成

カーネルに OpenCL パイプを実装するには インテル FPGA SDK for OpenCL 固有のパイプオブジェクトをホストアプリケーションに作成する必要があります

SDK 固有のパイプオブジェクトはOpenCL Specification version 20 で説明されているように真の OpenCL パイプオブジェクトではありませんこの実装は準拠したソリューションによるインテルFPGA 製品からの移行を可能にしますSDK 固有のパイプオブジェクトはメモリーオブジェクト(cl_mem) ですがホストはパイプ自体にメモリーを割り当てません

次の clCreatePipeホスト API はパイプオブジェクトを作成します

cl_mem clCreatePipe(cl_context context cl_mem_flags flags cl_uint pipe_packet_size cl_uint pipe_max_packets const cl_pipe_properties properties cl_int errcode_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

85

clCreatePipeホスト API 関数についての詳細はOpenCL Specification version 20 のSection 541 を参照ください

以下はclCreatePipeホスト API 関数の構文例です

cl_int statuscl_mem c0_pipe = clCreatePipe(context 0 sizeof(int) 1 NULL ampstatus)status = clSetKernelArg(kernel 1 sizeof(cl_mem) ampc0_pipe)

注意 SDK はランタイムの動的なチャネル割り当てをサポートしません SDK は一致する名前に基づきコンパイル中にパイプを静的にリンクします

関連情報OpenCL Specification version 20 (API)

63 カーネル実行中におけるプロファイルデータの収集

カーネルの実行がホストアプリケーションの完了後に終了する場合カーネルの実行中にプロファイルデータを収集するようFPGA に対し明示的に要求することができますほとんどのアプリケーションではカーネルの実行完了時にプロファイルデータを自動的にリードバックするデフォルトの動作で十分です

コンパイル中に OpenCL カーネルをプロファイリングするとprofilemonファイルが自動的に生成されますその後プロファイルデータはFPGA でカーネルの実行が完了した後に profilemonに書き込まれますただしカーネルの実行がホストアプリケーション終了後に完了した場合そのカーネル呼び出しのプロファイル情報はprofilemonファイルに存在しなくなりますこの場合プロファイル情報をカーネルの実行中に取得するようホストコードを修正することができます

重要 カーネルの実行中にプロファイルデータを収集するとカーネルのレイテンシーが増加しカーネルの実行にかなりのオーバーヘッドが追加される可能性があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

86

bull カーネルの実行中にプロファイルデータを収集するよう FPGA に要求するには次のホストライブラリー呼び出しを呼び出します

extern CL_API_ENTRY cl_int CL_API_CALL

clGetProfileInfoIntelFPGA(cl_event)

上記 cl_eventはカーネルのイベントですこのホストライブラリー呼び出しに渡すカーネルイベントはclEnqueueNDRangeKernel呼び出しに渡すものと同じである必要があります

重要

mdash clGetProfileInfoIntelFPGAの呼び出し前にカーネルの実行が完了した場合この関数はイベントエラーメッセージを返します

mdash clGetProfileInfoIntelFPGAおよびclGetProfileDataDeviceIntelFPGA関数呼び出しを使用しているホストプログラムにはCLcl_ext_intelfpgahヘッダーファイルを含む必要があります

注意

カーネルの実行中に clGetProfileInfoIntelFPGA関数を呼び出すとプロファイルカウンターが一時的に無効になり インテル FPGA Dynamic Profiler for OpenCL がFPGA からデータを収集できるようになりますそのためいくつかのプロファイル情報がこの中断中に失われますこの関数を非常に短い間隔で呼び出すとプロファイルデータがカーネルの実際のパフォーマンス動作を正確に反映しない可能性があります

次のホストコードを例に説明します

int main() clEnqueueNDRangeKernel(queue kernel NULL) clEnqueueNDRangeKernel(queue kernel NULL)

このホストアプリケーションはカーネルが 2 回起動した後に完了するという前提で動作しますカーネルの呼び出しごとに 1 組のプロファイルデータが生成されるためprofilemonファイルには合計 2 組のプロファイルデータが生成されますカーネルの実行中にプロファイルデータを収集するにはホストコードを次のように変更します

int main() clEnqueueNDRangeKernel(queue kernel ampevent)

Get the profile data before the kernel completes clGetProfileInfoIntelFPGA(event)

Wait until the kernel completes clFinish(queue)

clEnqueueNDRangeKernel(queue kernel NULL)

clGetProfileInfoIntelFPGAへの呼び出しによりprofilemonファイルに新しいエントリーが追加されます インテル FPGA Dynamic Profiler for OpenCL GUI はその後レポートにこのエントリーを解析します

インテル FPGA Dynamic Profiler for OpenCL についての詳細は次の章を参照ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

87

bull インテル FPGA SDK for OpenCL ベストプラクティスガイドのパフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング

関連情報bull パフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング (140 ページ)

631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング

完了時にプロファイラーデータを自動的に生成するエンキューされたカーネルとは異なり (コンパイラーフラグが設定されている場合)自動実行カーネルは終了しませんしたがってclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しでカーネルをプロファイルするタイミングを明示的に指定する必要がありますプロファイラーデータはすべてprofilemonファイルへ出力されますホストライブラリー呼び出しで収集されるデータは自動実行のプロファイルデータのスナップショットになります

次はclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しのコード例です

cl_int clGetProfileDataDeviceIntelFPGA (cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret)

以下が詳細です

bull read_enqueue_kernelsパラメーターはエンキューされたカーネルをプロファイリングしますこのリリースにおいてこのパラメーターは無効です

bull read_auto_enqueuedパラメーターは自動実行カーネルをプロファイリングします

bull 以下は今後のリリースにおけるプレースホルダーパラメーターです

mdash clear_counters_after_readback

mdash param_value_size

mdash param_value

mdash param_value_size_ret

mdash errcode_ret

注意 このホストライブラリー呼び出しは自動実行カーネルのみをポートしていますread_enqueue_kernelsパラメーターに TRUEを入力できますがブール値は無視されますこれはエンキューされたカーネルがプロファイリングされないという意味ではありませんコンパイラーの profileフラグがエンキューされたカーネルを含むように設定されている場合通常通り実行の終わりにプロファイルデータはキャプチャーされます唯一の違いはclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しはエンキューされたカーネルに対し自動的に行われるプロファイリングとは別にエンキューされたカーネルをプロファイリングしないことです

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

88

clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは成功時にCL_SUCCESSを返しますそれ以外の場合は次のエラーのいずれかを返します

bull デバイスが有効なデバイスではない場合は CL_INVALID_DEVICE

bull プログラムが有効なプログラムではない場合は CL_INVALID_PROGRAM

注意 clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは与えられたデバイスで与えられたプログラムのプログラミング操作をトリガーしませんホストライブラリー呼び出し時にプログラムがまだデバイスにプログラミングされていない場合ホストライブラリー呼び出しはCL_INVALID_PROGRAMエラーを返します

表 3 clGetProfileDataDeviceIntelFPGA ホストライブラリー呼び出しパラメーターの組み合わせ

read_auto_enqueued

エンキューされたカーネルのみをプロファイリング注意 実行が完了すると自動的にプロファイル情報を出力します

False

自動実行カーネルのみをプロファイリング True

エンキューされたカーネルと自動実行カーネルの両方をプロファイリング

True

632 プロファイルデータの取得

実行中のカーネルからのプロファイルデータの取得はリードバック動作中に一時停止します

注意 データ取得が一時停止してもカーネル自体はまだ実行していますしたがってリードバック動作中にカーネルデータは記録されません

データ取得の一時停止はすべてのカーネル間において完全には同期されませんカーネル間におけるプロファイルデータの取得停止のスキューはデバイスとの通信リンクドライバーのオーバーヘッドおよび通信バス上の輻輳によって異なりますカーネル間におけるプロファイルデータの正確な同期スナップショットに依存するべきではありません

633 複数の自動実行プロファイリング呼び出し

自動実行カーネルは継続的に実行されるためホストアプリケーションは複数のclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを実行中の特定の時点または特定の時間範囲に含め自動実行カーネルをプロファイリングすることができますホストアプリケーションが clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを呼び出すたびにプロファイルカウンターが読み取られゼロにリセットされますclGetProfileDataDeviceIntelFPGAを複数回呼び出すことでホストアプリケーションは時間範囲にわたり自動実行カーネルをプロファイリングできます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

89

図 -13 複数の自動実行プロファイリングのキャプチャーフロー

main() clEnqueueNDRangeKernel() system startsclGetProfileDataDeviceIntelFPGA () Time AclGetProfileDataDeviceIntelFPGA () Time BclFinish()

AR0

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 0

Counter 1

AR2 AR8

AR9

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 18

Counter 19

Collect_Autorun_Profiling

CRA

profile_ctrl profile_data

Host

daisy_out

profile_shift

カウンター実行中

カウンターは無効

(~1000us)

カウンター読み取り(Time A) (Time B)

カウンターリセット

カーネルは実行中

カウンター実行中

カウンターは無効

(~1000us)

カウンター実行中

カーネルは実行中

カウンター読み取り カウンター

リセット

64 カスタムプラットフォーム固有の関数へのアクセス

カスタムプラットフォームで利用可能なユーザーがアクセスできる関数をオプションでアプリケーションに含めることができますただしホストアプリケーションを FPGA クライアントドライバー (FCD)にリンクするとそれらのカスタムプラットフォーム固有の関数を直接参照することはできません FCDとリンク中にカスタムプラットフォーム固有のユーザーがアクセス可能な関数を参照するにはホストアプリケーションに clGetBoardExtensionFunctionAddressIntelFPGA拡張を含めます

clGetBoardExtensionFunctionAddressIntelFPGA拡張はカスタムプラットフォームからユーザーがアクセス可能な関数へのポインターを取得する API を指定します

注意 Linux システムの場合clGetBoardExtensionFunctionAddressIntelFPGA関数はFCD の有無にかかわらず機能しますWindows システムの場合この関数は FCD と併用する場合にのみ機能しますカスタムプラットフォームにおいて FCD がサポートされているかはボードメーカーへお問い合わせください

拡張インターフェイスの定義は INTELFPGAOCLSDKROOThostincludeCLcl_exthファイルで確認できます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

90

bull カスタムプラットフォームでユーザーがアクセス可能な関数へのポインターを取得するにはホストアプリケーションで次の関数を呼び出します

void clGetBoardExtensionFunctionAddressIntelFPGA ( const char function_name cl_device_id device )

以下に詳細を説明します

function_name はカスタムプラットフォームのメーカーが提供するユーザーがアクセス可能な関数の名前を指します

また

device はclGetDeviceIDs関数によって返されるデバイス ID です

ユーザーがアクセス可能な関数を識別するとclGetBoardExtensionFunctionAddressIntelFPGA関数はユーザーがアクセス可能な関数へのポインターを返しますカスタムプラットフォームにその関数が存在しない場合clGetBoardExtensionFunctionAddressIntelFPGAは NULLを返します

注意

インストーラブルクライアントドライバー (ICD) を介しclGetBoardExtensionFunctionAddressIntelFPGA API にアクセスする際はICD 拡張 API の clGetExtensionFunctionAddressIntelFPGAが 初にclGetBoardExtensionFunctionAddressIntelFPGA API へのポインターを取得していることを確認してください

次のコード例はICD を介したカスタムプラットフォーム固有の関数へのアクセス方法を示しています

clGetBoardExtensionFunctionAddressIntelFPGA_fn clGetBoardExtensionFunctionAddressIntelFPGA = (clGetBoardExtensionFunctionAddressIntelFPGA_fn) clGetExtensionFunctionAddressForPlatform (platform clGetBoardExtensionFunctionAddressIntelFPGA) if (clGetBoardExtensionFunctionAddressIntelFPGA == NULL) printf (Failed to get clGetBoardExtensionFunctionAddressIntelFPGAn)

void board_extension_function_ptr = clGetBoardExtensionFunctionAddressIntelFPGA(function_namedevice_id)

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

65 構造パラメーター変換に向けたホストプログラムの変更

OpenCL カーネルにおいて構造パラメーターを定数へのポインター構造に変換する場合ホストアプリケーションを適宜変更する必要があります

ホストアプリケーションに次の変更を加えます

1 構造体のコンテンツを格納するための cl_memバッファーを割り当てます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

91

注意 異なる構造体の値を使用するカーネルごとに個別の cl_memバッファーが必要です

2 構造体のカーネル引数を構造体のコンテンツへのポインターではなく構造体のバッファーへのポインターで設定します

3 カーネルをキューする前に構造体のバッファーのコンテンツを設定します次のいずれかの手順を実行しカーネルが起動する前に構造体のバッファーが設定されるようにします

mdash カーネルキューと同じコマンドキューに構造体バッファーをキューします

mdash 個別のカーネルキューと構造体のバッファーキューをイベントと同期させます

4 アプリケーションが構造体バッファーを使用するカーネルを呼び出す必要がなくなった際にはcl_memバッファーを解放します

関連情報bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

bull ホストとカーネルにおける構造体データ型のデータレイアウトの一致 (73 ページ)

66 ホストアプリケーションの管理

インテル FPGA SDK for OpenCL にはホストアプリケーションのコンパイルとリンクに必要なフラグおよびライブラリーに関する情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

注意 ホストアプリケーションを SoC FPGA ボードにクロスコンパイルするにはユーティリティーコマンドに--armオプションを含めます

注意 Linux システムにおいてGNU Project Debugger (GDB) を使用しホストアプリケーションをデバッグする場合はホストアプリケーションを実行する前に次のコマンドを呼び出します

handle SIG44 nostop

このコマンドを呼び出していない場合GDB のデバッグプロセスは次のエラーメッセージとともに終了します

Program received signal SIG44 Real-time event 44

661 Makefile フラグメント例の表示 (example-makefile または makefile)

ホストランタイムライブラリーに対してホストアプリケーションをコンパイルおよびリンクするために インテル FPGA SDK for OpenCL で利用可能な Makefile フラグメント例を表示するにはexample-makefileまたは makefileユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

92

bull コマンドプロンプトで aocl example-makefile または aocl makefile ユーティリティーコマンドを呼び出しますソフトウェアは次のような出力を表示します

The following are example Makefile fragments for compiling and linkinga host program against the host runtime libraries included with the Intel FPGA SDK for OpenCL

Example GNU makefile on Linux with GCC toolchain

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_prog host_progo g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile on Windows with Microsoft Visual C++ command line compiler

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_progexe host_progobj link -nologo OUThost_progexe host_progobj $(AOCL_LINK_CONFIG)

host_progobj host_progcpp cl MD Fohost_progobj -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile cross-compiling to ARM SoC from Linux or Windows withLinaro GCC cross-compiler toolchain

CROSS-COMPILER=arm-linux-gnueabihf- AOCL_COMPILE_CONFIG=$(shell aocl compile-config --arm) AOCL_LINK_CONFIG=$(shell aocl link-config --arm)

host_prog host_progo $(CROSS-COMPILER)g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp $(CROSS-COMPILER)g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

662 ホストアプリケーションのコンパイルとリンク

OpenCL ホストアプリケーションは標準 OpenCL ラインタイム API を使用しデバイスのコンフィグレーションデータのバッファーカーネルの起動および同期を管理しますまたファイル IOアクセラレーターデバイスで実行しないソースコードの一部などの機能も含んでいます インテル FPGA SDKfor OpenCL にはOpenCL API を記述している C ヘッダーファイルホストアプリケーションとリンクする必要があるボード固有の MMD ライブラリーおよびホストランタイムライブラリーの情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

重要 Windows システムの場合MDフラグを追加しホストランタイムライブラリーを Microsoft CRuntime ライブラリーのマルチスレッド DLL (ダイナミックリンクライブラリー) バージョンにリンクする必要がありますまたホストアプリケーションをMDコンパイルフラグでコンパイルするかNODEFAULTLIBリンカーオプションでランタイムライブラリーの選択を上書きする必要があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

93

注意 ホストアプリケーションを実行する際は INTELFPGAOCLSDKROOThostltOS_platformgtbinフォルダーへのパスをライブラリー検索パスに含めます

ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config) (95 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示 (ldflags) (96ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs) (96 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-configまたは linkflags) (96 ページ)

6621 ホストアプリケーションと Khronos ICD Loader Library のリンク

インテル FPGA SDK for OpenCL はKhronos Group の OpenCL ICD 拡張をサポートしていますOpenCL ICD 拡張機能を使用するとシステムに複数の OpenCL 実装を行うことができますOpenCL ICD Loader Library ではインストールされているプラットフォームのリストを選択し選択した OpenCL の実装に特化した OpenCL API 呼び出しを実行できます

SDK のホストランタイムライブラリーに加えインテルはOpenCL Specification version 10 およびOpenCL Specification versions 111220 に実装されている API をサポートする ICDLoader Library のバージョンを提供します他のメーカーが提供する ICD ライブラリーを使用する場合該当メーカーが発行している資料を参照しICD ライブラリーのリンク方法を確認ください

OpenCL ホストアプリケーションを ICD Loader Library にリンクする前にボード MMD ライブラリーをロードするための FCD を設定する必要がありますFCD をまだ設定していない場合FPGA ボードの管理 (20 ページ) にて詳細を確認ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

94

ICD と FCD がどちらも正しくセットアップされていることを確認してくださいこれは aocldiagnose ndashicd-only ユーティリティーを使用し確認することができますこのユーティリティーは対応する ICD または FCD を作成しライブラリーがシステムにレジスターされているかどうかを確認します

bull aocl diagnoseユーティリティーの出力に ICD diagnostics PASSEDが表示されるとホストアプリケーションを作成する際にホストアプリケーションは自動的に ICD LoaderLibrary に接続します

bull aocl diagnoseユーティリティーが ICD を検出しなかった場合次の手順で ICD の設定を確認してください

mdash Windows システムにおいてはregeditを管理者権限で開きWindows レジストリーキーの HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors に移動しますName の値は altera_icddllになりますこの動的ライブラリーファイルは ltINTELFPGAOCLSDKROOTgthostwindows64binにありますType はDWORD でありData は 00000000 になりますレジストリーキーは次の例ようになります

HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]alteracl_icddll=dword00000000

mdash Linux システムにおいてはetcOpenCLvendorsAlteraicdファイルがシステム内に存在しlibalteraclsoのテキストが含まれていることを確認してください

bull aocl diagnoseユーティリティーが FCD を検出しなかった場合次の手順で FCD の設定を確認してください

mdash Windows システムにおいてはHKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards レジストリーキーのライブラリーですべてのユーザーのインストールが選択されていることを確認してくださいもしくは HKEY_CURRENT_USERSOFTWAREIntelOpenCLBoards レジストリーキーを確認してくださいNameの値は ltpath_to_the_mmd_librarygt になりData は 0 に設定された DWORDですレジストリーキーは次の例のようになります

[HKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards]cboard_vendor amy_board_mmddll=dword00000000

mdash Linux システムの場合はoptIntelOpenCLBoardsmy_boardfcdファイルがシステムに存在しメーカー固有のライブラリー名が含まれていることを確認してください(databoard_vendor_alibmy_board_mmdsoなど)

注意

bull ボードメーカーが複数のライブラリーを提供している場合それらが特定の順序になっているかを再度確認してくださいライブラリーをロードする正しい順序に関してはボードメーカーにお問い合わせくださいライブラリーはロードする順序通りにレジストリーに並べる必要があります

bull インテル Arria 10 SoC ボードにおいてカスタムプラットフォームに SD フラッシュカードイメージをビルドする際はlibalteraclsoのテキストを含むAlteraicdファイルを作成くださいAlteraicdファイルをカスタムプラットフォームのetcOpenCLvendorsディレクトリーに保存します詳細はBuilding the Software and SD Card Image for the Intel Arria 10 SoCDevelopment Kit Reference Platform を参照ください

6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)

ホストアプリケーションのコンパイルに必要なフラグのリストを表示するにはcompile-configユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

95

1 コマンドプロンプトで aocl compile-config ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL API ヘッダーファイルが存在するフォルダーまたはディレクトリーへのパスを表示します例えば

bull Windows システムの場合パスは-IINTELFPGAOCLSDKROOThostincludeになります

bull Linux システムの場合パスは-I$INTELFPGAOCLSDKROOThostincludeになります

この INTELFPGAOCLSDKROOT はソフトウェアのインストール位置を指します

2 このパスをC プリプロセッサーに追加します

注意 INTELFPGAOCLSDKROOThostincludeCLフォルダーまたはディレクトリーにあるopenclh OpenCL ヘッダーファイルをホストソースに含めます

6623 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示(ldflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なパスを表示するにはldflagsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldflags ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL プラットフォームとランタイム API を提供する OpenCL ホストランタイムライブラリーとホストアプリケーションをリンクするためのパスを表示しますOpenCL ホストランタイムライブラリーは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあります

6624 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs)

ホストアプリケーションをリンクするために必要な OpenCL ホストランタイムライブラリー名およびMMD ライブラリー名を表示するにはldlibsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldlibs ユーティリティーコマンドを呼び出します

ソフトウェアは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあるホストランタイムライブラリーのリストを表示しますまたカスタムプラットフォームのltboard_family_namegtltOS_platformgtlibディレクトリー にあるカスタムプラットフォーム固有の MMD ライブラリーのリストも表示します

注意

FCD が正しく設定されているとソフトウェアは MMD ライブラリーのリストを表示しません

mdash Windows システムの場合出力は OpenCLlibになります

mdash Linux システムの場合出力は-lOpenCLになります

6625 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示(link-config または linkflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なフラグの一覧を表示するにはlink-configまたは linkflagsユーティリティーコマンドを呼び出します

このユーティリティーコマンドはldflagsと ldlibsユーティリティーコマンドの機能を兼ね備えています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

96

bull コマンドプロンプトで aocl link-config または aocl linkflags コマンドを呼び出します

mdash Windows システムの場合出力はlibpathINTELFPGAOCLSDKROOThostwindows64lib OpenCLlibになります

mdash Linux システムの場合出力は-L$INTELFPGAOCLSDKROOThost[linux64|arm32]lib -lOpenCLになります

663 OpenCL ICD 拡張 API の使用

ICD を使用する際にOpenCL Specification に正式に記載されていない OpenCL ホスト API 関数を呼び出す場合はclGetExtensionFunctionAddress関数を 初に呼び出しそのホストAPI 関数への関数ポインターを取得後その関数ポインターを使用しホスト API 関数を呼び出す必要がありますこれは関数名に IntelFPGAを含む非標準の呼び出しすべてに適用されます

次のコード例を参照ください

extern CL_API_ENTRY cl_int CL_API_CALLclGetProfileDataDeviceIntelFPGA( cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret )

以下の関数呼び出しを

cl_int status = clGetProfileDataDeviceIntelFPGA (device program false true false 0 NULL NULL NULL)

以下の構文を使用するコードと置き換え関数ポインターの定義およびロードを行います

typedef cl_int (clGetProfileDataDevice_fn) (cl_device_id cl_program cl_bool cl_bool cl_bool size_t void size_t cl_int )clGetProfileDataDevice_fn get_profile_data_ptr = (clGetProfileDataDevice_fn) clGetExtensionFunctionAddressForPlatform (clGetProfileDataDeviceIntelFPGA)

その後関数呼び出しとして関数ポインターを使用します

cl_int status = (get_profile_data_ptr) (device program false true false 0 NULL NULL NULL)

664 ホストを経由した FPGA のプログラミング

インテル FPGA SDK for OpenCL オフラインコンパイラーはホストアプリケーションから独立してカーネルをコンパイルするオフラインコンパイラーです カーネルを OpenCL ランタイムにロードするにはclCreateProgramWithBinary関数をホストアプリケーションに含めます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

97

注意 ホストシステムが複数のプロセッサーで構成されている場合FPGA には一度に 1 つのプロセッサーしかアクセスできません例えば2 つのプロセッサーに対応する 2 つのホストアプリケーションが同じFPGA にカーネルを同時に起動しようとしているとします2 番目のホストアプリケーションはデバイスがビジーであることを示すエラーメッセージを受け取ります2 番目のホストアプリケーションは1番目のホストアプリケーションが OpenCL のコンテキストを解放するまで実行できません

1 オフラインコンパイラーで OpenCL カーネルをコンパイルしaocxファイルを作成します

2 ホストアプリケーションに clCreateProgramWithBinary関数を含めaocxファイルから cl_program OpenCL プログラムオブジェクトを作成します

3 ホストアプリケーションに clBuildProgram関数を含め指定したデバイスで実行可能なプログラムファイルを作成します

以下はclCreateProgramWithBinaryを使用し FPGA デバイスをプログラムするホストコード例です

size_t lengths[1]unsigned char binaries[1] =NULLcl_int status[1]cl_int errorcl_program programconst char options[] =

FILE fp = fopen(programaocxrb)fseek(fp0SEEK_END)lengths[0] = ftell(fp)binaries[0] = (unsigned char)malloc(sizeof(unsigned char)lengths[0])rewind(fp)fread(binaries[0]lengths[0]1fp)fclose(fp)

program = clCreateProgramWithBinary(context 1 device_list lengths (const unsigned char )binaries status amperror)clBuildProgram(program1device_listoptionsNULLNULL)

clBuildProgram関数が正常に実行されるとCL_SUCCESSが返されます

4 clCreateKernelsInProgramまたは clCreateKernel関数を使用しプログラム実行可能ファイルからカーネルオブジェクトを作成します

5 カーネルを実行するための関数を含めスケジュールされたカーネルを FPGA で実行するようホストランタイムに指示します

mdash NDRange カーネルを実行するためのコマンドをエンキューするにはclEnqueueNDRangeKernelを使用します

mdash 単一ワークアイテムのカーネルをエンキューするにはclEnqueueTaskを使用します

注意

インテルでは使用されていないイベントオブジェクトを解放することを推奨していますSDK は明示的な指示があるまでイベントオブジェクトを解放せずに保持し続けます使用していないイベントオブジェクトを保持し続けると不必要にメモリーが消費されます

イベントオブジェクトの解放にはclReleaseEvent関数を呼び出します

複数の FPGA のプログラムをメモリーにロードすることができますホストはそれらを使用し必要に応じて FPGA を再プログラムします

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

98

OpenCL ホストランタイムの API 呼び出しに関してはOpenCL Specification version 10 を参照ください

関連情報OpenCL Specification version 10

6641 複数の FPGA デバイスのプログラミング

システムに複数の FPGA デバイスをインストールする場合ホストコードを変更し特定の FPGA デバイスをプログラムするようホストランタイムに指示できます

重要 ホストアプリケーションを FCD にリンクすると異なるカスタムプラットフォームから複数の FPGA デバイスをターゲットにすることができますただし161 よりも前のバージョンの SDK と互換性のあるカスタムプラットフォームにおいてはこの機能に対するサポートが制限されています

次のように 大 128 の FPGA デバイスをシステムに提示できます

bull それぞれが単一の FPGA で構成されている複数の FPGA アクセラレーターボード

bull PCIe スイッチを介しホストシステムに接続する単一アクセラレーターボード上の複数の FPGA

bull 上記の組み合わせ

ホストランタイムはそれぞれの FPGA デバイスすべてにカーネルをロードすることができますまたFPGA デバイスは並列に動作できます

関連情報カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

66411 OpenCL FPGA デバイスの診断

ホストはシステムにインストールされている OpenCL FPGA のデバイス数を特定する必要があります

1 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出します

2 ホストアプリケーションに次のコード行を追加しホストに Open CL FPGA のデバイス数を特定させます

Get the platformciErrNum = clGetPlatformID(ampcpPlatform)

Get the devicesciErrNum = clGetDeviceIDs(cpPlatform CL_DEVICE_TYPE_ALL 0 NULL ampciDeviceCount)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) が含まれます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

99

関連情報FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

66412 デバイス情報の照会

OpenCL FPGA デバイスの情報を照会するようホストに指示することができます

bull システムにインストールされている OpenCL FPGA デバイスのリストを出力するようホストに指示するには次のコード行をホストアプリケーションに追加します

char buf[1024]for (unsigned i = 0 i lt ciDeviceCount i++) clGetDeviceInfo(cdDevices[i] CL_DEVICE_NAME 1023 buf 0) printf(Device d sn i buf)

デバイス情報を照会するとホストは次のように FPGA デバイスの一覧を表示します Device ltNgtltboard_namegt ltname_of_FPGA_boardgt

以下が詳細になります

bull ltNgt はデバイスの番号です

bull ltboard_namegt はaocコマンドを呼び出す際に FPGA デバイスをターゲットにするボードの指定です

bull ltname_of_FPGA_boardgt はFPGA ボードに公示されている名前です

例えばシステムに同一の FPGA ボードが 2 つある場合ホストは次のような出力を生成します

Device 0 board_1 Stratix V FPGA BoardDevice 1 board_1 Stratix V FPGA Board

注意 clGetDeviceInfo関数は aoc -list-boards コマンドの呼び出し時にインテルFPGA SDK for OpenCL オフラインコンパイラーが画面上に表示するボードタイプを返します(board_1など)アクセラレーターボードに FPGA が複数含まれている場合各デバイスは「ボード」として扱われ一意の名前が付けられます

関連情報利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

66413 複数の 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 Stringunsigned char load_file(const char filename size_t size_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

100

FILE fp = fopen(aocx_namerb) fseek(fp0SEEK_END) size_t len = ftell(fp) char result = (unsigned char)malloc(sizeof(unsigned char)len) rewind(fp) fread(resultlen1fp) fclose(fp) size_ret = len return result

Create a Program that is compiled for the devices in the device_listcl_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 devicesn aocx_name num_devices) const unsigned char binaries = (const unsigned char)malloc(num_devicessizeof(unsigned char)) size_t lengths=(size_t)malloc(num_devicessizeof(size_t)) cl_int err for(cl_uint i=0 iltnum_devices i++) binaries[i] = load_file(aocx_nameamplengths[i]) if (binaries[i]) printf(couldnt load sn aocx_name) exit(-1)

cl_program p = clCreateProgramWithBinary(context num_devices device_list lengths binaries NULL amperr) free(lengths) free(binaries) if (err = CL_SUCCESS) printf(Program Create Errorn) return p

main program

main () Normal OpenCL setup program = createMultiDeviceProgram(context device_list num_devices programaocx)clBuildProgram(programnum_devicesdevice_listoptionsNULLNULL)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

101

665 ランタイム環境の終了とエラー回復

ホストアプリケーションが予期せず終了した場合ランタイム環境を再起動しFPGA を再プログラムする必要があります

ランタイム環境はホストアプリケーションの一部としてコンパイルされるライブラリーですホストアプリケーションが終了するとランタイム環境もまた実行する追跡アクティビティーとともに終了しますホストアプリケーションを再起動すると新しいランタイム環境および関連する追跡アクティビティーが再度初期化されます初期化関数はカーネルのハードウェア状態をリセットします

同様にホストアプリケーションが予期せず終了した場合特定のハードウェア (PCIe ハード IP など)のコンフィグレーションが不完全に終わりますこれらのハードウェアのコンフィグレーションを復元するためにホストは FPGA を再プログラムする必要があります

カスタマイズされたハードウェアブロックを実装するカスタムプラットフォームを使用している場合ホストアプリケーションを再起動しそれらのブロックをリセットすることでデザインに影響を与える可能性があることに注意してください

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すと利用可能なすべてのデバイスに対してカーネルとチャネルはすべてリセットされます

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すとデバイスのリセット時にFIFO バッファーとチャネルがリセットされます

bull ホストアプリケーションはclCreateBufferおよび clEnqueueWriteBuffer関数呼び出しを介しメモリーバッファーを初期化します新しいホスト実行において前回のホスト実行時のバッファーの内容へはアクセスすることができません

67 SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て

インテルでは インテル SoC で動作する OpenCL カーネルはFPGA DDR メモリーではなく共有メモリーにアクセスすることを推奨していますFPGA DDR メモリーには非常に高い帯域幅でカーネルがアクセス可能ですただしARM CPU から FPGA DDR メモリーへの読み出しおよび書き込み動作はダイレクトメモリーアクセス (DMA) を使用していないため非常に低速ですFPGA DDR メモリーはテスト目的でカーネル間または単一のカーネル内で一時データを渡すためだけに予約ください

注意 bull カーネル間の共有バッファーは揮発性としてマークしあるカーネルによるバッファーの変更が他のカーネルも認識できるようにしてください

bull 共有メモリーにアクセスするにはホストコードの変更のみが必要ですカーネルコードの変更は必要ありません

bull ライブラリー関数 mallocまたは new演算子で物理的に共有されたメモリーを割り当てることはできませんまたCL_MEM_USE_HOST_PTRフラグは共有メモリーでは機能しません

DDR メモリーでは共有メモリーは物理的に連続している必要がありますFPGA はSG-DMA コントローラーコアなしでは実質的に連続したメモリーを消費することができませんmalloc関数および new演算子は実質的に連続したメモリーへアクセスするためのものです

bull 共有メモリーの CPU キャッシュは無効になっています

bull 共有メモリーを使用する際はデータのコピー 1 つがホストとカーネルの両方で使用されますこのメモリーを使用するとOpenCL メモリーの呼び出しはバッファー読み取りバッファー書き込みマッピングおよびアンマッピングに対しゼロコピー転送で実行されます

ARM CPU と FPGA は共有メモリーに同時にアクセスできますclEnqueueReadBufferおよびclEnqueueWriteBuffer呼び出しをホストコードに含めFPGA または CPU にデータを認識させる必要はありません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

102

bull 共有メモリーの割り当てとアクセスには次の例のようなホストコードを構築します

cl_mem src = clCreateBuffer(hellip CL_MEM_ALLOC_HOST_PTR size hellip)int src_ptr = (int)clEnqueueMapBuffer (hellip src size hellip)src_ptr = input_value host writes to ptr directlyclSetKernelArg (hellip src)clEnqueueNDRangeKernel(hellip)clFinish()printf (ldquoResult = dnrdquo dst_ptr) result is available immediatelyclEnqueueUnmapMemObject(hellip src src_ptr hellip)clReleaseMemObject(src) actually frees physical memory

CONFIG_CMA_SIZE_MBYTESカーネルコンフィグレーションオプションを含め割り当てに有効な共有メモリーの 大総量を制御することができます実際には割り当てられた共有メモリーの総量はCONFIG_CMA_SIZE_MBYTESの値よりも小さくなります

重要

1 ターゲットボードに複数の DDR メモリーバンクがある場合clCreateBuffer( CL_MEM_READ_WRITE )関数はメモリーを非共有 DDR メモリーバンクに割り当てますただしFPGA が共有メモリーである単一DDR バンクへアクセスできる場合clCreateBuffer(CL_MEM_READ_WRITE ) はCL_MEM_ALLOC_HOST_PTRフラグを使用するのと同様にメモリーを共有メモリーに割り当てます

2 clCreateBuffer( CL_MEM_ALLOC_HOST_PTR size )関数で要求する共有メモリーはLinux OpenCL カーネルドライバーに割り当てられLinuxカーネルの連続したメモリー割り当て (CMA) 機能に依存しますCMA を有効にしコンフィグレーションする方法に関してはIntel FPGA SDK for OpenCL Intel Arria 10SoC Development Kit Reference Platform Porting Guideの Recompiling theLinux Kernel for the Intel Arria 10 SoC Development Kit および Compilingand Installing the OpenCL Linux Kernel Driverの章を参照ください

bull 共有ハードプロセッサーシステム (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 に共有メモリーとして割り当てます

bull ホストがコンスタントメモリーを共有 HPS DDR システムに割り当てカーネル実行後にそれを変更すると変更が有効にならない可能性がありますその結果続くカーネル実行に古いデータが使用される可能性がありますカーネルの実行に古いコンスタントメモリーが使用されないようにするため次のいずれかを実行してください

a コンスタントメモリーの初期化後はそれを変更しない

b 複数の__constantデータセットが必要な場合複数のコンスタントメモリーバッファーを作成する

c 可能であればアクセラレーターボードの FPGA DDR にコンスタントメモリーを割り当てる

関連情報bull Recompiling the Linux Kernel for the Intel Arria 10 SoC Development Kit

bull Compiling and Installing the OpenCL Linux Kernel Driver

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

103

68 徐々に速度低下する OpenCL システムのデバッグ

ホストアプリケーションのループがイベントを解放しないまま作成を続けるとOpenCL システムが実行中に徐々に遅くなることがありますこの速度低下を緩和するにはホストアプリケーションがスケジューリングや時間のプロファイリングに不要になった cl_eventオブジェクトを解放する必要があります

OpenCL システムに多数の不要なイベントが存在するために速度低下が発生しているかどうかを確認するにはコンテキストのコールバック警告またはエラーを出力するコンテキストコールバック関数を次のコード例に示すように定義します

void oclContextCallback (const char errinfo const void size_t void ) printf (Context callback sn errinfo)int main() hellip Create the context context = clCreateContext (NULL num_devices device ampoclContextCallback NULL ampstatus) hellip

システムで発生しているイベント数がイベントオブジェクトのしきい値制限である 1000 を超えるとコールバック関数は次の警告メッセージを出力します

[Runtime Warning] Too many event objects in the host This causes deterioration in runtime performance

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

104

7 OpenCL カーネルのコンパイル

インテル FPGA SDK for OpenCL はカーネルのコンパイルプロセスのカスタマイズを可能にするコンパイラーのオプション一覧を提供します インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドはaocコマンドコンパイラーのオプションと設定カーネルファイル名から構成されますaocコマンドを呼び出し特定の FPGA ボードをターゲットにしたりレポートを生成したり 適化に向けた手法を実装したりするようコンパイラーに指示することができます

OpenCL カーネルをコンパイルする前に QUARTUS_ROOTDIR_OVERRIDE 環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアを指定していることを確認してください

この環境変数の設定が正しくない場合 インテル FPGA SDK for OpenCL スタートガイド の インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章に記載されている手順に基づき設定を変更してください

CompilingEncryptedSource

aocコマンドでは提供されている暗号化されたclファイルをコンパイルする際にその暗号化されたファイルのみをコンパイルすることが可能です暗号化された複数のclファイルを aocコマンドで同時にコンパイルすることはできませんご自身で暗号化したカーネルソースファイルをコンパイルすることはできません

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル

OpenCL カーネルのコンパイルおよびハードウェアのコンフィグレーションファイル (aocxファイル) の作成は1 ステップで行うことができます

インテルでは次のような状況においてこの 1 ステップコンパイル手法を使用することを推奨しています

bull インテル FPGA SDK for OpenCL デザインフローでカーネルを 適化しFPGA に展開するaocxファイルの作成準備が整っている場合

bull 適化を必要としない単純なカーネルが 1 つ以上ある場合

カーネルのコンパイルおよびaocxファイルの生成を 1 ステップで行うには aocltyour_kernel_filename1gtcl [ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

インテル FPGA SDK for OpenCL オフラインコンパイラーはclファイルを一時ファイルにグループ化しますその後このファイルを使用しaocxファイルを生成します

注意 aocコマンドを実行しaocoファイル ( aoc ltyour_kernel_filenamegtaoco) をコンパイルする場合オフラインコンパイラーはaocrファイルとaocxファイルをどちらも生成します

72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネルのコンパイルおよび OpenCL パーサーの出力の生成を行うには-cオプションを aocコマンドに含めます

注意 -cフラグはインクリメンタルコンパイルフローではサポートされていません

bull コマンドプロンプトで aoc -c ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

aocコマンドを-cフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを生成します

mdash 各clカーネルソースファイルのaocoファイルオフラインコンパイラーはaocoファイルを数秒から数分で作成します

73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネル (cl) をコンパイルし各カーネルに向けたaocoオブジェクトファイルを生成後それらをリンクしaocrファイルを作成するには-rtlオプションをaocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

106

bull 1 つもしくは複数のカーネルソースファイルをコンパイルするにはコマンドプロンプトで aoc-rtl ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtclに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを作成します

mdash 各clカーネルソースファイルのaocoファイルその後オフラインコンパイラーはそれらをリンクしaocrファイルを生成しますaocoファイルまたはaocrファイルの生成は数秒から数分で行われます

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

bull 1 つ以上のaocoオブジェクトファイルをコンパイルするには aoc -rtlltyour_kernel_filenamegtaoco [ltyour_kernel_filename2gtaoco ]コマンドをコマンドプロンプトで呼び出します

この [ ltyour_kernel_filename2gtaoco ] はオブジェクトファイルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtaocoに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーは次のファイルとディレクトリーを作成します

mdash オフラインコンパイラーはすべてのaocoファイルをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)

インテル FPGA SDK for OpenCL オフラインコンパイラーがカーネルのコンパイル中にヘッダーファイルを検索するディレクトリーリストにディレクトリーを追加するには -I=ltdirectorygt オプションを aocコマンドに含めます

ヘッダーファイルがカーネルと同じディレクトリーにある場合は -I=ltdirectorygt オプションをaocコマンドに含める必要はありませんオフラインコンパイラーは現在のフォルダーまたはディレクトリーでヘッダーファイルを自動的に検索します

bull コマンドプロンプトで aoc -I=ltdirectorygt ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

107

注意 Windows システムの場合インクルードパスの末尾にスラッシュが含まれていないことを確認してくださいオフラインコンパイラーは末尾のスラッシュ () またはバックスラッシュ () を不正と認識します

次のような方法で aocコマンドを呼び出すとオフラインコンパイラーはエラーメッセージを生成します

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

インクルードパスの正しい指定方法は以下のようになります

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

75 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)

aocrファイル名またはaocxファイル名を指定するには -o ltfilenamegt オプションをaocコマンドに含めます

bull 複数ステップでのコンパイルフローを実行する場合は出力ファイル名を次のように指定します

a 中間コンパイルの段階でオフラインコンパイラーが作成するaocoファイルの名前を指定するには aoc -rtl -o ltyour_object_filenamegtaocr ltyourkernel_filenamegtclコマンドを呼び出します

b 終コンパイルの段階でオフラインコンパイラーが作成するaocxファイルの名前を指定するには aoc -o ltyour_executable_filenamegtaocxltyour_object_filenamegtaocrコマンドを呼び出します

bull 1 ステップでのコンパイルフローを実行する場合は aoc -oltyour_executable_filenamegtaocx ltyour_kernel_filenamegtclコマンドを呼び出しaocxファイル名を指定します

76 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)

特定の FPGA ボードに対し OpenCL カーネルをコンパイルするには -board=ltboard_namegtオプションを aocコマンドに含めます

警告 -rtlフラグをともなう中間コンパイル中にkernel1clファイルをボード X (-board=X) にkernel2clファイルをボード Y (-board=Y) にコンパイルすると インテル FPGA SDK forOpenCL オフラインコンパイラーは aoc -rtl kernel1aoco kernel2aocoコマンドを実行した際にエラーメッセージを発行し終了します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

108

-board=ltboard_namegt オプションを aocコマンドに含めてカーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはプリプロセッサーマクロAOCL_BOARD_ltboard_namegt を 1 に定義しますこれによりデバイスに 適化されたコードをカーネルにコンパイルすることができます

bull カスタムプラットフォームで利用可能な FPGA ボードの名前を取得するには aoc -list-boards コマンドを呼び出します

オフラインコンパイラーは以下のような出力を生成します

Board ListFPGA_board_1

この FPGA_board_1はltboard_namegt です

特定のカスタムプラットフォームの利用可能な FPGA ボードをすべて一覧表示することも可能です-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc ndashboard-package=ltcustom_platform_pathgt -list-boards=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーは特定のカスタムプラットフォームで利用可能なボードの一覧を表示します

bull OpenCL カーネルを FPGA_board_1 にコンパイルするには aoc-board=FPGA_board_1 ltyour_kernel_filenamegtclコマンドを呼び出しますオフラインコンパイラーはプリプロセッサーマクロ AOCL_BOARD_FPGA_board_1を 1 に定義しFPGA_board_1 をターゲットとするカーネルコードをコンパイルします

bull 複数のカスタムプラットフォーム (ボードパッケージ) がインストールされている場合特定のカスタムプラットフォームのボードバリアントでカーネルをコンパイルできます-board-package=ltcustom_platform_pathgt オプションを -board=ltboard_namegt とともに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -board=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーはltcustom_platform_pathgt で指定されているボードでカーネルをコンパイルします

bull システムで利用可能なカスタムプラットフォームのリストを表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します インテル FPGA SDK for OpenCL オフラインコンパイラーは次の例のような出力を生成します

Installed board packagesltboard_package_1gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_2gt

この ltboard_package_Ngt はシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

109

ヒント 特定の FPGA ボードをターゲットとするコンパイル済みのカーネルファイルを容易に識別するためインテルでは-oオプションを aocコマンドに含めカーネルバイナリーの名前を変更することを推奨しています

bull 1 ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次のコマンドを呼び出します

aoc -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 複数ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次の作業を実行します

1 以下のコマンドを呼び出しaocoファイルを生成します

aoc -rtl -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltmy_object_filenamegt_FPGA_board_1aocr

2 以下のコマンドを呼び出しaocxファイルを生成します

aoc -board=FPGA_board_1 ltyour_object_filenamegt_FPGA_board_1aocr -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 2 つの FPGA で構成されるアクセラレーターボードの場合各 FPGA デバイスには同等の「ボード」名が付けられます (例えば board_fpga_1board_fpga_2 など)kernel_1clのターゲットを board_fpga_1kernel_2clのターゲットを board_fpga_2 にするには次のコマンドを呼び出します

aoc -board=board_fpga1 kernel_1claoc -board=board_fpga2 kernel_2cl

関連情報インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-oltfilenamegt) (108 ページ)

77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)

デザインがフィッティング制約を満たしていないためにOpenCL カーネルのコンパイルがハードウェアの生成段階で失敗することがありますこの場合aocコマンドの -high-effortオプションを使用しカーネルを再コンパイルしてください

フィッティング制約の問題によってカーネルのコンパイルが失敗すると インテル FPGA SDK forOpenCL オフラインコンパイラーは次のエラーメッセージを表示します

Error Kernel fit error recommend using -high-effortError Cannot fit kernel(s) on device

bull この問題を解決するには次のコマンドを実行しカーネルを再コンパイルします

aoc -high-effort ltyour_kernel_filenamegtcl

コマンドを呼び出すとオフラインコンパイラーは次のメッセージを表示します

High-effort hardware generation selected compile time may increase significantly

オフラインコンパイラーはカーネルの再コンパイルとハードウェアの生成を 3 回試みます-high-effortを試みた後もコンパイルが失敗する場合はカーネルを変更してください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

110

78 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt)

fmax ターゲットのスケジュールはスケジューリングプロセス中にスケジューラーが試みるパイプライン化の努力目標を決定します

次のオプションの一方または両方を使用しカーネル固有の fmax ターゲットを指定できます

bull __attribute__((scheduler_target_fmax_mhz(__x))) ソースレベル属性を使用する

bull aocコマンドの-fmax=ltfmax target in Mhzgt ですべてのカーネルをグローバルにコンパイルするようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示する

コマンドラインオプションとソースレベル属性をどちらも使用する場合カーネル属性が優先されます次のコードを例にします

kernel void k1() __attribute__((scheduler_target_fmax_mhz(200))) kernel void k2()

オフラインコンパイラーに aocコマンドの-fmax=300をコンパイルするよう指示するとコンパイラーはカーネル k1を 300 MHzカーネル k2を 200 MHz でスケジュールします

重要 スケジュールされたターゲット fmax はコンパイル中のパイプライン化の努力目標を決定します インテル Quartus Prime 開発ソフトウェアプロエディションコンパイラーを実行し実際の fmax の値を取得してください

79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーはマクロの定義を渡し条件付きでのコードのコンパイルを可能にするプリプロセッサーマクロをサポートします

bull プリプロセッサーマクロの定義をオフラインコンパイラーに渡すには aoc -Dltmacro_namegt ltkernel_filenamegtclコマンドを呼び出します

bull 定義済みのプリプロセッサーマクロの既存値を上書きするには aoc -Dltmacro_namegt=ltvaluegt ltkernel_filenamegtclコマンドを呼び出します

次のカーネル sumのコードを例にします

ifndef UNROLL_FACTOR define UNROLL_FACTOR 1endif

__kernel void sum (__global const int restrict x __global int restrict sum) int accum = 0

pragma unroll UNROLL_FACTOR for(size_t i = 0 i lt 4 i++) accum += x[i + get_global_id(0) 4]

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

111

sum[get_global_id(0)] = accum

UNROLL_FACTORの 1 を 4 に上書きし設定するには aoc -DUNROLL_FACTOR=4sumclコマンドを呼び出しますこのコマンドを呼び出すことはsumカーネルソースコードのdefine UNROLL_FACTOR 1の行をdefine UNROLL_FACTOR 4に置き換えることと同等です

bull プリプロセッサーマクロを使用しカーネルのソースコードを変更することなくオフラインコンパイラーによるカーネルの 適化を制御するには aoc -olthardware_filenamegtaocx -D ltmacro_namegt=ltvaluegtltkernel_filenamegtclを呼び出します

以下に詳細を説明します

-oはオフラインコンパイラーが生成するaocxファイル名を指定するために使用するオフラインコンパイラーのオプションです

lthardware_filenamegt は指定したプリプロセッサーマクロの値を使用しオフラインコンパイラーが生成するaocxファイルの名前です

ヒント

コンパイル結果をどちらもファイルシステムに保存するにはaocコマンドの-oフラグを使用しカーネルを個別のバイナリーとしてコンパイルします

例えば同じカーネルを必要なワークグループサイズの 64 および 128 で複数回コンパイルする場合次のように WORK_GROUP_SIZEプリプロセッサーマクロをカーネル属性reqd_work_group_sizeに定義できます

__attribute__((reqd_work_group_size(WORK_GROUP_SIZE11)))__kernel void myKernel()for (size_t i = 0 i lt 1024 i++) statements

次のコマンドを入力しカーネルを複数回コンパイルします

aoc ndasho myKernel_64aocx ndashDWORK_GROUP_SIZE=64 myKernelcl

aoc ndasho myKernel_128aocx ndashDWORK_GROUP_SIZE=128 myKernelcl

710 コンパイル進捗レポートの生成 (-v)

インテル FPGA SDK for OpenCL オフラインコンパイラーにコンパイルの進捗を報告させるには-vオプションを aocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

112

bull フルコンパイルの進捗をオフラインコンパイラーに報告させるには aoc -vltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc Setting up project for CvP revision flowaoc Hardware generation completed successfully

bull ハードウェアを構築しない中間コンパイルの進捗をオフラインコンパイラーに報告させるにはaoc -rtl -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc To compile this project run aoc ltyour_kernel_filenamegtaoco

bull エミュレーションに向けたコンパイルの進捗を報告するようオフラインコンパイラーに指示するには aoc -march=emulator -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parserexaoc OpenCL parser completed successfullyaoc Compiling for Emulation aoc Emulator Compilation completed successfullyEmulator flow is successful

関連情報bull ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-

rtl) (106 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

711 リソース推定使用率要約の画面表示 (-report)

デフォルトにおいてインテル FPGA SDK for OpenCL オフラインコンパイラーはハードウェアのリソース使用率をコンパイル中に見積もりますオフラインコンパイラーはPCIeメモリーコントローラーDMA エンジンなどの外部インターフェイスの使用率も計算に含めますカーネルのコンパイル中にオフラインコンパイラーは推定されるリソース使用率の要約を ltyour_kernel_filenamegtディレクトリーの ltyour_kernel_filenamegtlogファイルに生成します 推定されるリソース使用率の要約を画面上で確認するには-reportオプションを aocコマンドに含めてください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

113

推定リソース使用率の要約はフルコンパイルを実行しなくても確認することができますハードウェアのコンフィグレーションファイルを生成する前に画面上で使用率の要約を確認するには-rtlオプションを aocコマンドに含めてください

bull コマンドプロンプトで aoc -rtl ltyour_kernel_filenamegtcl -report コマンドを呼び出しますオフラインコンパイラーは次のような出力を生成します

+--------------------------------------------------------------------+ Estimated Resource Usage Summary +----------------------------------------+---------------------------+ Resource + Usage +----------------------------------------+---------------------------+ Logic utilization 35 ALUTs 22 Dedicated logic registers 15 Memory blocks 29 DSP blocks 0 +----------------------------------------+---------------------------

関連情報ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)(106 ページ)

712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)

すべての警告メッセージを抑制するには-Wオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -W ltyour_kernel_filenamegtclコマンドを呼び出します

713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)

警告メッセージをすべてエラーメッセージに変換するには-Werrorオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -Werror ltyour_kernel_filenamegtclコマンドを呼び出します

714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0)

clまたはaocoファイルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはデフォルトでソース情報をコンパイラーレポートに含めソースコードをaocxバイナリーに組み込みます -g0オプションを aocコマンドに含めソース情報をコンパイラーレポートから削除しソースコードとカスタマー IP 情報をaocxファイルから削除します

bull レポートのソース情報とaocxファイルのソースコードおよびカスタマー IP の情報を削除するには aoc -g0 ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

114

715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーでは異なるメモリータイプにわたりグローバルメモリーをバーストインターリーブすることはできません -no-interleaving=ltglobal_memory_typegt オプションを aocコマンドに含め同じタイプのグローバルメモリーバンクすべてのバーストインターリーブを無効にしそれらを手動で管理することができますメモリーバッファーの手動分割はグローバルメモリーにデフォルトで設定されているバーストインターリーブ方式でのコンフィグレーションを上書きします

注意 -no-interleaving オプションはグローバルメモリータイプのパラメーターを必要としますメモリータイプが指定されていない場合オフラインコンパイラーはエラーメッセージを発行します

bull デフォルトのグローバルメモリーのバーストインターリーブを無効にするようオフラインコンパイラーに指示するにはaoc ltyour_kernel_filenamegtcl -no-interleaving=default コマンドを呼び出します

アクセラレーターボードには複数のグローバルメモリータイプが含まれる場合がありますデフォルトのグローバルメモリータイプを特定するにはご利用のカスタムプラットフォームのボードメーカーより提供されている資料を確認ください

bull 異種メモリーのシステムにおいて特定のグローバルメモリータイプのバーストインターリーブを無効にするようオフラインコンパイラーに指示するには次の作業を実行します

a カスタムプラットフォームの Board_specxmlファイルで利用可能なグローバルメモリータイプ名を確認します (DDRクアッドデータレート (QDR) など)

b 例えばDDR のメモリータイプのバーストインターリーブを無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDRコマンドを呼び出しますオフラインコンパイラーはDDR メモリーバンクの手動分割を有効にし他のメモリーバンクをバーストインターリーブ方式でコンフィグレーションします

c 複数のタイプのグローバルメモリーバッファーのバーストインターリーブを無効にするには-no-interleaving=ltglobal_memory_typegt オプションを各グローバルメモリータイプに含めます

例えばDDR と QDR のバーストインターリーブをどちらとも無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDR -no-interleaving=QDRコマンドを呼び出します

注意 バッファーを複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

716 グローバルメモリーのリング型相互接続の強制 (-global-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーはデザインのさまざまな特性を考慮しグローバルメモリーの 適な相互接続トポロジーの選択を試みます

コンパイラーの選択を無効にしリング型トポロジーを強制するには -global-ring オプションを aocコマンドで使用しますこのオプションはツリー型トポロジーの使用によって fmax が制限されている場合などにカーネルの fmax を向上させることができます特に4 バンク以上のグローバルメモリーをともなうボードサポートパッケージをターゲットとするデザインの fmax にこのオプションは有効に働きます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

115

例 aoc -global-ring ltyour_kernel_filenamegtcl

717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製(-duplicate-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーが (自動選択または-global-ringでリングを強制し) グローバルメモリーの相互接続のためのリング型トポロジーを実行する際のグローバルメモリーへのカーネル書き込みスループットを向上させるには -duplicate-ring オプションを aocコマンドで使用します

このオプションは相互接続の幅を広げるためより多くの書き込みが並行して発生するようになりますしたがってより多くの領域を消費します

例 aoc -duplicate-ring ltyour_kernel_filenamegtcl

関連情報グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ)

718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)

-const-cache-bytes=ltNgt フラグを aocコマンドに含めインテル FPGA SDK forOpenCL オフラインコンパイラーにコンスタントメモリーキャッシュサイズをコンフィグレーションするよう指示します ( も近い 2 の乗数に切り上げられます)

デフォルトのコンスタントキャッシュサイズは 16 kB です

bull コンスタントメモリーキャッシュサイズのコンフィグレーションには aoc -const-cache-bytes=ltNgt ltyour_kernel_filenamegtclコマンドを呼び出しますこのltNgt はバイト単位のキャッシュサイズを表します

例えばOpenCL カーネル myKernelclのコンパイル時に 32 kB のキャッシュをコンフィグレーションするには aoc -const-cache-bytes=32768 myKernelclコマンドを呼び出します

注意 __constantアドレス空間をいずれのカーネルも使用していない場合この引数の効果はありません

719 浮動小数点演算処理順序の緩和 (-fp-relaxed)

-fp-relaxedオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーがバランスの取れたツリー構造のハードウェアを実装し浮動小数点演算の処理順序を緩和するようにします

バランスの取れたツリー構造の実装は結果における数値の変動性と引き換えにより効率的なハードウェアをもたらします

注意 この 適化のための制御を実装するには浮動小数点演算の結果における小さな変動を許容できるプログラムでなければなりません

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

116

bull オフラインコンパイラーに対しバランスの取れた木構造のハードウェア実装を実行するよう指示するには aoc -fp-relaxed ltyour_kernel_filenamegtclコマンドを呼び出します

720 浮動小数点演算における丸め処理の削減 (-fpc)

-fpcオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーに中間で行われる浮動小数点演算の丸め処理および変換を可能な限り削除し精度を維持するための追加ビットを持つよう指示します

この 適化に向けた制御を実装すると丸め処理のモードも変更されますこのモードでは一連の浮動小数点演算処理 (乗算加算減算) の 後でのみゼロに丸める処理が行われます

bull オフラインコンパイラーに丸め処理の回数を削減するよう指示するには aoc -fpcltyour_kernel_filenamegtclコマンドを呼び出します

721 OpenCL コンパイルの高速化 (-fast-compile)

コンパイル時間を 40から 90削減しカーネルのaocxファイルを短時間で作成するには-fast-compile インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

-fast-compileフィーチャーは 適化の作業を減らすことによりコンパイル時間を大幅に削減します

コマンドプロンプトで aoc -rtl ltyour_kernel_filename1gtcl-fast-compile コマンドを呼び出します

警告 -fast-compileフィーチャーを有効にすると次のようなパフォーマンス上の問題が発生する可能性があります

bull リソース使用率の増加

bull fmax の低下およびそれにより発生するアプリケーションパフォーマンスの低下

bull 電力効率の低下

インテルでは-fast-compileオプションを内部での開発目的にのみ使用することを推奨しています

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

117

注意 bull -fast-compileコンパイラーオプションは インテル Arria 10 以降のデバイスをターゲットにする OpenCL デザインをコンパイルする場合にのみ使用することができます

bull デザインの完成後 OpenCL カーネルを-fast-compileオプションを指定せずに複数のシードでコンパイルし 高のパフォーマンスを確立します

bull -fast-compileフィーチャーが有効になっているか否かにかかわらずOpenCL システムの初期コンパイルを新しいボードおよび新しいバージョンのインテル FPGA SDK for OpenCL プロエディションで行う場合45 分から 60 分の時間が追加で必要ですこの追加される時間では今後のコンパイルに備えコンパイルの一部をキャッシュしています (この動作はカーネルのパフォーマンスに影響しません)このキャッシュを作成するには環境変数$AOCL_TMP_DIR を共有できる書き込み可能なディレクトリーに定義しますデフォルトでこのキャッシュはLinux の場合vartmpaocl$USERにWindows の場合USERPROFILEAppDataLocalaoclに格納されますこの書き込み可能なディレクトリーは共有ネットワーク位置に設定することで共有できます

キャッシュを作成後は現在のバージョンのインテル FPGA SDK for OpenCL および現在のターゲットボードに対し再度キャッシュを作成する必要はありません

722 カーネルのインクリメンタルコンパイル (-incremental)

OpenCL デザインに加える変更をインクリメンタルにコンパイルするには-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

複数のカーネルを持つ大規模なシステムにおいて単一のカーネルのみ変更する場合 インテル FPGASDK for OpenCL オフラインコンパイラーでは前回のコンパイル結果を再利用し変更したカーネルのみを合成配置ルーティングすることができますこのインクリメンタルコンパイルフィーチャーはコンパイル時間の大幅な短縮につながります

注意 インクリメンタルコンパイルフィーチャーは内部での OpenCL デザインの開発目的に限り有効にしてください 高の回路パフォーマンスを確立するため 終デザインではフルコンパイルを実行してください

インクリメンタルコンパイルフロー例

aoc-incrementalltyour_kernel_filenamegtcl

Update kernels in your OpenCL design

aoc-incremental-fast-compileltyour_kernel_filenamegtcl

1 aoc -incremental ltyour_kernel_filenamegtclコマンドを呼び出しインクリメンタルモードが有効になっている状態で初期セットアップのコンパイルをクリーンなディレクトリーに行います

注意 セットアップをコンパイルする際は-incrementalフラグを必ず有効にしてください

このセットアップのコンパイルは以前のコンパイル結果を再利用しませんセットアップをコンパイルする際は-fast-compileオフラインコンパイラーコマンドオプションを aocコマンドに含めないでくださいこのオプションを含めると今後のインクリメンタルコンパイル時にエラーが発生する可能性が高くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

118

ヒント

インテルではコンパイルの時間が問題にならない場合は必ずセットアップのコンパイルを新しく実行し今後のインクリメンタルコンパイル時にコンパイルが失敗する可能性を低下させることを推奨しています連続して多くのインクリメンタルコンパイルを実行するとコンパイルが失敗する可能性が高くなりますまたハードウェアのパフォーマンスおよび生成されたaocxファイルの効率も低下します

2 ご自身の OpenCL デザインのカーネルを修正します

デザインには複数のclファイルを含めることが可能です

3 デザインのインクリメンタルコンパイルを実行します 適なコンパイル速度を得るために-fast-compileフラグも aocコマンドに含めます

aoc -incremental -fast-compile ltyour_kernel_filenamegtcl

4 reporthtmlファイルの Incremental compile セクションでオフラインコンパイラーが検出した変更を確認してください

reporthtmlファイルは ltyour_kernel_filenamegtreportsディレクトリーにあります

7221 インクリメンタルコンパイルレポート

-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションで OpenCL のデザインをコンパイルするとオフラインコンパイラーはIncremental compile セクションを ltyour_kernel_filenamegt プロジェクトディレクトリーの reporthtmlファイルに含めます

インクリメンタルコンパイルレポートはOpenCL のデザインに関する次のようなメトリクスを提供します

bull レポートの下部にある ltgt of design not preservedメトリクスはデザインの全体的な変更の簡単な概要を示しますこれはコンパイル時間を予測する も良い判断材料です

注意

インクリメンタルコンパイルレポートに表示される FPGA リソースは インテル FPGASDK for OpenCL オフラインコンパイラーが作成する推定エリアモデルに基づき計算されますエリアの数字は標準コンパイル (インクリメンタルではないコンパイル) 時の推定エリア使用量を表しますこの数字をもとに標準コンパイル時にデザインが消費するエリアを見積もることが可能です

FPGA のリソース情報は インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアコンパイルレポートの 終的なエリアと完全に一致しない場合があります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

119

図 -14 セットアップコンパイル時のインクリメンタルコンパイルレポート

図 -15 インクリメンタルコンパイル時のコンパイルレポート

7222 インクリメンタルコンパイルのその他のコマンドオプション

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーに含まれているオプションの機能を有効にしOpenCL デザインのコンパイルをカスタマイズすることができます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

120

複数のカーネルのパーティションへのグループ化 (-incremental-grouping=ltfilenamegt)

デフォルトにおいて インテル FPGA SDK for OpenCL オフラインコンパイラーはインクリメンタルコンパイル時にデザイン内の各カーネルを個別のパーティションに配置します -incremental-grouping=ltpartition_filenamegt コマンドオプションを aocコマンドに含め複数のカーネルを単一のパーティションにまとめることができます通常デザインに含まれるパーティションが少ないほどコンパイル速度は早くなります

例 aoc -incremental-grouping=ltpartition_filenamegtltyour_kernel_filenamegtcl

注意 1 つのカーネルのみを変更した場合でもオフラインコンパイラーはグループ内のすべてのカーネルを再コンパイルしますインテルでは通常同時に変更するカーネルをグループ化することを推奨しています

グループ化されたカーネルが多数のロードおよびストア動作を実行する場合-incremental=aggressiveオプションも aocコマンドに含めコンパイルスピードをさらに加速させることが可能です

-Incremental-groupingオプションに渡すパーティションファイルはプレーンテキストファイルですファイル内の各行は新しいパーティションを指定しておりカーネル名をセミコロン () で区切ったリストを含んでいます例えばパーティションファイルの以下の行は3 つのパーティションを指定しそれぞれに 4 つのカーネルを含んでいます

reader0reader1reader2reader3accum0accum1accum2accum3writer0writer1writer2writer3

アグレッシブモードによるデザインのコンパイル (-incremental=aggressive)

エリア使用量とスループットを引き換えにインクリメンタルコンパイルを加速するには -incremental=aggressiveコマンドオプションを aocコマンドに含めます

このフィーチャーはデザイン内のカーネルが多数のバッファーに対してロードおよびストア動作を行う場合や-incremental-groupingコマンドオプションで複数のカーネルをグループ化した場合に特に有効です

例 aoc -incremental=aggressive -incremental-grouping=ltpartition_filenamegt ltyour_kernel_filenamegtcl

注意 bull アグレッシブモードを有効にするとFmax の低下が示すよりも大きいスループットの低下が生じる可能性があります

bull 各 OpenCL デザインのインクリメンタルコンパイルを行っている間はコンパイルモードを変更しないでくださいデザインをアグレッシブモードでコンパイルする場合そのデザインに対して続けて実行するインクリメンタルコンパイルではすべてアグレッシブモードを有効にしますインクリメンタルコンパイルのモードを切り替えるたびにコンパイルが完了するまでの時間が長くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

121

カスタム入力ディレクトリーの指定 (-incremental-input-dir=ltpath_to_directorygt)

オフラインコンパイラーはインクリメンタルコンパイル中にデフォルトのltyour_kernel_filenamegt プロジェクトディレクトリーを現在の作業ディレクトリーに作成し中間コンパイルファイルを保存しますインクリメンタルコンパイルをデフォルトのプロジェクトディレクトリー以外に配置するには -incremental-input-dir=ltpath_to_directorygtコマンドオプションを aocコマンドに含めます

次のいずれかまたは両方のシナリオでデザインをコンパイルする場合-incremental-input-dirオプションを含める必要があります

bull aocコマンドを前回のコンパイルとは違う作業ディレクトリーから実行する場合

bull -o ltfilenamegt コマンドオプションを前回のコンパイルに含めた場合

mykernelclファイルが初期の作業ディレクトリーにあり同じ mykernelclファイルの別のリビジョンが new_revサブディレクトリーにある以下のシナリオを例にします

aoc -incremental mykernelclcd new_revaoc -incremental -fast-compile mykernelcl -incremental-input-dir=mykernel

このシナリオにおいてオフラインコンパイラーはmykernelプロジェクトディレクトリーにある初期コンパイル時のファイルを再利用しそれをもとに 2 回目のコンパイルを行いますオフラインコンパイラーは元の mykernelディレクトリー内のファイルを変更することなくnew_revmykernelプロジェクトディレクトリーを 2 回目のコンパイルに作成します

-incremental-input-dirコマンドオプションは複数のデベロッパーが同じインクリメンタルセットアップコンパイルを共有する場合に有効です各デベロッパーはその後のインクリメンタルコンパイルを他のデベロッパーのコンパイル結果を上書きすることなく自分の作業スペースで実行できます

自動再試行の無効化 (-incremental-flow=no-retry)

インクリメンタルコンパイルが失敗した場合デフォルトでオフラインコンパイラーはコンパイルの再試行を自動的に行いますその場合パーティションは保存されずに 2 回目のコンパイルが実行されますこの 2 回目のコンパイルはデザイン全体を再コンパイルするため完了までに時間がかかります

オフラインコンパイラーの自動再試行メカニズムを無効にするには-incremental-flow=no-retryコマンドオプションを aocコマンドに含めますこのフィーチャーを有効にすると 初の試みが失敗に終わった際にオフラインコンパイラーは 2 回目のインクリメンタルコンパイルを実行しませんまたオフラインコンパイラーはaocxファイルを生成しません

このフィーチャーを有効にすることにより次のような独自の失敗軽減ストラテジーを実行することが可能になります

bull 複数のシードを並行してコンパイルすることにより 低 1 つのコンパイルが再試行なしで成功する可能性を高める

bull インクリメンタル高速コンパイルに代わり非インクリメンタル高速コンパイル ( aoc -fast-compile ltyour_kernel_filenamegtcl) を実行する

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

122

7223 インクリメンタルコンパイルフィーチャーの制限

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーは インテル Arria10 FPGA をターゲットとする OpenCL デザインにのみ利用可能です

デバイスのサポートのほかにインクリメンタルコンパイルには次の制限があります

bull インクリメンタルコンパイルフィーチャー (-incremental) または高速コンパイルフィーチャー (-fast-compile)もしくはその両方を有効にするとエリアFmax電力の低下が発生します

bull 輻輳したデザインのインクリメンタルコンパイルでは初期セットアップのコンパイルと比較しFmax が大幅に低下することがあります (25以上)Fmax の低下を許容できない場合非インクリメンタル高速コンパイルを実行し一定のコンパイル時間の短縮を維持しながら Fmax の低下量を軽減します

bull オフラインコンパイラーは -l ltlibrary_namegtaoclibオフラインコンパイラーコマンドオプションを呼び出すことで行った RTL ライブラリーの変更を検出しませんRTL ライブラリーを変更した後はセットアップコンパイルを再度行う必要があります

オフラインコンパイラーはセットアップコンパイルを再度実行するよう警告メッセージを表示し注意喚起します

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)

注意 ECC (誤り訂正符号) は初期のインテル FPGA SDK for OpenCL のフィーチャーでプレビューの段階にあります訂正されたエラーおよび検出されたものの訂正されなかったエラーを報告するこのフィーチャーを 大限に活用するにはECC に対応するカスタムプラットフォームをボードメーカーより入手する必要があります

-eccオプションを aocコマンドに含み インテル FPGA SDK for OpenCL オフラインコンパイラーが誤り訂正符号をカーネルのメモリー (M20k および MLAB) で有効にするようにします

ECC の実装には各 32 ビットワードに対しシングルエラー訂正機能とダブルエラー検出機能があります

注意 ECC フィーチャーを有効にするとRAM と ALM の両方でエリアオーバーヘッドが発生しシステムのFmax が低下します

bull オフラインコンパイラーで誤り訂正符号のハードウェア実装を有効にするには aoc -eccltyour_kernel_filenamegtclコマンドを呼び出します

724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)

インテル FPGA SDK for OpenCL オフラインコンパイラーでOpenCL カーネルの呼び出しキューを削除しカーネルのエリア使用量を低減するには -no-hardware-kernel-invocation-queue オプションを aocコマンドに含めます

例 aoc -no-hardware-kernel-invocation-queueltyour_kernel_filenamegtcl

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

123

このオプションを使用することでカーネルの実行時間が長くなる場合がありますカーネルの呼び出しキューはOpenCL ランタイム環境においてカーネルの起動をアクセラレーターにキューすることを可能にしますそのためアクセラレーターはカーネルの呼び出し終了後すぐに同じカーネルの次の実行をスタートできます

注意 -No-hardware-kernel-invocation-queue オプションはカーネルの実行時間がカーネルの呼び出しキュー (20-100us) に隠れているシステムや OpenCL ランタイム環境のオーバーヘッドより長い場合または インテル FPGA SDK for OpenCL オフラインコンパイラーでカーネルのフィットが難しい場合にのみ使用します

カーネル呼び出しキューの使用方法に関してはIntel FPGA SDK for OpenCL Pro Edition BestPractices Guide のトピックUtilizing Hardware Kernel Invocation Queue を参照ください

関連情報Utilizing Hardware Kernel Invocation Queue

725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)

デザインの特定の領域で使用されているハンドシェイクプロトコルを変更するにはaocコマンドの-hyper-optimized-handshaking=ltauto|offgt オプションを使用します

-hyper-optimized-handshaking オプションには次のいずれかの値を設定できます

auto オプションを指定しないデフォルトの動作です可能な場合コンパイラーは 適化を有効にしますそうでない場合は offに設定されます

より高い fmax を要求する場合にこの値を使用しますこのオプションを有効にすると インテル FPGA SDK for OpenCL オフラインコンパイラーはストールを許容するノードのハンドシェイクパスにパイプラインレジスターを追加しますこれによりエリアとレイテンシーが増加する代わりに fmax が高くなります

例 aoc -hyper-optimized-handshakingltyour_kernel_filenamegtcl

off コンパイラーはfmax が低下する潜在的な可能性と引き換えに低レイテンシーに向けた 適化を試みますこのハンドシェイクの高度な 適化を無効にするとエリアの縮小につながる可能性もありますこれはfmax をあまり必要としない小規模なデザインにおいてレイテンシーとエリアを低減できるため効果的です

例 aoc -hyper-optimized-handshaking=offltyour_kernel_filenamegtcl

注意 -hyper-optimized-handshaking オプションは インテル Stratixreg 10 をターゲットにするデザインにのみ適用されます インテル Stratix 10 デバイス以外のターゲットデバイスにこのオプションを使用するとコンパイルが失敗しエラーが発生します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

124

8 OpenCL カーネルのエミュレーションとデバッグ

インテル FPGA SDK for OpenCL Emulator はカーネルの機能性を評価します

インテル FPGA SDK for OpenCL Emulator はx86-64 Windows または Linux ホストで実行するaocxファイルを生成しますこの機能によりカーネルの機能性をエミュレーションし毎回実際のFPGA で実行することなくデザインを反復することが可能になりますLinux のプラットフォームではエミュレーターを使用し機能のデバッグを実行することも可能です

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインのエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインを SoC ボードへターゲットにすることが可能です

エミュレーターは64 ビットの Windows および Linux のオペレーティングシステムをサポートしていますLinux システムではGNU C Library (glibc) version 215 以降のバージョンが必要ですお使いの Linux システムがこの要件を満たさない場合レガシーエミュレーターを利用できる可能性があります詳細はレガシーエミュレーターの使用 (135 ページ) を確認ください

1 高速エミュレーターの設定 (125 ページ)

2 エミュレーションに向けたチャネルカーネルコードの変更 (126 ページ)

3 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128ページ)

4 OpenCL カーネルのエミュレーション (129 ページ)

5 Linux における OpenCL カーネルのデバッグ (130 ページ)

6 インテル FPGA SDK for OpenCL Emulator の制限 (131 ページ)

7 ハードウェアとエミュレーターの結果の不一致 (131 ページ)

8 高速エミュレーターの環境変数 (133 ページ)

9 高速エミュレーターでサポートされている拡張機能 (133 ページ)

10 高速エミュレーターの既知の問題 (134 ページ)

11 レガシーエミュレーターの使用 (135 ページ)

81 高速エミュレーターの設定

インテル FPGA SDK for OpenCL プロエディションを管理者権限でインストールしている場合次の手順を実行する必要はありません インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合は高速エミュレーターを有効にするための作業を行う必要があります

インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合高速エミュレーターを使用する前に次の手順を実行してください

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

1 高速エミュレーターをインストール可能なクライアントドライバー (ICD) エントリーを手動で設定します

bull Linux の場合etcOpenCLvendorsIntel_FPGA_SSG_Emulatoricdファイルが環境変数 INTELFPGAOCLSDKROOT が指定するディレクトリーにあるファイルと一致することを確認しますINTELFPGAOCLSDKROOT 環境変数はSDK をインストールする位置を指しています

ファイルが一致しない場合やetcOpenCLvendorsにファイルが存在しない場合はIntel_FPGA_SSG_Emulatoricdファイルを INTELFPGAOCLSDKROOT 環境変数で指定されている位置からetcOpenCLvendorsディレクトリーへコピーします

bull Windows の場合レジストリーキー HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendorsが次の値を含んでいることを確認してください[HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]intelocl64_emudll=dword00000000

2 インテル FPGA サポートプレビューで インテル FPGA SDK for OpenCL を手動でインストール (または再インストール) します

この手順により64 ビットの インテル SDK for OpenCL オフラインコンパイラーコマンドラインインターフェイス (ioc64) がシステムにインストールされます

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

bull OpenCL Vector Addition Design Example

82 エミュレーションに向けたチャネルカーネルコードの変更

エミュレーターはカーネル間のチャネルをエミュレーションしますFPGA ボードの入出力フィーチャーに接続する IO チャネルのエミュレーションはサポートしていません IO チャネルの読み書きを行うチャネルを持つアプリケーションをエミュレーションするにはカーネルを変更しIO チャネルに代わる読み取りまたは書き込みチャネルを追加しますまたそのチャネルを使用するソースコードを条件付きにします

インテル FPGA SDK for OpenCL はEMULATORのマクロの定義を設定しませんコマンドラインまたはソースコードで手動にて設定する必要があります

次のカーネルを例に説明します

channel unlong4 inchannel __attribute__((io(eth0_in)))

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ulong4 data = read_channel_intel(inchannel) statements

IO チャネルに接続するチャネルを持つカーネルをエミュレーションするエミュレーターを有効にするには次の手順を実行します

1 次のいずれかの方法でカーネルコードを変更します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

126

mdash 次のように一致する write_channel_intel呼び出しを追加する

ifdef EMULATOR

__kernel void io_in (__global char restrict arr int size) for (unsigned i = 0 i lt size i++) ulong4 data = arr[i] arr[i] being an alternate data source write_channel_intel(inchannel data) endif

mdash IO チャネルアクセスを次のようにメモリーアクセスに置き換える

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ifndef EMULATOR

ulong4 data = read_channel_intel(inchannel)

else ulong4 data = arr[i] arr[i] being an alternate data source

endif statements

2 エミュレーション中にこの条件付きカーネルを作成および起動するようホストアプリケーションを変更します

関連情報io チャネル属性を使用した IO チャネルの実装 (44 ページ)

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション

インテル FPGA SDK for OpenCL Emulator は値によってパイプやチャネルを渡すカーネルをサポートします

値によってチャネルまたはパイプを渡すカーネルは次のようにエミュレーションできます

channel uint my_ch

void my_function (channel uint ch __global uint dst int i) dst[i] = read_channel_intel(ch)

__kernel voidconsumer (__global uint restrict dst) for (int i=0ilt5i++) my_function(my_ch dst i )

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

127

822 チャネル深度のエミュレーション

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE環境変数を使用しエミュレーションに向けてカーネルをコンパイルすることで変更できます

この CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数は次の値を取ることができます

ignoredepth カーネルのエミュレーション実行時間が 短になるよう選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性は無視されます

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数が設定されていない場合はこの値がデフォルトで使用されます

default 明示的に深度属性が指定されているチャネルはその深度を持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるよう選択されたデフォルトのチャネル深度が与えられます

strict エミュレーションのチャネル深度はすべてFPGA のコンパイルに指定されている深度に一致するように与えられます

重要 チャネルに対する CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数はカーネルをコンパイルする前に設定する必要がありますパイプの場合はホストプログラムを実行する前に設定する必要があります

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)

エミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorおよび-fast-emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に次の作業を実行します

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認してください

bull LD_LIBRARY_PATH 環境変数の設定に インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認します

bull x86-64 のホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator -fast-emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向けてインテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートではカーネルソースコードの機能的なエラーの原因を特定できます

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

128

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

84 OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行しますOpenCL 高速エミュレーターはFPGA ハードウェアをターゲットとする際とは異なる OpenCL プラットフォームを使用します

カーネルをエミュレーションするには次のステップを実行します

1 ホストプログラムを変更しエミュレーターの OpenCL プラットフォームを選択します

次のプラットフォーム名を選択しホストプログラムのエミュレーション用 OpenCL プラットフォームを選択します

Intel(R) FPGA Emulation Platform for OpenCL(TM)

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細についてはホストアプリケーションと Khronos ICD Loader Library のリンクを確認ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置へ動かします現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを次のように実行します

mdash Windows の場合

a set CL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を定義します

b ホストアプリケーションを実行します

c set CL_CONFIG_CPU_EMULATE_DEVICES=を呼び出し変数の設定を解除します

mdash Linux の場合は envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要のある同一のエミュレーションデバイス数を指定します

注意

エミュレーション用 OpenCL プラットフォーム (Intel(R) FPGA EmulationPlatform for OpenCL(TM)) は物理的なボードへのアクセスを提供しませんエミュレーションされたデバイスのみ利用可能です

ヒント

エミュレーターデバイスを 1 つだけ使用する場合はCL_CONFIG_CPU_EMULATE_DEVICES環境変数を設定する必要はありません

5 ホストまたはカーネルプログラムの変更後にテストを行う場合変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

129

85 Linux における OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL Emulator にデバッガーで OpenCL カーネルを実行しホストアプリケーションの一部として機能的にデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証と設定を行うことができます

注意 カーネルのデバッグはホストのデバッグから独立していますWindows の Microsoft Visual StudioDebugger や Linux の GDB など既存のツールでホストコードをデバッグしてください

デバッグに向けて OpenCL カーネルをコンパイルするには次のステップを実行します

1 特定のアクセラレーターボードをターゲットとするデバッグのaocxファイルを生成するためaoc -march=emulator -fast-emulator -gltyour_kernel_filenamegtclコマンドを呼び出します

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94ページ) を確認ください

3 ltyour_kernel_filenamegtaocxファイルがホストが容易に検索できる位置にあることを確認してください現在の作業ディレクトリーが推奨されます

4 アプリケーションの実行には envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt gdb --argsltyour_host_program_namegt [lthost_program_argumentsgt] コマンドを呼び出しますこの ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムの変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行します

カーネルをデバッガーで実行するには次の作業を実行します

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルを呼び出す前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグを開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yと返答します 初のプログラム実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 エミュレーターはOpenCL ランタイムでいくつかのエラーの詳細をレポートしますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

130

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

86 インテル FPGA SDK for OpenCL Emulator の制限

インテル FPGA SDK for OpenCL Emulator のフィーチャーにはいくつかの制限があります

bull 実行モデル

エミュレーターはFPGA バリアントと同じコンパイルモードをサポートしますそのためclCreateProgramBinary関数を呼び出しエミュレーションのための cl_programオブジェクトを作成する必要があります

bull 並列実行

並行するカーネルの実行のモデリングには制限があります実行中にエミュレーターは通信しているワークアイテムを実際には並行して実行しませんよって異なるカーネルが同期化のためにバリアーなしでグローバルメモリーにアクセスしている場合など並行して実行されている動作によっては実行ごとに一貫性のないエミュレーション結果が生成される可能性があります

bull エミュレーターはホストランタイムとカーネルを同じアドレス空間で実行しますホストアプリケーションで特定のポインターや配列を使用することによりカーネルプログラムが失敗する場合がありますまたその逆も同じです使用例としては外部に割り当てられたメモリーのインデックス化やランダムなポインターへの書き込みなどがありますValgrind などのメモリーリーク検出ツールを使用しプログラムを分析することができますただしカーネルでの範囲を超える書き込み動作によってホストに致命的なエラーが発生する可能性がありますまたその逆も同様です

bull チャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合エミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

87 ハードウェアとエミュレーターの結果の不一致

カーネルをエミュレーションするとOpenCL システムはハードウェアにコンパイルされたカーネルとは異なる結果を生成することがありますシミュレーションでカーネルを実行することでハードウェアにカーネルをコンパイルする前にさらにカーネルをデバッグすることが可能です

警告 この結果における不一致はインテル FPGA SDK for OpenCL Emulator がハードウェアの計算の一部を正確にモデル化できない場合またはプログラムが未定義の動作に依存している場合に通常発生します

エミュレーターとハードウェアの結果の不一致を引き起こす も一般的な理由は次のとおりです

bull OpenCL カーネルコードがpragma ivdepディレクティブを使用しているエミュレーターは真の依存関係が pragma ivdepディレクティブによって壊されている場合OpenCL システムをモデル化しませんハードウェアをフルコンパイルする際にこれは誤った結果として考えられます

bull OpenCL カーネルコードが初期化されていないデータに依存している初期化されていないデータとは初期化されていない変数初期化されていないまたは部分的に初期化されたグローバルバッファーローカル配列プライベート配列などです

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

131

bull OpenCL カーネルコードの動作が正確な浮動小数点演算の結果に依存しているエミュレーターが CPU の浮動小数点計算ハードウェアを使用する一方でハードウェアの実行には FPGA コアとして実装されている浮動小数点コアが使用されます-fp-relaxedの aoc オプションをOpenCL カーネルコードに使用すると演算の順序が変わり浮動小数点の計算結果がさらに変動する可能性があります

注意 OpenCL の標準は各プラットフォームの浮動小数点計算の 下位ビットが 1 つ以上異なることを許容します一方でそれはどのプラットフォームでも正しいと見なされます

bull OpenCL カーネルコードの動作が異なるカーネルのチャネルアクセスの順序に依存しているチャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合にエミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

bull OpenCL カーネルまたはホストコードが範囲外のグローバルメモリーにアクセスしている

注意

mdash 初期化されていないメモリーの読み取りおよび書き込み動作はプラットフォームに依存しますカーネル内のすべてのアドレスを使用している場合clCreateBuffer関数呼び出しを割り当てている場合clEnqueueReadBufferとclEnqueueWriteBuffer関数呼び出しを転送している場合はグローバルメモリーのバッファーサイズを確認してください

mdash Valgrind などのソフトウェアメモリーリーク検出ツールをエミュレーションされたバージョンの OpenCL システムで使用するとメモリーに関する問題を分析できますこれらのツールからの警告がないということは問題がないということを意味するわけではありませんこれは単にツールが問題を検出できなかったことを意味するだけですインテルではこのような状況においてOpenCL カーネルまたはホストコードの手動検証を推奨しています

bull OpenCL カーネルコードが範囲外のローカルまたはプライベート変数にアクセスしている例えば範囲外のローカルまたはプライベート配列にアクセスしている場合やスコープ外になったプライベート変数にアクセスしている場合です

注意

範囲外の変数へのアクセスは通常ソフトウェアのスタックにおいてアクセスされている変数付近の無関係な変数に影響を及ぼすためこれらの問題はソフトウェア用語でスタックの破損問題と呼ばれていますエミュレーションされた OpenCL カーネルは通常の CPU 機能として実装されており破損する可能性のあるスタックを実際に持っていますハードウェアをターゲットにしている場合はスタックが存在しないためスタックの破損問題は必ず別の形で現れますスタックの破損が疑われる場合はValgrind などのメモリーリーク検証ツールを使用することが可能ですがスタック関連の問題の特定は通常困難ですインテルではスタック関連の問題をデバッグするためOpenCL カーネルコードを手動で検証することを推奨しています

bull OpenCL カーネルコードがシフトされる型よりも大きいシフトを使用している例えば 64 ビットの整数を 65 ビットでシフトしている場合などですOpenCL specification version 10 によるとこのようなシフトの動作は未定義です

bull エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度がカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なるこのチャネル深度の相違はカーネルのエミュレーションは問題なく機能する一方でハードウェアでの実行はハングアップするという状況を引き起こす可能性がありますチャネル深度の相違を修正する方法についてはチャネル深度のエミュレーション (128 ページ) を参照してください

bull 出力されるラインの順序に関してはprintf関数で出力される順序がエミュレーターとハードウェアで異なる場合がありますこれはハードウェアにおいて printfデータはグローバルメモリーバッファーに格納されカーネルの実行が完了した際またはバッファーがフルになった際にのみバッファーからフラッシュされるためですエミュレーターの printf関数はx86 stdoutを使用しています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

132

bull 型のアップキャストでアライメントされていないロードやストアを実行するとFPGA とエミュレーターでは異なる結果が生じる可能性がありますこの型のロードおよびストアはC99 の仕様では定義されていません

次例のような演算では予期しない結果になる可能性があります

int tmp = ((int ) (my_ptr + 5))

関連情報シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

88 高速エミュレーターの環境変数

高速エミュレーターの動作を変更する環境変数をいくつか利用することが可能です

OCL_TBB_NUM_WORKERS

エミュレーターが使用できる 大スレッド数を示しますデフォルト値は 32 大値は 255 です各スレッドは単一のカーネルを実行できます

アプリケーションで複数のカーネルを同時に実行する必要がある場合OCL_TBB_NUM_WORKERSを適切に設定する必要があります (使用されているカーネルの数またはそれ以上の値に設定してください)

CL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE

利用可能な OpenCL ローカルメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE

利用可能な OpenCL プライベートメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE

エミュレーションに向けて OpenCL カーネルをコンパイルするとカーネルをハードウェアに向けてコンパイルする際に生成されるチャネル深度とは異なるチャネル深度になりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数で変更できます詳細はチャネル深度のエミュレーション (128 ページ) を参照ください

関連情報チャネル深度のエミュレーション (128 ページ)

89 高速エミュレーターでサポートされている拡張機能

高速エミュレーターはさまざまな OpenCL 拡張機能に対しさまざまなレベルのサポートを提供しています

次の OpenCL の拡張機能は高速エミュレーターで完全にサポートされています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

133

bull cl_intel_fpga_host_pipe

bull cl_khr_byte_addressable_store

bull cl_khr_icd

bull cles_khr_int64

また次の OpenCL 拡張機能をレガシーエミュレーターと同様のレベルでサポートしています

bull cl_intel_channels

bull cl_khr_local_int32_base_atomics

bull cl_khr_local_int32_extended_atomics

bull cl_khr_global_int32_base_atomics

bull cl_khr_global_int32_extended_atomics

bull cl_khr_fp64

bull cl_khr_fp16

810 高速エミュレーターの既知の問題

高速エミュレーターの使用はいくつかの既知の問題に影響を受ける可能性があります起こりうる問題を回避するため高速エミュレーターを使用する際はこれらの問題を考慮ください

自動実行カーネル

自動実行カーネルはclReleaseProgram() 呼び出しの後ではなくホストプログラムの終了後にのみシャットダウンします

コンパイラー診断

一部のコンパイラー診断は高速エミュレーターに未実装です

clEnqueueNDRangeKernel() が返す CL_OUT_OF_RESOURCES エラー

高速エミュレーターがデフォルトでサポートしているよりも多くの__privateまたは__localメモリーをカーネルが使用している場合に発生する可能性があります

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE またはCL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE 環境変数を設定してください詳細は高速エミュレーターの環境変数 (133 ページ) を参照ください

clCreateKernel() が返す CL_INVALID_VALUE エラー

clBuildProgram() の呼び出しが行われていない可能性があります

プログラムがバイナリーから作成されている場合でもこの呼び出しは OpenCL 仕様に必要です詳細はOpenCL Specification version 10 の Section 542 を参照してください

uses_global_work_offsetカーネル属性は認識されない属性であるという警告

OpenCL 高速エミュレーターはuses_global_work_offsetカーネル属性をサポートしていません属性が無視されることを通知する警告がコンパイル時に出されることがありますがこの警告は高速エミュレーターにおけるカーネルの実行には影響しないため無視しても問題ありません

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

134

関連情報bull 高速エミュレーターの環境変数 (133 ページ)

bull The OpenCL Specification Version 10

811 レガシーエミュレーターの使用

インテル FPGA SDK for OpenCL バージョン 181 およびそれ以前のバージョンにおけるデフォルトのエミュレーターは現在も入手可能であり利用することができます ただしインテル FPGAOpenCL システムのエミュレーションには高速エミュレーターの利用を推奨しています

OpenCL カーネルのエミュレーションとデバッグ (125 ページ) で紹介されている推奨事項の多くはどちらのエミュレーターにも適用されますただしレガシーエミュレーターには次の章以降で説明されている違いがいくつかあります

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインでエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインのターゲットを SoC にすることが可能です

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)

レガシーエミュレーターでのエミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に以下の作業を実行してください

mdash FPGA アクセラレーターボードに対しボードメーカーから提供されているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認します

bull Windows システムでカーネルをエミュレーションするにはMicrosoft のリンカーおよびコンパイル用のライブラリーが別途必要になりますPATH 環境変数設定に インテル FPGA SDK forOpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設が インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

135

bull x86-64 ホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull 特定のボードをターゲットとするエミュレーションに向けてカーネルをコンパイルするには aoc-march=emulator -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向け インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードの機能的なエラーの原因を特定できるようになります

関連情報bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

81111 レガシーエミュレーターでのチャネル深度のエミュレーション

レガシーエミュレーターをターゲットにしている場合はエミュレーターのチャネル深度モデル作成における制御が異なります

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルをハードウェアに向けてコンパイルする際に生成されるデフォルトのチャネル深度とは異なりますこの動作はカーネルをエミュレーションに向けてコンパイルする際に-emulator-channel-depth-modelオプションを使用し変更することが可能です

-emulator-channel-depth-modelコンパイラーオプションは次の値を取ることができます

default 明示的な深度属性を持つチャネルは指定された深度持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるように選択されたデフォルトのチャネル深度が与えられます

strict FPGA のコンパイルに指定されている深度と一致するチャネル深度がエミュレーションのすべてのチャネル深度に与えられます

ignore-depth

カーネルのエミュレーション実行時間が 短になるように選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性はいずれも無視されます

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはご自身のカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行します

以下の手順でカーネルをエミュレーションしてください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

136

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションを構築するために必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーをどちらも表示します

2 ホストアプリケーションを構築し手順 1 で検索したライブラリーにリンクします

注意

複数のデバイスを他の OpenCL SDK と共にエミュレーションするにはホストアプリケーションをホストランタイムのライブラリーに接続する前 にKhronos ICD Loader Libraryに接続しますホストアプリケーションと ICD Loader Library の接続はホストアプリケーションの Makefileを変更して行います詳細は ホストアプリケーションと KhronosICD Loader Library のリンク (94 ページ) を参照ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置に移動します現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを実行するには

mdash Windows の場合 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を 初に定義しその後ホストアプリケーションを実行します

ホストアプリケーションを実行した後 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=を呼び出し変数の設定を解除します

mdash Linux の場合 envCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要がある同一のエミュレーションデバイス数を指定します

注意

環境変数 CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA を設定するとエミュレーションされたデバイスのみが利用可能になりますつまり物理的なボードへのアクセスはすべて無効になります

5 ホストまたはカーネルプログラムを変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行してください

エミュレーションされたカーネルを呼び出すたびに共有ライブラリーのコピーであるltprocess_IDgt-libkernelsoがデフォルトの一時ディレクトリーに作成されますこのltprocess_IDgt は各エミュレーションの実行に割り当てられた固有の数値ですWindows ではTMP または TEMP 環境変数を設定しデフォルトのディレクトリーを変更することができますLinux では TMPDIR の設定です

関連情報bull OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-

config または linkflags) (96 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL レガシーエミュレーターにOpenCL カーネルをデバッガーで実行しホストアプリケーションの一部としてデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証および設定を行うことが可能です

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

137

注意 カーネルのデバッグはホストのデバッグから独立していますWindows では Microsoft VisualStudio DebuggerLinux では GDB など既存のツールでホストコードをデバッグしてください

レガシーエミュレーションでのデバッグに向けて OpenCL カーネルをコンパイルするには以下を行います

1 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) (135 ページ) の説明に従いカーネルをコンパイルしてください

2 ホストアプリケーションを構築しKhronos ICD Loader Library に接続します詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ) を参照ください

3 ltyour_kernel_filenamegtaocxファイルがホストが特定できる位置にあることを確認します現在の作業ディレクトリーが推奨されます

4 env CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtgdb --args ltyour_host_program_namegt [lthost_program_argumentsgt]コマンドを呼び出しアプリケーションを実行しますここで ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムを変更した後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行してください

デバッガーでカーネルを実行するには以下を行います

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルが呼び出される前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグをまだ開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行の前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yを返答します 初のプログラムの実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 レガシーエミュレーターはOpenCL ランタイムにいくつかのエラーの詳細を報告しますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

138

9 カーネルの reporthtml ファイルのレビュー

注意 analyze-area インテル FPGA SDK for OpenCL ユーティリティーオプションは廃止されましたカーネルの推定エリア使用率を確認するにはreporthtmlファイルを参照してください

廃止されたエリアレポートに関する参考情報はAltera SDK for OpenCL Best Practices Guideversion 160 の Review Your Kernels Area Report to Identify Inefficiencies in ResourceUsage の章を参照ください

OpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーは面積ループ構造メモリーの使用率カーネルのパイプラインなどカーネルのさまざまな側面を分析する HTML レポートを自動的に生成しますHTML レポートを起動するには ltyour_kernel_filenamegtreportsディレクトリーのreporthtmlファイルを開きます

HTML レポートについての詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

関連情報bull カーネルの reporthtml ファイルのレビュー

bull Altera SDK for OpenCL Best Practices Guide version 160

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

10 OpenCL カーネルのプロファイリング

インテル FPGA Dynamic Profiler for OpenCL はFPGA での OpenCL カーネル実行中に収集したパフォーマンスデータを測定し報告します インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスカウンターに依存しパフォーマンスデータを収集しますパフォーマンスデータはその後Profiler GUI で確認することができます

1 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) (140 ページ)

2 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report) (141 ページ)

3 自動実行カーネルのプロファイリング (142 ページ)

101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

パフォーマンスカウンターで OpenCL カーネルのパイプラインを測定するにはaocコマンドの-profile=(all|autorun|enqueued)オプションをカーネルをコンパイルする際に含めます

注意 パフォーマンスカウンターで Verilog コードを測定するとハードウェアのリソース使用率が増加 (つまり FPGA のエリア使用率が増加) し通常パフォーマンスが低下します

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ltyour_kernel_filenamegtaocxファイルの Verilog コードをパフォーマンスカウンターで測定するには aoc -profile=(all|autorun|enqueued)ltyour_kernel_filenamegtclコマンドを呼び出します以下に詳細を説明します

mdash all引数は ltyour_kernel_filenamegtclファイルのすべてのカーネルをパフォーマンスカウンターで測定しますこれは引数が指定されていない場合のデフォルトのオプションです

mdash autorun引数は自動実行のカーネルのみをパフォーマンスカウンターで測定します

mdash enqueued引数は自動実行以外のカーネルのみをパフォーマンスカウンターで測定します

注意

mdash 複数の異なるカーネルをプロファイリングする際は異なるaocxファイルに同じカーネル名を使用しないでください同じカーネル名が付けられている場合それらのカーネルのプロファイルデータは正確なものになりません

mdash clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しへの入力にかかわらず インテル FPGA Dynamic Profiler for OpenCL はコンパイル中に示したカーネルタイプのみをプロファイルします

mdash すべてのカーネルまたはエンキューされたカーネルの OpenCL カーネルパイプラインをパフォーマンスカウンターで測定するとOpenCL ランタイム環境でのハードウェアのカーネル呼び出しキューの使用が無効になりますそのためプロファイルの時間が異なる場合があります

注意

自動実行カーネルをプロファイルするとカウンターに対するハードウェアのオーバーヘッドが発生します大規模なデザインの場合オーバーヘッドによって fmax およびデザイン周波数が低下する可能性がありますまた インテル FPGA Dynamic Profiler for OpenCL がすべてのカーネルをプロファイルするとデザインがチップに収まらなくなる可能性もあります

bull ローカルディスクからホストアプリケーションを実行しltyour_kernel_filenamegtaocxファイルを FPGA で実行しますカーネルの実行中カーネルパイプライン全体のパフォーマンスカウンターはプロファイル情報を収集しますホストは現在の作業ディレクトリーの profilemonモニター記述ファイルにその情報を保存します

注意

ネットワークディスクのアクセスが遅いためネットワークのディレクトリーからホストアプリケーションを実行すると各カーネルの実行に遅れをもたらす可能性がありますこの遅れによりホストアプリケーションの全体的な実行時間が長くなる可能性がありますさらにランタイムがプロファイル出力データをディスクに格納している間にカーネルの起動に遅れが発生する可能性もあります

102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report)

インテル FPGA Dynamic Profiler for OpenCL の reportユーティリティーコマンドを使用しプロファイラー GUI を起動することができますプロファイラー GUI ではカーネルの実行中にインテルFPGA Dynamic Profiler for OpenCL が収集するカーネルのパフォーマンスデータの統計情報を確認できます

インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスデータを現在の作業ディレクトリーの profilemonファイルに格納します

bull インテル FPGA Dynamic Profiler for OpenCL GUI を起動するには aocl reportltyour_kernel_filenamegtaocx profilemon[ltyour_kernel_filenamegtsource]ユーティリティーコマンドを呼び出します

重要 コマンドにsourceファイルを指定しない場合 インテル FPGA Dynamic Profiler forOpenCL GUI はソースコードタブを持たなくなります

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

141

103 自動実行カーネルのプロファイリング

自動実行カーネルのプロファイル機能は自動実行カーネルのプロファイルを可能にします

autorun属性でマークされたカーネルは自動実行カーネルと呼ばれますしたがって自動実行カーネルはホストが明示的に他のカーネルを起動する前に自動的に開始され完了すると自動的に再起動しますautorun属性についての詳細はホストとカーネル間の通信ハードウェアの省略を参照ください

自動実行カーネルは終了することがないためホストライブラリー呼び出しのclGetProfileDataDeviceIntelFPGAを呼び出し自動実行のプロファイルデータをキャプチャーする必要がありますホストアプリケーションに指示することでこの呼び出しは実行中の任意のタイミングで行うことができます

注意 自動実行カーネルのプロファイリング機能はグローバルメモリーを使用する自動実行カーネルをサポートしておらずカーネルの個別プロファイリングも行うことができません

関連情報bull ホストとカーネル間の通信ハードウェアの省略 (175 ページ)

bull エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ページ)

bull プロファイルデータの取得 (89 ページ)

bull 複数の自動実行プロファイリング呼び出し (89 ページ)

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発

インテル Code Builder for OpenCL は インテル FPGA SDK for OpenCL の一部として提供されているソフトウェア開発ツールですこのツールは インテル FPGA をターゲットとする一般的に広く利用されている統合開発環境での OpenCL アプリケーションの開発を可能にします

インテル Code Builder for OpenCL はOpenCL によって加速された Windows および Linux アプリケーションの作成構築デバッグ分析を可能にする一連の Microsoft Visual Studio およびEclipse のプラグインを提供します

111 Microsoft Visual Studio に向けた インテル Code Builder forOpenCL オフラインコンパイラープラグインのコンフィグレーション

Microsoft Visual Studio に向けてインテル Code Builder for OpenCL プラグインを有効にするには次の手順を実行します

1 Visual Studio ソフトウェアでProject gt Properties を選択します

2 Project gt Properties gt Code Builder のページでDevice を目的の FPGA デバイスに変更します

3 CC++ gt General プロパティーページの Additional Include Directories にOpenCL コードのヘッダーファイルが配置されているディレクトリーへのフルパスを入力します($(INTELFPGAOCLSDKROOT)include)

4 Linker gt General プロパティーページの Additional Library Directories にOpenCL コードのランタイムインポートライブラリーファイルが配置されているディレクトリーへのフルパスを入力します例えば 64 ビットのアプリケーションには$(INTELFPGAOCLSDKROOT)libx64を追加します

5 Linker gt Input プロパティーページAdditional Dependencies の OpenCL ICD のインポートライブラリーファイル名に OpenCLlibを入力します

112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション

Eclipse IDE に向けてインテル Code Builder for OpenCL オフラインコンパイラープラグインを有効にするには次の手順を実行します

1 CodeBuilder_ltversiongtjarプラグインファイルを$INTELFPGAOCLSDKROOTeclipse-plug-inから ltECLIPSE_ROOT_FOLDERgtdropinsへコピーします

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

注意 Linux では$INTELFPGAOCLSDKROOTbinを LD_LIBRARY_PATH環境変数に追加する必要があります

2 Eclipse IDE を実行します

3 Windows gt Preferences を選択します

4 インテル OpenCL ダイアログに切り替えます

5 OpenCL バイナリーのディレクトリーを$INTELFPGAOCLSDKROOTbinに設定します

オフラインコンパイラーのコンフィグレーションが完了するとCode-Builder メニューを使用し次の基本的な操作を実行できます

bull 新しいセッションの作成

bull 既存のセッションを開く

bull セッションの保存

bull セッションの構築

bull セッションのコンパイル

bull セッションのコンフィグレーション

インテル Code Builder for OpenCL に関する詳細はDeveloper Guide for Intel SDK forOpenCL Applications を参照くださいMicrosoft Visual Studio に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Microsoft Visual Studio を参照くださいEclipse に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Eclipse を参照ください

関連情報bull Developer Guide for Intel SDK for OpenCL Applications

bull Intel Code Builder for OpenCL API for Microsoft Visual Studio

bull Intel Code Builder for OpenCL API for Eclipse

113 インテル Code Builder for OpenCL でのセッションの作成

インテル Code Builder for OpenCL でセッションを作成するには次の手順を実行します

1 Code-Builder gt OpenCL Kernel Development gt New Session を選択します

2 セッション名セッションファイルを格納するフォルダーへのパスおよびセッションのコンテンツを指定します (空のセッションまたは事前に定義された OpenCL コードを持つセッションのどちらか)

3 Done をクリックします

セッションが作成されると新しいセッションが Code Builder Sessions Explorer ビューに表示されます

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

144

図 -16 Code Builder Session Explorer

注意 Code Builder Session Explorer ビューが表示されない場合はCode-builder gt OpenCLKernel Development gt Windows gt Code Builder Session Explorer を選択します

114 セッションのコンフィグレーション

コンフィグレーションとは割り当てられた変数反復回数特定のカーネルのグローバルサイズとローカルサイズなどの一連の分析の入力です分析が必要な入力のセットごとに個別のコンフィグレーションを作成することができます

Code Builder Session Explorer のセッションを右クリックし Session Options を選択するとセッションをコンフィグレーションできますあるいはCode-Builder gt OpenCL KernelDevelopment gt Session Options を選択するとSession Settings ダイアログボックスを開くことができます

Session Settings ダイアログボックスでは次の内容をコンフィグレーションすることができます

bull ターゲットマシンOpenCL プラットフォームOpenCL デバイスなどのデバイスオプション

bull オフラインコンパイラーフラグやビルドアーキテクチャーなどのビルドオプション

bull aocxおよびaocoファイルなどのビルドアーティファクトや静的レポート

bull ジョブアーキテクチャーやネットワーク設定などの一般的なオプション

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

145

Device Options タブの OpenCL platform ドロップダウンリストから インテル FPGA SDKfor OpenCL を選択していることを確認してください

Build Options タブの OpenCL Build Options セクションに インテル FPGA SDK forOpenCL オフラインコンパイラーフラグを手動で入力します

注意 カーネルにチャネルがある場合ワークフローをコンフィグレーションする必要がありますワークフローは一連のカーネルであり連続して実行することができますワークフローはあるカーネルの入力が前のカーネルの出力と接続しているチャネルでワークロードを実行するために使用できます (両方のカーネルに同じ変数を割り当てる必要があります)

セッションのコンフィグレーションと変数管理についてはDeveloper Guide for Intel SDK forOpenCL Applications を参照ください

関連情報bull Configuring a Session in Microsoft Visual Studio

bull Configurations and Settings in Eclipse

bull Variable Management in Microsoft Visual Studio

bull Variable Management in Eclipse

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

146

12 インテル FPGA SDK for OpenCL のアドバンスト機能

インテル FPGA SDK for OpenCL が提供するアドバンスト機能を使用しデザインアーキテクチャーの以下の側面および インテル FPGA SDK for OpenCL オフラインコンパイラーの動作を制御することができます

121 OpenCL ライブラリー

OpenCL ライブラリーは複数の機能を含む単一のファイルです各機能は任意のクロック周波数で動作するデータ処理ロジックで構成されています OpenCL ライブラリーはOpenCL あるいはレジスター転送レベル (RTL) で作成できますこのライブラリーファイルをインクルードしOpenCL カーネル内の関数を使用することができます

図 -17 インテル FPGA SDK for OpenCL のライブラリーサポートの概要

OpenCL

Verilog

VHDL OpenCL Kernel

OpenCL LibraryIntel FPGA SDK for OpenCL

Offline CompilerOffline Compiler

Executable File (aocx)

以前に作成したライブラリーを使用することも独自のライブラリーを作成することも可能ですOpenCL ライブラリーの使用にあたりハードウェアデザインやライブラリーコンポーネントの実装に関する詳細な知識は必要ありませんOpenCL ライブラリーを作成するには次のファイルとコンポーネントを作成する必要があります

表 4 OpenCL ライブラリーの作成に必要なファイルとコンポーネント

ファイルまたはコンポーネント 説明

RTL コンポーネント

RTL ソースファイル RTL コンポーネントを定義する VerilogSystem VerilogまたはVHDL ファイルですインテル Quartus Prime IP ファイル (qip)SDC ファイル(sdc)Tcl Script ファイル (tcl) などの付加的なファイルは使用することができません

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ファイルまたはコンポーネント 説明

eXtensible Markup Language ファイル (xml) RTL コンポーネントのプロパティーを記述します インテル FPGASDK for OpenCL オフラインコンパイラーはこれらのプロパティーを使用し RTL コンポーネントを OpenCL パイプラインに統合します

ヘッダーファイル (h) RTL コンポーネントにより実装される関数のシグニチャーを宣言するCスタイルのヘッダーファイルです

OpenCL エミュレーションモデルファイル (cl) エミュレーションでのみ使用される RTL コンポーネントの C モデルを提供しますハードウェアのフルコンパイルには RTL ソースファイルを使用します

OpenCL の機能

OpenCL ソースファイル (cl) OpenCL 関数の定義を含んでいますこれらの関数はエミュレーションおよびハードウェアのフルコンパイルの際に使用されます

ヘッダーファイル (h) OpenCL ソースファイルで定義される関数のシグネチャーを宣言する Cスタイルのヘッダーファイルです

注意 RTL と OpenCL ライブラリー関数に使用されるヘッダーファイルに違いはありません単一のヘッダーファイルで両方の関数の型を宣言することができます単一のライブラリーにRTL と OpenCL のライブラリーの関数をどちらも含めることができます

RTL モジュールと OpenCL パイプラインの理解 (148 ページ)

OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 (161 ページ)

OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化 (162 ページ)

RTL モジュールの検証 (164 ページ)

複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ)

OpenCL ライブラリーのコマンドラインオプション (170 ページ)

関連情報OpenCL ライブラリーのコマンドラインオプション (170 ページ)

1211 RTL モジュールと OpenCL パイプラインの理解

OpenCL のライブラリー機能によりVerilogSystemVerilogVHDL で記述された RTL モジュールを OpenCL カーネルで使用することができます この章では インテル FPGA SDK for OpenCL オフラインコンパイラーがRTL モジュールをインテル FPGA SDK for OpenCL パイプラインアーキテクチャーに統合する方法の概要を説明します

次の状況において RTL モジュールを使用してください

bull 適化および検証がされた RTL モジュールをOpenCL 関数として書き直すことなく OpenCL カーネルで使用する場合

bull OpenCL で効果的に表現できない OpenCL カーネル機能を実装する必要がある場合

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

148

12111 インテル FPGA SDK for OpenCL パイプラインのアプローチの概要

次の図はインテル FPGA SDK for OpenCL パイプラインのアーキテクチャーを表しています

図 -18 インテル FPGA SDK for OpenCL パイプラインステージの並列実行モデル右側の動作は左側の OpenCL カーネルコードにおける SDK のパイプライン実装を表しています黄色の各ボックスはパイプラインにある動作またはデータの値です各動作に付けられている数字はパイプラインのスレッド数を表します

Load A Load B

Add

Store C

global ID (gid)

gid

gid

2

1

0

2 2

3

1

void kernel pe (global int A global int B global int C) int gid = get_global_id(0)

int a = A[gid] int b = B[gid]

C[gid] = a + b

各レベルの動作がパイプラインの 1 ステージであると仮定します各ステージにおいてインテル FPGASDK for OpenCL はそのステージに存在するスレッドに基づきすべての動作を並列で実行します例えばスレッド 2 では Load ALoad B を実行し現在のグローバル ID を (gidを介し) 次のパイプラインステージにコピーしますRISC (縮小命令セットコンピューター) プロセッサーでのパイプライン化された命令の実行と同様SDK のパイプラインステージもまた並列して実行を行いますステージの実行がすべて完了しなければスレッドは次のパイプラインステージに進みません

Add

oready

iready

ivalid

ovalid

一部の動作ではインテル FPGA SDK for OpenCL パイプラインをストールさせることができます例えばメモリーのロードやストア動作のような可変レイテンシー動作などがそれにあたりますストールをサポートするにはready 信号と valid 信号をパイプライン全体に伝播しオフラインコンパイラーがパイプラインステージをスケジュールできるようにしますただしすべての動作のレイテンシーが固定されている場合ready 信号は必要ありませんこのような場合オフラインコンパイラーはパイプラインを 適化し静的に動作をスケジュールするためパイプラインの実装に必要なロジックが大幅に削減されます

12112 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合

カーネルのコンパイル中に OpenCL ライブラリーを指定するとオフラインコンパイラーはライブラリーの RTL モジュールをパイプライン全体に統合します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

149

図 -19 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合この図はRTL モジュール myModを図 18 (149 ページ) のパイプラインへ統合しているものです

Load A Load B

myMod

Store C

gid

gid

gid

4

3

0

4 4

5

3

myMod

oready

iready

ivalid

ovalid

extern int myMod(int int)void kernel pe(global int A global int B global int C)

int gid = get_global_id(0) int a = A[gid] int b = B[gid] C[gid] = myMod(a b)

2

1

gid2

gid1

3 cycles

示されている RTL モジュールはバランスの取れたレイテンシーを有しRTL モジュールのスレッドはパイプラインのステージ数と一致していますレイテンシーのバランスが取れているためRTL モジュールのスレッドは SDK のパイプラインをストールさせることなく実行することができます

RTL の仕様ファイルで RTL モジュールのレイテンシーを設定するとオフラインコンパイラーはパイプラインのレイテンシーのバランスを取ることができるようになります RTL は Avalontrade Streaming(Avalontrade -ST) インターフェイスをサポートしているためRTL モジュールのレイテンシシーは可変です (つまり固定ではありません)ただし性能を 大限に上げるためにはレイテンシーの変動は小さくなければなりませんさらにレイテンシーを ltRTL module description filenamegtxml仕様ファイルで指定するとRTL モジュールは安定状態で実際のレイテンシーの適切な概算を得られるようになります

関連情報bull Avalon Interface Specifications

bull Pipelined Read Transfer with Variable Latency

bull Pipelined Read Transfers with Fixed Latency

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ)

bull RTL モジュールの XML 構文 (154 ページ)

12113 ストールのない RTL

インテル FPGA SDK for OpenCL オフラインコンパイラーではレイテンシーを固定し RTL モジュール周辺のストールロジックを削除することによりハードウェアのリソース使用率とパフォーマンスを適化できます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

150

可変レイテンシーを持ちAvalon-ST の入出力信号を使用する RTL モジュールは入力データの準備が整うまで待機します一方インテル FPGA SDK for OpenCL パイプラインはRTL モジュールからの有効な出力データを受け取るまでストールします固定レイテンシーを有する RTL モジュールではltRTL module description file namegtxml仕様ファイルを次の記述のように変更することでRTL のストールを削除することができます

1 可能な場合に RTL モジュール周囲のストールロジックを削除するようオフラインコンパイラーに指示するにはFUNCTION要素の IS_STALL_FREE属性をyesに設定します

この変更はRTL モジュールが EXPECTED_LATENCYサイクルごとに有効なデータを生成することをオフラインコンパイラーに通知します

注意 EXPECTED_LATENCYはFUNCTION要素のxmlファイルで指定する属性です

2 レイテンシーがモジュールのパイプラインステージ数に等しくなるよう EXPECTED_LATENCYの値を指定します

注意 不正確な EXPECTED_LATENCYの値を指定するとRTL モジュールがパイプラインの他の部分と同期しなくなります

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを通して無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールではivalid=0入力の処理に注意する必要があります

12114 RTL モジュールインターフェイス

RTL モジュールが他のコンパイラーによって生成された動作と適切に通信するにはRTL モジュールの入力および出力の両方において単純化された Avalon-ST インターフェイスをサポートする必要があります

次の図は図 19 (150 ページ) で示されている RTL モジュール myModの 終的なインターフェイスを表しています

Upstream module

Downstream module

oready ivalid A B

iready ovalid C

myMod

この図において myModはABのデータ信号や ivalid (入力) および oready (出力) のコントロール信号を介しアップストリームのモジュールと通信していますivalidコントロール信号はデータ信号 Aおよびデータ信号 Bが有効なデータを含む場合のみ1に等しくなります (ivalid =1)コントロール信号 oreadyが 1 に等しくなると (oready = 1)データ信号 Aと Bが有効であれば (ivalid = 1)myMod RTL モジュールはそれらの信号の処理を行うことができることを示しますivalid = 1で oready = 0の場合アップストリームのモジュールは次のクロックサイクルで ivalidAおよび Bの値を保持すると考えられます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

151

myModはデータ信号 Cおよびコントロール信号の ovalid (出力) と iready (入力) を介しダウンストリームのモジュールと通信しますovalidコントロール信号はデータ信号 Cが有効なデータを含む場合にのみ1に等しくなります (ovalid = 1)ireadyコントロール信号が 1に等しくなると (ivalid = 1)データ信号 Cが有効であればダウンストリームのモジュールは処理が可能なことを示しますovalid = 1で iready = 0の場合myMod RLT モジュールは次のクロックサイクルで ovalidと C信号の有効性を保持すると考えられます

myModモジュールはoreadyを 1 クロックサイクル間アサートしアクティブサイクルに向け準備が整っていることを示しますmyModモジュールのデータの準備ができているサイクルをレディーサイクルと呼びますレディーサイクル中myModモジュールの上にあるモジュールはivalidをアサートし myModにデータを送信することができます

バックプレッシャー下でのデータ転送に関する詳細な説明はAvalon Interface Specifications のData Transfer with Backpressureを参照くださいレディーレイテンシーに関する情報は参考にしないでください

関連情報Data Transfer with Backpressure

12115 Avalon Streaming (Avalon-ST) インターフェイス

オフラインコンパイラーは入力と出力の両方において RTL モジュールがreadyLatency = 0の Avalon-ST インターフェイスをサポートすることを想定しています

図 19 (150 ページ) で示されているようにRTL モジュールには 4 つのポートがなければなりません

bull Avalon-ST インターフェイス入力の ivalidと iready

bull Avalon-ST インターフェイス出力の ovalidと oready

次にバックプレッシャーでの入力データ転送のタイミング図を示していますAvalon-ST インターフェイスに関する詳細はAvalon Interface Specifications の Avalon Streaming Interfaces の章を参照ください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

152

固定レイテンシーを持つ RTL モジュールの場合出力信号 (ovalidと oready) は一定の高い値を持つことができ入力レディー信号 (iready) は無視することができます

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを介し無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールにおいてはivalid = 0入力の処理に注意する必要があります

12116 RTL リセットおよびクロック信号

RTL モジュールのリセットおよびクロックはOpenCL パイプラインの他の部分と同じクロックおよびリセットドライバーに接続されています

共通のクロックドライバーとリセットドライバーであるためRTL モジュールは OpenCL カーネルと同じクロックドメインで動作しますモジュールは インテル FPGA SDK for OpenCL の programユーティリティーまたは clCreateProgramwithBinaryホスト関数でOpenCL カーネルが 初に FPGA にロードされた際にのみリセットされますつまりホストがカーネルを連続するclEnqueueNDRangeKernelまたは clEnqueueTask呼び出しで再起動した場合関連するRTL モジュールはこの再起動時にリセットされません

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

153

カーネルのクロック周波数を設定する過程を次に説明します

1 インテル Quartus Prime ソフトウェアのフィッターはカーネルクロックに積極的な制約を適用します

2 インテル Quartus Prime ソフトウェアのタイミングアナライザーは静的なタイミング解析を実行しフィッターが実際に達成する周波数を決定します

3 カーネルのクロックを駆動するフェーズロックループ (PLL) は上記 2 で決定された周波数をカーネルのクロック周波数に設定します

オプションにより RTL モジュールはOpenCL カーネルクロックの 2 倍の周波数で動作するシステム全体のクロックにアクセスできますこのシステム全体のクロックを RTL モジュールの入力信号に接続するにはAVALON要素のタイプ clock2xを含めますこの 2 つのクロックは定義された位相関係を持ちません

121161 ストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテル Stratix10 デザイン固有のリセット要件

インテル Stratix 10 OpenCL デザインに RLT モジュールを作成する際は特定のロジックリセット要件を満たしていることを確認してください

ストールのない RTL モジュールのリセット要件

ストールのない RTL モジュールはレイテンシーが固定されたモジュールであり インテル FPGA SDKfor OpenCL オフラインコンパイラーはストールロジックを削除し 適化することができます

bull インテル Stratix 10 のデザインに向けストールのない RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールのない RTL モジュールに対するリセットシグナルのディアサート後モジュールは 15 クロックサイクル以内に動作可能でなければなりませんリセット信号がモジュール内でパイプライン化されている場合この要件はリセットのパイプライン化を 15 ステージ以下に制限します

ストールをサポートする RTL モジュールのリセット要件

ストールをサポートする RTL モジュールは可変レイテンシーを持ち正確に機能するためにバックプレッシャー入力および出力インターフェイスに依存します

bull インテル Stratix 10 デザインにストールをサポートする RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールをサポートする RTL モジュールにリセット信号をアサートした後モジュールは oreadyおよび ovalidインターフェイス信号を 40 クロックサイクル内にディアサートしなければなりません

bull ストールをサポートする RTL モジュールにリセット信号をディアサートした後モジュールは 40 クロックサイクル以内に完全に動作可能になる必要がありますモジュールは準備が完了したことを oreadyインターフェイス信号をアサートし知らせます

関連情報ストールのない RTL (150 ページ)

12117 RTL モジュールの XML 構文

この章では倍精度平方根関数を実装する RTL モジュールのシンプルな XML 仕様ファイルの構文を提供しますRTL モジュールはVerilog ラッパーで VHDL に実装されています

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

154

次の XML 仕様ファイルはOpenCL のヘルパー関数 my_sqrtfdを実装する RTL モジュールmy_fp_sqrt_doubleのものです (どちらの名前もライン 2 にあります)

1 ltRTL_SPECgt 2 ltFUNCTION name=my_sqrtfd module=my_fp_sqrt_doublegt 3 ltATTRIBUTESgt 4 ltIS_STALL_FREE value=yesgt 5 ltIS_FIXED_LATENCY value=yesgt 6 ltEXPECTED_LATENCY value=31gt 7 ltCAPACITY value=1gt 8 ltHAS_SIDE_EFFECTS value=nogt 9 ltALLOW_MERGING value=yesgt 10 ltATTRIBUTESgt 11 ltINTERFACEgt 12 ltAVALON port=clock type=clockgt 13 ltAVALON port=resetn type=resetngt 14 ltAVALON port=ivalid type=ivalidgt 15 ltAVALON port=iready type=ireadygt 16 ltAVALON port=ovalid type=ovalidgt 17 ltAVALON port=oready type=oreadygt 18 ltINPUT port=datain width=64gt 19 ltOUTPUT port=dataout width=64gt 20 ltINTERFACEgt 21 ltC_MODELgt 22 ltFILE name=c_modelcl gt 23 ltC_MODELgt 24 ltREQUIREMENTSgt 25 ltFILE name=my_fp_sqrt_double_s5v gt 26 ltFILE name=fp_sqrt_double_s5vhd gt 27 ltREQUIREMENTSgt 28 ltRESOURCESgt 29 ltALUTS value=2057gt 30 ltFFS value=3098gt 31 ltRAMS value=15gt 32 ltMLABS value=43gt 33 ltDSPS value=15gt 34 ltRESOURCESgt 35 ltFUNCTIONgt 36 ltRTL_SPECgt

表 5 XML 仕様ファイルにおける要素と属性

XML 要素 説明

RTL_SPEC XML 仕様ファイルにおける 上位の要素ですこのような 上位の要素はファイルに 1 つしか存在できません

FUNCTION RTL モジュールが実装する OpenCL 関数を定義する要素ですFUNCTION要素の name属性は関数の名前を指定しますOpenCL カーネルから呼び出すことのできる異なる関数を宣言する複数の FUNCTION要素を持つことが可能です異なるパラメーターを指定することで同じ RTL モジュールに複数の関数を実装できます

ATTRIBUTES RTL モジュールのさまざまな特性 (レイテンシーなど) を記述する他の XML 要素を含む要素です例にある RTL モジュールは32 の値を持つ WIDTHという PARAMETER設定を 1 つ取りますその他の ATTRIBUTES固有の要素に関しては表 6 (156 ページ) を参照ください

注意

異なるモジュールに複数の OpenCL ヘルパー関数を作成する場合や異なるPARAMETER設定で同じ RTL モジュールを使用する場合は関数ごとに個別のFUNCTION要素を作成する必要があります

INTERFACE RTL モジュールのインターフェイスを記述する他の XML 要素を含む要素です例にある XML仕様ファイルではすべての RTL モジュールが提供する必要のある Avalon-ST インターフェイス信号 (clockresetnivalidireadyovalidoready) を示していますこの信号名はxmlファイルで指定する名前と一致している必要があります信号名が一致しない場合ライブラリー作成時にエラーが発生します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

155

XML 要素 説明

C_MODEL 関数に OpenCL C モデルを実装する 1 つ以上のファイルを指定する要素ですモデルはエミュレーション時にのみ使用されますただしC_MODEL要素と関連するファイルはライブラリーファイル作成時に存在している必要があります

REQUIREMENTS 1 つ以上の RTL リソースファイル (vsvvhdhexmif) を指定する要素ですこれらのファイルに指定されたパスはXML 仕様ファイルの位置に対応します各 RTL リソースファイルはOpenCL システム全体に対応する関連するプラットフォームデザイナーコンポーネントの一部になります注意

インテル FPGA SDK for OpenCL ライブラリー機能はqipファイルをサポートしませんサポートされていないリソースファイルタイプを含むライブラリーを使用しOpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーのエラーが発生します

 

RESOURCES RTL モジュールが使用する FPGA リソースを指定するオプションの要素ですこの要素を指定しない場合RTL モジュールが使用する FPGA リソースはデフォルトのゼロになります

121171 ATTRIBUTES を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの特性を設定するために指定できる XML 要素が ATTRIBUTESにあります

表 6 RTL モジュールの XML 仕様ファイルにおける ATTRIBUTES 要素に関連する XML 要素

注意 IS_STALL_FREEおよび EXPECTED_LATENCYを除きすべての要素には安全な値があります属性に指定する値に確信がない場合は安全な値を設定してください安全な値を使用するライブラリーでカーネルをコンパイルすると機能的なハードウェアをもたらしますただしハードウェアは実際のサイズよりも大きい場合があります

XML 要素 説明

IS_STALL_FREE インテル FPGA SDK for OpenCL オフラインコンパイラーにRTL モジュール周囲のすべてのストールロジックを削除するように指示しますIS_STALL_FREEをyesに設定しモジュールでストールを生成しないことおよび受信ストールの適切な処理ができないことを示しますモジュールはストールの入力を単純に無視しますIS_STALL_FREEをnoに設定する場合モジュールはストールおよび有効な信号をすべて適切に処理する必要があります

注意 IS_STALL_FREEをyesに設定する際はIS_FIXED_LATENCYもyesに設定する必要がありますまたRTL モジュールが内部状態がを持つ場合ivalid=0入力を適切に処理する必要があります

不正な IS_STALL_FREEを設定するとハードウェに不正確な結果をもたらします

IS_FIXED_LATENCY RTL モジュールのレイテンシーが固定されているかどうかを示しますRTL モジュールが常に既知のクロックサイクル数で出力を計算する場合はIS_FIXED_LATENCYをyesrdquoに設定しますEXPECTED_LATENCY要素に指定する値はクロックサイクル数を指定しますIS_FIXED_LATENCYの安全な値はnordquoですIS_FIXED_LATENCY=noを設定する際にEXPECTED_LATENCYの値は少なくとも 1 でなければなりません

注意

特定のモジュールではIS_FIXED_LATENCYをyesにしIS_STALL_FREEをnoに設定することができますこのようなモジュールは固定のクロックサイクル数で出力を生成しストール信号を適切に処理します

EXPECTED_LATENCY RTL モジュールの予想されるレイテンシーを指定しますIS_FIXED_LATENCYをyesに設定するとEXPECTED_LATENCYの値はモジュールにあるパイプラインのステージ数を示しますこの場合この値はモジュールの正確なレイテンシーに設定する必要があります正確に設定されていない場合オフラインコンパイラーは不正確なハードウェアを生成しますレイテンシーが可変のモジュールにおいてはオフラインコンパイラーはこのモジュール周辺のパイプラインを指定した EXPECTED_LATENCYの値でバランスを取りますストールをサポートしireadyなどの信号を必要とするモジュールにおいてはEXPECTED_LATENCYの値は 低でも 1 に設定する必要があります指定した値と実際のレイテンシーは異なることがありパイプラインのストール数に影響を与える場合があります ただし生成されるハードウェアは正しいものです

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

156

XML 要素 説明

CAPACITY このモジュールが同時に処理できる複数の入力の数を指定しますIS_STALL_FREE=noおよびIS_FIXED_LATENCY=noも設定する場合はCAPACITYの値を指定する必要がありますそれ以外の場合は CAPACITYの値を指定する必要はありませんCAPACITYが EXPECTED_LATENCYよりもわずかでも小さい場合オフラインコンパイラーは必要に応じて容量のバランスをとる FIFO バッファーをこのモジュールの後に自動的に挿入しますCAPACITYの安全な値は 1です

HAS_SIDE_EFFECTS RTL モジュールに副作用があるかどうかを示します内部状態のあるモジュールや外部メモリーと通信するモジュールは副作用をともなうモジュールの例になりますHAS_SIDE_EFFECTSをyesに設定しモジュールに副作用があることを示しますHAS_SIDE_EFFECTSをyesに指定すると 適化を行う際に副作用のあるモジュールへの呼び出しは削除されません副作用がありストールのないモジュール (IS_STALL_FREE=yesでありHAS_SIDE_EFFECTS=yesのモジュール) は無効なデータを受け取る可能性があるためivalid=0の入力を適切に処理する必要がありますHAS_SIDE_EFFECTSの安全な値はyesです

ALLOW_MERGING オフラインコンパイラーにRTL モジュールの複数のインスタンスをマージするよう指示しますALLOW_MERGINGをyesに設定しモジュールの複数のインスタンスのマージを可能にしますインテルではALLOW_MERGINGをyesに設定することを推奨していますALLOW_MERGINGの安全な値はnoです

注意 HAS_SIDE_EFFECTS=yesでモジュールをマークしてもマージを防ぐことはできません

PARAMETER RTL モジュールのパラメーター値を指定しますPARAMETERの属性bull namemdashRTL モジュールのパラメーター名を指定しますbull valuemdashパラメーターに 10 進数の値を指定しますbull typemdashシステムパラメーターにRTL モジュールのパラメーター値として使用される値を指定します次

のシステムパラメーター名を type属性で使用できますmdash bspaddresswidthmdashボードサポートパッケージの OpenCL グローバルメモリーにコンフィグレ

ーションされたメモリー範囲のアドレスを指定するために必要なAvalon メモリーバス幅を指定します

注意 RTL モジュールのパラメーター値はvalue属性または type属性を使用し指定できます

121172 INTERFACE を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはRTL モジュールのインターフェイスの側面を指定するために定義できる XML 要素が INTERFACEにあります(Avalon-ST インターフェイスなど)

表 7 RTL モジュール XML 仕様ファイルの INTERFACE 要素に関連のある必須 XML 要素

XML 要素 説明

INPUT RTL モジュールの入力パラメーターを指定しますINPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

AOCL はOpenCL のデータ型に対応する幅のみをサポートしますつまり 8 (uchar)1632641282565121024 (long16) ビットのみをサポートします

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力パラメーターは連結されて入力ストリームを形成します構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

出力 RTL モジュールの出力パラメーターを指定します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

157

XML 要素 説明

OUTPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

SDK はOpenCL のデータ型に対応する幅のみをサポートしますつまり8 (uchar)1632641282565121024 (long16) ビットのみのサポートです

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力ストリームからの戻り値は出力ストリームの出力パラメーターを介し送信されます構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

RTL モジュールが外部メモリーと通信する場合はXML 要素を追加し含める必要があります

ltMEM_INPUT port=m_input_A access=readonlygtltMEM_INPUT port=m_input_sum access =readwritegtltAVALON_MEM port=avm_port0 width=512 burstwidth=5 optype=read buffer_location=gt

表 8 外部メモリーアクセスをサポートするために追加する XML 要素

XML 要素 説明

MEM_INPUT RTL モジュールへのポインター入力を記述しますMEM_INPUT属性bull portmdashポインター入力の名前を指定しますbull accessmdashRTL モジュールにおけるこのポインターの使用方法をインテル FPGA SDK

for OpenCL オフラインコンパイラーに指定します有効なアクセスの値はreadonlyと readwrite ですRTL モジュールがこのポインターでのみ書き込む場合はreadwriteを accessに割り当てます

外部メモリーへのポインターはすべて 64 ビットである必要があるためMEM_INPUTに関連付けられる width属性はありません

AVALON_MEM RTL モジュールの Avalon-MM インターフェイスを宣言しますAVALON_MEM属性bull portmdashRTL モジュールの対応するポート名のルートを指定します例えば port が

avm_port0_の値を持っている場合RTL モジュールの Avalon-MM インターフェイスのポート名はすべてavm_port0_で始まります

bull width mdash デ ー タ幅 を指定 し ま す こ の 値は ア ク セ ラ レ ー タ ー ボ ー ド のboard_specxml ファイルの対応する幅の値と一致している必要がありますboard_specxml ファイルでは幅の値は global_mem の interface要素で指定されています詳細は インテル FPGA SDK for OpenCL カスタムプラットフォームツールキットユーザーガイドの Board_specxml ファイル内の XML 要素属性およびパラメーターにある global_mem の章を参照ください

bull burstwidthmdashバーストサイズを表すために必要なビット数を指定します burstwidth = log(maxburst) +1 を使用しバーストサイズを計算しますこのmaxburstはboard_specxmlファイルで指定された対応する 大バーストサイズです例えば maxburst=16 の場合burstwidth=5 です

bull optypemdash Avalon-MM ポートが外部メモリーから読み取り (read) を行うか書き込み(write) を行うかを指定しますoptypeには readまたは writeのいずれかしか割り当てることができません

bull Buffer_locationmdash異種メモリーをサポートします異種メモリーコンパイルフローは現在検証されていないためこの属性は空白のままにしてください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

158

上のコード例で定義された AVALON_MEM要素に対応する RTL モジュールポートは次のようになります

output avm_port0_enableinput [5110] avm_port0_readdatainput avm_port0_readdatavalidinput avm_port0_waitrequestoutput [310] avm_port0_addressoutput avm_port0_readoutput avm_port0_writeinput avm_port0_writeackoutput [5110] avm_port0_writedataoutput [630] avm_port0_byteenableoutput [40] avm_port0_burstcount

MEM_INPUTで指定するポインターと AVALON_MEMで指定する Avalon-MM インターフェイス間に想定の関係はありませんRTL モジュールは 1 つのポインターを使用し0 から複数の Avalon-MMインターフェイスのアドレスを指定することができます

関連情報Board_specxml ファイル内の XML 要素属性およびパラメーター

121173 リソースを指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの FPGA リソース使用率を指定するために定義できるオプションの要素が RESOURCESにあります特定の要素を指定しない場合はデフォルト値のゼロになります

表 9 RTL モジュールの XML 仕様ファイルの RESOURCES 要素に関連する XML 要素

XML 要素 説明

ALUTS モジュールが使用する組み合わせ対応可能なルックアップテーブル (ALUT) の数を指定します

FFS モジュールが使用する専用のロジックレジスター数を指定します

RAMS モジュールが使用するブロック RAM の数を指定します

DSPS モジュールが使用するデジタル信号処理 (DSP) ブロックの数を指定します

MLABS モジュールが使用するメモリーロジックアレイ (MLAB) の数を指定します各 MLAB は 10の ALM を消費するためこの値はメモリーに使用される ALM (アダプティブロジックモード)の数を 10 で割った値に等しくなります

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

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

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

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

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

159

表 10 外部メモリーと通信する RTL モジュールのコード例

複雑な RTL モジュール 簡潔化された RTL モジュール

my_rtl_fn does out_ptr[idx] = fn(in_ptr[idx])my_rtl_fn (in_ptr out_ptridx)

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 forOpenCL オフラインコンパイラーにおいて非常に控えめなポインター分析が行われます

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

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

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

bull RTL モジュールがポインターへ書き込む場合OpenCL カーネルの他の部分はこのポインターに対する読み書きはできません

bull RTL モジュールがポインターから読み取る場合OpenCL カーネルの他の部分および他の RTL モジュールもまたこのポインターから読み取ることができます

bull MEM_INPUT属性の accessフィールドを設定することでRTL モジュールのメモリーポインターの使用方法を指定できます値を検証する方法がないためアクセスを行うための値が正しく設定されていることを確認してください

12119 RTL モジュールに入るスレッドの順序

RTL モジュールに入るスレッドが定義された順序に従うと想定しないでくださいさらにRTL モジュールはスレッドを並べ替えることができますよってスレッド 0 がスレッド 1 の前にモジュールに入るとは限りません

121110 RTL モジュールの OpenCL C モデル

OpenCL ライブラリーの各 RTL モジュールにはOpenCL C モデルが必要ですOpenCL C モデルはエミュレーション時に OpenCL システム全体を検証します

平方根関数の OpenCL C モデルファイル例

double my_sqrtfd (double a) return sqrt(a)

インテルではOpenCL システムをエミュレーションすることを推奨していますOpenCL システムをエミュレーションしない場合はXML 仕様ファイルで指定した関数名と一致する名前の空の関数を作成してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

160

関連情報RTL モジュールの XML 構文 (154 ページ)

121111 RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

RTL モジュールを使用し OpenCL ライブラリーを作成するとパーシャルリコンフィグレーションに関係する問題が発生する場合があります

パーシャルリコンフィグレーション (PR) をサポートしていないデバイスでライブラリーを作成し検証した後にライブラリーのユーザーがライブラリーの RTL モジュールを PR 領域で使用するとPR 後にモジュールが正しく機能しない可能性があります

PR を使用するデバイスで RTL モジュールを正しく機能させるため次の内容を確認してください

bull RTL モジュールは初期化されたコンテンツのメモリーロジックアレイブロック (MLAB) を使用していないこと

bull RTL モジュールはロジックのパワーアップ値に関していかなる仮定もしていないこと

PR コーディングの完全なガイドラインに関してはインテル Quartus Prime プロエディション ユーザーガイドパーシャルリコンフィグレーションのパーシャルリコンフィグレーションデザインの作成を参照ください

1212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

OpenCL ライブラリーファイルを作成する前にヘルパー関数を持つ各 OpenCL ソースファイルをaocoファイルにパッケージ化しますRTL モジュールとは異なりXML 仕様ファイルを作成する必要はありません

OpenCL で書かれたヘルパー関数を共有するためのライブラリーは通常作成する必要はありません例えば ltshared_filegtclなどのソース形式でヘルパー関数を配布しincludeltshared_filegtcl行を OpenCL カーネルのソースコードに挿入することができます

次のような状況においてライブラリーを作成することを検討ください

bull ヘルパー関数が複数のファイルにあり配布を簡素化する必要がある

bull ヘルパー関数のソースコードの公開を望まない

ヘルパー関数はアセンブリー言語のような LLVM IR として関連するライブラリーにコメントなしで格納されます

aocoファイルの作成にハードウェアの生成は必要ありません-cオフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

注意 ライブラリーには OpenCL ヘルパー関数のみを含むことができますライブラリーが OpenCL カーネルを含んでいる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはエラーメッセージを発行します

bull OpenCL ソースファイルをaocoファイルにパッケージ化するには次のコマンドを呼び出します aoc -c -shared ltOpenCL_source_file_namegtcl -oltOpenCL_object_file_namegtaoco

このオフラインコンパイラーコマンドオプション-sharedはOpenCL ライブラリーに含むために適したaocoファイルの作成をコンパイラーに指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

161

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

1213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化

OpenCL ライブラリーファイルを作成する前に各 RTL コンポーネントをaocoファイルにパッケージ化します

aocoファイルの作成においてハードウェアの生成は必要ありません-c インテル FPGA SDK forOpenCL オフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

bull RTL コンポーネントをaocoファイルにパッケージ化するには次のコマンドを呼び出しますaoc -c ltRTL component description file namegtxml -o ltRTLobject file namegtaoco

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull RTL モジュールの検証 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

12131 インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限

インテル FPGA SDK for OpenCL はOpenCL ライブラリーにおける RTL モジュールの使用をいくつかの制約と制限をともないサポートしています

RTL モジュールを作成する際は次の制約内で動作させることを確認してください

bull RTL モジュールは単一入力の Avalon-ST インターフェイスを使用する必要がありますつまりreadyと validロジックの単一ペアがすべての入力を制御しなければなりません

必要な Avalon-ST ポートを提供しRTL モジュールをストールのないモジュールとして宣言するオプションもありますこの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはモジュールに向けてラッパーを作成するため適切なストール動作を実装する必要はありません構文と使用法に関する詳細はRTL モジュールの XML 構文およびシンプルな関数で動作するOpenCL ライブラリーの使用 (例 1) を参照ください

注意 RTL モジュールが内部状態を持つ場合はivalid信号を適切に処理する必要があります詳しくはストールのない RTL を参照ください

bull RTL モジュールはカーネルのクロック周波数にかかわらず正確に動作する必要があります

bull データの入力および出力サイズはcharの 8 ビットから long16の 1024 ビットまでの有効なOpenCL データ型と一致する必要があります

例えば RTL モジュールで 24 ビットの値を使用する場合入力が 32 ビットになるよう宣言しSDK ライブラリーのヘッダーファイルで関数シグニチャーを宣言し uintデータ型を受け取るようにしますその後RTL モジュールで 32 ビットの入力を受け入れ上位 8 ビットを破棄します

bull RTL モジュールは外部 IO 信号に接続することができません入出力信号はすべてOpenCL カーネルから発行される必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

162

bull RTL モジュールにはclockポートresetnポートAvalon-ST 入力および出力ポート(ivalidovalidireadyoready) が必要ですここで指定されている通りに名前を付けてください

bull 外部メモリーと通信する RTL モジュールには対応するカスタムプラットフォームパラメーターに一致する Avalon メモリーマップド (Avalon-MM) ポートのパラメーターが必要ですオフラインコンパイラーは幅またはバーストの調整を行いません

bull 外部メモリーと通信する RTL モジュールは次のように動作する必要があります

mdash バースト境界を越えてバーストしないこと

mdash クロックサイクルごとに要求を行いアービトレーションロジックを独占しハードウェアをストールさせないことRTL モジュールは定期的に要求を一時停止し他のロードまたはストアユニットが動作を実行できるようにする必要があります

bull RTL モジュールは独立した OpenCL カーネルとして動作することはできませんRTL モジュールはヘルパー関数にしかなれずカーネルのコンパイル時に OpenCL カーネルに統合されます

bull RTL モジュールのインスタンス化に対応する関数呼び出しはすべて他のインスタンス化から完全に独立していますハードウェアの共有はありません

bull カーネルコード (kernelとしてマークされた関数) はaoclibライブラリーファイルに組み込まないでくださいカーネルコードをライブラリーファイルに組み込むとオフラインコンパイラーはエラーメッセージを発行しますヘルパー関数をライブラリーファイルに組み込むことは可能です

bull RTL コンポーネントはすべての入力を同時に受け取る必要があります単一の ivalid入力はすべての入力が有効なデータを含んでいることを意味します

bull SDK は IO RTL モジュールをサポートしません

bull RTL モジュールのパラメーターはOpenCL カーネルソースファイルではなく ltRTLmodule description file namegtxml仕様ファイルでのみ設定できます同じ RTLモジュールを複数のパラメーターで使用するには個別の FUNCTIONタグを各パラメーターの組み合わせに作成します

SDK の RTL モジュールのライブラリー機能に対するサポートには現在次の制限があります

bull RTL モジュールへのデータ入力はOpenCL カーネルコードを介した値でのみ渡すことができます参照渡し構造体またはチャネルを介し RTL モジュールにデータ入力を渡さないでくださいチャネルデータの場合はまずチャネルからデータを抽出し抽出したスカラーデータを RTL モジュールに渡します

注意 参照渡しまたは構造体によってデータ入力を RTL モジュールに渡すとオフラインコンパイラーで致命的なエラーが発生します

bull デバッガー (Linux の GDBなど) はエミュレーション中にライブラリー関数にステップインできませんさらに 適化レポートおよびエリアレポートはライブラリー関数の横にコード行番号を含みません

bull RTL モジュールのソースファイル名は インテル FPGA SDK for OpenCL オフラインコンパイラー IP ファイル名と競合することはできませんRTL モジュールのソースファイルとオフラインコンパイラーの IP ファイルはどちらも ltkernel file namegtsystemsynthesissubmodulesディレクトリーに格納されます名前が競合するとディレクトリーにある既存のオフラインコンパイラー IP ファイルがRTL モジュールのソースファイルに上書きされます

bull SDK はqipファイルをサポートしませんネスト化されたqipファイルを手動で解析しRTLファイルのフラットリストを作成する必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

163

bull 単独では正しく動作する一方でOpenCL カーネルの一部としては正しく動作しない RTL モジュールをデバッグすることは非常に困難です ltRTL module description filenamegtxmlファイルの ATTRIBUTES要素にあるパラメーターをすべて再度確認してください

bull オフラインコンパイラーのエリア見積りツールはすべてRTL モジュールのエリアが 0 であると仮定していますSDK は現在RTL モジュールのエリアモデルを指定する機能をサポートしていません

bull RTL モジュールはカーネルクロックと同位相でありカーネルクロック周波数の 2 倍の2x クロックにアクセスできません

関連情報bull RTL モジュールの XML 構文 (154 ページ)

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

bull ストールのない RTL (150 ページ)

1214 RTL モジュールの検証

OpenCL ライブラリーの作成者はライブラリーの RTL モジュールを独立したエンティティーとしてまた OpenCL システムの一部として検証する責任があります

1 各 RTL モジュールを標準のハードウェア検証方法にて検証します

2 インテル FPGA SDK for OpenCL ライブラリーデザイン例の 1 つを変更しOpenCL システム全体において RTL モジュールをテストします

この手順はライブラリーのユーザーがハードウェアの問題に直面しないようにするために重要です

XML 仕様ファイルの ATTRIBUTES要素の値を正しく設定していることが重要ですOpenCL システム全体をシミュレーションすることはできないためインターフェイスレベルのエラーによって発生する問題はハードウェアを動作させるまで検出されない可能性があります

3 注意 インテル FPGA SDK for OpenCL libraryユーティリティーはXML 仕様ファイルとソースファイルの整合性を確認しますがそれにはいくつかの制限があります

aocl library [ltcommand optiongt]コマンドを呼び出します

bull サポートされている ltcommand optionsgt リストは aocl library コマンドで呼び出します

bull libraryユーティリティーはXML 仕様ファイルの ATTRIBUTESMEM_INPUTAVALON_MEM要素内の要素に割り当てられている値のエラーを検出しません

bull library ユーティリティーはRTL 構文のエラーを検出しませんRTL 構文のエラーについては ltyour_kernel_filenamegtquartus_sh_compilelogファイルを確認する必要がありますただしエラーの解析には時間を要する可能性があります

1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化

OpenCL ライブラリーに含めるaocoファイルを作成後 インテル FPGA SDK for OpenCLlibraryユーティリティーコマンドオプションを呼び出しそれらをライブラリーファイルにパッケージ化します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

164

bull 複数のオブジェクトファイルを単一のライブラリーファイルにパッケージ化するには次のコマンドを呼び出します aocl library create -o ltlibrary filenamegtaoclib ltobject file 1gtaoco [ltobject file 2gtaoco ltobject file Ngtaoco]

aocl libraryユーティリティーコマンドは ltlibrary file namegtaoclibライブラリーファイルを作成しますこのファイルにはコマンドで指定したaocoオブジェクトファイルが含まれていますライブラリーファイルにはRTL ベースのオブジェクトファイルおよびOpenCL ベースのオブジェクトファイルをどちらも含むことができます

1216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定

OpenCL カーネルで OpenCL ライブラリーを使用するにはカーネルをコンパイルする際にライブラリーファイル名とディレクトリーを指定します

重要 ライブラリーを使用してもカーネルのコンパイル時間は短縮されません

bull OpenCL ライブラリーを インテル FPGA SDK for OpenCL オフラインコンパイラーに指定するには次のコマンドを呼び出します aoc -l ltlibrary_file_namegtaoclib [-Lltlibrary directorygt] ltkernel file namegtcl

この-l ltlibrary_file_namegtaoclibコマンドオプションはライブラリーファイル名を指定し-L ltlibrary directorygt コマンドオプションはライブラリーファイルを含むディレクトリーを指定します

-l ltlibrary file namegt および-L ltlibrary directorygt の複数のインスタンスをオフラインコンパイラーコマンドに含めることができます

例えば関数 my_div_fd()my_sqrtfd()myrsqrtfd()を含むライブラリーを作成する場合OpenCL のカーネルコードは次のようになります

include ldquolib_headerhrdquo

kernel void test_lib ( global double restrict in global double restrict out int N) int i = get_global_id(0) for (int k =0 k lt N k++) double x = in[iN + k] out[iN + k] = my_divfd (my_rsqrtfd(x) my_sqrtfd(my_rsqrtfd (x)))

注意 ライブラリー関連の行は太字で強調されています

対応する lib_headerhファイルは次のようになります

double my_sqrtfd (double x)double my_rsqrtfd(double x)double my_divfd(double a double b)

1217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー)

インテル FPGA SDK for OpenCL シミュレーターは OpenCL ライブラリーの機能性を評価します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

165

インテル FPGA SDK for OpenCL シミュレーターはx86-64 Windows または Linux ホストで動作するaocxファイルを生成しますこの機能により毎回ハードウェアにライブラリーをコンパイルしたり FPGA で動作させたりすることなくカーネルの機能性のシミュレーションやデザインのイタレーションができるようになります

OpenCL ライブラリーの動的なパフォーマンスをより深く理解することが必要な場合や OpenCL ライブラリー機能の正確性に関しエミュレーションや OpenCL のレポートツールが提供する内容以上の情報が必要な場合はシミュレーターを使用してください

シミュレーターはサイクル精度が高くハードウェアを生成するのと同じネットリストを持ちデバッグに向けた完全な波形を提供することが可能です波形は Mentor Graphics ModelSim ソフトウェアで確認してください

12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

シミュレーションに向け OpenCL ライブラリーをコンパイルするには-march=simulatorオプションを aocコマンドに含めますシミュレーション中の波形収集を有効にするには-ghdlオプションを aocコマンドに含めます

bull ライブラリーのシミュレーションを実行する前に次の作業を実行してください

mdash FPGA アクセラレーターボードにボードメーカーが提供しているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアのインストールフォルダーを指していることを確認します

bull Windows システムでライブラリーをシミュレーションするにはMicrosoft のリンカーおよびコンパイル時のライブラリーが追加で必要になりますPATH 環境変数設定に インテル FPGASDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設定が インテル FPGA SDK for OpenCL スタートガイドのインテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

bull 特定のボードをターゲットとするシミュレーションをコンパイルするには aoc-march=simulator -ghdl -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードにおける機能的なエラーの原因を特定できるようになります

12172 OpenCL ライブラリーのシミュレーション

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

166

シミュレーション中に生成された波形を確認するには Mentor Graphics ModelSim ソフトウェアをインストールしコンフィグレーションする必要があります

重要 エミュレーターとシミュレーターを同じ端末またはコマンドプロンプトセッションから実行する場合シミュレーターを実行する前にエミュレーターの環境変数設定(CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA) を解除しますエミュレーター環境変数の設定が解除されていないとシミュレーションはエラーにより失敗します

エミュレーターとシミュレーターは別々の端末セッションまたはコマンドプロンプトセッションから実行することもできます

OpenCL ライブラリーをシミュレーターで実行するには以下を行います

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションの構築に必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーの一覧を表示します

2 ホストアプリケーションを構築し手順 1 のライブラリーにリンクします

ヒント

他の OpenCL SDK とともに複数のデバイスをエミュレーションするにはホストランタイムのライブラリーに接続する前 にホストアプリケーションを Khronos ICD LoaderLibrary に接続しますホストアプリケーションを ICD Loader Library に接続するにはホストアプリケーションの Makefileを変更します詳細はホストアプリケーションとKhronos ICD Loader Library のリンクを確認ください

3 必要であればaocxファイルをホストが容易に見つけることのできる位置に動かします現在の作業ディレクトリーが推奨されます

4 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA環境変数を設定しシミュレーションデバイスを有効にします

mdash Windows の場合

set CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

mdash Linux の場合

env CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

注意

環境変数 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA を設定するとシミュレーションデバイスのみが利用可能になりますすなわち物理的なボードおよびエミュレーションデバイスへのアクセスは無効になります

ホストプログラムがシミュレーションデバイスを識別できない場合CL_CONTEXT_COMPILER_MODE_INTELFPGA=3を設定する必要があります

5 ホストプログラムを実行します

ホストコードとデバイスをデバッグするにはgdb または Eclipse でホストコードを実行します

ホストプログラムを実行すると波形ファイル vsimwifが作成されますこの波形ファイルはホストコードを実行時に ModelSim ソフトウェアで確認することができますvsimwifファイルはホストプログラムを実行しているディレクトリーと同じディレクトリーに書き込まれます

6 ホストまたはカーネルプログラムを変更しテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしシミュレーションを再度実行してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

167

12173 シミュレーターの制限

シミュレーターの制限を確認しシミュレーションを試みる際に発生する可能性がある問題をトラブルシューティングしてください

Windows のコンパイルが失敗しホストプログラムがaocxファイルの破損を報告している場合

deviceclファイルをコンパイルする際のディレクトリーパスが長すぎる可能性があります-oコンパイラーオプションを使用し短いパスでコンパイル結果を出力してください

socket=-11エラーが transcriptlogに記録される場合

次のエラーメッセージが表示される場合 ModelSim - Intelreg FPGA Edition と ModelSim SE のリソースを混同しています

Message srchls_cosim_ipc_socketcpp202 void IPCSocketMasterconnect()Assertion `sockfd = -1 ampamp IPCSocketMasterconnect() call to accept() failed failed

ModelSim リソースの混同例には ModelSim SE でデバイスをコンパイルしホストプログラムをModelSim - Intel FPGA Edition で実行している場合などがあります

ホストプログラムを実行するとセグメンテーション違反が発生する場合

ホストプログラムを実行した際にセグメンテーション違反が発生する場合は同じ端末またはコマンドプロンプトセッションからエミュレーターとシミュレーターを実行している可能性がありますシミュレーターを実行する前にエミュレーターの環境変数設定を必ず解除してください

同じ端末セッションまたはコマンドプロンプトセッションでデバイスとホストプログラムをコンパイルしないようにしてください別々のセッションを使用することで起こりうる環境変数の競合を回避できます

1218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)

インテルでは倍精度関数を 3 つ実装した (sqrtrsqrtdivide) RTL を含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example1tgzターボールにはライブラリーカーネルおよびホストシステムが含まれていますexample1clカーネルソースファイルには2 つのカーネルが含まれますカーネルのtest_libはライブラリー関数を使用しますすなわちカーネルの test_builtinは組み込み関数を使用しますホストは両方のカーネルを実行しそれらの出力とランタイムを比較しますインテルでは同じ方法でご自身がデザインしたライブラリー関数を検証することを推奨しています

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページからexample1tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example1aocx Create buffersGenerate random data for conversionEnqueuing both library and builtin in kernels 4 times with global size 65536Kernel computation using library function took 535333 secondsKernel computation using built-in function took 539949 secondsReading results to buffers

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

168

Checking resultsLibrary function throughput is within 5 of builtin throughputPASSED

関連情報OpenCL デザイン例のページ

1219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2)

インテルではグローバルメモリーと通信する 2 つの RTL モジュールを含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example2tgzターボールにはライブラリーカーネルそしてホストシステムが含まれていますこの例においてグローバルメモリーと通信する RTL コードはカスタムプラットフォームまたはリファレンスプラットフォームに依存しますコンパイルがStratix V Network Reference Platform に対応するボードをターゲットとしていることを確認してください

インテルではRTL モジュールの copyElement()および sumOfElements() を インテルFPGA SDK for OpenCL オフラインコンパイラーを使用し生成しました インテル FPGA SDK forOpenCL オフラインコンパイラーはコードの追加入力を示します

Example2clカーネルソースファイルは 2 つのカーネルを含みますカーネル test6はcopyElement() RTL 関数を呼び出す NDRange カーネルでありデータを B[]から A[]へコピーし global_id+100を C[]に格納しますカーネル test11はRTL 関数を使用する単一ワークアイテムのカーネルですsumOfElements() RTL 関数は範囲[i N]の A[]の要素の合計を確定し残りを C[i]に追加します

注意 sumOfElements(i=0)の 初の呼び出しの実行はその後の呼び出しよりも時間がかかります

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページから example2tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example2aocx Running test6Launching the kernel test6 with globalsize=128 localSize=16Loading example2aocx Running test11Launching the kernel test11 with globalsize=1 localSize=1PASSED

関連情報bull OpenCL デザイン例のページ

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull Intel FPGA SDK for OpenCL Stratix V Network Reference Platform Porting Guide

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

169

12110 OpenCL ライブラリーのコマンドラインオプション

インテル FPGA SDK for OpenCL オフラインコンパイラーの一連のコマンドおよびSDK ユーティリティーはOpenCL ライブラリーに関連するタスクを実行するために呼び出すことができるオプションを含んでいます

表 11 ライブラリーに関連する インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドオプション

コマンドオプション 説明

-shared -rtlコマンドオプションとともにOpenCL ソースファイルをオブジェクトファイル (aoco) へコンパイルしますその後それをライブラリーに含めることができますaoc -rtl -shared ltOpenCL source file namegtcl -oltOpenCL object file namegtaoco

-I=ltlibrary_directorygt ltlibrary directorygt をヘッダーファイルの検索パスに追加します

aocl -I ltlibrary_header_file_directorygt -lltlibrary_file_namegtaoclib ltkernel_file_namegtcl

-L=ltlibrary directorygt ltlibrary directorygt を OpenCL ライブラリーの検索パスに追加します「-L」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-l=ltlibrary_file_namegtaoclib OpenCL ライブラリーファイル ( ltlibrary_file_namegtaoclib) を指定します「 -l 」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-library-debug ライブラリーに関連のあるデバッグ出力を生成します追加の出力の一部はstdout に表示されその他の部分は ltkernel_file_namegtltkernel_file_namegtlog ファイルに表示されます

aoc -l=ltlibrary_file_namegtaoclib -library-debugltkernel_file_namegtcl

表 12 インテル FPGA SDK for OpenCL ライブラリーユーティリティー (aocl library) のコマンドオプション

コマンドオプション 説明

hdl-comp-pkg ltXML_specification_filegtxml

単一の HDL コンポーネントをaocoファイルにパッケージ化しますそれをその後ライブラリーに含みますこのコマンドの呼び出しは aoc -rtlltXML_specification_filegtxmlを呼び出すことに類似していますただしaoclは環境チェックを行わないため処理時間は短くなります

aocl library hdl-comp-pkg ltXML_specification_filegtxml -o ltoutput_filegtaoco

-rtl ltXML_specification_ filegtxml hdl-comp-pkg ltXML_specification_ filegtxmlと同じ機能ですaocl library -rtl ltXML_specification_ filegtxml

create hdl-comp-pkgユーティリティーオプションまたは aoc -shared コマンドを呼び出すことによって作成したaocoファイルからライブラリーファイルそしてその他のaoclibライブラリーを作成します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

170

コマンドオプション 説明

aocl library create [-name ltlibrary_namegt] [-vendor ltlibrary_vendorgt] [-versionltlibrary_versiongt] [-o ltoutput_filegtaoclib][aoco] [aoclib]

この-name-vendor-versionはオプションの情報文字列でそれらを指定しライブラリーに加えることができます

list ltlibrary_namegt ライブラリーの RTL コンポーネントをすべてリスト表示します現在このオプションはOpenCL 関数のリスト化には利用できません

aocl library list ltlibrary_namegt

help インテル FPGA SDK for OpenCL ライブラリーユーティリティーオプションのリストとその説明を画面上に表示しますaocl library help

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性

インテル FPGA SDK for OpenCL はデザインのコンスタントローカルおよびプライベート変数に適用できるカーネルメモリー属性を提供しますそれらを使用しローカルメモリーシステムおよびプライベートメモリーシステムのオンチップメモリーアーキテクチャーをカスタマイズすることが可能です

注意 これらのローカルメモリーカーネル属性はコンスタントローカルまたはプライベート変数にのみ適用してください

表 13 ローカルメモリーをコンフィグレーションするための OpenCL の属性

属性 説明

register ローカル変数がレジスターのパイプラインを介して伝達される必要があることを指定しますレジスター変数の実装はFF のみで行うこともFF と RAM ベースのFIFO を組み合わせて行うことも可能です

memory(impl_type) ローカル変数をメモリーシステムに実装する必要があることを指定しますメモリーカーネル属性を含めることはローカル変数を__local修飾子で宣言することと同等ですオプションで文字列引数を渡しメモリーの実装タイプを指定することが可能ですimpl_type に BLOCK_RAMまたは MLABを指定するとメモリーはそれぞれメモリーブロック (M20K など) またはメモリーロジックアレイブロック(MLAB) を使用し実装されます

numbanks(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

bankwidth(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN バイト幅のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

singlepump ローカル変数を実装しているメモリーシステムをシングルポンピングする必要があることを指定します

doublepump ローカル変数を実装しているメモリーシステムをダブルポンピングする必要があることを指定します

numreadports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の読み出しポートを有する必要があることを指定しますN は 0 より大きい整数値です

numwriteports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の書き込みポートを有する必要があることを指定しますN は 0 より大きい整数値です

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

171

属性 説明

merge(label direction) 2 つ以上の変数を同じメモリーシステムに実装するように強制しますlabel は任意の文字列です結合しようとしている変数に同じラベルを割り当てますdirection に widthもしくは depthを指定しメモリーをそれぞれ幅方向または深さ方向のどちらに結合するかを特定します

bank_bits(b 0 b 1 b n ) メモリーシステムを2n のバンクに分割するよう強制しますb 0 b 1 b nはバンク選択ビットを形成しています重要 b 0 b 1 hellipb n はかならず連続する正の整数にしてください

bank_bits属性なしで numbanks(n)属性を指定するとバンク選択ビットはデフォルトで 下位ビット (01helliplog2(numbanks)-1) になります

max_concurrency(N) メモリーが 大 N 個のプライベートコピーを保有しN 回のループの同時反復を常に実行することを指定しますここで N は2 の累乗に切り上げられます(宣言またはアクセスパターンによって) 変数の範囲がループに限定されている場合この属性を適用しますループがpragma max_concurrency M も持っている場合作成されるプライベートコピーの数はmin(MN)になります

表 14 メモリー属性のコード例

ユースケース例 構文

レジスターに変数を実装する int __attribute__((register)) a[12]

それぞれ 8 バイト幅の 8 つのバンクを持つメモリーシステムを実装する int __attribute__((memory numbanks(8) bankwidth(8)) b[16]

ダブルポンピングのメモリーシステムを128 バイト幅のバンク 1 つ書き込みポート 1 つ読み出しポート 4 つとともに実装する

int __attribute__((memory numbanks(1) bankwidth(128) doublepump numwriteports(1) numreadports(4)) c[32]

structのデータメンバーにメモリー属性を適用することも可能ですstruct 宣言の structデータメンバーに属性を指定してくださいstructのオブジェクトのインスタンス化に属性を適用するとこの属性は structデータメンバーの宣言で指定された属性を上書きします以下を例として示します

struct State int array[100] __attribute__((__memory__)) int reg[4] __attribute__((__register__)) __kernel void sum() struct State S1 struct State S2 __attribute__((__memory__)) some uses

オフラインコンパイラーは S1 をメモリーに実装される S1array[100]とレジスターに実装される S1reg[4]の 2 つの変数に分割しますただしS2には memory属性が適用されているためコンパイラーは struct宣言でオブジェクト S2に適用された属性を無視しそれを分割しません

関連情報bull ローカルメモリーのバンキングによるカーネルパフォーマンスの向上

bull メモリーレプリケーションファクタの制御によるローカルメモリーへのアクセスの 適化

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

172

1221 変数固有の属性を使用する際の制約

サポートされていない変数固有の属性の使用法または不正なメモリー構成を検出した場合 インテルFPGA SDK for OpenCL オフラインコンパイラーではエラーが発生するもしくは警告を発行します

コンパイルエラーの原因となる変数固有の属性のサポートされていない使い方

bull カーネル属性をコンスタントローカルまたはプライベート変数の宣言以外の宣言で使用している (例えば関数パラメーターの宣言グローバル変数宣言関数宣言など)

bull register属性を他の変数固有の属性と組み合わせて使用している

bull singlepumpと doublepump属性をどちらも同じ変数宣言に含んでいる

bull singlepumpおよび doublepump属性をnumreadportsまたは numwriteports属性を含まずに指定している

bull numreadports属性を指定する際に numwriteports属性を同じ変数宣言に含んでいないまたはその逆

bull 同じ変数宣言に numbanksと bankwidth属性を含まずに次の属性のいずれかを指定している

mdash numreadports

mdash numwriteports

mdash singlepump

mdash doublepump

コンパイル時にオフラインコンパイラーが警告を発行する原因となる不正なメモリー構成

bull 変数固有の属性で定義されているメモリー構成が利用可能なストレージサイズを超えている (例えば8 バンクのローカルメモリーを整数変数に指定するなど)

コンパイルエラーの原因となる不正なメモリー構成

bull バンク幅がデータのストレージサイズよりも小さい (例えば 4 バイト整数の配列の場合バンク幅は2 バイトです)

bull 変数にメモリーのコンフィグレーションを指定しているコンパイラーの制約またはコーディングスタイルのためオフラインコンパイラーはメモリーを分割するのではなく同じメモリーに変数を実装します

bull register属性を変数に指定しているコンパイラーの制約またはコーディングスタイルによりオフラインコンパイラーは変数をレジスターに実装できません

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性

インテル FPGA SDK for OpenCL にはロジック使用率を低減しカーネルのパフォーマンスを向上させるカーネル属性が含まれておりそれを単一のワークアイテムカーネルに含むことができますこれらのカーネル属性により インテル FPGA SDK for OpenCL オフラインコンパイラーは不要なハードウェアの生成を省略し効率を向上させることが可能になります

1231 カーネルインターフェイスに向けたハードウェア

インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルのパイプライン周辺にハードウェアを生成します一部の OpenCL アプリケーションではこれらのインターフェイスのハードウェアコンポーネントは不要です

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

173

カーネルパイプライン周辺のハードウェアは次のような機能において必要です

bull ワークアイテムおよびワークグループ ID の振り分け

bull カーネル引数とワークグループのサイズに関するホストとの通信

図 20 (174 ページ) はオフラインコンパイラーが次のカーネルをコンパイルする際に生成するハードウェアを表しています

__kernel void my_kernel(global int arg) hellip int sum = 0 for(unsigned i = 0 i lt n i++) if(sum lt m) sum += val arg = sum hellip

図 -20 カーネルパイプライン周辺に インテル FPGA SDK for OpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

12311 カーネル ID を生成し振り分けるハードウェアの省略

Max_global_work_dim(0)カーネル属性はグローバルローカルまたはグループ ID を生成しコンパイルされたカーネルに振り分けるロジックを省略するよう インテル FPGA SDK forOpenCL オフラインコンパイラーに指示します

意味的に max_global_work_dim(0)カーネル属性はカーネルのグローバルワークサイズがゼロであることを指定しますこのカーネル属性を設定するとカーネルがグローバルローカルまたはグループ ID を使用しないことを意味しますカーネルコード内のこの属性の存在はカーネルが単一のワークアイテムカーネルであるということをオフラインコンパイラーに対し保証しています

次のカーネルをコンパイルするとオフラインコンパイラーは図 21 (175 ページ) で表されているインターフェイスハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__kernel void plusK (int N int k) for (int i = 0 i lt N ++i) int data_in = read_channel_intel(chan_in)

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

174

write_channel_intel(chan_out data_in + k)

図 -21 max_global_work_dim(0) 属性をともなうカーネルに向けて インテル FPGA SDK forOpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

現在のカーネル実装に複数のワークアイテムがありグローバルローカルまたはグループ ID を使用していない場合次のようにカーネルコードを変更するとmax_global_work_dim(0)カーネル属性を使用することができます

1 ワークアイテムと同じ数だけ反復する forループのカーネル本体をラップする

2 変更したカーネルを 1 つのワークアイテムのみで起動する

12312 ホストとカーネル間の通信ハードウェアの省略

autorunカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーにホストとカーネルの通信に使用されるロジックを省略するよう指示します autorun属性を使用するカーネルはホストが明示的に起動するカーネルよりも前に自動的に実行を開始しますさらにこのカーネルは実行が終了するとすぐに自動的に再起動します

autorunカーネル属性はオフラインコンパイラーに対しカーネルが独立して実行されどのホストからもエンキューされないことを通知します

autorun属性を活用するにはカーネルが次の基準をすべて満たしている必要があります

1 IO チャネルを使用しないこと

注意 カーネルからカーネルへのチャネルはサポートされています

2 引数を持たないこと

3 max_global_work_dim(0)属性または reqd_work_group_size(XYZ) 属性のどちらかを持つこと

注意 reqd_work_group_size(XYZ) 属性のパラメーターは 232 の除数である必要があります

前述のようにautorun属性のあるカーネルは引数を持つことができずホストが明示的に起動することなく実行を開始しますそのためオフラインコンパイラーはホストとカーネルの通信のためのロジックを生成する必要がありませんこのロジックを省略するとロジック使用率が低下しオフラインコンパイラーがパフォーマンスの 適化をさらに適用することが可能になります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

175

autorun属性の一般的な使用例はカーネル間の 1 つ以上のチャネルからデータを読み取りデータを処理しその結果を 1 つ以上のチャネルに書き込むカーネルですカーネルをコンパイルするとオフラインコンパイラーは図 22 (176 ページ) で表されているようにハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__kernel void plusOne () while(1) int data_in = read_channel_intel(chan_in) write_channel_intel(chan_out data_in + 1)

図 -22 インターフェイスハードウェアのない単一ワークアイテムカーネル

Host Link Hardware

Kernel ID Generators

Kernel

12313 clEnqueueNDRangeKernel API の global_work_offset引数をサポートするハードウェアの省略

uses_global_work_offset(0) のカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーに対しNDRange カーネルの 0 以外または NULL 以外のglobal_work_offset引数をサポートするために必要なハードウェアを省略するよう指示します

このカーネル属性は0 もしくは NULL の global_work_offset引数で必ずエンキューされるカーネルすべてに推奨されますこのカーネル属性が設定されるとインテル FPGA ホストランタイムは0 以外もしくは NULL 以外の global_work_offset引数でカーネルがエンキューされた場合にCL_INVALID_GLOBAL_OFFSETエラーコードを返します

124 num_compute_units(XYZ) 属性を使用したカーネルの複製

num_compute_units(XYZ) カーネル属性を含めると単一ワークアイテムの OpenCL カーネルを複製することができます

計算ユニット数の指定 で示されているようにnum_compute_units(N) カーネル属性をカーネルに含めることで インテル FPGA SDK for OpenCL オフラインコンパイラーに対し複数の計算ユニットを生成しデータを処理するよう指示しますnum_compute_unit(N) 属性はオフラインコンパイラーにカーネルの同一のコピーを N 個ハードウェアに生成するよう指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

176

注意 データに依存するカーネルの処理を制御している特定の計算ユニットを識別するにはget_compute_id()組み込み関数を呼び出します

関連情報bull get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

bull 計算ユニット数の指定 (33 ページ)

1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ

それぞれの違いがわずかで共通するコードを多く持つ複数の計算ユニットを作成するにはnum_compute_units (XYZ) 属性を使用しているカーネルで get_compute_id() 組み込み関数を呼び出します

注意 get_compute_id() 関数はautorunおよび max_global_work_dim(0) カーネル属性を使用するカーネルにのみ使用することができます

計算 ID の取得はカーネルをソースコードに複写し各カーネルのコピーに特定のコードを追加することに代わる有用な方法ですカーネルが num_compute_units(XYZ) 属性を使用しget_compute_id() 関数を呼び出すと インテル FPGA SDK for OpenCL オフラインコンパイラーは固有の計算 ID を各計算ユニットに割り当てますその後 get_compute_id() 関数はそれらの固有の計算 ID を取得します計算 ID を使用することで関連付けられている計算ユニットの動作を指定し同じカーネルのソースコードから派生した他の計算ユニットと異なる動作をさせることが可能です例えばget_compute_id() の戻り値を使用しチャネルの配列にインデックスを付け各計算ユニットが読み書きするチャネルを指定することができます

num_compute_units属性は 大 3 つの引数を受け取ります(num_compute_units(XYZ))get_compute_id() 関数とともにこの属性を使用すると1 次元2 次元および 3 次元のロジック配列の計算ユニットを作成することが可能になります計算ユニットの 1D 配列の使用例には線形パイプラインのカーネル (カーネルのデイジーチェーンとも呼ばれる) があります計算ユニットの 2D 配列の使用例はカーネルのシストリックアレイです

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

177

図 -23 4x4 配列の計算ユニットの概略図次のコード例はnum_compute_units(44)を単一ワークアイテムカーネルで指定しておりこれは 4x4=16 の計算ユニットで構成される 4x4 配列になります

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__attribute__((num_compute_units(44)))__kernel void PE()

row = get_compute_id(0) col = get_compute_id(1)

hellip

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

0

3

2

1

3210col

row

3D 配列の計算ユニットにおいては論理計算ユニット配列の計算ユニットの XYZ 座標をget_compute_id(0)get_compute_id(1)get_compute_id(2)をそれぞれ使用することで取得できますこの場合の API はワークアイテムの組み込み関数 API(get_global_id()get_local_id()get_group_id()) と非常に類似しています

グローバル IDローカル IDおよびグループ ID はホストがカーネルを呼び出す方法によってランタイムで変化しますただし計算 ID はコンパイル時に認識されるためオフラインコンパイラーは各計算ユニットに 適化されたハードウェアを生成できます

1242 カーネルコピーでのチャネル使用

カーネルを複製コピーした計算ユニットにチャネルを実装するにはチャネルの配列を作成しget_compute_id() の戻り値を使用しその配列にインデックスを付けます

次のコード例は複数の計算ユニットにチャネルを実装しています

define N 4channel int chain_channels[N+1]

__attribute__((max_global_work_dim(0)))__kernel void reader(global int data_in int size) for (int i = 0 i lt size ++i) write_channel_intel(chain_channels[0] data_in[i])

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

178

__attribute__((max_global_work_dim(0)))__attribute__((autorun)) __attribute__((num_compute_units(N))) __kernel void plusOne() int compute_id = get_compute_id(0) int input = read_channel_intel(chain_channels[compute_id]) write_channel_intel(chain_channels[compute_id+1] input + 1)

__attribute__((max_global_work_dim(0)))__kernel void writer(global int data_out int size) for (int i = 0 i lt size ++i) data_out[i] = read_channel_intel(chain_channels[N])

図 -24 チャネルを実装するカーネルコピーのトポロジー例この図は上記 OpenCL アプリケーションコードが生成するカーネルグループのトポロジーを表しています

reader writer+1 +1 +1 +1

DDR4 DDR4kernel copies created using num_compute_units(N)

注意 このカーネルコピーの実装はソースコードに 4 つのカーネルを個別に定義しchain_channels[N]へアクセスするためのインデックスをそれぞれハードコーディングすることと機能的に同等です

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

インテル 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() 関数は次のような目的で使用します

bull 大規模なストリックアレイを処理する要素間など空間的に離れたデータパスの間のクリティカルパスの切断

bull 空間的に異なるカーネル実装によって発生する配置とルーティングエフォートの負荷の軽減

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

179

__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 つより多くのレジスターをパスに挿入する場合があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

180

A OpenCL 機能のサポート状況

インテル FPGA SDK for OpenCL のホストランタイムは明確にした内容と例外をともなうかたちでOpenCL プラットフォームレイヤーおよびアプリケーションプログラミングインターフェイス (API)に準拠しています

OpenCL10 の機能のサポート状況 (181 ページ)

OpenCL 12 の機能のサポート状況 (186 ページ)

OpenCL 20 の機能のサポート状況 (187 ページ)

インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ)

A1 OpenCL10 の機能のサポート状況

以降の章ではOpenCL Specification version 10 に記載されている OpenCL 機能のサポート状況の概要を説明します

A11 OpenCL10 C プログラミング言語の実装

OpenCL は一部制限をともなうかたちで C99 に基づいていますOpenCL Specification version10 の Section 6 はOpenCL C プログラミング言語について説明しています インテル FPGA SDKfor OpenCL は明確化された内容と例外をともない OpenCL C プログラミング言語に準拠しています次の表はOpenCL プログラミング言語の実装における機能に対するサポート状況の概要です内容を明確化することなくサポートしている OpenCL プログラミング言語の実装に関しては記載していません

サポート状況の表の見方

シンボル 説明

この機能はサポートされており備考欄にてサポートされている内容を明確にしています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

セクション

機能 サポート状況 備考

611 組み込みスカラーデータ型

倍精度浮動小数点 倍精度浮動小数点の組み込みスカラーデータ型すべてに対する暫定サポートですこの機能はOpenCL Specification version 10 に準拠していない可能性があります現在次の倍精度浮動小数点関数はOpenCL Specification version10 に準拠すると考えられています

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

セクション

機能 サポート状況 備考

add subtract multiply divide ceil floor rint trunc fabs fmax fmin sqrt rsqrt exp exp2 exp10 log log2 log10 sin cos asin acos sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

半精度浮動小数点 スカラーの加算減算乗算に対するサポートです単精度浮動小数点との変換をサポートしますこの機能はOpenCL Specification version 10 に準拠していない可能性がありますこの機能はエミュレーターでサポートされています

612 組み込みベクトルデータ型 3 要素のベクトルに対する暫定サポートです3 要素ベクトルのサポートはOpenCL Specification version 10 を補うものです

613 その他の組み込みデータ型 SDK はイメージをサポートしていないためイメージ型またはサンプラー型をサポートしていません

621 暗黙的な変換 スカラー型とベクトル型の暗黙的な変換に関する重要な説明についてはOpenCL Specification version 12 の Section 626UsualArithmetic Conversions を参照してください

622 明示的なキャスト SDK ではスカラーを異なる要素型のベクトルにキャストできます

65 アドレス空間修飾子 関数スコープ__constant変数はサポートされていません

66 イメージアクセス修飾子 X SDK はイメージをサポートしていません

67 関数修飾子

672 オプションの属性修飾子 カーネルのパフォーマンス向上に向けた reqd_work_group_sizeの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照くださいSDK は vec_type_hintと work_group_size_hint属性修飾子の解析は行いますがそれらを無視します

69 プリプロセッサーディレクティブとマクロ

pragmaディレクティブ (pragmaunroll)

インテル FPGA SDK for OpenCL オフラインコンパイラーはpragmaunrollのみサポートしています整数引数をアンロールディレクティブに割り当てループ展開の範囲を制御することができます例えばpragma unroll 4はループの 4 つの反復を展開します展開係数のないアンロールディレクティブの場合デフォルトでオフラインコンパイラーはループを完全に展開しようと試みますカーネルのパフォーマンス向上に向けたpragma unrollの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

値 1に定義された__ENDIAN_LITTLE__

ターゲット FPGA はリトルエンディアンです

__IMAGE_SUPPORT__ X __IMAGE_SUPPORT__は未定義ですSDK はイメージをサポートしていません

610 Attribute Qualifiersmdashオフラインコンパイラーは以下ように属性修飾子を解析します

6103 変数の属性を指定する (endian) X

6104 ブロック属性と制御フローステートメント属性の指定

X

6105 属性修飾子の拡張 オフラインコンパイラーはさまざまな構文構造の属性を解析することができますまた内部使用のためにいくつかの属性名を予約していますこれらのカーネル属性を使用しカーネルのパフォーマンスを 適化する方法については インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

182

セクション

機能 サポート状況 備考

6112 数学関数

組み込み数学関数 倍精度浮動小数点の組み込み数学関数に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

組み込み数学関数の half_とnative_

倍精度浮動小数点の組み込み数学関数 half_および native_に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

6115 ジオメトリック関数 倍精度浮動小数点の組み込みジオメトリック関数に対する暫定サポートですこの関数は OpenCL Specification version 10 に準拠していない可能性がありますSDK でサポートされる組み込みのジオメトリック関数のリストについては組み込みジオメトリック関数の引数型 を参照してください

6118 イメージ読み取りおよび書き込み機能 X SDK はイメージをサポートしていません

6119 Synchronization Functionsmdash バリアー同期機能

内容の明確化と例外bull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合バリアーは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合バリアーはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

ワークアイテムの制限はカーネルにサポートされているワークグループの大サイズでありこの制限はランタイムに強制されます

61111

グローバルメモリーからローカルメモリーローカルメモリーからグローバルメモリーの非同期コピーおよびプリフェッチ

実装は単純なものですワークアイテム (000) はコピーを実行しwait_group_eventsがバリアーとして実装されますbull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合wait_group_eventsは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合wait_group_eventsはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

関連情報bull Intel FPGA SDK for OpenCL ベストプラクティスガイド

bull 組み込みジオメトリック関数の引数型 (184 ページ)

A12 OpenCL C プログラミング言語の制約

インテル FPGA SDK for OpenCL は特定のプログラミング言語機能に関し OpenCLSpecification version 10 の Section 68 で示されている OpenCL Specification の制約に準拠します

重要 インテル FPGA SDK for OpenCL オフラインコンパイラーは許可されていない特定のプログラミング言語機能に対する制約を強制しません使用しているカーネルコードにOpenCL Specificationversion 10 がサポートしていない機能が含まれていないようにしてください

次の表は インテル FPGA SDK for OpenCL が強制する OpenCL C プログラミング言語の制約に関する補足説明のみを記載しています他の制約はすべてOpenCL Specification version 10 のSection 68 の内容と完全に一致します

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

183

機能 サポート状況 備考

構造体型のカーネル引数 X 構造体引数をグローバルメモリーの構造体へのポインターに変換します

既約の制御フロー X オフラインコンパイラーはこの制約に関しエラーは返しませんがこの機能はサポートされていません

32 ビット未満の組み込み型メモリーへの書き込み

サイズが 32 ビット未満のストア操作はメモリーの性能が低下する可能性がありますがサポートされています

異なるアドレス空間に属する structまたはunion要素

X オフラインコンパイラーはこの制約を強制しません警告 structまたは union要素を異なるアドレス空間に割り当てると致

命的なエラーが発生する可能性があります

サポート状況表の見方

シンボル 説明

この機能はサポートされています備考欄にてサポートされている内容を明確化しています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

A13 組み込みジオメトリック関数の引数型

インテル FPGA SDK for OpenCL はスカラーおよびベクトル引数の組み込みジオメトリック関数を特定の制限をともないサポートしています

関数 引数型

浮動 倍精度

cross

dot

distance

length

normalize

fast_distance mdash

fast_length mdash

fast_normalize mdash

サポート状況表の見方

記号 説明

この機能はサポートされています

mdash この機能は OpenCL Specification で定義されていません

A14 数値コンプライアンスの実装

OpenCL Specification version 10 の Sectoin 7 はOpenCL に準拠するデバイスがサポートする必要がある C99 と IEEE 754 標準の機能を説明しています インテル FPGA SDK for OpenCL はIEEE 標準 754-2008 形式の 32 ビットおよび 64 ビットの浮動小数点値で動作しますがすべての浮動小数点演算子が実装されているわけではありません 

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

184

以下の表は浮動小数点演算子の実装状況の概要です

セクション 機能 サポート状況 備考

71 丸めモード 整数と単精度または半精度の浮動小数点型の変換においてはすべての丸めモードをサポートしています整数と倍精度の浮動小数点型の変換については暫定的な形式ですべての丸めモードをサポートしていますがOpenCL Specification version10 に準拠していない可能性があります

72 INFNaN非正規化数 単精度の演算における無限大 (INF) および非数 (NaN) の結果はOpenCL Specification version 10 に準拠する形式で生成されます非正規化数を処理する演算のほとんどは浮動小数点演算の前後にフラッシュされます倍精度浮動小数点演算に対しては暫定的なサポートでありOpenCLSpecification version 10 に準拠していない可能性があります

73 浮動小数点の例外 X

74 ULP の相対誤差 単精度浮動小数点演算はOpenCL Specification version 10 の埋め込みプロファイルに対する数値精度要件に準拠しています倍精度浮動小数点演算については暫定サポートでありOpenCLSpecification version 10 に準拠していない可能性があります

75 エッジケースの動作

A15 イメージのアドレス指定とフィルタリングの実装

インテル FPGA SDK for OpenCL はイメージのアドレス指定とフィルタリングをサポートしませんSDK はイメージをサポートしていません

A16 アトミック関数

OpenCL Specification version 10 の Section 9 には一部の OpenCL 実装においてサポートされる場合があるオプションの機能が記載されています インテル FPGA SDK for OpenCL は条件付きでアトミック関数をサポートしますサポートされているこの関数の実装はOpenCL SpecificationVersion 10 に準拠していない可能性があります

bull Section 95 の Atomic Functions for 32-bit Integers に関しSDK は 32 ビットのグローバルおよびローカルメモリーのアトミック関数をすべてサポートしますSDK はまたOpenCLSpecification version 11 の Section 61111OpenCL Specification version 12 のSection 61211 に記載されている 32 ビットのアトミック関数もサポートしています

mdash SDK はOpenCL Specification version 10 の Section 97 に記載されている 64 ビットのアトミック関数をサポートしていません

注意 アトミック関数を使用するとデザインのパフォーマンスが低下する可能性がありますカーネルに複数の型のアトミック関数を実装する場合 (atomic_addと atomic_subなど)ハードウェアの動作周波数がさらに低下する可能性があります

A17 埋め込みプロファイルの実装

OpenCL Specification version 10 の Section 10 はOpenCL の埋め込みプロファイルについて説明しています インテル FPGA SDK for OpenCL は明確化した内容および例外をともないOpenCL の埋め込みプロファイルに準拠しています

次の表はOpenCL 埋め込みプロファイルの明確化した内容および例外の概要です

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

185

項目 機能 サポート状況 備考

1 64 ビット整数 64 ビット整数はOpenCL Specification version 10 の埋め込みプロファイルに対し補助的な形式でサポートされています

2 3D イメージ X SDK はイメージをサポートしていません

3 image_channel_data_typeの値による 2D および 3D イメージの作成

X SDK はイメージをサポートしていません

4 サンプラー X SDK はサンプラーをサポートしていません

5 丸めモード CL_DEVICE_SINGLE_FP_CONFIGのデフォルトの丸めモードはCL_FP_ROUND_TO_NEARESTです

6 単精度の基本的な浮動小数点演算に対し記載されている制約事項

X

7 半精度型 X OpenCL Specification version 10 のこの項目はSDK に適用されません

8 CL_UNORM_INT8CL_SNORM_INT8CL_UNORM_INT16CL_SNORM_INT16から float への変換に対して記載されているエラー範囲

A2 OpenCL 12 の機能のサポート状況

以降の章ではOpenCL Specification version 12 に記載されている OpenCL 機能のサポート状況の概要を説明します

A21 OpenCL 12 のランタイムの実装

インテル FPGA SDK for OpenCL はサブバッファーオブジェクトの実装をサポートしていますサブバッファーオブジェクトに関する詳細はOpenCL Specification version 12 の Section 52 を参照ください

SDK は次の API の実装もサポートしています

bull clSetMemObjectDestructorCallback

bull clGetKernelArgInfo

bull clSetEventCallback

これらの API についての詳細はOpenCL Specification 12 の Section 541573 および 59をそれぞれ参照ください

関連情報OpenCL Specification version 12

A22 OpenCL 12 C プログラミング言語の実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 12 の Section 6 で指定されている OpenCL C プログラミング言語機能の多くをサポートしています SDK は明確にした内容および例外をともないOpenCL C プログラミング言語に準拠しています

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

186

注意 サポート状況欄の「」はサポートされている機能であり備考欄においてサポートされている内容を明確にしていますサポート状況欄の「」は備考欄で特定されている内容を除きサポートされている機能です

表 15 OpenCL 12 C プログラミング言語機能のサポート状況

セクション 機能 サポート状況 備考

613 その他の組み込みデータ型 この機能は OpenCL Specification version 12 に準拠していない可能性があります

61212 各種ベクトル関数 SDK は次の組み込みベクトル関数を追加しサポートしていますbull vec_step

bull shuffle

bull shuffle2

61213 printf この機能は OpenCL Specification version 12 に準拠していない可能性があります詳細は下記を確認ください

OpenCL の printf関数は一部例外をともないC99 の printf関数に類似する構文と機能を持ちます詳細はOpenCL Specificationversion 12 を参照くださいprintf関数の使用においてコンパイル手順バッファーまたはフラグに対する特別な要件はありません通常の aocコマンドでprintf命令を含むカーネルをコンパイルすることができますカーネルの実行中に printfデータは インテル FPGA SDK for OpenCL オフラインコンパイラーが自動的に割り当てるグローバルprintfバッファーに格納されますこのバッファーのサイズは 64 kB でありprintf呼び出しのデータ引数の合計サイズがこのサイズを超えてはいけませんカーネルの実行が完了すると printfバッファーのコンテンツは標準出力されますprintfステートメントのフォーマット文字列は256 文字を超えることはできませんバッファーのオーバーフローはシームレスに処理されますつまりprintf命令は無制限に実行することができますただしprintfバッファーがオーバーフローするとカーネルのパイプラインの実行はホストがバッファーを読み取りバッファー内容を出力するまでストールしますprintf関数はデータをグローバルメモリーバッファーに格納するためそのような関数が含まれている場合カーネルのパフォーマンスは低下しますprintf関数の使用上の制限はありませんprintf命令はifと elseのステートメントやループなどで使用することができますカーネルは複数のワークアイテムで実行される複数の printf命令を含むことができますprintf呼び出しのフォーマット文字列引数と文字列リテラル引数は特別なメモリー領域を使用し FPGA からホストシステムに転送されますprintf文字列引数の合計サイズが大きい場合このメモリー領域はオーバーフローする可能性があります (一般的な OpenCL アプリケーションでは通常 3000 文字以下が安全です)オーバーフローした場合エラーメッセージ cannot parse auto-discovery string atbyte offset 4096がホストプログラムの実行中に出力されますprintfからの出力はワークアイテムが並行して printf関数を実行しても混在することはありませんただし並行して実行される printfの順序は保証されていませんつまり printf命令が並行するデータパスにある場合printf出力はプログラム順に表示されない可能性があります

関連情報OpenCL Specification version 12

A3 OpenCL 20 の機能のサポート状況

以降の章ではOpenCL Specification version 20 に記されている OpenCL の機能のサポート状況の概要を提供します

A31 OpenCL 20 のヘッダー

インテル FPGA SDK for OpenCL はすべての OpenCL バージョンをサポートする統一ヘッダーを提供します

OpenCL 20 の機能を使用するには次の 2 行をコードに含めてください

define CL_TARGET_OPENCL_VERSION 200include ltCLopenclhgt

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

187

注意 SDK は現在OpenCL 20 の API をすべてサポートしているわけではありませんサポートされていない API を呼び出すとその API が完全にはサポートされていないことを示すエラーコードが返されます

A32 OpenCL 20 ランタイムの実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 20 の Section 56 に記載されているように共有仮想メモリーの実装に対する暫定サポートを提供しています共有仮想メモリーに関する詳細は OpenCL Specification version 20 の Section 56 を参照ください

重要 ご利用のボード仕様を参照しボードが共有仮想メモリーをサポートしていることを確認してください

関連情報OpenCL Specification version 20 (API)

A33 OpenCL 20 C プログラミング言語のパイプにおける制約

インテル FPGA SDK for OpenCL はOpenCL のパイプに対する暫定サポートを提供します次の表はOpenCL Specification version 20 に記載されているパイプ固有の OpenCL C プログラミング言語の実装に対するサポート状況を示しています

注意 サポート状況欄の「」はサポートされている機能であり一部については備考欄においてサポートされている内容を明確化していますSDK がサポートしていない機能は「X」で識別されています

表 16 パイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数ついての詳細はOpenCL Specification version 20 の Section 613162 で提供されています

関数 サポート状況

int read_pipe (pipe gentype p gentype ptr)

int write_pipe (pipe gentype p const gentype ptr)

int read_pipe (pipe gentype p reserve_id_t reserve_id uint index gentypeptr)

X

int write_pipe (pipe gentype p reserve_id_t reserve_id uint index constgentype ptr)

X

reserve_id_t reserve_read_pipe (pipe gentype p uint num_packets)

reserve_id_t reserve_write_pipe (pipe gentype p uint num_packets)

X

void commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

bool is_valid_reserve_id (reserve_id_t reserve_id) X

表 17 ワークグループのパイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613163で提供されています

関数 サポート状況

reserve_id_t work_group_reserve_read_pipe (pipe gentype p uint num_packets) X

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

188

関数 サポート状況

reserve_id_t work_group_reserve_write_pipe (pipe gentype p uint num_packets)

void work_group_commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void work_group_commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

表 18 パイプクエリーの組み込み関数に対するサポート状況パイプクエリーの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613164 で提供されています

関数 サポート状況

uint get_pipe_num_packets (pipe gentype p) X

uint get_pipe_max_packets (pipe gentype p) X

関連情報OpenCL Specification version 20 (C Language)

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限

項目 制限

大コンテキスト数 ホストメモリーのサイズによってのみ制限されます

大デバイス数 128

ランタイムの 小グローバルメモリー割り当て ランタイムはコンテキストが作成されると 64 kB のデバイスメモリーを割り当てますこのメモリーはプログラム変数の場合はグローバルアドレス空間に静的変数の場合は関数内に予約されていますOpenCL カーネルが printf関数を使用する場合ランタイムは 64 kB のデバイスメモリーを追加し割り当てます

大キュー数 1024

注意 各コンテキストはシステム目的でキューを 2 つ使用します

コンテキストあたりの 大プログラムオブジェクト数 20

コンテキストあたりの 大イベントオブジェクト数 ホストメモリーのサイズによってのみ制限されます

コンテキスト内のイベント間における依存関係の 大数

1000

コマンドあたりのイベント依存関係の 大数 20

大同時実行カーネル数 キューの合計数

エンキューされるカーネルの 大数 1000

FPGA デバイスあたりの 大カーネル数 ハードウェアに静的な制限はありませんエミュレーターは 256 です

カーネルあたりの 大の引数の数 128

カーネル引数の 大合計サイズ カーネルあたり 256 バイト

各カーネルのローカルメモリーにおける宣言済み変数の 大数

128

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20190401 191 bull 以下のトピックを新しく追加しましたmdash ループの投機的実行 (speculated_iterations Pragma) (32 ページ)mdash メモリー属性の指定 (34 ページ)

bull ループの並列性 (max_concurrency Pragma) (31 ページ) に無制限の並行性に関する注意を加えました

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)においてIntelFPGAを関数名に含む非標準の呼び出しに ICD を使用する場合の手順を更新しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)(140 ページ) にパフォーマンスカウンターを使用した OpenCL カーネルのパイプライン計測に関する注記を追加しました

bull ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) (123 ページ) を追加し-no-hardware-kernel-invocation-queueオプションに関し説明しています

bull グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ) を追加し-global-ringオプションに関し説明しています

bull グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring) (116 ページ) を追加し-duplicate-ringオプションに関し説明しています

bull ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) (124 ページ) を追加し-hyper-optimized-handshakingオプションに関し説明しています

bull 整数のプロモーション規則 (80 ページ) を追加し整数のプロモーションに関し説明しています

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) およびカーネル実行中におけるプロファイルデータの収集 (86 ページ) にCLcl_ext_intelfpgahヘッダーファイルを含める際の注意を追加しました

bull uses_global_work_offset(0) カーネル属性に関する新しい項目clEnqueueNDRangeKernel API の global_work_offset 引数をサポートするハードウェアの省略 (176 ページ) を追加しました

bull OpenCL10 C プログラミング言語の実装 (181 ページ) の以下の内容を変更しましたmdash 613 に対するサポート状況の内容を変更し説明を追加mdash 614615 および 6102 を削除mdash 66 および 6118 の説明を追加mdash 6112 および 6115 に関する説明を更新mdash 6119 および 61111 のサポート状況を変更

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull OpenCL C プログラミング言語の制約 (183 ページ) において以下の内容を変更していますmdash 次の機能に関する注記を削除しました

bull 関数へのポインターbull ビットフィールドbull externstaticautoregisterのストレージクラス指定子bull 再帰bull event_t型の__kernel関数のへの引数宣言

mdash 特別な注意がない機能をすべて削除しましたmdash 以下の機能を削除しました

bull アドレススペース間のポインター割り当てbull イメージbull 定義済み識別子

mdash 「32 ビット未満の組み込み型メモリーへの書き込み」に関する説明を更新しました

bull 組み込みジオメトリック関数の引数型 (184 ページ) にサポート状況表の見方を追加しました

bull 数値コンプライアンスの実装 (184 ページ) の71 の説明を更新しましたbull 埋め込みプロファイルの実装 (185 ページ) の項目 4 に説明を追加しましたbull OpenCL 12 のランタイムの実装 (186 ページ) のイメージオブジェクトに対する

サポート情報を削除しましたbull OpenCL 12 C プログラミング言語の実装 (186 ページ) のprintfに対するサ

ポート情報と注記およびその他のデータ型の組み込み関数についての注記を更新しました

bull OpenCL 20 のヘッダー (187 ページ) の古い情報を削除し新しい情報を追加しました

bull 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages) (18 ページ) に-list-board-packagesオプションの詳細を追加しました

bull FPGA ボードのインストール (install) (21 ページ) において手順 6 の FCD に関する詳細および手順 5 の例を追記しました

bull FPGA ボードのアンインストール (uninstall) (22 ページ) にFCD に関する詳細を追記しました

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ) に-board-package=ltboard_package_pathgt に関する詳細を追記しました

bull 高速エミュレーターの既知の問題 (134 ページ) のAutoRun (自動実行) の表記をAutorun に変更しました (英語版のみ)

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) を追加し-fmax=ltfmax target in MHzgt に関し説明しています

bull Windows での ICD Loader Library への接続およびLinux での ICD LoaderLibrary への接続の項目を削除しWindows および Linux における ICD と FCD ドライバーに関する情報を次の項目に追加しましたmdash ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ペー

ジ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表

示 (ldflags) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示

(ldlibs) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情

報の表示 (link-config または linkflags) (96 ページ)bull OpenCL ICD 拡張 API の使用 (97 ページ) の項目を追加しOpenCL ICD 拡張

API の使用方法を説明しています

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

191

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull カーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ)において次の内容を変更しましたmdash タイトルの変更mdash 概要説明の変更mdash registerの説明を FF と FIFO の情報とともに更新mdash memory属性の名前と説明を更新しメモリーの実装型に関する詳細を追加mdash max_concurrency(N) 属性およびそれに関する説明の追加mdash 構造型データメンバーでのメモリー属性の指定に関する情報を追加

bull 変数固有の属性を使用する際の制約 (173 ページ) にconstant 変数に関する内容を記載しnumbanks属性に関する箇条書きの項目を削除しました

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) の項目を追加しfmax ターゲット属性と aoc コマンドオプションに関して説明しています

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ) を更新し高速エミュレーターが現在はデフォルトであり推奨されることを反映しました

20181224 1811 bull RTL リセットおよびクロック信号 (153 ページ) を更新しOpenCL カーネルクロックの2倍の周波数で動作するシステム全体のクロックに対する RTL モジュールのアクセスに関する内容を説明しています

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のEXPECTED_LATENCY要素に関する説明を更新しストールをサポートし ireadyなどの信号を必要とするモジュールに対する EXPECTED_LATENCY値の要件を含めました

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のIS_FIXED_LATENCYXML 要素の説明を更新しIS_FIXED_LATENCY=noが設定されている場合のEXPECTED_LATENCY値の要件を含めました

bull PARAMETER要素を ATTRIBUTES を指定する XML 要素 (156 ページ) に追加しました

bull unique_212unique_212_Connect_42_ul_rlt_5pj_w5 (162 ページ) の箇条書きの2番目の項目において「正確にクロック 1 つ」を削除しました

bull インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt) (108 ページ) を更新し-oオプションの構文から=を削除しましたaocコマンドで出力ファイル名を指定する正しい方法は-o ltfilenamegt ですこのオプションは-o=ltfilenamegt と誤って記載されていましたまたこのコマンドオプションを使用する本プログラミングガイドの構文例はすべて今回の更新において訂正されています

20180927 181 bull RTL モジュールインターフェイス (151 ページ) の重複していた内容を削除しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

192

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20180924 181 bull インテル FPGA SDK for OpenCL プロエディションのインテル FPGA SDK forOpenCL オフラインコンパイラーには新しいフロントエンドがありますこの新しいフロントエンドによって変更になった内容の概要は Intel FPGA SDK for OpenCLPro Edition Release Notes の Improved Intel FPGA SDK for OpenCLCompiler Front End を参照ください

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ) に新しい OpenCL シミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

(166 ページ)mdash OpenCL ライブラリーのシミュレーション (166 ページ)mdash シミュレーターの制限 (168 ページ)

bull 高速エミュレーターの設定 (125 ページ) に新しい OpenCL 高速エミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash 高速エミュレーターの環境変数 (133 ページ)mdash 高速エミュレーターでサポートされている拡張機能 (133 ページ)mdash 高速エミュレーターの既知の問題 (134 ページ)

bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ) を更新しstructカーネルパラメーターは値または structへのポインターとして渡さなければならないことを示しました

bull 参照でのチャネル渡しに対するサポートは終了したため参照でのチャネル渡しに関する参照内容を削除しました

20180803 180 bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ) の誤記を訂正しました正しいフラグは CL_MEM_HETEROGENEOUS_INTELFPGAですこれまでこのフラグは誤って CL_MEM_HETEROGENEOUS_INTELになっていました

20180614 180 bull ハードウェアを構築せずに行うカーネルのコンパイル (-c) (106 ページ) のaoc -cコマンドの動作についての説明を訂正しました-cコマンドオプションでフォルダーやサブディレクトリーは作成されません

20180523 180 bull カーネルコピーでのチャネル使用 (178 ページ) のコード例を訂正しデザイン例が正常にコンパイルされるようにしました

20180504 180 bull インテル Quartus Prime 開発ソフトウェアスタンダードエディションに関する情報を削除しました

bull 中間コンパイルでの aocコマンドおよび関連するすべての内容において-cを-rtlに変更しました インテル FPGA SDK for OpenCL プロエディションは-rtlフラグを中間コンパイルに提供します

bull 次の項目に記載されているデバイスの 大数を 128 に増加しましたmdash FPGA ボードのインストール (install) (21 ページ)mdash FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)mdash ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)mdash オフラインまたはホストなしでの FPGA のプログラミング (program

ltdevice_namegt) (24 ページ)mdash フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)mdash 複数の FPGA デバイスのプログラミング (99 ページ)

bull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) のワンステップでの OpenCL カーネルのコンパイルフローに記載されている図およびトピックの内容を更新しました

bull 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー (12 ページ) の複数のステップによる インテル FPGA SDK forOpenCL プロエディションデザインフローの図を更新し-rtl高速コンパイルおよびインクリメンタルコンパイルに関する情報を追記しました

bull データの処理効率を 適化するためのプログラミング手法 (27 ページ) にループの並列性 (max_concurrency Pragma) (31 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

193

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull 項目のタイトルをローカルメモリー効率の 適化に向けたプログラミング手法からローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35ページ) へ変更しました

bull IO チャネルのエミュレーション (46 ページ) の章においてカーネルとホストまたはカーネルと他のプロセス間における通信のエミュレーション (Linux 限定) を削除しました

bull 値によってチャネルまたはパイプを渡すカーネルのエミュレーション (127 ページ)を更新し値によるパイプまたはチャネル渡しに関する情報を追加しましたまた参照によるチャネル渡しに対するサポートは非推奨です

bull 項目のタイトルを「チャネルまたはパイプの複数のコマンドキュー実装に向けた要件」からカーネルを同時に実行するための複数のコマンドキューにおける要件 (82ページ) に変更し内容を更新しました

bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ) の項目を次のサブ項目とともに追加しましたmdash インクリメンタルコンパイルレポート (119 ページ)mdash インクリメンタルコンパイルのその他のコマンドオプション (120 ページ)mdash インクリメンタルコンパイルフィーチャーの制限 (123 ページ)

bull 早期の ECC 機能に関するメモリーの誤り訂正符号をともなうカーネルのコンパイル(-ecc) (123 ページ) の項目を追加しました

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) の次の内容を変更していますmdash 項目のタイトルを新しいカーネル引数属性オプションから

intel_host_accessible カーネル引数属性オプション (67 ページ) に変更mdash 項目のタイトルを新しい API 機能から ホストがアクセス可能なパイプカーネル

引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数(68 ページ) に変更

bull インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ) の次の内容を変更していますmdash ランタイムでのサポートが終了したことによる環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA の参照項目を削除

mdash キューの 大数を更新bull RTL モジュールの XML 構文 (154 ページ) にRESOURCES要素に関する内容を

追加しましたmdash リソースを指定する XML 要素 (159 ページ) の項目を追加

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテルStratix 10 デザイン固有のリセット要件 (154 ページ) の項目を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にカーネル内に登録される割り当ての組み込み関数 (179 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

194

日付 バージョン 変更内容

2017 年 12 月 20171208 bull 次の項目を新しく追加しましたmdash 自動実行カーネルのプロファイリング (142 ページ)mdash エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ペー

ジ)mdash プロファイルデータの取得 (89 ページ)mdash 複数の自動実行プロファイリング呼び出し (89 ページ)mdash インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの

開発 (143 ページ)mdash Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフ

ラインコンパイラープラグインのコンフィグレーション (143 ページ)mdash Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラ

ープラグインのコンフィグレーション (143 ページ)mdash インテル Code Builder for OpenCL でのセッションの作成 (144 ページ)mdash セッションのコンフィグレーション (145 ページ)

bull RTL モジュールの XML 構文 (154 ページ) のXML 仕様ファイルからltPARAMETER name=WIDTH value=32gt を削除しました

2017 年 11 月 20171106 bull トピックを各章へ移動しましたbull リファレンスの商標を次のように変更しました

mdash マクロ ALTERA_CLを INTELFPGA_CLへmdash 環境変数 ALTERAOCLSDKROOTを INTELFPGAOCLSDKROOTへmdash 環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_ALTERA をCL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA へ

mdash clGetExtensionFunctionAddressをclGetExtensionFunctionAddressIntelFPGAへ

mdash 環境変数 CL_CONTEXT_EMULATOR_DEVICE_ALTERA をCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA へ

mdash write_channel_alteraを write_channel_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash CL_MEM_BANKを CL_CHANNELへmdash CL_MEM_BANK_1_INTELを CL_CHANNEL_1_INTELFPGAへmdash CL_MEM_BANK_2_INTELを CL_CHANNEL_2_INTELFPGAへmdash Arria 10 を インテル Arria 10 へmdash Quartus Prime をインテル Quartus Prime へmdash インテル FPGA SDK for OpenCL Profiler を インテル FPGA Dynamic

Profiler for OpenCL へmdash TimeQuest タイミングアナライザーをタイミングアナライザーへmdash Qsys Pro をプラットフォームデザイナーへ

bull インテル FPGA SDK for OpenCL の FPGA プログラミングフロー (8 ページ) にFPGA データフローのアーキテクチャー図と関連する記述を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の項目にRTL モジュールインターフェイス (151 ページ) を追加しRTL モジュールインターフェイスの動作例を提供しています

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) のタイミング図を更新しました

bull ブロッキングのチャネル書き込みの実装 (42 ページ) とブロッキングのチャネル読み取りの実装 (43 ページ) においてlttypegt の定義から「一定にできない」という記述を削除しました

bull 徐々に速度低下する OpenCL システムのデバッグ (104 ページ) の項目を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

195

日付 バージョン 変更内容

bull PLDA ウェブサイトへのリンクを OpenCL カーネルのコンパイル (105 ページ) に追加しました

bull カーネルの命名ガイドライン (26 ページ) において箇条書きの 後のポイントを更新しキーワードとなる VHDL と Verilog を含めました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) に制御可能なデザインの側面を一覧にしました

bull OpenCL ライブラリー (147 ページ) に RTL の拡張を追加しましたbull RTL モジュールと OpenCL パイプラインの理解 (148 ページ) の項目をインテル

FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ) と RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149 ページ)に分割しました

bull インテル FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ)の左側のコード例を右側の図に合わせました図の下部を図を説明する段落の上に移動させました

bull RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149ページ) に Avalon -ST の関連リンクを追加しました

bull ストールのない RTL (150 ページ) のパラグラフを手順ごとに分割し関連リンクを追加しました

bull 複数のワークアイテムの決定論的な順序付けにおける要件 (38 ページ) にワークアイテムの順序付けにおける 3 番目の要件を追加しました

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) を更新しましたbull 新しいトピック OpenCL コンパイルの高速化 (-fast-compile) (117 ページ) を追

加し-option=ltvaluegt の規則を実装しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のlog ファイルへのリファレンスを HTML レポートに置き換え二重ダッシュのコマンドオプションを単一ダッシュに置き換えました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にStratix 10 に対するサポートを追加しました

bull ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得(16 ページ) に二重ダッシュおよび aoc コマンドの-option ltvaluegt の表記規則が非推奨となったことを強調する注記を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

196

日付 バージョン 変更内容

bull 次の項目に単一ダッシュと-option=ltvaluegt の表記規則を適用しましたmdash コンパイラーバージョンの表示 (-version) (17 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプショ

ンリストの表示 (引数なし-help-h) (17 ページ)mdash 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-

boards および-list-board-packages) (18 ページ)mdash 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)mdash ヘッダーファイル位置の指定 (-I=ltdirectorygt) (107 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の

指定 (-o ltfilenamegt) (108 ページ)mdash 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル

(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

mdash カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) (110 ページ)

mdash カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) (111 ページ)

mdash リソース推定使用率要約の画面表示 (-report) (113 ページ)mdash グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt) (115 ページ)mdash コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-

cache-bytes=ltNgt) (116 ページ)mdash 浮動小数点演算処理順序の緩和 (-fp-relaxed) (116 ページ)mdash 浮動小数点演算における丸め処理の削減 (-fpc) (117 ページ)mdash チャネル深度のエミュレーション (128 ページ)mdash エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-

emulator) (128 ページ)mdash OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

(161 ページ)mdash OpenCL ライブラリーのコマンドラインオプション (170 ページ)mdash パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

(140 ページ)bull カスタムプラットフォーム固有の関数へのアクセス (90 ページ) にICD Loader の

関連リンクを追加しましたbull 計算ユニット数の指定 (33 ページ)num_compute_units(XYZ) 属性を使用し

たカーネルの複製 (176 ページ)OpenCL カーネルのエミュレーション (129 ページ) に計算ユニットに関する注記を追加しました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にインテル Stratix 10 に対するサポートを追加しました

bull ハードウェアとエミュレーターの結果の不一致 (131 ページ) の項目を追加しましたbull OpenCL C プログラミング言語の制約 (183 ページ) にサポート状況表の見方を

追加しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のフローチャートを簡略化しそれにともなう記述を更新しました

bull AOCL_BOARD_PACKAGE_ROOT は廃止されているためリファレンスを本プログラミングガイドから削除しました

bull aocl installのインスタンスをaocl installltpath_to_customplatformgt に更新しました

bull aocl uninstallのインスタンスをaocl uninstallltpath_to_customplatformgt に更新しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

197

日付 バージョン 変更内容

bull ホストパイプに関する次の項目を新しく追加しましたmdash ホストパイプを介したカーネルとの直接通信 (67 ページ)mdash intel_host_accessible カーネル引数属性オプション (67 ページ)mdash ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプ

オブジェクトと通信するための API 関数 (68 ページ)mdash ホストがアクセス可能なパイプの作成 (69 ページ)mdash cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

bull OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化(41 ページ) にチャネル拡張を有効にするためのプラグマを追加しました

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ) および外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ) のデザイン例のコンパイル手順を更新しました

bull インテル FPGA SDK for OpenCL チャネル拡張の実装における制約 (39 ページ)の「単一のチャネル呼び出しサイト」の項目を「複数のチャネル呼び出しサイト」に置き換えました

2017 年 5 月 20170508 bull コード例の関数の商標を次のように変更しましたmdash read_channel_alteraを read_channel_intelへmdash write_channel_alteraを write_channel_intelへmdash read_channel_nb_alteraを read_channel_nb_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash clGetBoardExtensionFunctionAddressAlteraを

clGetBoardExtensionFunctionAddressIntelFPGAへbull IO チャネルのエミュレーション (46 ページ) を追加しましたbull 任意精度での整数の実装 (70 ページ) を追加しましたbull ネスト化されたループの結合 (28 ページ) を追加しましたbull ループ開始間隔の指定 (II) (30 ページ) を追加しましたbull チャネル深度のエミュレーション (128 ページ) を追加しましたbull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) を追加しまし

たbull pragma OPENCL EXTENSION cl_altera_channels enableへ

のリファレンスをすべて削除しましたチャネルの実装にこのプラグマは必要ありません

bull 異種メモリーに関する情報を次のように再編成しましたmdash メモリーにおけるポインターサイズの指定の内容をローカルメモリーサイズへ

のポインターの 適化に向けたプログラミング手法 (35 ページ) へ統合mdash 次の 3 項目に構成を変更

bull グローバルメモリーの手動分割における OpenCL バッファーの割り当て(82 ページ)

bull 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)

bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ)mdash グローバルメモリーにおけるバッファー位置の指定の内容を異なるメモリータイ

プ (異種メモリー) 間でのバッファーの分割 (84 ページ) に移動(これまではアクセス効率の 適化に向けたプログラミング手法にありました)

bull カーネル実行中におけるプロファイルデータの収集 (86 ページ) を更新しプロファイルデータの収集がカーネル起動時に与える影響についての警告を加えました

bull OpenCL カーネルのコンパイル (105 ページ) に暗号化されたclファイルをコンパイルする際の制約を加え更新しました

bull インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限 (162 ページ) を更新しRTL モジュールは入力を制御するために単一入力のAvalon-ST インターフェイスを使用する必要があることを明記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

198

日付 バージョン 変更内容

bull OpenCL Profiler の変更によって影響を受ける項目を以下のように更新しましたmdash インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) (141

ページ) に新しいコマンドオプションを含め更新mdash 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデ

ザインフロー (12 ページ) の図 5 (13 ページ) に新しいコマンドオプションを反映させて更新

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) のコード例を訂正しました

bull チャネルのワークアイテムのシリアル実行 (39 ページ) の複数のワークアイテムをともなうループのチャネル実行の章に記載されているコード例を訂正しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の章に以下の更新を行いましたmdash RTL モジュールと外部メモリーの通信 (159 ページ) を更新しRTL モジュール

と外部メモリーの通信において推奨される手法を明記mdash RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

(161 ページ) を更新しインテル Quartus Prime 開発ソフトウェアプロエディションユーザーガイドのパーシャルリコンフィグレーションへのリンクを追記

mdash bankbitsと mergeの内容をカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) に追加

mdash コード例の関数の商標を以下のように変更bull read_channel_alteraを read_channel_intelへbull write_channel_alteraを write_channel_intelへ

2016 年 10 月 20161031 bull Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更しました

bull Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコンパイラーに商標を変更しました

bull ビッグエンディアンシステムに対するサポートが廃止削除されたため次の内容が変更になっていますmdash ビッグエンディアンシステムのためのカーネルのコンパイル (--big-endian) の

項目を削除mdash ビッグエンディアン (64 ビット) をホストアプリケーションがターゲットにでき

るアーキテクチャーのリストから削除bull OpenCL バイナリーのコンパイル環境の表示の項目を追加しaoc envコマンドを

導入しましたbull 適化レポートへのソースの参照先追加 (-g) を削除しましたオフラインコンパイ

ラーは自動的にソース情報をコンパイラーレポートに含めx86 Linux マシンでのエミュレーション中のシンボリックデバッグを有効にします

bull コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) の項目を追加し-g0 aocコマンドオプションを導入しました

bull インテル FPGA SDK for OpenCL エミュレーターの制限事項から「エミュレーターはハーフデータ型をサポートしません」という記述を削除しました

bull ホストアプリケーションと Khronos ICD Loader Library のリンクにおいてサポート内容を更新しましたインテルが提供する ICD Loader Library はOpenCLSpecification version 10 およびOpenCL Specification version 111220 で実装されている API をサポートします

bull FPGA ボードの管理における以下内容を更新しましたmdash SDK が複数のカスタムプラットフォームのインストールをサポートすることを明

記複数のボードをインストレールする際に SDK ユーティリティーを各ボードに使用するにはAOCL_BOARD_PACKAGE_ROOT 環境変数設定が関連するボードのカスタムプラットフォームのサブディレクトリーに対応している必要があります

mdash カスタムプラットフォームが複数あるシステムではMMD ライブラリーに直接リンクするのではなくホストプログラムが ACD を使用しボードを検出する必要があることを明記

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

199

日付 バージョン 変更内容

bull カーネルの reporthtml ファイルのレビューの章を追加しanalyze-areaユーティリティーオプション廃止の通知を追加しましたHTML レポートの導入により以下の項目を削除しましたmdash エリアレポートでのカーネルのリソース使用率情報のレビューmdash エリアレポートへのアクセスmdash エリアレポートのレイアウト

bull 複数のステップによるデザインフローのデザイン手順および複数のステップによるインテル FPGA SDK for OpenCL デザインフローの図を更新しエリアレポートをHTML レポートに置き換えましたまた-gを有効化するための情報を削除しました

bull レジスターの推論のコード例に続く文章においてハードウェアでの配列の実装をオフラインコンパイラーが決定する方法の説明を訂正しました

bull Windows での ICD Loader Library のリンクの内容をより明確化しましたbull OpenCL 機能のサポートの章に次の更新を行いました

mdash Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更mdash Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコ

ンパイラーに商標を変更mdash インテル FPGA SDK for OpenCL 割り当ての制限の章の次の内容を修正

bull ランタイムの 小メモリー割り当てに関する情報を更新bull 大キュー数を 70 から 256 へ更新bull FPGA デバイスあたりの 大カーネル数の 64 を変更ハードウェアにコンパ

イルする場合の静的な制限はなくなりエミュレーターにコンパイルする場合は 256 になります

mdash OpenCL 10 C プログラミング言語の実装の半精度浮動小数点の備考欄にこの機能はエミュレーターでサポートされているという注記を追加さらに半精度浮動小数点のサポート状況を「X」から「」へ更新

mdash OpenCL 20 機能のサポート状況にOpenCL 20 のヘッダーを加えOpenCL20 のヘッダーを使用しサポートされていない API を呼び出すとエラーの原因になることを追記

2016 年 5 月 20160502 bull AOCL プログラミングモデルの回路図を Altera SDK for OpenCL FPGAProgramming Flow の章に追加しました

bull AOCL FPGA プログラミングフローの図をAltera Offline Compiler KernelCompilation Flows の章へ移動しました

bull 複数ステップでの AOCL デザインフローの図とそれに関連する内容をエリアレポートのレビュー手順を含めて更新しました

bull 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの機能に関する情報を追加しました詳細は単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの章を参照ください

bull OpenCL カーネルのエミュレーションの章にICD を使用する他の OpenCL SDK とともにエミュレーションを行うための複数のデバイスサポートに関する情報を追加しました

bull 強化されたエリアレポート機能に関する情報を追加しましたmdash analyze-area AOCL ユーティリティーコマンドを呼び出しHTML エリアレ

ポートを生成するオプションを追加mdash HTML エリアレポートのレイアウトを説明する項目を追加

bull Windows での ICD Loader Library のリンクにおいて変更後の Makefileのコード例から$(AOCL_LDLIBS) を削除しました

bull チャネルおよびパイプの複数のワークアイテムの順序付けの章においてチャネルまたはパイプ呼び出しがワークアイテムに対し不変であることを確認するために AOCLが使用する特性を変更しました

bull インテル FPGA SDK for OpenCL アドバンスト機能の章を追加しましたbull OpenCL 機能のサポート状況の章の OpenCL 12 のランタイムの実装にAOCL が

clSetEventCallbackclGetKernelArgInfoclSetMemObjectDestructorCallback の API をサポートすることを注記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

200

日付 バージョン 変更内容

2015 年 11 月 20151102 bull aocコマンドを引数なしで呼び出しAltera Offline Compiler のヘルプメニューにアクセスするオプションを追加しました

bull 複数のホストスレッドの章を更新しOpenCL ホストランタイムはスレッドセーフであることを明記しました

bull 複数のカーネルのソースファイルサポートを反映するため以下の図と章を更新しましたmdash AOCL FPGA プログラミングフローの章の AOCL FPGA プログラミングフロ

ーの図mdash ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコン

パイルの章mdash ハードウェアを構築せずに行うカーネルのコンパイル (-c) の章

bull チャネルに対する複数のワークアイテムの順序付けの誤解を招く文章を削除しましたbull チャネル実装の概要の図を更新しましたbull 次の章の OpenCL パイプに関する内容を更新しました

mdash OpenCL パイプ機能の概要のパイプネットワーク実装の概要の図mdash OpenCL のパイプ実装における制約の章のエミュレーションサポートmdash 誤ったコードを正しい構文に修正mdash パイプハンドルの宣言の io 属性を使用した IO パイプの実装にリンクを追加

bull ホストを経由した FPGA のプログラミングに注意事項を追記しましたイベントオブジェクトは使用後に解放し過剰なメモリー使用を防ぐ必要があります

bull OpenCL 機能のサポート状況の以下の内容を更新しましたmdash OpenCL Specification のバージョンに基づき各機能のサポート状況と制限事

項を分類mdash OpenCL に準拠する倍精度浮動小数点関数リストに次の関数を追加

sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

mdash OpenCL 12 のランタイムの実装にサブバッファーオブジェクトのサポートを追加

mdash OpenCL 12 のランタイムの実装に共有仮想メモリーに対する暫定サポートを追加

mdash Altera SDK for OpenCL 割り当ての制限にランタイムの 小グローバルメモリーの割り当て制限を追加

2015 年 5 月 1500 bull カーネルの命名ガイドラインにOpenCL カーネルを kernelclと命名することに反対する内容を追記しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) にローカルディスクからホストアプリケーションを実行し低速なネットワークディスクアクセスに起因する潜在的な遅延を回避する必要があることを明記しました

bull OpenCL カーネルのエミュレーションとデバッグの注記を変更しSoC をターゲットとするデザインのエミュレーションは SoC 以外のボードで行う必要があることを示しました

bull OpenCL カーネルのエミュレーションのホストアプリケーションを実行するコマンドを更新し ltprocess_IDgt-libkernelsoを含むデフォルトの一時ディレクトリーを上書きする命令を追加しました

bull カーネルコンパイル時のハードウェア生成フィッティングエラーの解決に--high-effort aocコマンドフラグを導入しました

bull 倍精度浮動小数点演算の有効化に倍精度浮動小数点演算を有効にするためのOPENCL EXTENSIONプラグマを導入しました

bull OpenCL パイプのサポートを導入しました詳しくはOpenCL パイプの実装 (またその章内の項目) およびホストアプリケーションでのパイプオブジェクトの作成を参照してください

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

201

日付 バージョン 変更内容

bull AOCL チャネル拡張の制約にチャネル ID の配列への静的なインデックス付けの方法を表すコード例を追加しました

bull 複数のホストスレッドにOpenCL ホスト関数の呼び出しを複数のスレッドを持つホストアプリケーションで同期するための推奨事項を追加しました

bull ICD と ACD のサポートを導入しました詳しくはホストアプリケーションとKhronos ICD Loader Library のリンクを参照してください

bull clGetBoardExtensionFunctionAddressAlteraを導入しユーザーが利用可能な関数をリファレンスできるようにしました詳細はカスタムプラットフォーム固有の関数へのアクセスを参照してください

bull OpenCL 機能のサポート状況の以下内容を更新しましたmdash Alterareg SDK for OpenCL が暫定的にサポートする倍精度浮動小数点関数の

一覧を表示mdash OpenCL C プログラミング言語のパイプにおける制約を追記

2014 年 12 月 1410 bull 情報フローを再編成しましたAltera reg SDK for OpenCL (AOCL) または AlteraRTE OpenCL を使用して実行する可能性のある作業に基づき情報を提供しています

bull --util ltNgt および-O3の AOC (Altera Offline Compiler) オプションに関連する情報を削除しました

bull OpenCL カーネルのコンパイルに以下の PLDA QuickUDP IP コアライセンスに関する情報を追加しました1 PLDA QuickUDP IP コアライセンスは Stratix V ネットワークリファレンスプ

ラットフォームまたは QuickUDP IP コアを使用するカスタムプラットフォームに必要です

2 QuickUDP IP コアライセンスを不適切にインストールするとQuickTCP IP コアに関するエラーメッセージが表示されコンパイルは失敗します

bull 大規模なシフトレジスターの条件付きシフトは推奨されないという注記を追加しました

bull 複数のデバイスでのシステムのエミュレーションの章を削除しました現在は新しいenvCL_CONTEXT_EMULATOR_DEVICE_ALTERA=ltnumber_of_devicesgtコマンドが複数のデバイスをエミュレーションするために利用可能です

bull 言語サポートの制限を AOCL エミュレーターの制限の章から削除しましたbull OpenCL 機能のサポートの章の AOCL の割り当て制限でFPGA あたりの 大カー

ネル数を 32 から 64 に更新しました

2014 年 6 月 1400 bull --estimate-throughputおよび--sw-dimm-partitionの AOC オプションを削除しました

bull -march=emulator-g--big-endian--profileの AOC オプションを追加しました

bull --no-interleavingはltglobal_memory_typegt 引数を必要としますbull -fp-relaxed=trueは現在--fp-relaxedですbull -fpc=trueは現在--fpcですbull SoC 以外のデバイスにおいて aocl diagnostic は現在 aocl

diagnose および aocl diagnose ltdevice_namegt ですbull programおよび flashはltdevice_namegt 引数を必要としますbull FPGA ボードのデバイス名の識別を追加しましたbull AOCL プロファイラーユーティリティーを追加しましたbull AOCL のチャネル拡張と関連する項目を追加しましたbull チャネルの属性を追加しましたbull ホストとカーネルにおける構造体データ型のデータレイアウトの一致を追加しましたbull レジスターインターフェイスおよびシフトレジスターインターフェイスを追加しまし

たbull Channels and Multiple Command Queues を追加しましたbull SoC で動作する OpenCL カーネルの共有メモリーアクセスを追加しましたbull カーネル実行中におけるプロファイルデータの収集を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

202

日付 バージョン 変更内容

bull OpenCL カーネルのエミュレーションとデバッグとそれに関連するサブ項目を追加しました

bull AOC カーネルのコンパイルフローを更新しましたbull -v を更新しましたbull ホストバイナリーの要件を更新しましたbull グローバルメモリーアクセスの分割と異種グローバルメモリーアクセスの分割を

グローバルメモリーアクセスの分割に統合しましたbull 付録 A の AOC 割り当ての制限を更新しましたbull max_unroll_loopsmax_share_resources

num_share_resourcestaskのカーネル属性を削除しましたbull packedと aligned(ltNgt) のカーネル属性を追加しましたbull OpenCL 機能のサポート状況の章の以下 AOCL 割り当て制限の内容を更新しまし

たmdash 大コンテキスト数mdash 大キュー数mdash コンテキストあたりの 大イベントオブジェクト数

2013 年 12 月 1311 bull 「-W と-Werror」の章を削除し「-W」と「-Werror」の 2 章に再編成しましたbull 複数のデバイスのサポートを反映するために次の内容を更新しました

mdash AOCL FPGA プログラミングフローの図mdash --list-boards の章mdash -board ltboard_namegt の章mdash 複数の FPGA デバイスのプログラミングの項目をFPGA のプログラミングに追

加bull 異種グローバルメモリーのサポートを反映するため以下の内容を追加しました

mdash --no-interleaving の章mdash カーネルのプラグマと属性に buffer_locationのカーネル属性mdash 異種グローバルメモリーアクセスの分割の章

bull 付録OpenCL 機能のサポート状況においてサポート状況の指定を更新しましたbull OpenCL プログラミング言語の実装の章からOpenCL プログラミング言語の制約

に関する情報を削除しましたまた新しく OpenCL プログラミング言語の制約の章を作成しその内容を記載しました

2013 年 11 月 1310 bull 情報フローを再編成しましたbull インテル FPGA SDK for OpenCL コンパイルフローを更新後AOCL FPGA プロ

グラミングフローにタイトルを変更しましたbull 1 ステップでの AOC コンパイルフローと 2 ステップでの AOC コンパイルフローの

図を追加しましたbull AOCL バージョン 131 の内容の章を更新しましたbull 以下の章を削除しました

mdash OpenCL カーネルソースファイルのコンパイルmdash Altera Offline Kernel Compiler の使用mdash FPGA ボードの設定mdash 特定の FPGA ボードのターゲットmdash OpenCL アプリケーションの実行mdash カーネルソースファイルの統合mdash アライメントされたメモリー割り当てmdash FPGA ハードウェアのプログラミングmdash FPGA のフラッシュメモリーのプログラミング

bull OpenCL カーネルソースファイルのコンパイルを更新後AOC コンパイルフローへ名称を変更しました

bull OpenCL カーネルへのファイルスコープ構造の受け渡しを OpenCL カーネルでの構造体引数の使用にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張を更新しカーネルのプラグマと属性へタイトルを変更しました

bull FPGA へのカーネルのロードを FPGA のプログラミングにタイトルを変更しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

203

日付 バージョン 変更内容

bull ホストプログラムのコンパイルおよびリンクホストプログラムのコンパイルの設定およびライブラリーパスとリンクを 1 つの章に統合しました

bull プリプロセッサーマクロの章を追加しましたbull グローバルメモリーアクセスの 適化のタイトルをグローバルメモリーアクセス

の分割に変更しました

2013 年 6 月 130 SP10 bull FPGA ボードの設定の章を追加しましたbull カーネルプログラミング時の考慮事項からターゲット FPGA ボードの指定の項目

を削除しましたbull 特定の FPGA ボードのターゲットとコンパイルレポートの生成の項目をOpenCL カ

ーネルソースファイルのコンパイルに追加しましたbull ファイルスコープ__constant アドレス空間修飾子のタイトルを__constant アドレ

ス空間修飾子に変更し次の項目を挿入しましたmdash 関数スコープ__constant 変数mdash ファイルスコープ__constant 変数mdash ホストからの__constant パラメーターの指定

bull OpenCL カーネルへのファイルスコープ構造の受け渡しの項目をカーネルプログラミング時の考慮事項に追記しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの変更をカーネル属性とプラグマの指定による OpenCL カーネルの拡張にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張の章の unrollプラグマディレクティブの内容を更新しました

bull 順不同のコマンドキューおよび構造パラメーター変換に向けたホストプログラムの変更の項目をホストプログラミング時の考慮事項に追加しました

bull clCreateProgramWithBinary を使用した FPGA へのカーネルのロード およびアライメントされたメモリー割り当ての章を更新しました

bull フラッシュプログラミング手順を更新しましたbull 付録 B のオプションの拡張の内容を更新しアトミック関数にタイトルを変更しまし

たbull 付録 B からプラットフォームレイヤーとランタイムの実装を削除しました

2013 年 5 月 1301 bull 明示的なメモリーフェンス機能がサポートされるようになったため関連する内容をOpenCL プログラミング言語の実装の表から削除しました

bull FPGA のフラッシュメモリーのプログラミングの章を更新しましたbull カーネル属性とプラグマの指定による OpenCL カーネルの変更の章を追加しカー

ネルのパフォーマンスを 適化するために実装可能なカーネル属性とプラグマを導入しました

bull グローバルメモリーアクセスの 適化の章を追加しデータの分割に関する説明を追加しました

bull 付録 A からaocl プラグムコマンドを使用した FPGA のプログラミングの章を削除しました

2013 年 5 月 1300 bull コンパイルフローを更新しましたbull カーネルのコンパイラーコマンドを更新しましたbull Altera SDK for OpenCL ユーティリティーコマンドを追加しましたbull OpenCL プログラミング時の考慮事項を追加しましたbull フラッシュプログラミング手順を更新しこれを付録 A に移動しましたbull 新しい clCreateProgramWithBinary FPGA ハードウェアプログラミング

フローを追加しましたbull ホストを必要としない clCreateProgramWithBinaryハードウェアプログラ

ミングフローを付録 A の aocl プラグマコマンドを使用した FPGA プログラミングに移動しました

bull 割り当て制限と OpenCL 言語サポートに関する 新情報を付録 B へ移動しました

2012 年 11 月 1210 初版

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

204

  • インテル FPGA SDK for OpenCLプロエディション プログラミングガイド
  • 目次
  • 1 インテルreg FPGA SDK for OpenCLtrade の概要
    • 11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件
    • 12 インテル FPGA SDK for OpenCLのFPGAプログラミングフロー
      • 2 インテル FPGA SDK for OpenCLオフラインコンパイラーのカーネルコンパイルフロー
        • 21 シンプルなカーネルに向けたワンステップコンパイル
        • 22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー
          • 3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得
            • 31 ソフトウェアバージョンの表示 (version)
            • 32 コンパイラーバージョンの表示 (-version)
            • 33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)
              • 331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)
                • 34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)
                • 35 利用可能なFPGAボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages)
                • 36 OpenCLバイナリーのコンパイル環境の表示 (env)
                  • 4 FPGAボードの管理
                    • 41 FPGAボードのインストール (install)
                    • 42 FPGAボードのアンインストール (uninstall)
                    • 43 FPGAボードのデバイス名の照会 (diagnose)
                    • 44 ボード診断テストの実行 (diagnose ltdevice_namegt)
                    • 45 オフラインまたはホストなしでのFPGAのプログラミング (program ltdevice_namegt)
                    • 46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)
                      • 5 OpenCLカーネルの構築
                        • 51 カーネルの命名ガイドライン
                        • 52 データの処理効率を最適化するためのプログラミング手法
                          • 521 ループ展開 (unroll Pragma)
                          • 522 ネスト化されたループの結合
                          • 523 ループ開始間隔の指定 (II)
                          • 524 ループの並列性 (max_concurrency Pragma)
                          • 525 ループの投機的実行 (speculated_iterations Pragma)
                          • 526 ワークグループサイズの指定
                          • 527 計算ユニット数の指定
                          • 528 SIMDワークアイテム数の指定
                          • 529 メモリー属性の指定
                            • 53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法
                            • 54 インテル FPGA SDK for OpenCL チャネル拡張の実装
                              • 541 インテル FPGA SDK for OpenCL チャネル拡張の概要
                              • 542 チャネルにおけるデータの動作
                              • 543 チャネルに対する複数のワークアイテムの順序付け
                                • 5431 チャネルのワークアイテムのシリアル実行
                                  • 544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約
                                  • 545 OpenCLカーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化
                                    • 5451 チャネルのハンドル宣言
                                    • 5452 ブロッキングのチャネル書き込みの実装
                                      • 54521 ノンブロッキングのチャネル書き込みの実装
                                        • 5453 ブロッキングのチャネル読み取りの実装
                                          • 54531 ノンブロッキングのチャネル読み取りの実装
                                            • 5454 ioチャネル属性を使用したIOチャネルの実装
                                            • 5455 IOチャネルのエミュレーション
                                            • 5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例
                                            • 5457 depth属性を使用するバッファーされたチャネルの実装
                                            • 5458 チャネルの呼び出し順序の強制
                                              • 54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義
                                                • 55 OpenCLパイプの実装
                                                  • 551 OpenCLパイプ機能の概要
                                                  • 552 パイプデータの動作
                                                  • 553 パイプにおける複数のワークアイテムの順序付け
                                                    • 5531 パイプにおけるワークアイテムのシリアル実行
                                                      • 554 OpenCLのパイプ実装における制約
                                                      • 555 カーネルに向けたOpenCLパイプの有効化
                                                        • 5551 他のOpenCL SDKとの互換性の確保
                                                        • 5552 パイプハンドルの宣言
                                                        • 5553 パイプ書き込みの実装
                                                        • 5554 パイプ読み出しの実装
                                                        • 5555 depth属性を使用するバッファーされたパイプの実装
                                                        • 5556 io属性を使用したIOパイプの実装
                                                        • 5557 パイプ呼び出し順序の強制
                                                          • 55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義
                                                              • 556 ホストパイプを介したカーネルとの直接通信
                                                                • 5561 intel_host_accessibleカーネル引数属性オプション
                                                                • 5562 ホストがアクセス可能なパイプカーネル引数にバインドされたcl_memパイプオブジェクトと通信するためのAPI関数
                                                                • 5563 ホストがアクセス可能なパイプの作成
                                                                • 5564 cl_intel_fpga_host_pipe拡張機能の使用例
                                                                    • 56 任意精度での整数の実装
                                                                    • 57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用
                                                                    • 58 __constantアドレス空間修飾子の宣言
                                                                    • 59 構造体データ型をOpenCLカーネルに引数として含める
                                                                      • 591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致
                                                                      • 592 データ構造パディング挿入の無効化
                                                                      • 593 構造体のアライメントの指定
                                                                        • 510 レジスターの推論
                                                                          • 5101 シフトレジスターの推論
                                                                            • 511 倍精度浮動小数点演算の有効化
                                                                            • 512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター
                                                                              • 5121 アキュムレーターを推論するためのプログラミング手法
                                                                                • 513 整数のプロモーション規則
                                                                                  • 6 ホストアプリケーションの設計
                                                                                    • 61 ホストのプログラミング要件
                                                                                      • 611 ホストマシンのメモリー要件
                                                                                      • 612 ホストバイナリーの要件
                                                                                      • 613 複数のホストスレッド
                                                                                      • 614 順不同のコマンドキュー
                                                                                      • 615 カーネルを同時に実行するための複数のコマンドキューにおける要件
                                                                                        • 62 グローバルメモリーの手動分割におけるOpenCLバッファーの割り当て
                                                                                          • 621 同じメモリータイプの複数のインターフェイスでのバッファーの分割
                                                                                          • 622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割
                                                                                          • 623 ホストアプリケーションでのパイプオブジェクトの作成
                                                                                            • 63 カーネル実行中におけるプロファイルデータの収集
                                                                                              • 631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング
                                                                                              • 632 プロファイルデータの取得
                                                                                              • 633 複数の自動実行プロファイリング呼び出し
                                                                                                • 64 カスタムプラットフォーム固有の関数へのアクセス
                                                                                                • 65 構造パラメーター変換に向けたホストプログラムの変更
                                                                                                • 66 ホストアプリケーションの管理
                                                                                                  • 661 Makefileフラグメント例の表示 (example-makefileまたはmakefile)
                                                                                                  • 662 ホストアプリケーションのコンパイルとリンク
                                                                                                    • 6621 ホストアプリケーションとKhronos ICD Loader Libraryのリンク
                                                                                                    • 6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)
                                                                                                    • 6623 OpenCLホストランタイムライブラリーおよびMMDライブラリーへのパスの表示 (ldflags)
                                                                                                    • 6624 OpenCLホストランタイムライブラリーおよびMMDライブラリーのリスト表示 (ldlibs)
                                                                                                    • 6625 OpenCLホストランタイムライブラリーおよびMMDライブラリーに関する情報の表示 (link-config または linkflags)
                                                                                                      • 663 OpenCL ICD拡張APIの使用
                                                                                                      • 664 ホストを経由したFPGAのプログラミング
                                                                                                        • 6641 複数のFPGAデバイスのプログラミング
                                                                                                          • 66411 OpenCL FPGAデバイスの診断
                                                                                                          • 66412 デバイス情報の照会
                                                                                                          • 66413 複数のFPGAデバイスへのカーネルのロード
                                                                                                              • 665 ランタイム環境の終了とエラー回復
                                                                                                                • 67 SoCをターゲットとするOpenCL カーネルへの共有メモリーの割り当て
                                                                                                                • 68 徐々に速度低下するOpenCLシステムのデバッグ
                                                                                                                  • 7 OpenCL カーネルのコンパイル
                                                                                                                    • 71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル
                                                                                                                    • 72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)
                                                                                                                    • 73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)
                                                                                                                    • 74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)
                                                                                                                    • 75 インテル FPGA SDK for OpenCLオフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)
                                                                                                                    • 76 特定のFPGAボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)
                                                                                                                    • 77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)
                                                                                                                    • 78 カーネルのFmaxターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt)
                                                                                                                    • 79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)
                                                                                                                    • 710 コンパイル進捗レポートの生成 (-v)
                                                                                                                    • 711 リソース推定使用率要約の画面表示 (-report)
                                                                                                                    • 712 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージの抑制 (-W)
                                                                                                                    • 713 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)
                                                                                                                    • 714 コンパイラーレポートのデバッグデータの削除およびaocxファイルのソースコードの削除 (-g0)
                                                                                                                    • 715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)
                                                                                                                    • 716 グローバルメモリーのリング型相互接続の強制 (-global-ring)
                                                                                                                    • 717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)
                                                                                                                    • 718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)
                                                                                                                    • 719 浮動小数点演算処理順序の緩和 (-fp-relaxed)
                                                                                                                    • 720 浮動小数点演算における丸め処理の削減 (-fpc)
                                                                                                                    • 721 OpenCLコンパイルの高速化 (-fast-compile)
                                                                                                                    • 722 カーネルのインクリメンタルコンパイル (-incremental)
                                                                                                                      • 7221 インクリメンタルコンパイルレポート
                                                                                                                      • 7222 インクリメンタルコンパイルのその他のコマンドオプション
                                                                                                                      • 7223 インクリメンタルコンパイルフィーチャーの制限
                                                                                                                        • 723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)
                                                                                                                        • 724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)
                                                                                                                        • 725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)
                                                                                                                          • 8 OpenCLカーネルのエミュレーションとデバッグ
                                                                                                                            • 81 高速エミュレーターの設定
                                                                                                                            • 82 エミュレーションに向けたチャネルカーネルコードの変更
                                                                                                                              • 821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション
                                                                                                                              • 822 チャネル深度のエミュレーション
                                                                                                                                • 83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)
                                                                                                                                • 84 OpenCLカーネルのエミュレーション
                                                                                                                                • 85 LinuxにおけるOpenCLカーネルのデバッグ
                                                                                                                                • 86 インテル FPGA SDK for OpenCL Emulatorの制限
                                                                                                                                • 87 ハードウェアとエミュレーターの結果の不一致
                                                                                                                                • 88 高速エミュレーターの環境変数
                                                                                                                                • 89 高速エミュレーターでサポートされている拡張機能
                                                                                                                                • 810 高速エミュレーターの既知の問題
                                                                                                                                • 811 レガシーエミュレーターの使用
                                                                                                                                  • 8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)
                                                                                                                                    • 81111 レガシーエミュレーターでのチャネル深度のエミュレーション
                                                                                                                                      • 8112 レガシーエミュレーターでのOpenCLカーネルのエミュレーション
                                                                                                                                      • 8113 LinuxにおけるレガシーエミュレーターでのOpenCLカーネルのデバッグ
                                                                                                                                          • 9 カーネルのreporthtmlファイルのレビュー
                                                                                                                                          • 10 OpenCLカーネルのプロファイリング
                                                                                                                                            • 101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)
                                                                                                                                            • 102 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report)
                                                                                                                                            • 103 自動実行カーネルのプロファイリング
                                                                                                                                              • 11 インテル Code Builder for OpenCL を使用するOpenCLアプリケーションの開発
                                                                                                                                                • 111 Microsoft Visual Studioに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 112 Eclipseに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 113 インテル Code Builder for OpenCL でのセッションの作成
                                                                                                                                                • 114 セッションのコンフィグレーション
                                                                                                                                                  • 12 インテル FPGA SDK for OpenCL のアドバンスト機能
                                                                                                                                                    • 121 OpenCLライブラリー
                                                                                                                                                      • 1211 RTLモジュールとOpenCLパイプラインの理解
                                                                                                                                                        • 12111 インテルFPGA SDK for OpenCLパイプラインのアプローチの概要
                                                                                                                                                        • 12112 RTLモジュールのインテル FPGA SDK for OpenCLパイプラインへの統合
                                                                                                                                                        • 12113 ストールのないRTL
                                                                                                                                                        • 12114 RTLモジュールインターフェイス
                                                                                                                                                        • 12115 Avalon Streaming (Avalon-ST) インターフェイス
                                                                                                                                                        • 12116 RTLリセットおよびクロック信号
                                                                                                                                                          • 121161 ストールのないRTLモジュールおよびストールをサポートするRTLモジュールの インテル Stratix 10デザイン固有のリセット要件
                                                                                                                                                            • 12117 RTLモジュールのXML構文
                                                                                                                                                              • 121171 ATTRIBUTESを指定するXML要素
                                                                                                                                                              • 121172 INTERFACEを指定するXML要素
                                                                                                                                                              • 121173 リソースを指定するXML要素
                                                                                                                                                                • 12118 RTLモジュールと外部メモリーの通信
                                                                                                                                                                • 12119 RTLモジュールに入るスレッドの順序
                                                                                                                                                                • 121110 RTLモジュールのOpenCL Cモデル
                                                                                                                                                                • 121111 RTLモジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性
                                                                                                                                                                  • 1212 OpenCLライブラリーに向けたOpenCLヘルパー関数ファイルのパッケージ化
                                                                                                                                                                  • 1213 OpenCLライブラリーに向けたRTLコンポーネントのパッケージ化
                                                                                                                                                                    • 12131 インテル FPGA SDK for OpenCL ライブラリー機能に対するRTLサポートの制約と制限
                                                                                                                                                                      • 1214 RTLモジュールの検証
                                                                                                                                                                      • 1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化
                                                                                                                                                                      • 1216 OpenCLカーネルコンパイル時のOpenCLライブラリーの指定
                                                                                                                                                                      • 1217 シミュレーションによるOpenCLライブラリーのデバッグ (プレビュー)
                                                                                                                                                                        • 12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)
                                                                                                                                                                        • 12172 OpenCL ライブラリーのシミュレーション
                                                                                                                                                                        • 12173 シミュレーターの制限
                                                                                                                                                                          • 1218 シンプルな関数で動作するOpenCLライブラリーの使用 (例1)
                                                                                                                                                                          • 1219 外部メモリーと動作するOpenCLライブラリーの使用 (例2)
                                                                                                                                                                          • 12110 OpenCLライブラリーのコマンドラインオプション
                                                                                                                                                                            • 122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性
                                                                                                                                                                              • 1221 変数固有の属性を使用する際の制約
                                                                                                                                                                                • 123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性
                                                                                                                                                                                  • 1231 カーネルインターフェイスに向けたハードウェア
                                                                                                                                                                                    • 12311 カーネルIDを生成し振り分けるハードウェアの省略
                                                                                                                                                                                    • 12312 ホストとカーネル間の通信ハードウェアの省略
                                                                                                                                                                                    • 12313 clEnqueueNDRangeKernel APIのglobal_work_offset引数をサポートするハードウェアの省略
                                                                                                                                                                                        • 124 num_compute_units(XYZ) 属性を使用したカーネルの複製
                                                                                                                                                                                          • 1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ
                                                                                                                                                                                          • 1242 カーネルコピーでのチャネル使用
                                                                                                                                                                                            • 125 カーネル内に登録される割り当ての組み込み関数
                                                                                                                                                                                              • A OpenCL機能のサポート状況
                                                                                                                                                                                                • A1 OpenCL10の機能のサポート状況
                                                                                                                                                                                                  • A11 OpenCL10 Cプログラミング言語の実装
                                                                                                                                                                                                  • A12 OpenCL Cプログラミング言語の制約
                                                                                                                                                                                                  • A13 組み込みジオメトリック関数の引数型
                                                                                                                                                                                                  • A14 数値コンプライアンスの実装
                                                                                                                                                                                                  • A15 イメージのアドレス指定とフィルタリングの実装
                                                                                                                                                                                                  • A16 アトミック関数
                                                                                                                                                                                                  • A17 埋め込みプロファイルの実装
                                                                                                                                                                                                    • A2 OpenCL 12の機能のサポート状況
                                                                                                                                                                                                      • A21 OpenCL 12のランタイムの実装
                                                                                                                                                                                                      • A22 OpenCL 12 Cプログラミング言語の実装
                                                                                                                                                                                                        • A3 OpenCL 20の機能のサポート状況
                                                                                                                                                                                                          • A31 OpenCL 20のヘッダー
                                                                                                                                                                                                          • A32 OpenCL 20ランタイムの実装
                                                                                                                                                                                                          • A33 OpenCL 20 Cプログラミング言語のパイプにおける制約
                                                                                                                                                                                                            • A4 インテル FPGA SDK for OpenCL の割り当てにおける制限
                                                                                                                                                                                                              • B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴
Page 2: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus

目次

1 インテルreg FPGA SDK for OpenCLtrade の概要711 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前

提条件 712 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー8

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフロー1021 シンプルなカーネルに向けたワンステップコンパイル 1122 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー 12

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得 1631 ソフトウェアバージョンの表示 (version) 1632 コンパイラーバージョンの表示 (-version) 1733 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help) 17

331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示(help ltcommand_optiongt) 17

34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示(引数なし-help-h) 17

35 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages)18

36 OpenCL バイナリーのコンパイル環境の表示 (env) 19

4 FPGA ボードの管理 2041 FPGA ボードのインストール (install) 2142 FPGA ボードのアンインストール (uninstall) 2243 FPGA ボードのデバイス名の照会 (diagnose) 2344 ボード診断テストの実行 (diagnose ltdevice_namegt)2445 オフラインまたはホストなしでの FPGA のプログラミング (program ltdevice_namegt)2446 フラッシュメモリーのプログラミング (flash ltdevice_namegt)24

5 OpenCL カーネルの構築2651 カーネルの命名ガイドライン 2652 データの処理効率を 適化するためのプログラミング手法 27

521 ループ展開 (unroll Pragma) 28522 ネスト化されたループの結合 28523 ループ開始間隔の指定 (II) 30524 ループの並列性 (max_concurrency Pragma) 31525 ループの投機的実行 (speculated_iterations Pragma) 32526 ワークグループサイズの指定32527 計算ユニット数の指定33528 SIMD ワークアイテム数の指定 34529 メモリー属性の指定 34

53 ローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 3554 インテル FPGA SDK for OpenCL チャネル拡張の実装 36

541 インテル FPGA SDK for OpenCL チャネル拡張の概要36542 チャネルにおけるデータの動作37543 チャネルに対する複数のワークアイテムの順序付け 38

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

2

544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約39545 OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化41

55 OpenCL パイプの実装53551 OpenCL パイプ機能の概要 53552 パイプデータの動作 54553 パイプにおける複数のワークアイテムの順序付け 55554 OpenCL のパイプ実装における制約56555 カーネルに向けた OpenCL パイプの有効化 58556 ホストパイプを介したカーネルとの直接通信 67

56 任意精度での整数の実装 7057 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用 7158 __constant アドレス空間修飾子の宣言 7259 構造体データ型を OpenCL カーネルに引数として含める73

591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致73592 データ構造パディング挿入の無効化75593 構造体のアライメントの指定 75

510 レジスターの推論 765101 シフトレジスターの推論76

511 倍精度浮動小数点演算の有効化78512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター78

5121 アキュムレーターを推論するためのプログラミング手法 79513 整数のプロモーション規則80

6 ホストアプリケーションの設計 8161 ホストのプログラミング要件81

611 ホストマシンのメモリー要件 81612 ホストバイナリーの要件81613 複数のホストスレッド82614 順不同のコマンドキュー 82615 カーネルを同時に実行するための複数のコマンドキューにおける要件82

62 グローバルメモリーの手動分割における OpenCL バッファーの割り当て 82621 同じメモリータイプの複数のインターフェイスでのバッファーの分割 82622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 84623 ホストアプリケーションでのパイプオブジェクトの作成 85

63 カーネル実行中におけるプロファイルデータの収集86631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング88632 プロファイルデータの取得 89633 複数の自動実行プロファイリング呼び出し 89

64 カスタムプラットフォーム固有の関数へのアクセス9065 構造パラメーター変換に向けたホストプログラムの変更 9166 ホストアプリケーションの管理92

661 Makefile フラグメント例の表示 (example-makefile または makefile) 92662 ホストアプリケーションのコンパイルとリンク93663 OpenCL ICD 拡張 API の使用97664 ホストを経由した FPGA のプログラミング 97665 ランタイム環境の終了とエラー回復 102

67 SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て 10268 徐々に速度低下する OpenCL システムのデバッグ104

目次

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

3

7 OpenCL カーネルのコンパイル10571 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル10572 ハードウェアを構築せずに行うカーネルのコンパイル (-c) 10673 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)10674 ヘッダーファイル位置の指定 (-I=ltdirectorygt) 10775 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o

ltfilenamegt)10876 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) 10877 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) 11078 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt) 11179 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) 111710 コンパイル進捗レポートの生成 (-v) 112711 リソース推定使用率要約の画面表示 (-report) 113712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)114713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセ

ージへの変換 (-Werror) 114714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) 114715 グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt)115716 グローバルメモリーのリング型相互接続の強制 (-global-ring) 115717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)116718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt) 116719 浮動小数点演算処理順序の緩和 (-fp-relaxed) 116720 浮動小数点演算における丸め処理の削減 (-fpc) 117721 OpenCL コンパイルの高速化 (-fast-compile)117722 カーネルのインクリメンタルコンパイル (-incremental) 118

7221 インクリメンタルコンパイルレポート 1197222 インクリメンタルコンパイルのその他のコマンドオプション1207223 インクリメンタルコンパイルフィーチャーの制限123

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)123724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) 123725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) 124

8 OpenCL カーネルのエミュレーションとデバッグ 12581 高速エミュレーターの設定12582 エミュレーションに向けたチャネルカーネルコードの変更 126

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション 127822 チャネル深度のエミュレーション128

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) 12884 OpenCL カーネルのエミュレーション 12985 Linux における OpenCL カーネルのデバッグ 13086 インテル FPGA SDK for OpenCL Emulator の制限 13187 ハードウェアとエミュレーターの結果の不一致13188 高速エミュレーターの環境変数 13389 高速エミュレーターでサポートされている拡張機能 133810 高速エミュレーターの既知の問題134811 レガシーエミュレーターの使用 135

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

4

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) 135

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション1368113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ 137

9 カーネルの reporthtml ファイルのレビュー 139

10 OpenCL カーネルのプロファイリング140101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) 140102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) 141103 自動実行カーネルのプロファイリング 142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発143111 Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフラインコンパイ

ラープラグインのコンフィグレーション143112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインの

コンフィグレーション 143113 インテル Code Builder for OpenCL でのセッションの作成144114 セッションのコンフィグレーション 145

12 インテル FPGA SDK for OpenCL のアドバンスト機能147121 OpenCL ライブラリー147

1211 RTL モジュールと OpenCL パイプラインの理解1481212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 1611213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化1621214 RTL モジュールの検証1641215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 1641216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 1651217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) 1651218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)1681219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) 16912110 OpenCL ライブラリーのコマンドラインオプション 170

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性 1711221 変数固有の属性を使用する際の制約173

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性1731231 カーネルインターフェイスに向けたハードウェア 173

124 num_compute_units(XYZ) 属性を使用したカーネルの複製 1761241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ 1771242 カーネルコピーでのチャネル使用 178

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

A OpenCL 機能のサポート状況 181A1 OpenCL10 の機能のサポート状況181

A11 OpenCL10 C プログラミング言語の実装 181A12 OpenCL C プログラミング言語の制約183A13 組み込みジオメトリック関数の引数型184A14 数値コンプライアンスの実装 184A15 イメージのアドレス指定とフィルタリングの実装 185A16 アトミック関数 185A17 埋め込みプロファイルの実装 185

目次

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

5

A2 OpenCL 12 の機能のサポート状況186A21 OpenCL 12 のランタイムの実装186A22 OpenCL 12 C プログラミング言語の実装 186

A3 OpenCL 20 の機能のサポート状況187A31 OpenCL 20 のヘッダー 187A32 OpenCL 20 ランタイムの実装 188A33 OpenCL 20 C プログラミング言語のパイプにおける制約 188

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限 189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴190

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

6

1 インテルreg FPGA SDK for OpenCLtrade の概要

インテルreg FPGA SDK for OpenCLtrade プログラミングガイド は インテル SDK (ソフトウェア開発キット) for OpenCL のコンパイラーとツールに関する説明推奨事項ならびに使用方法を提供します インテル FPGA SDK for OpenCL (1) は インテル FPGA 製品に向けた OpenCL(2) ベースの異種並列プログラミング環境です

11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件

インテル FPGA SDK for OpenCL プロエディションプログラミングガイド はOpenCL の概念とアプリケーションプログラミングインターフェイス (API) について精通されている方がご利用になることを前提としていますまたOpenCL アプリケーションの作成経験がありOpenCL Specificationversion 10 を理解されていることも前提としています

インテル FPGA SDK for OpenCL またはOpenCL 向けのインテル FPGA ランタイム環境 (RTE)を使用しデバイスをプログラムする前にそれぞれのスタートガイドを十分に理解してから作業を開始してくださいなおこのプログラミングガイドは次の作業をすでに実行していることを前提としています

bull OpenCL カーネルを開発および展開するための tar ファイルのダウンロードまたインストーラーを実行し SDK インテル Quartusreg Prime 開発ソフトウェアプロエディションデバイスサポートのインストール

bull OpenCL カーネルを展開するための RTE のダウンロードおよびインストール

bull SDK もしくは RTE を使用しインテル SoC FPGA をプログラムする場合は インテル SoC FPGAエンベデッド開発スイート (EDS) プロエディションのダウンロードとインストール

bull FPGA ボードのインストールと設定

bull ボードのインストールが正常に終了し正確に機能するかの確認

上記作業を実行していない場合はSDK のスタートガイドを参照し詳細を確認ください

関連情報bull OpenCL References Pages

bull OpenCL Specification version 10

bull インテル FPGA SDK for OpenCL スタートガイド

bull Intel FPGA RTE for OpenCL Pro Edition Getting Started Guide

(1) インテル FPGA SDK for OpenCL は Khronos 社が公開している仕様に基づいておりKhronosConformance Testing Process に合格しています現在の規格適合状況については wwwkhronosorgconformance を参照してください

(2) OpenCL および OpenCL のロゴは Apple Incの商標でありKhronos Grouptradeの許可を得て使用しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

12 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

インテル FPGA SDK for OpenCL を使用しているアプリケーションには2 つのメインコンポーネントがあります1 つは FPGA プログラミングビットストリームでありもう 1 つはアプリケーションとFPGA アクセラレーターを管理するホストプログラムです インテル FPGA SDK for OpenCL オフラインコンパイラーはまずホストプログラムが FPGA のプログラミングに使用するイメージファイルにご自身の OpenCL カーネルをコンパイルしますホスト側の C コンパイラーはホストプログラムをコンパイルしそれをインテル FPGA SDK for OpenCL ランタイムライブラリーにリンクします

図 -1 インテル FPGA SDK for OpenCL プログラミングモデルの回路図

インテル FPGA for OpenCL

ランタイム環境

システムのホスト コンパイラー

 ホストソースコード

(cまたは cpp)

ホストバイナリー

SDKオフライン コンパイラー

カーネルソースコード

( cl)

FPGAイメージ(aocx)

ホストアプリケーションを

ホストで実行

Quartus Prime開発ソフトウェアデザインスイート

ボード固有のカスタムプラットフォーム  デザイン

ターゲットプラットフォームに向けたポーティングまたはカスタ

マイズ

バージョンに互換性のあるターゲットプラットフォームに向けたSDKのボードディレクトリー

最終的な計算結果

ランタイムの実行

ホストアプリケーションのコードパス OpenCL Kernelのコードパス カスタムプラットフォームのパス

(カスタムプラットフォームはOpenCLボードとともに提供されます)

ボード開発者が作成するアイテム

SDKユーザーが作成するアイテム

インテルが提供するツールまたはデザイン

ボード開発者が提供するアイテム

サードパーティーが提供するツールまたはオープンソースツール

ツールが生成するアイテム プロセスまたはアクション

Intel FPGA SDK for OpenCLリファレンスプラットフォーム    デザイン

次の SDK コンポーネントと連携しインテル FPGA のプログラムを作成します

bull ホストアプリケーションとホストコンパイラー

bull OpenCL カーネルとオフラインコンパイラー

bull カスタムプラットフォーム

カスタムプラットフォームはボードサポートパッケージを提供しますボードメーカーは通常特定の OpenCL ボードをサポートするカスタムプラットフォームを開発しますオフラインコンパイラーはOpenCL カーネルをコンパイルしハードウェアプログラミングイメージを生成する際にカスタムプラットフォームをターゲットにしますホストはその後ホストアプリケーションを実行し通常ハードウェアイメージを FPGA にプログラムし実行します

例えば従来のプロセッサーなどでのシーケンシャルなプログラムの実装ではプログラムカウンターがハードウェアで実行される命令のシーケンスとハードウェアで順次実行される命令を制御しますインテル FPGA SDK for OpenCL などでの空間的なプログラムの実装では前提条件となるデータが利用可能になるとすぐに命令が実行されますプログラムはデータの依存関係を表す連続した流れとして解釈されます

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

8

図 -2 FPGA データフローアーキテクチャー

ロード ロード

ストア

FPGA領域(空間的な計算)

42

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

9

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフロー

インテル FPGA SDK for OpenCL オフラインコンパイラーではご自身の FPGA プログラミングイメージファイル (aocxファイル) を単一または複数のプロセスで作成可能ですご自身のカーネルの複雑さに応じて推奨されるコンパイル方法が決まります

図 -3 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

カーネルソースコード2 ( cl )

カーネルソースコード1 ( cl )

カーネルソースコード3 ( cl )

ホストバイナリー

標準Cコンパイラー

ホストコード

OpenCL Kernelのオフラインコンパイラー

カーネルバイナリーA(aocx )

FPGAのプログラミングに向けてaocxをメモリーにロード

PCIe

PCIe

ランタイムのプログラミング

統合されたカーネルバイナリー A(aoco aocx)

5 ( cl )4 (cl ) 6 (cl )

統合されたカーネルバイナリーB(aoco aocx )

カーネルバイナリーB(aocx )

OpenCLカーネルのオフラインコンパイラー

カーネルソースコード

カーネルソースコード

カーネルソースコード

ランタイムのプログラミング

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

OpenCL カーネルソースファイル (cl) はFPGA で動作する OpenCL カーネルのソースコードを含みますオフラインコンパイラーは1 つもしくは複数のカーネルを一時ファイルにグループ化した後この一時ファイルをコンパイルして以下のファイルとフォルダーを生成します

bull 中間オブジェクトファイルであるaoco オブジェクトファイルこのファイルにはコンパイルの後半段階に向けての情報が含まれます

bull ハードウェアコンフィグレーションファイルであるaocxイメージファイルこのファイルはランタイムに FPGA をプログラミングするために必要な情報を含みます

bull aocxファイルの作成に必要なデータを含む作業フォルダーまたはサブディレクトリーデフォルトの状態で作業ディレクトリーの名前はご自身のclファイル名です複数のカーネルソースファイルをコンパイルする場合作業ディレクトリーの名前は aocコマンドラインの 後にリストしたclファイル名です

aocxファイルはホストアプリケーションがターゲット FPGA のプログラムオブジェクトを作成するために使用するデータを含みますプログラムオブジェクトはOpenCL ランタイム API の概念ですホストアプリケーションはまずこれらのプログラムオブジェクトをメモリーにロードしますホストランタイムはその後これらのプログラムオブジェクトを使用しホストプログラムのカーネル起動動作の要求に基づきターゲット FPGA をプログラムします

21 シンプルなカーネルに向けたワンステップコンパイル

デフォルトでインテル FPGA SDK for OpenCL は1 つもしくは複数の OpenCL カーネルのコンパイルとハードウェアコンフィグレーションファイルの作成を一度の作業で行いますご自身のアプリケーションの OpenCL カーネルが 1 つの場合や複数のカーネルがアプリケーションにある場合でも 小のイタレーションのみを必要とする場合にこのコンパイルオプションを選択します

次の図はワンステップでコンパイルを行う OpenCL カーネルのデザインフローを表しています

図 -4 ワンステップでの OpenCL カーネルのコンパイルフロー

ltyour_kernel_filenamegtcl

aoc ltyour_kernel_filenamegtcl [-report]コンパイルの時間 (数時間)

説明

ファイル コマンド カーネルの実行

ltyour_kernel_filenamegtaocxltyour_kernel_filenamegtaoco ltyour_kernel_filenamegtaocr

FPGAにおける実行

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

11

コンパイルが正常に終了すると次のファイルとレポートが作成されます

bull aocoファイル

bull aocrファイル

bull aocxファイル

bull ltyour_kernel_filenamegtreportsreporthtmlファイルの概算リソース使用率の要約では暫定的に評価されたエリア使用率が提供されます単一ワークアイテムのカーネルの場合は 適化に向けたレポートでボトルネックが特定されます

注意 ワンステップのコンパイルフローでデザインのイタレーションを行うとイタレーションごとに FPGA のハードウェアをフルコンパイルしなければならないため非常に長い時間を費やしますその後 FPGA でカーネルを実行しパフォーマンスの測定をする必要があります

関連情報ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル (105 ページ)

22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

デザインの 適化に向けたイタレーションやその他の修正を繰り返し行う場合は複数のステップによるインテル FPGA SDK for OpenCL プロエディションのデザインフローを選択してください

次の図はSDK のデザインフローを段階で表していますデザインフローの各ステップは機能的なエラーとパフォーマンスのボトルネックを特定するためのチェックポイントとしての役割を果たしますこれによりイタレーションごとにフルコンパイルを実行することなくOpenCL のカーネルコードを修正することができるようになりますコンパイルステップは一部もしくはすべてを実行することのどちらも可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

12

図 -5 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

ltyour_kernel_filenamegtaocx

ltyour_kernel_filenamegtcl

aoc -march=emulator ltyour_kernel_filenamegtclコンパイル時間 (数秒)

エミュレーションは成功したか

aoc ltyour_kernel_filenamegtclコンパイル時間 (数時間)

カーネルのパフォーマンスに満足しているか

エミュレーション

フルデプロイメント

カーネルをFPGAで実行

NO

YES

NO

説明

ファイルコマンドカーネルの実行

カーネルパフォーマンスの

概算データは許容可能か

NO

aoc -c ltyour_kernel_filenamegtcl [-report]コンパイル時間 (数秒から数分)

中間コンパイル (-c)

ltyour_kernel_filenamegtaocr

注)HTMLレポートとカーネルのプロファイリングについては「Intel FPGA SDK for OpenCL ベストプラクティスガイド」を参照ください

ltyour_kernel_filenamegtreportsreporthtml

HTMLレポートのレビュー

aoc -profile ltyour_kernel_filenamegtcl [-fast-compile] [-incremental]コンパイル時間 (数時間)

プロファイリング

aoc -fast-compile ltyour_kernel_filenamegt clコンパイル時間 (数分から数時間)

デザイン変更はわずかである

aoc -incremental ltyour_kernel_filenamegtcl [-fast-compile]

インクリメンタルコンパイル高速コンパイル

ltyour_kernel_filenamegtaoco

aoc -rtl ltyour_kernel_filenamegtcl [-report]

中間コンパイル (-rtl)

ハードウェアの実行は

成功したか

YES

NO

NO YES

YES

YES

シミュレーションは成功したか

YES

NO

aoc -march=simulator [-ghdl]ltyour_kernel_filenamegtcl コンパイル時間 (数分)

シミュレーション

ltyour_kernel_filenamegtaocx

コンパイル時間 (数秒から数分)

コンパイル時間 (数分から数時間)

SDK のデザインフローには次のステップがあります

1 エミュレーション

x86-64 ホストシステムの 1 つもしくは複数のエミュレーションデバイスで OpenCL カーネルを実行しその機能性を評価しますLinux システムではエミュレーターはシンボリックデバッグのサポートを提供しますシンボリックデバッグを使用するとカーネルコードの機能的なエラーの原因を特定できます

2 中間コンパイル

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

13

中間コンパイルを行う方法は 2 つありますデザインフローにはこの 2 つの方法のうち 1 つもしくは両方を含むことが可能です

bull -cフラグを使用し 1 つもしくは複数のclカーネルソースファイルをコンパイルする方法これによりOpenCL パーサーからの出力を含むaocoオブジェクトファイルを生成するようオフラインコンパイラーに命令が出されます

bull -rtlフラグを使用し 1 つもしくは複数のclカーネルソースファイルまたはaocoファイルをコンパイルする方法ただしコンパイルはどちらか一方のファイルになりますこれによりオフラインコンパイラーに以下のタスクを実行するよう命令が出されます

mdash 入力ファイルがclファイルの場合オフラインコンパイラーはaocoファイルを各カーネルソースファイルに生成しそれらをリンクしaocrファイルを生成します

mdash 入力ファイルがaocoファイルの場合オフラインコンパイラーはそれらをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt ディレクトリーを作成します

オフラインコパイラーはaocrファイルを使用し 終的なaocxハードウェアコンフィグレーションファイルを生成します

注意

デフォルトのボードが X の環境において-cフラグでカーネルをコンパイルしデフォルトのボードが Y の環境においてaocoファイルを-rtlフラグでコンパイルする場合オフラインコンパイラーはaocoファイルからボード X を読み出しそれを続くコンパイルの段階へ渡します

3 HTML レポートのレビュー

OpenCL アプリケーションの ltyour_kernel_filenamegtreportsreporthtmlファイルをレビューし概算のカーネルのパフォーマンスデータが許容できるかを判断しますHTML レポートではパフォーマンスを向上させるためのカーネルの修正案も提供されます

4 シミュレーション (プレビュー)

OpenCL カーネルをシミュレーションで実行しその機能性を評価しますシミュレーションではコンパイルに長時間を費やすことなくカーネルの機能の正確性および動的なパフォーマンスの評価を行うことができますカーネルのデバッグに向けカーネルの波形をキャプチャーし表示することが可能です

5 高速コンパイル

ハードウェアでの OpenCL カーネルの機能性を評価します高速コンパイルステップはフルコンパイルに比べわずかな時間でaocxファイルを生成します インテル FPGA SDK for OpenCLオフラインコンパイラーは簡単な 適化のみを実行しコンパイル時間を削減します

6 インクリメンタルコンパイル

ハードウェアでの OpenCL カーネルの機能性を評価しますインクリメンタルコンパイルでは修正したカーネルのみをコンパイルしaocxファイルを生成します インテル FPGA SDK forOpenCL オフラインコンパイラーはデザイン全体のサイズではなく変更したデザインのサイズによってコンパイル時間をスケーリングし生産性を向上させます

7 プロファイリング

FPGA プログラミングイメージにパフォーマンスカウンターを挿入するようインテル FPGASDK for OpenCL オフラインコンパイラーに命令します実行中カウンターは性能情報を集めますその情報は インテル FPGA Dynamic Profiler for OpenCL GUI で確認することが可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

14

8 フルデプロイメント

デザインフロー全体における OpenCL カーネルのパフォーマンスに納得したらフルコンパイルを実行します実行後デプロイメントに適したaocxファイルが生成されます

HTML レポートとカーネルのプロファイリングについては インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

関連情報bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ)

bull OpenCL コンパイルの高速化 (-fast-compile) (117 ページ)

bull カーネルの reporthtml ファイルのレビュー (139 ページ)

bull OpenCL カーネルのコンパイル (105 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

bull OpenCL カーネルのプロファイリング (140 ページ)

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

15

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得

インテル FPGA SDK for OpenCL には2 つのコマンドオプションのセットが含まれます1 つはSDK ユーティリティーコマンド ( aocl ltcommand_optiongt )もう 1 つがインテル FPGASDK for OpenCL オフラインコンパイラーコマンド ( aoc ltcommand_optiongt ) ですそれぞれのコマンドセットにはソフトウェアコンパイラーおよびカスタムプラットフォームに関する一般的な情報を入手するために呼び出すことができるオプションが含まれています

注意 bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプション ( aocltcommand_optiongt ) は現在二重ダッシュ (--) ではなく単一ダッシュ (-) を使用します二重ダッシュの規則は 171 のリリースにて非推奨となり今後のリリースで削除される予定です

bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションは現在ltcommand_optiongt=ltvaluegt の規則に従っていますこの規則において valueはユーザー入力値をコンマで区切ったリストとすることが可能です -option value1 -optionvalue2の使用は 171 リリースで非推奨となり今後のリリースでは削除される予定です

ソフトウェアバージョンの表示 (version) (16 ページ)

コンパイラーバージョンの表示 (-version) (17 ページ)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help) (17ページ)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h) (17 ページ)

利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

OpenCL バイナリーのコンパイル環境の表示 (env) (19 ページ)

31 ソフトウェアバージョンの表示 (version)

インテル FPGA SDK for OpenCL のバージョンを表示するにはversionユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl version コマンドを呼び出します出力例

aocl ltversiongtltbuildgt (Intel(R) FPGA SDK for OpenCL(TM)Version ltversiongt Build ltbuildgt Copyright (C) ltyeargt IntelCorporation)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

32 コンパイラーバージョンの表示 (-version)

インテル FPGA SDK for OpenCL オフラインコンパイラーのバージョンを表示するには-versionコンパイラーコマンドを呼び出します

bull コマンドプロンプトで aoc -version コマンドを呼び出します出力例

Intel(R) FPGA SDK for OpenCL(TM) 64-Bit Offline CompilerVersion ltversiongt Build ltbuildgtCopyright (C) ltyeargt Intel Corporation

33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションに関する情報を表示するにはhelpユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl help コマンドを呼び出しますSDK はユーティリティーコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)

インテル FPGA SDK for OpenCL の特定のユーティリティーコマンドオプションについての情報を表示するにはhelp ユーティリティーコマンドの引数としてコマンドオプションを含めます

bull コマンドプロンプトで aocl help ltcommand_optiongt コマンドを呼び出します

例えばinstallユーティリティーコマンドオプションについての詳細情報を取得するにはaocl help install コマンドを呼び出します

出力例

aocl install - Installs a board onto your host system

Usage aocl install

DescriptionThis command installs a boards drivers and other necessary software for the host operating system to communicate with the boardFor example this might install PCIe drivers

34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションに関する情報を表示するには引数なしでコンパイラーコマンドを呼び出すか-helpまたは -hコマンドオプションでコンパイラーコマンドを呼び出します

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

17

bull コマンドプロンプトで次のコマンドのいずれかを呼び出します

mdash aoc

mdash aoc -help

mdash aoc -h

SDK はオフラインコンパイラーのコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

35 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示(-list-boards および-list-board-packages)

カスタムプラットフォームで利用可能な FPGA ボードのリストを表示するには-list-boardsオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -list-boards コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは以下のような出力を生成します

Board list ltboard_name_1gt ltboard_name_2gt

この ltboard_name_Ngt は特定の FPGA ボードをターゲットにするために aocコマンドで使用するボード名です

bull 複数のカスタムプラットフォームがインストールされている場合に特定のカスタムプラットフォームで利用可能な FPGA ボードの一覧を表示するには-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めますコマンドプロンプトで次のようにコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -list-boards

インテル FPGA SDK for OpenCL オフラインコンパイラーはカスタムプラットフォームで利用可能なボードの一覧を表示します

bull システムで利用可能なカスタムプラットフォームを一覧表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のような出力を生成します

Installed board packagesltboard_package_1gtltboard_package_2gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_3gtltboard_package_4gt

この ltboard_package_Ngt はご自身のシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

18

36 OpenCL バイナリーのコンパイル環境の表示 (env)

インテル FPGA SDK for OpenCL オフラインコンパイラーの入力引数およびコンパイルされたOpenCL デザインの環境を表示するにはenvユーティリティーコマンドを呼び出します

bull コマンドプロンプトでaocl env ltobject_file_namegt または aocl envltexecutable_file_namegt コマンドを呼び出します

ここで ltobject_file_namegt はOpenCL カーネルのaocoファイル名でltexecutable_file_namegt はカーネルのaocxファイル名です

aocl env vector_addaocxコマンドの出力例

INPUT_ARGS=-march=emulator -v devicevector_addcl -o binvector_addaocxBUILD_NUMBER=90ACL_VERSION=1610OPERATING_SYSTEM=linuxPLATFORM_TYPE=s5_net

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

19

4 FPGA ボードの管理

インテル FPGA SDK for OpenCL はご自身の FPGA ボードのインストールアンインストール診断およびプログラミングを行うために呼び出すことができるユーティリティーコマンドを含んでいます

aocl installユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストール可能ですカスタムプラットフォームのサブディレクトリーにはboard_envxmlファイルが含まれます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGAクライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFPGA クライアントドライバーの旧称はアルテラクライアントドライバー (ACD) です

aocl installユーティリティーを実行すると FCD が設定されますインストールされた BSP はシステムにレジスターされるためランタイムおよび SDK ユーティリティーは必要な BSP ファイルを見つけることができます

重要 インストール後は BSP を別のディレクトリーに移動させないでくださいBSP を移動する場合は以下を実行します

1 aocl uninstallユーティリティーを使用し現在の位置から BSP をアンインストールします

2 BSP ディレクトリーを変更します

3 aocl installユーティリティーを使用し新しい位置に BSP を再インストールします

FPGA ボードのインストール (install) (21 ページ)

FPGA ボードのアンインストール (uninstall) (22 ページ)

FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)

オフラインまたはホストなしでの FPGA のプログラミング (program ltdevice_namegt) (24 ページ)

フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)

関連情報bull FPGA ボードのインストール (install) (21 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

41 FPGA ボードのインストール (install)

FPGA アクセラレーターボードまたは SoC デバイスに向けた OpenCL アプリケーションを作成する前にボードメーカーが提供するカスタムプラットフォームをダウンロードおよびインストールする必要がありますほとんどのカスタムプラットフォームインストーラーには管理者権限が必要ですaocl install ltpath_to_customplatformgt ユーティリティーコマンドを呼び出しご自身のボードをホストシステムにインストールしてください

以下にボードのインストール手順を説明します一部のカスタムプラットフォームには下記以外のインストール手順が加わります詳細に関してはボードメーカーより提供されている資料を参照してください

注意 インテル Arriareg 10 SoC 開発キットを インテル Arria 10 SoC 開発キットリファレンスプラットフォーム (a10soc) とともに使用する場合のインストールについてはInstalling the Intel Arria 10Development Kit を参照ください

注意 インテル FPGA SDK for OpenCL を インテル Arria 10 GX FPGA 開発キットと使用する場合アプリケーションノートの AN 807 Configuring the Intel Arria 10 GX FPGA Development Kitfor the Intel FPGA SDK for OpenCLを参照ください

1 ボードメーカーが案内している手順に従いFPGA ボードをシステムに接続します

2 ボードメーカーの Web サイトからご自身の FPGA ボード用のカスタムプラットフォームをダウンロードします インテル FPGA SDK for OpenCL リファレンスプラットフォームのダウンロードついては インテル FPGA SDK for OpenCL プラットフォームのページを参照ください

ヒント

インテル FPGA SDK for OpenCL とともに提供されている BSP (a10_ref s10_refa10soc など) をインストールする場合はカスタムプラットフォームのインストールは不要ですBSP ファイルは INTELFPGAOCLSDKROOThldboardsにあります手順 4(21 ページ) に進んでください

3 システムフォルダー以外の任意のフォルダーにカスタムプラットフォームをインストールします

複数のカスタムプラットフォームでの aocl diagnoseなどSDK ユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストールできますカスタムプラットフォームのサブディレクトリーはboard_envxmlファイルを含みます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGA クライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFCDがカスタムプラットフォームに対し正しく設定されている限りFCD はインストールされているボードすべてをランタイムに検出します

4 QUARTUS_ROOTDIR_OVERRIDE ユーザー環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアのインストールディレクトリーを指定するように設定します

5 カスタムプラットフォームライブラリーへのパス (ボードサポートパッケージの MMD ライブリーへのパスであればltpath_to_customplatformgtwindows64binなど) をPATH(Windows) もしくは LD_LIBRARY_PATH (Linux) 環境変数設定に追加します

インテル FPGA SDK for OpenCL スタートガイドはinit_openclスクリプトに関するより詳細な情報を提供していますユーザー環境変数の設定および init_openclスクリプトの実行に関しては インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章を参照ください

6 コマンドプロンプトで aocl install ltpath_to_customplatformgt を呼び出します

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

21

aocl install ltpath_to_customplatformgt を呼び出すとFCD とボードドライバーがインストールされホストアプリケーションとハードウェアのカーネルプログラムの通信が可能になります

注意

bull ボードのインストールには管理者権限が必要ですWindows コマンドプロンプトを管理者として実行するにはStart gt All Programs gt Accessories をクリックしますAccessories の Command Prompt を右クリックし右クリックメニューにあるRun as Administrator をクリックします

Windows 81 または Windows 10 のシステムでは署名付きドライバーの検証を無効にしなければならない場合があります詳細については以下の内容を参照してください

mdash Windows 8 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-basesolutionsfb321729html

mdash Windows 10 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-baseembedded2017Why-does-aocl-diagnose-fail-while-using-Windows-10html

bull システムにドライバーがすでにインストールされており管理者権限なしで FCD をインストールする必要がある場合以下のように aocl installコマンドを-fcd-onlyフラグとともに呼び出しFCD インストールのプロンプトに従ってください

aocl install ltpath_to_customplatformgt -fcd-only

7 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出しますソフトウェアはltdevice_namegt を含む出力を生成しますltdevice_namegt はacl0 からacl127 の acl 番号です

注意

aocl diagnoseユーティリティーを実装した後に発生する可能性があるエラーに関してはIntel Arria 10 GX FPGA Development Kit Reference Platform Porting GuideのPossible Errors After Running the diagnose Utility の章を参照くださいご自身のアクセラレーターボードの ltdevice_namegt の照会に関してはFPGA ボードのデバイス名の照会の章を参照ください

8 FPGA ボードが正常にインストールされていることを確認するには aocl diagnoseltdevice_namegt コマンドを呼び出しボードメーカーが推奨する診断テストを実行します

関連情報bull FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

bull インテル FPGA SDK for OpenCL FPGA プラットフォームページ

42 FPGA ボードのアンインストール (uninstall)

FPGA ボードをアンインストールするにはuninstallユーティリティーコマンドを呼び出しカスタムプラットフォームのアンインストール後に関連する環境変数の設定を解除します

FPGA ボードをアンインストールするには次の手順を行います

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

22

1 ボードメーカーから提供されている手順に従いマシンからボードを外します

2 aocl uninstall ltpath_to_customplatformgt ユーティリティーコマンドを呼び出し現在のホストコンピュータードライバーを削除します (PCIeregドライバーなど) インテルFPGA SDK for OpenCL はFPGA ボードと通信するためにそれらのドライバーを使用します

注意

bull カスタムプラットフォームのアンインストールにはroot権限が必要ですドライバーを維持しながらインストールされている FCD を削除するには以下のように aocluninstall コマンドを-fcd-onlyフラグとともに呼び出しFCD のアンインストールのプロンプトに従ってください

aocl uninstall ltpath_to_customplatformgt -fcd-only

bull Linux システムにおいてFCD をデフォルトディレクトリーである opt Intel OpenCL Boards 以外の特定のディレクトリーにインストールした場合アンインストールを実行する前に環境変数 ACL_BOARD_VENDOR_PATHがその特定の FCD のインストールディレクトリーを指すよう設定されていることを確認してください

3 カスタムプラットフォームをアンインストールします

4 LD_LIBRARY_PATH 環境変数 (Linux の場合) または PATH 環境変数 (Windows の場合) の設定を解除します

43 FPGA ボードのデバイス名の照会 (diagnose)

一部の OpenCL ソフトウェアユーティリティーコマンドにはデバイス名 (ltdevice_namegt) を指定する必要がありますltdevice_namegt はFPGA デバイスに対応する acl 番号を参照します (例えば acl0 から acl127) アクセラレーターボードのリストを照会するとOpenCL ソフトウェアは使用するマシンにインストールされているデバイスのリストをデバイス名の順に生成します

bull マシンにインストールされているデバイスのリストを照会するにはコマンドプロンプトに aocldiagnose と入力しますソフトウェアは以下の例のような出力を生成します

aocl diagnose Running diagnostic from ALTERAOCLSDKROOTboardltboard_namegtltplatformgtlibexec

Verified that the kernel mode driver is installed on the host machine

Using board package from vendor ltboard_vendor_namegtQuerying information for all supported devices that are installed on the host machine

device_name Status Information

acl0 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 020000 at Gen 2 with 8 lanes FPGA temperature=430 degrees C

acl1 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 030000 at Gen 2 with 8 lanes FPGA temperature = 350 degrees C

Found 2 active device(s) installed on the host machine to perform a full diagnostic on a specific device please run aocl diagnose ltdevice_namegt

DIAGNOSTIC_PASSED

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

23

関連情報OpenCL FPGA デバイスの診断 (99 ページ)

44 ボード診断テストの実行 (diagnose ltdevice_namegt)

特定の FPGA ボードで詳細な診断を実行するにはdiagnose ユーティリティーコマンドの引数として ltdevice_namegt を含みます

bull コマンドプロンプトで aocl diagnose ltdevice_namegt コマンドを呼び出しますここで ltdevice_namegt はご自身の FPGA デバイスに対応する (acl0 から acl127 の) acl 番号です

システムにインストールされたボードのリストを照会するとltdevice_namegt を識別することができます

複数の FPGA ボードで diagnoseユーティリティーコマンドを使用し診断テストを実行する場合のボードに関する詳細はボードメーカーより提供されている資料を参照ください

45 オフラインまたはホストなしでの FPGA のプログラミング (programltdevice_namegt)

オフラインまたはホストなしで FPGA デバイスをプログラミングするにはprogramユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl program ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

注意 SoC をプログラミングするにはprogramユーティリティーコマンドを呼び出す際にデバイスのフルパスを次の例のように指定してください aocl program devltdevice_namegtltyour_kernel_filenamegtaocx

46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)

カスタムプラットフォームでサポートされている場合はflashユーティリティーコマンドを呼び出し指定されたスタートアップコンフィグレーションで FPGA を初期化します

注意 インテル Arria 10 SoC 開発キットなどのSoC ボードのマイクロ SD フラッシュカードのプログラミング例に関してはIntel FPGA SDK for OpenCL Intel Arria 10 SoC Development KitReference Platform Porting Guide のBuilding the SD Card Image の章を参照ください

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

24

bull コマンドプロンプトで aocl flash ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

関連情報Building the SD Card Image for the Intel Arria 10 SoC Development Kit

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

25

5 OpenCL カーネルの構築

インテルではOpenCL カーネルコードの構築方法に関する推奨事項を提供していますカーネルを作成する際もしくは別のアーキテクチャーをターゲットとして書かれたカーネルを変更する際はこのプログラミングにおける推奨事項を実行することを検討ください

カーネルの命名ガイドライン (26 ページ)

データの処理効率を 適化するためのプログラミング手法 (27 ページ)

ローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35 ページ)

インテル FPGA SDK for OpenCL チャネル拡張の実装 (36 ページ)

OpenCL パイプの実装 (53 ページ)

任意精度での整数の実装 (70 ページ)

条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用 (71 ページ)

__constant アドレス空間修飾子の宣言 (72 ページ)

構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

レジスターの推論 (76 ページ)

倍精度浮動小数点演算の有効化 (78 ページ)

単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター (78 ページ)

整数のプロモーション規則 (80 ページ)

51 カーネルの命名ガイドライン

インテルではファイル名に英数字のみを含めることを推奨しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ファイル名は英数字で始めてください

OpenCL アプリケーションのファイル名が英数字以外で始まっている場合以下のコンパイルエラーが発生します

Error Quartus compilation FAILEDSee quartus_sh_compilelog for the output log

bull 英数字以外の文字を使用しファイル名を区別しないでください

インテル FPGA SDK for OpenCL オフラインコンパイラーは英数字以外の文字をアンダースコア ( _ ) に変換しますファイル名の末尾のみを英数字以外の異なる文字にし2 つのファイルを区別すると (例えばmyKernelclと myKernelclなど)オフラインコンパイラーはその 2 つのファイル名をどちらもltyour_kernel_filenamegt _cl (前述の例の場合myKernel_cl) に変換します

bull Windows システムの場合カーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えないようにしてください

64 ビットの Windows 7 および Windows 81 にはファイルパスの長さに 260 文字の制限がありますカーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えるとオフラインコンパイラーは次のエラーメッセージを生成します

The filename or extension is too long The system cannot find the path specified

コンパイラーのエラーメッセージに加え次のメッセージが ltyour_kernel_filenamegtquartus_sh_compilelog ファイルに表示されます

Error Canrsquot copy ltfile_typegt files Canrsquot open ltyour_kernel_filenamegt for write No such file or directory

Windows 10 では260 文字の制限を除外することができます詳しくはWindows 10 の資料を参照してください

bull OpenCL のカーネルソースファイル (cl) に予約されているキーワードである「kernel」「Verilog」または「VHDL」の名前を付けないでください

ソースファイルに kernelclVerilogclまたは VHDLclの名前を付けるとオフラインコンラパイラーは特定の内部ファイルと同じ名前の中間デザインファイルを生成するためコンパイルエラーが発生します

52 データの処理効率を最適化するためのプログラミング手法

カーネルのデータ処理効率はループ展開ワークグループサイズの設定計算ユニットとワークアイテムの指定などの手法を実行し 適化してください

ループ展開 (unroll Pragma) (28 ページ)

ネスト化されたループの結合 (28 ページ)

ループ開始間隔の指定 (II) (30 ページ)

ループの並列性 (max_concurrency Pragma) (31 ページ)

ループの投機的実行 (speculated_iterations Pragma) (32 ページ)

ワークグループサイズの指定 (32 ページ)

計算ユニット数の指定 (33 ページ)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

27

SIMD ワークアイテム数の指定 (34 ページ)

メモリー属性の指定 (34 ページ)

521 ループ展開 (unroll Pragma)

ループ展開はループ本体を複数回複製しループのトリップカウントを減らすことで行われますループの展開はFPGA でのループ制御オーバーヘッドの削減または防止のために行いますループに依存関係がなくオフラインコンパイラーがループの反復処理を並列して実行できる場合はループを展開することで FPGA のレイテンシーとオーバーヘッドを低減させることもできますインテル FPGA SDK for OpenCL オフラインコンパイラーはプラグマでアノテートされていない場合でも単純なループを展開する場合がありますループを展開するようまたは明示的にループを展開しないようオフラインコンパイラーに指示するにはカーネルコードの展開するループの前にunrollカーネルプラグマを挿入します

注意

bull 可能な限り展開係数を指定してください展開係数 N を指定するにはpragma unrollltNgt ディレクティブをカーネルコードのループの前に挿入します

オフラインコンパイラーはループ展開を 大 ltNgt 回試みます

コードの一部を下記に示します展開係数に 2 の値を割り当てることによりループを 2 回展開するようオフラインコンパイラーに指示しています

pragma unroll 2for(size_t k = 0 k lt 4 k++) mac += data_in[(gid 4) + k] coeff[k]

bull ループを完全に展開する場合カーネルコードのループの前にpragma unrollディレクティブのみを挿入し展開係数を省略することができます

オフラインコンパイラーはトリップカウントを認識すると完全なループ展開を試みます展開要求が実行できない場合オフラインコンパイラーは警告を発行します

bull ループが展開されないようにするには展開係数に 1 を指定します (pragma unroll 1)

522 ネスト化されたループの結合

loop_coalesceプラグマを使用しループの機能に影響を与えずにネスト化されたループを 1 つのループに結合するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示しますループの結合はコンパイラーにループ制御に必要なオーバーヘッドを削減するよう指示することによりカーネルの使用領域を削減することができます

ネスト化されたループを結合するとコンポーネントのレイテンシーも低減されるためカーネルの使用領域をさらに削減することも可能ですただし場合によってはループを結合させることで重要なループを開始させるパスの間隔が長くなる場合があるためループの結合がカーネルすべてに適しているとは限りません

NDRange カーネルではloop_coalesceプラグマによりアノテートされていない場合でもコンパイラーは自動的にループ結合を試みますNDRange カーネルでループを結合することによりスループットが向上するとともにカーネルの使用領域が低減しますloop_coalesceプラグマを使用するとNDRange カーネルにおけるループの自動結合を防ぐことができます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

28

ネスト化されたループを結合するには次のようにプラグマを指定します

pragma loop_coalesce ltloop_nesting_levelgt

ltloop_nesting_levelgt パラメーターはコンパイラーが結合を試みるネスト化されたループのレベル数をオプションで指定する整数ですltloop_nesting_levelgt パラメーターを指定しない場合コンパイラーはネスト化されたループすべてを結合しようと試みます

ネスト化されたループの例を以下に示します

for (A) for (B) for (C) for (D) for (E)

ループ (A) の前にプラグマを配置するとこのループのネストレベルは次のように定義されます

bull ループ (A) のループネストレベルは 1

bull ループ (B) のループネストレベルは 2

bull ループ (C) のループネストレベルは 3

bull ループ (D) のループネストレベルは 4

bull ループ (E) のループネストレベルは 3

指定したループネストレベルによってコンパイラーは異なるループ結合を試みます

bull pragma loop_coalesce 1をループ (A) に指定した場合コンパイラーはこのネスト化されたループの結合を試みません

bull pragma loop_coalesce 2をループ (A) に指定した場合コンパイラーはループ (A) と(B) の結合を試みます

bull pragma loop_coalesce 3を (A) に指定した場合コンパイラーはループ (A)(B)(C)(E)の結合を試みます

bull pragma loop_coalesce 4をループ (A) に指定した場合コンパイラーはループ (A) からループ (E) すべてのループの結合を試みます

重要 pragma loop_coalesce 1を NDRange カーネルのループに指定するとそのループの自動ループ結合を防ぐことができます

以下はコンパイラーが 2 つのループを 1 つのループに結合する方法を簡単な例にて示しています

下記はネスト化された単純なループです

pragma loop_coalescefor (int i = 0 i lt N i++) for (int j = 0 j lt M j++) sum[i][j] += i+j

コンパイラーは 2 つのループを結合し次のような 1 つのループであるかのように実行します

int i = 0int j = 0while(i lt N) sum[i][j] += i+j j++

if (j == M)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

29

j = 0 i++

523 ループ開始間隔の指定 (II)

開始間隔 (II) は連続するループの反復が開始されるまでのクロックサイクル数です iiプラグマを使用しプラグマ宣言に続くループに II の設定を試みるよう インテル FPGA SDK for OpenCL オフラインコンパイラー に指示しますオフラインコンパイラーがそのループに対して指定された II を実現できない場合コンパイルエラーが発生します

iiプラグマはループがパイプライン化されている単一のワークアイテムカーネル (シングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルプロパティーについての詳細はインテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照してください

II の値が高いほど後続するループ反復の実行開始までの待機時間が長くなりますII および特定のループにおける II のパフォーマンスへの影響についての詳細を提供するコンパイラーレポートに関しては インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

カーネルのループによってはデフォルトでコンパイラーが選択する値よりも高い II の値を iiプラグマで指定するとスループットを低下させることなくカーネルの 大動作周波数 (fMAX) を向上させることができます

次の条件を満たすループはiiプラグマの使用に適しています

bull カーネルがシングルスレッドであるためループがパイプライン化されている

bull カーネルのスループットに重要ではないループである

bull ループの実行時間がそれに含まれる可能性のある他のループと比較して短い

ループの開始間隔を指定するには次のようにループの前にプラグマを指定します

pragma ii ltdesired_initiation_intervalgt

ltdesired_initiation_intervalgt パラメーターは後続のループ反復の開始を実行するまでに待機するクロックサイクル数を指定する整数であり必須です

カーネルにパイプライン化が可能な異なるループが 2 つある場合を考えます1 つはループに依存関係を持つ実行時間が短い初期化ループもう 1 つは処理の大部分を実行する実行時間が長いループですこの場合初期化ループがデザインの全体的なスループットに与える影響がもう一方のループに比べはるかに小さいことをコンパイラーは認識しません可能な場合コンパイラーは両方のループの IIを 1 でパイプライン化しようと試みます

初期化ループにはループに依存関係があるため生成されるハードウェアはフィードバックパスを持つようになりますこのようなフィードバックパスで II を実現するとクロック周波数の一部が犠牲になる可能性がありますメインループのフィードバックパスによっては残りのデザインがより高い動作周波数で動作できる場合があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

30

初期化ループにpragma ii 2を指定するとこのループに対する II の 適化をそれほど積極的に行う必要がないことをコンパイラーに通知します 適化をあまり積極的に行わないことでfmax を制限しているパスをコンパイラーがパイプライン化できるようになりカーネルのデザイン全体でより高いfmax を実現できるようになります

新しく指定される II により初期化ループの実行時間は長くなりますしかしfmax が高くなることでもう一方の長いループの実行時間が短縮されるため初期化ループの実行時間の増加は補償されます

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

524 ループの並列性 (max_concurrency Pragma)

max_concurrencyプラグマを使用しコンポーネントのループの並列性を制限できます

ループの並列性とはそのループの反復を同時に何回進行することができるかということですデフォルトにおいてインテル FPGA SDK for OpenCL はループの並列性を 大化しコンポーネントが 大のスループットで動作するように試みます

max_concurrencyプラグマはループがパイプライン化されている単一のワークアイテムカーネル (つまりシングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルのプロパティーについては インテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照ください

max_concurrencyプラグマを使用するとループのパイプライン化に必要なオンチップメモリーリソースを制御できるようになりますループ反復の同時実行を実現するためオフラインコンパイラーは単一の反復に専用のメモリーコピーを作成する必要がありますこのコピーはプライベートコピーと呼ばれます許可される並列性が高いほどより多くのプライベートコピーをコンパイラーは作成しなければなりません

カーネルの HTML レポート (reporthtml) はループの並列性に関する以下の情報を提供します

bull オフラインコンパイラーが選択した 大の並列性

この情報はループ解析レポートとカーネルメモリービューアーで確認できます

mdash ループ解析レポートの Details ペインのメッセージは同時実行の 大数は N に制限されていると報告します

注意 符号なしの N は0 以上の値になることが可能ですN = 0 は並列性が無制限であることを意味します

mdash カーネルメモリービューアーのローカルメモリーのバンクビューはプライベートコピーの数を図式化し表示します

bull メモリー使用量への影響

この情報はエリア解析レポートで確認可能ですDetails ペインのメッセージはオフラインコンパイラーが N 個のループ反復を同時実行するためN 個の独立したメモリーコピーを作成したことを報告します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

31

パフォーマンスよりも物理メモリーの低減を優先する場合以下のようにpragmamax_concurrency ltNgt をループに適用しますこのプラグマを適用するとオフラインコンパイラーは同時に実行するループの反復回数を N に制限しますループのメモリーのプライベートコピー数も N に減少します

pragma max_concurrency 1for (int i = 0 i lt N i++) int arr[M] Doing work on arr

ローカルメモリーに作成されループでアクセスされるプライベートコピーの数も__attribute__((max_concurrency(N))) を使用し制御することができます属性に関する詳細はカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) を参照ください__attribute__((max_concurrency(N))) を持つローカルメモリーにpragma max_concurency Mをともなうループでアクセスするとオフラインコンパイラーは同時に実行されるループの反復数を min(MN) に制限します

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

525 ループの投機的実行 (speculated_iterations Pragma)

speculated_iterationsプラグマを使用し インテル FPGA SDK for OpenCL オフラインコンパイラーにパイプライン化されたループのパフォーマンス向上を指示します

speculated_iterationsプラグマはループに適用されるため(他のループプラグマの位置と同様に) ループの直前に配置する必要があります以下に例を示します

pragma speculated_iterations k where k gt= 0

インテル FPGA SDK for OpenCL オフラインコンパイラーは他に影響を与えることなくk回の反復を追加し実行するハードウェアを生成しますこれによりループの II の短縮または fmax の増加どちらかが可能になります決定を左右するのはループの終了条件を計算する速度です計算に多くのサイクルを費やす場合はspeculated_iterationsを大きくすることを推奨します

注意 反復を追加することでループの次の呼び出しが開始されるまでの時間が長くなりますループの実際の反復回数が非常に少ない場合 (5 から 10 以下または同様の場合) はこれが要因の可能性がありますその場合pragma speculated_iterationsの値を 0 に指定すると後続のループの反復がすぐ開始されるようになります一方でこれはII を大きくし終了条件の算出に時間を与えることになりますHLD レポートのループ解析レポートを参照し終了条件が II のボトルネックであるかを確認してください

526 ワークグループサイズの指定

大のまたは必要なワークグループサイズを可能な限り指定してください インテル FPGA SDK forOpenCL オフラインコンパイラーはこの指定されたサイズに基づきOpenCL カーネルのハードウェア使用率を過剰なロジックをともなうことなく 適化します

max_work_group_sizeまたは reqd_work_group_size属性をカーネルで指定しない場合ワークグループサイズはコンパイル時間とランタイムの制約に応じたデフォルト値になります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

32

bull カーネルにバリアーが含まれる場合オフラインコンパイラーはデフォルトの 大ワークグループサイズである 256 ワークアイテムを設定します

bull カーネルが異なるスレッドの異なる動作を可能にする OpenCL 組み込み関数 (ローカルまたはグローバルスレッド IDワークグループ ID) の問い合わせを行わない場合オフラインコンパイラーはシングルスレッド実行モードを想定し 大ワークグループサイズを (111) に設定しますこの場合 OpenCL ランタイムもまたグローバルエンキューサイズを (111) に強制するためループのパイプライン化の 適化がオフラインコンパイラーで有効になります

ワークグループサイズを指定するには次のようにカーネルコードを修正します

bull カーネルのワークグループに向けてオフラインコンパイラーが規定するワークアイテムの 大数を指定するにはmax_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((max_work_group_size(51211)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

bull カーネルのワークグループにオフラインコンパイラーが規定するワークアイテムの必要数を指定するにはreqd_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((reqd_work_group_size(6411)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

527 計算ユニット数の指定

OpenCL カーネルのデータ処理効率を向上させるためカーネルの計算ユニットを複数生成するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示することができます各計算ユニットは複数のワークグループを同時に実行することができます

注意 カーネルの計算ユニット数を増加するとデータのスループットが向上する一方でFPGA リソースの消費率が増加しグローバルメモリーの帯域幅の競合が計算ユニット間で起こります

bull カーネルの計算ユニット数を指定するにはカーネルソースコードにnum_compute_units(N) 属性を挿入します

以下にコードの一部を例として示しますこのコードはカーネルに 2 つの計算ユニットをインスタンス化するようオフラインコンパイラーに指示しています

__attribute__((num_compute_units(2)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

33

size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは指定された数の計算ユニットにワークグループを動的に分配します

注意

ワークアイテムが実行されている特定の計算ユニットを識別するには組み込み関数のget_compute_id() を呼び出します詳細はget_compute_id() 関数を使用した複製カーネルのカスタマイズを参照ください

関連情報get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

528 SIMD ワークアイテム数の指定

手動でカーネルコードをベクトル化することなく複数のワークアイテムを SIMD (シングルインストラクションマルチプルワークアイテム) で実行しOpenCL カーネルのデータ処理効率を向上させることもできます インテル FPGA SDK for OpenCL オフラインコンパイラーにSIMD またはベクトル化された状態で実行するワークグループのワークアイテム数を指定してください

重要 reqd_work_group_size属性とともにnum_simd_work_items属性を導入します指定する num_simd_work_items属性はreqd_work_group_size属性に指定するワークグループサイズを均等に分割する必要があります

bull ワークグループの SIMD ワークアイテム数を指定するにはnum_simd_work_item(N) 属性をカーネルソースコードに挿入します

次のコード例は64 ワークアイテムの固定ワークグループサイズをカーネルに割り当てていますその後各ワークグループのワークアイテムを 4 つの SIMD ベクトルレーンに統合します

__attribute__((num_simd_work_items(4)))__attribute__((reqd_work_group_size(6411)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは可能な限りnum_simd_work_itemsに指定された値に従いカーネルのデータパスをベクトル化します

529 メモリー属性の指定

OpenCL カーネルの配列宣言にメモリー属性を適用することができます

int __attribute__((max_concurrency(k)) local_A[M]

この k は符号なしであり0 以上の値を取ることができますk の値は配列への 大同時アクセス数です インテル FPGA SDK for OpenCL オフラインコンパイラーは配列のコピーを k 個作成しますk=0 はスループットを 大化するためにオフラインコンパイラーが配列への 大同時アクセス数を小 16 までの範囲で選択することを示しますこれはメモリー属性を適用しないデフォルトの動作で

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

34

次の例は外側のループが 4 つのローカル配列を宣言しています

for (int i = 0 i lt N i++) int local_A[M] int local_B[M] int local_C[M] int local_D[M]

Step 1 for (int j = 0 j lt M j++) local_A[j ] = initA()

Step 2 for (int j = 0 j lt M j++) local_B[j] = initB(local_A[j])

Step 3 for (int j = 0 j lt M j++) local_C[j] = initC(local_B[j])

Step 4 for (int j = 0 j lt M j++) local_D[j] = initD(local_C[j])

この例において外側のループは 4 つのステップを含み各ステップは内側のループに対応していますステップ 1 では 初のローカル配列 local_A が初期化されますステップ 2 ではlocal_A の読み取りが行われますが書き込みはされませんこれは外側のループでの local_A の 後の使用になります同様に local_B はステップ 2 で 初に使用され初期化されますステップ 3 では local_B を読み取りますが書き込みはされませんそしてこれが 後の local_B の使用になります同様に local_Cはステップ 3 と 4 でのみで使用されます インテル FPGA SDK for OpenCL オフラインコンパイラーは16 個のコピーを作成し各配列をプライベート化しますこのコピーは外側のループでの 16 の並行処理をサポートするのに十分ですがこれらのローカル配列の実際の範囲は外側のループ全体に及ばないため外側のループのスループットを 大化するために 16 のコピーすべては必要ありませんこれはコピーを作成するために消費される領域が必要以上に大きいことを意味しますこの場合max_concurrency属性を適用しローカル配列のコピー数を制御すると外側のループのスループットを維持しながら使用される領域を減らすことができます

53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法

ローカルカーネルへのポインター引数を使用しローカルメモリーの割り当てを作成する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA に構築するローカルメモリーシステムのサイズをランタイムではなくコンパイル時に決定する必要があります clSetKernelArgでランタイムに要求するサイズを指定することでメモリーサイズを 適化できますこのサイズを指定することでオフラインコンパイラーはポインター引数に正しいサイズのローカルメモリーシステムを構築できるようになりますこのサイズを指定しない場合はオフラインコンパイラーはデフォルトのサイズを使用します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

35

bull デフォルトの 16 キロバイト (kB) 以外のサイズを指定するにはlocal_mem_size(N) 属性をカーネルソースコードのポインター宣言に含めます

N の値は要求するメモリーサイズをバイト単位で指定します効率を高めるためN は 2 のべき乗にしてください

__kernel void myLocalMemoryPointer( __local float A __attribute__((local_mem_size(1024))) __local float B __attribute__((local_mem_size(32768))) __local float C) statements

myLocalMemoryPointerカーネルにおいてローカルメモリーの 16 KB (デフォルト) はポインター Aに1 KB はポインター Bにそして 32 KB はポインター Cに割り当てられています

注意 ローカルカーネルへのポインター引数を使用する代わりにインテルではカーネルスコープにローカルメモリーシステムを定義することを推奨しています

54 インテル FPGA SDK for OpenCL チャネル拡張の実装

インテル FPGA SDK for OpenCL のチャネル拡張はカーネル間のデータの受け渡しおよびカーネルの同期を高効率かつ低レイテンシーで行うメカニズムを提供します

注意 チャネル機能の活用を求める一方で他の SDK を使用しカーネルプログラムを実行する機能がある場合はOpenCL パイプを代わりに使用しデザインを実装してください

関連情報OpenCL パイプの実装 (53 ページ)

541 インテル FPGA SDK for OpenCL チャネル拡張の概要

インテル FPGA SDK for OpenCL のチャネル拡張によりカーネルは FIFO バッファーを介し互いに直接通信できるようになります

チャネルの実装は並行して実行されているカーネル間のデータ移動をホストプロセッサーから切り離します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

36

図 -6 チャネル実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Channel

Host Processor

Initialize ( )

IO Channel

FIFO

542 チャネルにおけるデータの動作

チャネルに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りチャネルに残りますつまりチャネルに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり持続しますただしFPGA デバイスの再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたりデータが持続するわけではありません

OpenCL の実装においてデバイスの再プログラミング動作を回避するよう 適化を実行した場合でもチャネルのデータはコンテキストプログラムデバイスカーネルまたはプラットフォームのリリース間では持続しません例えば同じaocxファイルを使用しホストプログラムを 2 回実行する場合やホストプログラムがコンテキストをリリースし再取得した場合チャネルのデータは動作全体にわたって持続したりしなかったりする可能性がありますFPGA デバイスのリセット動作がチャネルのデータを消去するオブジェクトリリースの裏で発生する可能性があります

次のコードを例に示します

channel int c0

__kernel void producer() for (int i = 0 i lt 10 i++) write_channel_intel (c0 i)

__kernel void consumer (__global uint restrict dst) for (int i = 0 i lt 5 i++) dst[i] = read_channel_intel(c0)

図 -7 チャネルデータ FIFO の順序付け

9 012345678Producer Consumer

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

37

カーネルの producerは10 の要素 ([0 9]) をチャネルに書き込みますカーネルのコンシューマーにはワークアイテムの識別子の問い合わせが含まれていませんよって暗黙的なreqd_work_group_size属性 (111) を受け取りますこの暗黙的な属性reqd_work_group_size(111) は単一のワークアイテムカーネルとしてコンシューマーを起動させる必要があることを意味します上記例において consumerは1 回の呼び出しに 5 つの要素をチャネルから読み取ります 初の呼び出し中にカーネルの consumerは0 から 4 の値をチャネルより読み取りますデータは NDRange の呼び出し間で持続するため2 回目にカーネルconsumerを実行する際は5 から 9 の値が読み取られます

この例の場合デッドロックの発生を回避するためカーネル producerの呼び出しごとにカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとチャネルの容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回より多い場合はチャネルに十分なデータがないため consumerがストールします

543 チャネルに対する複数のワークアイテムの順序付け

OpenCL Specification はワークアイテムの順序を定義していません インテル FPGA SDK forOpenCL ではチャネルの読み書き動作の合理化を容易にするためワークアイテムの順序を強制します

複数のワークアイテムのチャネルへのアクセスはいくつかのシナリオにおいて有効です例えばチャネルのデータワードが独立している場合やチャネルがコントロールロジックに向けて実装されている場合などです複数のワークアイテムがチャネルにアクセスする際の主な注意事項はカーネルがチャネルにデータを書き込みチャネルからデータを読み取る順序ですSDK のチャネル拡張はチャネルへのワークアイテムの読み書き動作を可能な限り決定論的な順序で処理しますこれにより読み取りおよび書き込み動作はカーネル呼び出し間で一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK は以下の特性に基づきチャネルのアクセスがワークアイテムに対し不変であることを確認します

bull カーネルを通るすべてのパスが必ずチャネルアクセスを実行しているか

bull 上記要件が満たされない場合チャネル呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

bull カーネルが単一のワークアイテムカーネルとして推測されていないか

複数のワークアイテムのチャネルへのアクセスにおいて決定論的な順序付けを保証できない場合SDK はチャネルの順序付けが適切に定義されない可能性があり非決定論的な実行が行われる可能性があることを警告しますSDK は主にチャネル呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合決定論的な順序付けを提供することができません次に例を示します

__kernel void ordering (__global int restrict check __global int restrict data) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_channel_intel (req data[i]) else process(data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

38

5431 チャネルのワークアイテムのシリアル実行

ワークアイテムのシリアル実行とは順序付けられた実行動作のことでワークアイテムのシーケンシャル ID が計算ユニットでの実行順序を決定します

カーネルにチャネルを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は計算ユニットに同時に 大 1 つのインフライトのワークグループを持っているのと同等であるということを適用しますコンパイラーもまたカーネルがチャネルをシリアル実行することを保証しますよってカーネルはID の小さいワークアイテムから実行しますワークアイテムは識別子 (xyzgroup) を持ちますこの xyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

ワークアイテム ID (x0y0z0group0) は次の条件のいずれかが当てはまる場合ID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1 z0 lt z1の場合

bull group0 = group1 z0 = z1 y0 lt y1の場合

bull group0 = group1 z0 = z1 y0 = y1 x0 lt x1の場合

インクリメンタル ID をともなうワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) をともなうワークアイテムはチャネル書き込み呼び出しをまず実行しますその後ID (x1y0z0group0) をともなうワークアイテムが呼び出しを実行しますこの順序を定義することでシステムが外部モデルと検証可能になるよう保証しています

複数のワークアイテムをともなうループのチャネル実行

次のように複数のワークアイテムがあるループの本体にチャネルが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data int X) int n = 0 while (n lt X) write_channel_intel (req data[get_global_id(0)]) n++

544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約

OpenCL アプリケーションへのチャネル実装には一定のデザイン上の制約があります

複数のチャネル呼び出しサイト

カーネルは同じチャネルを複数回読み取ることが可能ですが複数のカーネルが同じチャネルから読み取ることはできません同様にカーネルは同じチャネルに複数回書き込むことはできますが複数のカーネルが同じチャネルに書き込むことはできません

__kernel void k1() read_channel_intel (channel1) read_channel_intel (channel1) read_channel_intel (channel1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

39

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコードをコンパイルすることができずエラーが発生します

__kernel void k1() write_channel_intel (channel1 1)

__kernel void k2() write_channel_intel (channel1 2)

フィードバックチャネルとフィードフォワードチャネル

カーネルのチャネルはread_onlyまたは write_onlyのどちらかになります同じチャネルに対して読み書きを行うカーネルのパフォーマンスは低下する可能性があります

静的なインデックス化

インテル FPGA SDK for OpenCL のチャネル拡張はチャネル ID の配列へのインデックス化をサポートしますが非効率なハードウェアにつながります

次に例を示します

channel int ch[WORKGROUP_SIZE]

__kernel void consumer()

int gid = get_global_id(0) int value = read_channel_intel(ch[gid])

statements

この例をコンパイルすると次の警告メッセージが表示されます

Compiler Warning Dynamic access into channel array ch was expanded into predicated static accesses on every channel of the array

アクセスが動的で配列のチャネルのサブセットのみにアクセスできることが明確な場合はswitch ステートメントを使用しわずかに効率的なハードウェアを生成することができます

channel int ch[WORKGROUP_SIZE] __kernel void consumer() int gid = get_global_id(0) int value

switch(gid) case 0 value = read_channel_intel(ch[0]) break

case 2 value = read_channel_intel(ch[2]) break case 3 value = read_channel_intel(ch[3]) break statements case WORKGROUP_SIZE-1read_channel_intel(ch[WORKGROUP_SIZE-1]) break

statements

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

40

カーネルのベクトル化に対するサポート

チャネルを使用するカーネルをベクトル化することはできませんしたがってカーネルコードにnum_simd_work_itemsカーネル属性を含めないでくださいチャネルを使用するカーネルをベクトル化すると同じカーネルで複数のチャネルアクセスが発生し調停が必要になりますこれはベクトル化の利点を無効にしますよって SDK のチャネル拡張はカーネルのベクトル化をサポートしません

read_channel_intel および write_channel_intel 呼び出しにおける命令レベルの並列処理

データの依存性が read_channel_intelと write_channel_intel呼び出し間に存在しない場合オフラインコンパイラーはそれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこの read_channel_intelと write_channel_intel呼び出しをOpenCL カーネルコードに表現されているシーケンスとは異なる順序で実行する場合があります

次のコードのシーケンスを例に示します

in_data1 = read_channel_intel(channel1)in_data2 = read_channel_intel(channel2)in_data3 = read_channel_intel(channel3)

read_channel_intel呼び出し間にデータの依存性がないためオフラインコンパイラーはこれらを任意の順序で実行できます

545 OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化

インテル FPGA SDK for OpenCL のチャネル拡張を実装するにはチャネル固有のプラグマと API 呼び出しを含むように OpenCL カーネルを修正します

チャネル拡張を有効にするには次のプラグマを使用しますpragma OPENCL EXTENSION cl_intel_channels enable

チャネル宣言は特定の OpenCL カーネルプログラムに固有のものですチャネルのインスタンスもまた各 OpenCL カーネルプログラムのデバイスペアに固有ですランタイムに単一の OpenCL カーネルプログラムを複数のデバイスにロードする場合各デバイスはチャネルのコピーを 1 つ保有するようになりますただしこのチャネルのコピーは独立しておりデバイス間でデータを共有しません

5451 チャネルのハンドル宣言

チャネル変数を使用しカーネル間またはカーネルと IO 間の接続性を定義します

チャネルから読み書きするにはカーネルはチャネル変数を対応する各 API 呼び出しに渡す必要があります

bull 以下の規則を使用しカーネルのソースコードにファイルスコープ変数としてチャネルのハンドルを宣言しますchannel lttypegt ltvariable_namegt

例 channel int c

bull インテル FPGA SDK for OpenCL のチャネル拡張はデータ構造で宣言された複数の変数による同時チャネルアクセスをサポートします次の方法でstructデータ構造をチャネルに宣言します

typedef struct type_ int a int b type_t

channel type_t foo

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

41

5452 ブロッキングのチャネル書き込みの実装

write_channel_intel API 呼び出しはチャネルを介したデータ送信を可能にします

bull ブロッキングのチャネル書き込みの実装には次の write_channel_intel関数シグネチャーを使用します

void write_channel_intel (channel lttypegt channel_id constlttypegt data)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますまた対応する読み取りチャネル(read_channel_intel) の channel_idと一致しなければなりません

dataはチャネル書き込み動作がチャネルに書き込むデータです

ltTypegt はチャネルのデータ幅を定義しますOpenCL 変換規則に従いカーネルがチャネルに書き込むデータがlttypegt に変換できるようにしてください

以下にwrite_channel_intel API 呼び出しを実装するコード例を示します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from global memory and passes this data to the channel __kernel void kernel_write_channel( __global const long src ) for (int i = 0 i lt N i++) Writes the eight bytes to the channel write_channel_intel(chan src[i])

注意 write_channel_intel API 呼び出しを使用しチャネルを介してデータを送信する際はチャネルの容量がフルの場合 (FIFO バッファーがデータでフルの場合) カーネルがストールしFIFO バッファーのデータスロットが 低 1 つ利用可能になるまで待機することに注意してください インテル FPGADynamic Profiler for OpenCL を使用しチャネルのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

54521 ノンブロッキングのチャネル書き込みの実装

ノンブロッキングのチャネル書き込みを行うとフルの状態の FIFO バッファーに書き込みFIFO バッファーのスロットが利用可能になるまでカーネルがストールすることのないアプリケーションが容易にできるようになりますノンブロッキングのチャネル書き込みはデータがチャネルに正常に書き込まれた (チャネルがフルではなかった) ことを示すブール値を返します

アプリケーションにデータプロデューサーが 1 つと同一のワーカーが 2 つあるシナリオを例とします各ワーカーがメッセージの処理に要する時間はデータの内容によって異ると想定しますこの場合一方のワーカーはビジー状態でもう一方のワーカーはフリーの状態になる可能性がありますノンブロッキングの書き込みは両方のワーカーがビジー状態になるワークの分配を促進します

bull ノンブロッキングのチャネル書き込みを実装するには次の write_channel_nb_intel関数シグネチャーを含めます

bool write_channel_nb_intel(channel lttypegt channel_id constlttypegt data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

42

次に示すコードのカーネル producerはノンブロッキングのチャネル書き込み拡張を使用しワークの分配を促進しています

channel long worker0 worker1__kernel void producer( __global const long src ) for(int i = 0 i lt N i++) bool success = false do success = write_channel_nb_intel(worker0 src[i]) if(success) success = write_channel_nb_intel(worker1 src[i]) while(success)

5453 ブロッキングのチャネル読み取りの実装

read_channel_intel API 呼び出しはチャネルを介したデータの受信を可能にします

bull ブロッキングのチャネルの読み取りを実装するには次の read_channel_intel関数シグネチャーを含めます

lttypegt read_channel_intel(channel lttypegt channel_id)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますこれは対応する書き込みチャネル (write_channel_intel) の channel_idと一致している必要があります

lttypegt はチャネルのデータ幅を定義しますチャネルデータを読み取るためにカーネルが割り当てる変数がlttypegt から変換可能であることを確認してください

read_channel_intel API 呼び出しを実装するコード例を以下に表します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from the channel and writes it back to global memory__kernel void kernel_read_channel (__global long dst) for (int i = 0 i lt N i++) Reads the eight bytes from the channel dst[i] = read_channel_intel(chan)

注意 チャネルが空の場合 (FIFO バッファーが空の場合)read_channel_intel API 呼び出しで読み出しチャネルを介したデータの受信はできませんこれを行うと 低 1 つのデータ要素が FIFO バッファーで利用可能になるまでカーネルはストールします

54531 ノンブロッキングのチャネル読み取りの実装

ノンブロッキングの読み取りを行うとデータが必ずしも利用可能ではない場合でもデータが利用可能になるまで動作が待機することのないアプリケーションを容易にできるようになりますノンブロッキング読み取りシグネチャーはブロッキング読み取りと類似していますが読み取り動作がチャネルからデータを正常に読み取ったかどうかを示すブールポインター validが指定するアドレスを生成します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

43

読み取りが正常に行われた場合 (validが true に設定される)チャネルから読み取った値はread_channel_nb_intel関数により返されます読み取りが失敗した場合 (validが false に設定される)read_channel_nb_intel関数の戻り値は定義されません

bull ブロッキングのチャネル読み取りを実装するには次の read_channel_nb_intel関数シグネチャーを使用します

lttypegt read_channel_nb_intel(channel lttypegt channel_id bool valid)

次のコードはノンブロッキングのチャネル読み取り拡張機能の使用方法を表しています

channel long chan

__kernel void kernel_read_channel (__global long dst) int i = 0 while (i lt N) bool valid0 valid1 long data0 = read_channel_nb_intel(chan ampvalid0) long data1 = read_channel_nb_intel(chan ampvalid1) if (valid0) process(data0) if (valid1) process(data1)

5454 io チャネル属性を使用した IO チャネルの実装

io属性をチャネル宣言に含めFPGA ボードの入力または出力フィーチャーと接続する特別な IO チャネルを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますこの chan_id はカスタムプラットフォームの board_specxmlにリストされている IO インターフェイス名です

ペリフェラルインターフェイスの使用方法はデバイスの種類によって異なるためIO チャネルをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいご自身の OpenCL カーネルコードはペリフェラルインターフェイスが生成するデータと互換性がある必要があります

注意 bull ボードに直接接続しIO チャネルを介してペリフェラルデバイスと通信するチャネルには暗黙的なデータの依存関係が存在する可能性があります インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらの依存関係に対する可視性を持たないためこの暗黙的なデータの依存関係は予期しない動作を引き起こす可能性があります

bull 同じペリフェラルと通信する外部 IO チャネルはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを参照しご自身の FPGA ボードで使用可能な入力および出力フィーチャーを特定してください

例えばboard_specxmlファイルには次のような IO フィーチャー情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

44

chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256 chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのチャネルで使用されるデータタイプの幅をビットで指定します上の例の場合uintと floatのデータタイプはどちらも 32 ビット幅です他のより大きいデータタイプやベクトル化されたデータタイプはboard_specxmlファイルで指定されている適切なビット幅と一致している必要があります

2 次のコード例で示されているように ioチャネル属性を実装しますioチャネル属性の名前はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) と一致していなければなりません

channel QUDPWord udp_in_IO __attribute__((depth(0))) __attribute__((io(eth0_in))) channel QUDPWord udp_out_IO __attribute__((depth(0))) __attribute__((io(eth0_out)))

__kernel void io_in_kernel (__global ulong4 mem_read uchar read_from int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) if (read_from amp 0x01) data = read_channel_intel(udp_in_IO) else data = mem_read[index] write_channel_intel(udp_in data) index++

__kernel void io_out_kernel (__global ulong2 mem_write uchar write_to int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) ulong4 data = read_channel_intel(udp_out) if (write_to amp 0x01) write_channel_intel(udp_out_IO data) else only write data portion ulong2 udp_data udp_datas0 = datas0 udp_datas1 = datas1 mem_write[index] = udp_data index++

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

45

注意 board_specxmlファイルのXML (eXtensible Markup Language) チャネル要素で指定されている各 IO チャネルに固有の io(chan_id) ハンドルを宣言してください

5455 IO チャネルのエミュレーション

io属性で宣言されたチャネルをともなうカーネルをエミュレーションするとIO チャネル入力はファイルからの読み取りによってエミュレーションされチャネル出力はファイルへの書き込みによってエミュレーションされます

エミュレーションを実行する際読み取りまたは書き込みに使用されるファイル名は io属性名と一致します例えば次のようなチャネル宣言をする場合エミュレーションは myIOChannelというファイルに対し読み取りまたは書き込みを行います (どちらか一方のみ)

channel uint chanA __attribute__((io(myIOChannel)))

IO チャネルの方向性は単方向ですチャネルへは読み取りもしくは書き込みのどちらかが可能で両方を行うことはできませんただし同じ io属性値を持つ読み取りチャネルと書き込みチャネルをそれぞれ持つことは可能です

channel uint readChannel __attribute__((io(myIOChannel)))channel uint writeChannel __attribute__((io(myIOChannel)))

IO チャネル読み取りのエミュレーション

読み取りが io属性を持つ myfileというチャネルから発行される場合ディスクの myfileというファイルに読み取りの試みは行われますmyfileが存在しない場合やファイルから読み取るデータが不十分な場合呼び出しタイプによって以下のように動作を行います

Non-blockingread

ファイルが存在しない場合やデータが不十分な場合読み取りの試みが失敗したことを示すメッセージを返します

Blockingread

ファイルが存在しない場合やデータが不十分な場合ディスクにファイルが作成されるかファイルに十分なデータが含まれるまでプログラムをブロックします

IO チャネル書き込みのエミュレーション

書き込みが io属性を持つ myfileというチャネルへ発行される場合ディスクの myfileというファイルに書き込みの試みが行われますmyfileファイルが存在しない場合通常ファイルが作成されそのファイルに書き込みが行われますmyfileが存在する場合はそれに上書きします書き込みが失敗した場合呼び出しタイプによって以下のように動作を行います

Non-blocking write 書き込みの試みが失敗した場合エラーが返されます

Blocking write 書き込みの試みが失敗した場合書き込みの試みがさらに行われます

5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例

カーネルの同時実行はFPGA のチャネルの効率を向上させることができます同時実行を実現するためホストはカーネルを並列して起動します該当する場合カーネルはチャネルを介して互いに通信できます

次に示すモデルは安全かつ効率的な同時実行の活用方法の概要を示しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

46

フィードフォワードのデザインモデル

フィードフォワードのデザインモデルを実装しサイクルを作成せずに 1 つのカーネルから次のカーネルにデータを送信します次のコードを参照ください

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i] = read_channel_intel(c0) dst[2i+1] = read_channel_intel(c1)

producerカーネルはデータをチャネル c0と c1に書き込みますconsumerカーネルはc0とc1からデータを読み取ります下の図は2 つのカーネル間のフィードフォワードのデータフローを表しています

図 -8 フィードフォワードのデータフロー

Producer Consumer

バッファー管理

フィードフォワードのデザインモデルではデータは producerと consumerのカーネル間を一度に1 ワードずつ移動します複数のワードから構成される大きなデータメッセージの転送を容易にするため通信用アプリケーションで一般的に見られるデザインパターンであるピンポンバッファーを実装することができます次の図はカーネルとピンポンバッファー間の通信を表しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

47

図 -9 バッファー管理をともなうフィードフォワードのデザインモデル

Producer Consumer

Manager

Buffer

managerカーネルはproducerカーネルと consumerカーネル間における循環バッファーの割り当ておよび割り当て解除を管理しますconsumerカーネルがデータを処理した後managerはconsumerが解放したメモリー領域を受け取り再度使用するために producerに送信しますmanagerはまた使用されていない位置の初期セット (トークンの初期セット) を producerカーネルに送信しそこに producerがデータを書き込めるようにします

次の図はバッファー管理の際に発生するイベントのシーケンスを表しています

図 -10 バッファー管理時のカーネルの通信

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

(1) (4)(3)(2)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

48

1 Managerカーネルはトークンのセットを producerカーネルに送信しメモリー内のどの領域が現在使用されておらずproducerが利用できるかを示します

2 managerがメモリー領域を割り当てた後producerはピンポンバッファーのその領域にデータを書き込みます

3 producerは書き込み動作完了後consumerカーネルに同期トークンを送信し処理するデータが含まれるメモリー領域を示します次に consumerカーネルはピンポンバッファーの該当領域からデータを読み取ります

注意

producerconsumermanagerカーネルは並行して実行されるためconsumerが読み取り動作を実行している間producerは他の使用されていないメモリー位置へ処理を行うデータを書き込むことができます

4 consumerは読み出し動作が完了後メモリー領域を解放しトークンを managerに送り返します次に managerカーネルはその領域をリサイクルしproducerが使用できるようにします

OpenCL カーネルへのバッファー管理の実装

SDK が適切なバッファー管理を実行するためにはチャネルの読み取りおよび書き込みの順序が重要です次のカーネル例を参照ください

__kernel void producer (__global const uint restrict src __global volatile uint restrict shared_mem const uint iterations) int base_offset for (uint gID = 0 gID lt iterations gID++) Assume each block of memory is 256 words uint lID = 0x0ff amp gID

if (lID == 0) base_offset = read_channel_intel(req)

shared_mem[base_offset + lID] = src[gID]

Make sure all memory operations are committed before sending token to the consumer mem_fence(CLK_GLOBAL_MEM_FENCE | CLK_CHANNEL_MEM_FENCE)

if (lID == 255) write_channel_intel(c base_offset)

このカーネルにおいて以下のコード行は独立しているため インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらを同時に実行するようスケジュールすることができます

shared_mem[base_offset + lID] = src[gID]

および

write_channel_intel(c base_offset)

base_offsetにデータを書き込みbase_offsetをチャネルへ書き込むことはグローバルメモリーへデータを書き込むよりもはるかに早い可能性がありますconsumerカーネルは次にチャネルから base_offsetを読み取りそれをグローバルメモリーから読み取るためのインデックスとして使

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

49

用します同期がなければshared_mem[base_offset + lID] = src[gID]の実行が終了する前にconsumerが producerからデータを読み取る可能性がありますその結果consumerは無効なデータを読み取ることになりますこのシナリオを回避するにはproducerカーネルがデータをメモリーに収納した後に同期トークンが発生しなければなりませんつまりconsumerカーネルはproducerがグローバルメモリーにデータを正常に格納するまでproducerカーネルからデータを消費することはできません

この順序を維持するにはOpenCL mem_fenceトークンをカーネルに含めますmem_fence構造はCLK_GLOBAL_MEM_FENCEと CLK_CHANNEL_MEM_FENCEの 2 つのフラグを持ちますmem_fenceはmem_fence呼び出し前後に発生する動作間に制御フローの依存性を効率的に作成しますCLK_GLOBAL_MEM_FENCEフラグはグローバルメモリー動作が制御フローに従う必要があることを示しますCLK_CHANNEL_MEM_FENCEはチャネル動作が制御フローに従う必要があることを示しますそのためこの例にある write_channel_intel呼び出しはグローバルメモリー動作が共有メモリーバッファーに格納されるまで開始できません

5457 depth 属性を使用するバッファーされたチャネルの実装

カーネルプログラムはバッファーされたチャネルとバッファーされていないチャネルを含むことが可能です チャネルの読み取り動作と書き込み動作が不均衡な場合チャネル宣言に depth属性を含めバッファーされたチャネルを作成しカーネルがストールするのを防ぎますバッファーされたチャネルは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたチャネルはスループットの制限や共有メモリーへのアクセスの同期化といったデータトラフィックの制御に使用することが可能ですバッファーされていないチャネルでは読み取り動作がデータの値を読み取るまで書き込み動作を開始できませんバッファーされたチャネルではデータの値がバッファーにコピーされるまで書き込み動作を開始できませんバッファーがフルの場合は読み取り動作がデータの一部を読み取りそれをチャネルから削除するまで動作を開始することができません

bull チャネルに対する消費率と生産率の一時的な不一致が予想される場合depthチャネル属性を使用しバッファーサイズを設定します

次の例は インテル FPGA SDK for OpenCL のチャネル拡張を実装するカーネルコードでのdepthチャネル属性の使用方法を示していますdepth(N) 属性はバッファーされたチャネルの 小深度を指定しますこの N はデータ値の数を表します

channel int c __attribute__((depth(10)))

__kernel void producer (__global int in_data) for (int i = 0 i lt N i++) if (in_data[i]) write_channel_intel(c in_data[i])

__kernel void consumer (__global int restrict check_data __global int restrict out_data) int last_val = 0

for (int i = 0 i lt N i++) if (check_data[i]) last_val = read_channel_intel(c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

50

out_data[i] = last_val

この例において書き込み動作はブロッキングをすることなく 10 個のデータ値をチャネルに書き込むことができますチャネルがフルになると関連する読み取り動作がチャネルに発生するまで書き込み動作を進めることはできません

チャネルの読み取りと書き込みの呼び出しは条件付きステートメントのためチャネルの読み取りと書き込みの呼び出しが不均衡になる可能性がありますチャネルにバッファー容量を追加することでproducerカーネルと consumerカーネルを確実に分離することができますこの手順はconsumerカーネルがチャネルからデータを読み取っていないときにproducerカーネルがデータを書き込んでいる場合に特に重要です

5458 チャネルの呼び出し順序の強制

チャネルの呼び出し順序を強制するにはカーネルプログラムにメモリーフェンスもしくはバリアー機能を導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンスの前後におけるチャネルアクセスに制御フローの依存性を作るために必要です

計算ユニットを生成する際 インテル FPGA SDK for OpenCL オフラインコンパイラーはそれぞれが独立している命令のすべてに命令レベルの並列性を必ず作成するわけではありませんそのためチャネル読み取りと書き込み動作の間に制御やデータの依存性がない場合でもそれぞれが独立して実行されない場合がありますチャネル呼び出しが相互に通信する際またはチャネルが外部デバイスにデータを書き込む際にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますチャネル c0とc1はバッファーされていないチャネルですc0と c1からのチャネル読み出し動作のスケジュールはc0と c1へのチャネル書き込み動作とは逆の順序で発生する可能性がありますつまりproducerカーネルはまず c0に書き込みますがconsumerカーネルは c1を 初に読み取る場合がありますこのチャネル呼び出しのスケジューリングの変更はconsumerカーネルが空のチャネルから読み取っているためデッドロックを引き起こす可能性があります

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) During compilation the AOC might reorder the way the consumer kernel writes to memory to optimize memory access Therefore c1 might be read before c0 which is the reverse of what appears in code

dst[2i+1] = read_channel_intel(c0) dst[2i] = read_channel_intel(c1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

51

bull デッドロックの発生を防ぐにはカーネルにメモリーフェンス関数 (mem_fence) を含めチャネル呼び出しの順序を強制します

各カーネルのチャネルフラグとともに mem_fence呼び出しを挿入すると書き込みと読み取りのチャネル呼び出しにシーケンシャルな順序付けが適用されます次は変更された producerとconsumerカーネルのコードです

channel uint c0 __attribute__((depth(0)))channel uint c1 __attribute__((depth(0)))

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i+1] = read_channel_intel(c0) mem_fence(CLK_CHANNEL_MEM_FENCE) dst[2i] = read_channel_intel(c1)

この例で producerカーネルの mem_fenceはc0へのチャネル書き込み動作が c1よりも前に発生するようにしています同様に consumerカーネルの mem_fenceはc0のチャネル読み取り動作が c1よりも前に発生するようにしています

54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義

OpenCL Specification version 10 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしチャネルを使用するカーネルは共通グローバルメモリーバッファーおよび同期されたメモリーアクセスを介しデータを共有することができます チャネルに書き込まれたデータがメモリーフェンスが渡された後に読み取りチャネルから確実に見えるようにするためメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull チャネルの同期呼び出しとメモリー動作間の制御フローの依存性を作成するにはCLK_GLOBAL_MEM_FENCEフラグを mem_fenceコールに追加します

__kernel void producer( __global const uint src const uint iterations ) for(int i=0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

52

write_channel_intel(c1 src[2i+1])

このカーネルにおいて mem_fence関数はc0への書き込み動作と src[2i]へのメモリーアクセスがc1への書き込み動作と src[2i+1]へのメモリーアクセスよりも先に実行されるようにしていますこれによりデータが c1に書き込まれる前にc0に書き込まれたデータが読み取りチャネルから見えるようになります

55 OpenCL パイプの実装

インテル FPGA SDK for OpenCL はOpenCL パイプ機能に対する暫定サポートを提供しますOpenCL パイプは OpenCL Specification version 20 の一部であり高効率かつ低レイテンシーなカーネルへのデータの受け渡しおよびカーネルの同期を可能にするメカニズムを提供します

OpenCL カーネルが他の SDK と互換性があることが重要な場合にパイプを実装してください

OpenCL C プログラミング言語の仕様およびパイプに関する概要についてはOpenCLSpecification version 20 を参照ください

インテル FPGA SDK for OpenCL のパイプの実装はパイプの仕様全体を網羅するものではありませんそのためOpenCL Specification version 20 に完全には準拠していませんSDK のパイプ実装の目的はOpenCL 20 に準拠する異なるデバイスにおいて一貫して機能するソリューションを提供することです インテル FPGA 製品に向けてパイプを有効にするにはご自身のデザインが特定の追加要件を満たしている必要があります

関連情報OpenCL Specification version 20 (API)

551 OpenCL パイプ機能の概要

OpenCL パイプはカーネルが FIFO バッファーを介し互いに直接通信できるようにします

図 -11 パイプネットワーク実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Pipe

Host Processor

Initialize ( )

IO Pipe

FIFO

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

53

パイプを実装するとカーネルの実行がホストプロセッサーから切り離されます インテル FPGA SDKfor OpenCL パイプサポートの基本はSDK のチャネル拡張ですただしパイプの関数の構文はチャネルの構文とは異なります

重要 チャネルとは異なりパイプのデフォルトの動作はノンブロッキングです

ブロッキングおよびノンブロッキング機能に関してはチャネルに関する次の章をそれぞれ参照ください

関連情報bull ブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ)

bull ブロッキングのチャネル読み取りの実装 (43 ページ)

552 パイプデータの動作

パイプに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りパイプに残りますつまりパイプに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり維持されますただしFPGA の再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたってデータが維持されることはありません

次のコードを例に示します

__kernel void producer (write_only pipe uint __attribute__((blocking)) c0) for (uint i = 0 i lt 10 i++) write_pipe (c0 ampi)

__kernel void consumer (__global uint restrict dst read_only pipe uint __attribute__((blocking)) __attribute__((depth(10))) c0) for (int i = 0 i lt 5 i++) read_pipe (c0 ampdst[i])

パイプへの読み取り操作では 初 にパイプに書き込まれたデータがまず読み出されますパイプデータはパイプ内の FIFO の順序を維持します

図 -12 パイプにおけるデータ FIFO の順序

9 012345678Producer Consumer

カーネル producerは10 個の要素 ([0 9]) をパイプに書き込みますカーネル consumerはNDRange の呼び出しごとにパイプから 5 個の要素を読み出します 初の呼び出しにおいてカーネル consumerは0 から 4 の値をパイプから読み出しますデータは NDRange 呼び出しにわたり維持されるため2 回目のカーネル consumer実行時には5 から 9 の値が読み出されます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

54

この例の場合デッドロックの発生を防ぐためカーネル producerの 1 回の呼び出しに対しカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとパイプ容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回を超えるとパイプ内のデータが不足するため consumerがストールします

553 パイプにおける複数のワークアイテムの順序付け

OpenCL Secification はワークアイテムの順序付けを定義していません インテル FPGA SDK forOpenCL はパイプの読み取りおよび書き込み動作の一貫性を維持するためワークアイテムの順序を強制します

複数のワークアイテムによるパイプへのアクセスはいくつかのシナリオでは有効です例えばパイプのデータワードが独立している場合やパイプが制御ロジックに向け実装されている場合に効果があります複数のワークアイテムがパイプにアクセスにする際に も注意しなければならないのはカーネルがデータをパイプへ書き込みパイプからデータを読み出す順序ですOpenCL パイプは可能な限りワークアイテムのパイプへの読み書き動作を決定論的な順序で処理しますそのため読み出し動作と書き込み動作はカーネル呼び出し間において一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK はパイプ呼び出しがワークアイテムに対し不変であることを次の点に基づき確認します

bull カーネルを通るすべてのパスがパイプ呼び出しを実行しているか

bull 上の要件が満たされない場合パイプ呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

SDK は複数のワークアイテムのパイプへのアクセスにおいて決定論的な順序を保証できない場合パイプが非決定論的な実行をともない適切な順序に定義されない可能性があることを警告しますSDKは通常パイプ呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合に決定的な順序付けを行うことができません

__kernel voidordering (__global int check global int data write_only pipe int __attribute__((blocking)) req) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_pipe (req ampdata[i]) else process(data)

5531 パイプにおけるワークアイテムのシリアル実行

ワークアイテムのシリアル実行とはワークアイテムのシーケンシャル ID が計算ユニットにおける実行順序を決定する順序付けられた実行動作のことです

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

55

カーネルにパイプを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は 大 1 つのインフライトのワークグループを保有しているのと同等であるということを強制しますオフラインコンパイラーはまたカーネルがワークアイテムのシリアル実行でパイプを実行するよう保証しますここでカーネルは小さな ID を有するワークアイテムをまず実行しますワークアイテムは(xyzgroup)の識別子を持ちxyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

次のいずれかの条件が当てはまる場合ワークアイテム ID (x0y0z0group0) はID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1z0 lt z1の場合

bull group0 = group1z0 = z1y0 lt y1の場合

bull group0 = group1z0 = z1y0 = y1x0 lt x1の場合

インクリメンタル ID を持つワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) を持つワークアイテムは書き込みチャネル呼び出しを 初に実行します次にID(x1y0z0group0) を持つワークアイテムが呼び出しを実行しますこの順序を定義することでシステムを外部モデルと検証することが可能になります

複数のワークアイテムを持つループでのパイプの実行

次に示すように複数のワークアイテムを持つループの本体にパイプが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data write_only pipe int __attribute__((blocking)) req) write_pipe (req ampdata[get_global_id(0)])

554 OpenCL のパイプ実装における制約

OpenCL アプリケーションへのパイプの実装においては一定のデザイン上の制約があります

デフォルト動作

デフォルトではパイプはノンブロッキング動作を行いますカーネルのパイプにブロッキング動作をさせる場合は読み取りパイプおよび書き込みパイプを宣言する際にブロッキング属性(__attribute__((blocking))) を指定してください

エミュレーションのサポート

インテル FPGA SDK for OpenCL Emulator はパイプを含むカーネルのエミュレーションをサポートしていますエミュレーターのサポート範囲はFPGA ハードウェアに実装される OpenCL パイプサポートのサブセットと一致します

パイプ API のサポート

現在 SDK のパイプの実装はOpenCL Specification version 20 の組み込みパイプ関数のすべてをサポートしているわけではありませんパイプ API におけるサポートの有無についてはOpenCL 20C プログラミング言語のパイプにおける制約の一覧を参照ください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

56

シングルコールサイト

パイプの読み取りおよび書き込み動作は決定論的に機能しないためカーネルにはパイプ ID ごとに 1つの呼び出しサイトしか割り当ることができません例えば インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコード例をコンパイルすることができません

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe1 ampin_data3)

pipe1への 2 回目の read_pipe呼び出しはpipe1への 2 つ目の呼び出しサイトを作成するためコンパイルは失敗します

特定のパイプから複数のデータを収集するには以下に示すようにパイプを複数のパイプに分割します

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe3 ampin_data3)

1 つのパイプ ID に対し 1 つの呼び出しサイトしか割り当てることができないためパイプを含むループを展開することはできません次のコードを参照ください

pragma unroll 4for (int i = 0 i lt 4 i++) read_pipe (pipe1 ampin_data1)

オフラインコンパイラーはコンパイル中に次の警告メッセージを発行します

Compiler Warning Unroll is required but the loop cannot beunrolled

フィードバックパイプとフィードフォワードパイプ

カーネルのパイプはread_onlyまたは write_onlyのどちらかです同じパイプを読み書きするカーネルのパフォーマンスは低下します

カーネルのベクトル化に対するサポート

パイプを使用するカーネルをベクトル化することはできませんつまりカーネルコードにnum_simd_work_itemsのカーネル属性を含めることはできませんパイプを使用するカーネルをベクトル化すると複数のパイプマスターが作成され調停が必要になりますこれは OpenCL パイプの仕様ではサポートされていません

read_pipe と write_pipe 呼び出しにおける命令レベルの並列性

read_pipeと write_pipe呼び出し間にデータの依存性がない場合オフラインコンパイラーはこれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこのread_pipeと write_pipe呼び出しをOpenCL のカーネルコードで表現されているシーケンスに従わない順序で実行する可能性があります

次のコードのシーケンスを例に示します

in_data1 = read_pipe(pipe1)in_data2 = read_pipe(pipe2)in_data3 = read_pipe(pipe3)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

57

read_pipe呼び出し間にデータの依存性がないためオフラインコンパイラーは任意の順序でそれらを実行することができます

関連情報OpenCL 20 C プログラミング言語のパイプにおける制約 (188 ページ)

555 カーネルに向けた OpenCL パイプの有効化

パイプを実装するにはご自身の OpenCL カーネルを変更しパイプ固有の API 呼び出しを含めてください

パイプ宣言は特定の OpenCL カーネルプログラムに固有のものですまたパイプのインスタンスはOpenCL カーネルのプログラムとデバイスのペアごとに一意のものですランタイムに単一の OpenCLカーネルプログラムを複数のデバイスにロードすると各デバイスは各パイプのコピーを 1 つ持つようになりますただしこれらのパイプのコピーは独立しておりデバイス間でデータを共有しません

5551 他の OpenCL SDK との互換性の確保

インテルによる OpenCL パイプの実装は現在OpenCL Specification version 20 に部分的に準拠しています 他の OpenCL SDK からのパイプを実装するカーネルを インテル FPGA SDK forOpenCL にポートする場合はホストコードとカーネルコードを変更する必要がありますこの変更はこのアプリケーションの他の OpenCL SDK に対する移植性に影響しません

ホストコードの変更

以下は変更されたホストアプリケーションの例です

include ltstdiohgtinclude ltstdlibhgtinclude ltstringhgtinclude CLopenclhdefine SIZE 1000

const char kernel_source = __kernel void pipe_writer(__global int in write_only pipe int p_in)n n int gid = get_global_id(0)n write_pipe(p_in ampin[gid])n n __kernel void pipe_reader(__global int out read_only pipe int p_out)n n int gid = get_global_id(0)n read_pipe(p_out ampout[gid])n n

int main() int input = (int )malloc(sizeof(int) SIZE) int output = (int )malloc(sizeof(int) SIZE) memset(output 0 sizeof(int) SIZE) for (int i = 0 i = SIZE ++i) input[i] = rand()

cl_int status cl_platform_id platform cl_uint num_platforms status = clGetPlatformIDs(1 ampplatform ampnum_platforms)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

58

cl_device_id device cl_uint num_devices status = clGetDeviceIDs(platform CL_DEVICE_TYPE_ALL 1 ampdevice ampnum_devices)

cl_context context = clCreateContext(0 1 ampdevice NULL NULL ampstatus)

cl_command_queue queue = clCreateCommandQueue(context device 0 ampstatus)

size_t len = strlen(kernel_source) cl_program program = clCreateProgramWithSource(context 1 (const char )ampkernel_source amplen ampstatus)

status = clBuildProgram(program num_devices ampdevice NULL NULL)

cl_kernel pipe_writer = clCreateKernel(program pipe_writer ampstatus) cl_kernel pipe_reader = clCreateKernel(program pipe_reader ampstatus)

cl_mem in_buffer = clCreateBuffer(context CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR sizeof(int) SIZE input ampstatus) cl_mem out_buffer = clCreateBuffer(context CL_MEM_WRITE_ONLY sizeof(int) SIZE NULL ampstatus)

cl_mem pipe = clCreatePipe(context 0 sizeof(cl_int) SIZE NULL ampstatus)

status = clSetKernelArg(pipe_writer 0 sizeof(cl_mem) ampin_buffer) status = clSetKernelArg(pipe_writer 1 sizeof(cl_mem) amppipe) status = clSetKernelArg(pipe_reader 0 sizeof(cl_mem) ampout_buffer) status = clSetKernelArg(pipe_reader 1 sizeof(cl_mem) amppipe)

size_t size = SIZE cl_event sync status = clEnqueueNDRangeKernel(queue pipe_writer 1 NULL ampsize ampsize 0 NULL ampsync) status = clEnqueueNDRangeKernel(queue pipe_reader 1 NULL ampsize ampsize 1 ampsync NULL) status = clFinish(queue)

status = clEnqueueReadBuffer(queue out_buffer CL_TRUE 0 sizeof(int) SIZE

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

59

output 0 NULL NULL)

int golden = 0 result = 0 for (int i = 0 i = SIZE ++i) golden += input[i] result += output[i]

int ret = 0 if (golden = result) printf(FAILED) ret = 1 else printf(PASSED) printf(n)

return ret

カーネルコードの変更

カーネルコードがOpenCL Specification version 20 に準拠する OpenCL SDK で実行される場合 インテル FPGA SDK for OpenCL で実行する前にこのコードを変更する必要があります次のようにカーネルコードを変更してください

bull パイプ引数の名前が両方のカーネルにおいて同一になるように変更します例えばp_inとp_outを pに変更します

bull パイプ引数に depth属性を指定しますホストで保持するためにパイプが作成する 大パケット数に等しい値をdepth属性に割り当てます

bull インテル FPGA SDK for OpenCL にはオフラインコンパイラーがあるためオフラインコンパイルモードでカーネルプログラムを実行します

変更後のカーネルコードは次のようになります

define SIZE 1000

__kernel void pipe_writer(__global int in write_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) write_pipe(p ampin[gid])

__kernel void pipe_reader(__global int out read_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) read_pipe(p ampout[gid])

5552 パイプハンドルの宣言

pipe変数を使用しカーネル間またはカーネルと IO 間の静的なパイプ接続を定義します

パイプの読み書きを行うにあたりカーネルはパイプ変数を対応する各 API 呼び出しに渡す必要があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

60

bull 以下の規則に従いパイプハンドルをファイルスコープ変数としてカーネルのソースコードに宣言します ltaccess qualifiergt pipe lttypegt ltvariable_namegt

パイプの lttypegt はスカラーサイズが 1024 ビット以下の任意の OpenCL 組み込みスカラーまたはベクトルデータ型にすることができますまたスカラーサイズで 1024 ビット以下のスカラーまたはベクトルデータ型で構成される任意のユーザー定義の型にすることも可能です

次のパイプハンドル宣言を参照ください

__kernel void first (pipe int c)

__kernel void second (write_only pipe int c)

初の例ではint型の読み出し専用パイプハンドルをカーネル firstで宣言しています2 番目の例では書き込み専用パイプをカーネル secondで宣言していますカーネル firstはパイプ cからの読み取りのみを行うことができカーネル secondはパイプ cへの書き込みのみを行うことができます

重要

インテル FPGA SDK for OpenCL オフラインコンパイラーではパイプ引数の名前を一致させることでシステム内のパイプの接続性を静的に推測します上記例においてカーネルfirstはカーネル secondにパイプ cで接続しています

インテル OpenCL システムでは1 つのカーネルのみがパイプを読み取ることができます同様に1 つのカーネルのみがパイプに書き込むことができますIO 以外のパイプに対応する読み取り動作と書き込み動作が少なくとも 1 つずつない場合オフラインコンパイラーはエラーを発行します

インテル FPGA SDK for OpenCL IO パイプの実装についてはio 属性を使用した IO パイプの実装を参照してください

関連情報io 属性を使用した IO パイプの実装 (64 ページ)

5553 パイプ書き込みの実装

write_pipe API 呼び出しはパイプを介したデータ送信を可能にします

インテルではwrite_pipe関数の簡易版のみをサポートしていますデフォルトで write_pipe呼び出しはノンブロッキングです受信するパケットを収容する容量がパイプにある場合にのみパイプ書き込み動作は成功します

bull パイプ書き込みを実装するには次の write_pipe関数シグネチャーを含めます

int write_pipe (write_only pipe lttypegt pipe_id const lttypegtdata)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応する読み出しパイプ(read_pipe) の pipe_idと一致する必要があります

dataはパイプ書き込み動作がパイプに書き込むデータですこれはパイプのパケットタイプへのポインターになりますパイプへの書き込みはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はパイプのデータ幅を定義します戻り値はパイプ書き込み動作が成功したかどうかを示します成功した場合の戻り値は 0 となりパイプの書き込みが失敗した場合の戻り値は-1 です

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

61

以下はwrite_pipe API 呼び出しの実装を表すコード例です

Declares the writable nonblocking pipe p which contains packets of type int__kernel void kernel_write_pipe (__global const long src write_only pipe int p) for (int i = 0 i lt N i++) Performs the actual writing Emulates blocking behavior via the use of a while loop while (write_pipe(p ampsrc[i]) lt 0)

blocking 属性を指定する場合whileループは不要ですより良いハードウェアの実装を実現するためにインテルではカーネルのパイプ引数宣言にブロッキング属性(__attribute__((blocking))) を指定することでブロッキングの write_pipe呼び出し機能を提供しますブロッキングの write_pipe呼び出しは必ず成功を返します

注意 write_pipe API 呼び出しを使用しブロッキングの書き込みパイプを介しデータを送信する際はパイプがフル (FIFO バッファーがデータでフル) の場合はカーネルがストールすることに注意してください インテル FPGA Dynamic Profiler for OpenCL を使用しパイプのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

5554 パイプ読み出しの実装

read_pipe API 呼び出しはパイプを介したデータ受信を可能にします

インテルではread_pipe関数の簡易版のみをサポートしていますread_pipe呼び出しはデフォルトではノンブロッキングです

bull パイプ読み出しを実装するには次の read_pipe関数シグネチャーを含めます

int read_pipe (read_only_pipe lttypegt pipe_id lttypegt data)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応するパイプ書き込み動作(write_pipe) の pipe_idと一致する必要があります

dataはパイプ読み出し動作がパイプから読み取るデータですこれはデータ位置へのポインターになりますread_pipe呼び出しはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はデータのパケットサイズを定義します

以下はread_pipe API 呼び出しの実装を表すコード例です

Declares the read_only_pipe that contains packetsof type longDeclares that read_pipe calls within the kernel will exhibitblocking behavior__kernel void kernel_read_pipe(__global long dst read_only pipe long __attribute__((blocking)) p) for (int i = 0 i lt N i++) Reads from a long from the pipe and stores it

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

62

into global memory at the specified location read_pipe(p ampdst[i])

より良いハードウェア実装を実現するためにインテルではカーネルのパイプ引数宣言にプロッキング属性 (__attribute__((blocking))) を指定することでブロッキングの read_pipe呼び出し機能を提供しますブロッキングの read_pipe呼び出しは必ず成功が返されます

注意 パイプが空 (FIFO バッファーが空) の場合read_pipe API 呼び出しでブロッキングの読み出しパイプを介したデータ受信はできませんこれを行うとカーネルがストールします

5555 depth 属性を使用するバッファーされたパイプの実装

カーネルプログラムにはバッファーされたパイプとバッファーされていないパイプを含むことができます パイプの読み出し動作と書き込み動作が不均衡な場合はパイプ宣言に depth属性を含めることでバッファーされたパイプを作成しカーネルのストールを防ぎますバッファーされたパイプは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたパイプを使用しスループットの制限や共有メモリーのアクセスの同期化といったデータのトラフィックを制御できますバッファーされていないパイプにおいて書き込み動作は読み出し動作がデータの読み取りをしようとしている場合にのみ開始できますバッファーされていないパイプは並行して実行されるカーネルでのブロッキングの読み書き動作と組み合わせて使用してくださいバッファーされていないパイプは自己同期型のデータ転送を効率的に提供します

バッファーされたパイプにおいて書き込み動作は受信するパケットを収容する容量がパイプにある場合にのみ進めることが可能です読み出し動作は少なくとも 1 つのパケットがパイプになければ実行することができません

パイプ呼び出しが書き込みカーネルと読み出しカーネルで異なって表されている場合にバッファーされたパイプを使用するとカーネルは並行して実行されません

bull パイプに対する消費率と生産率の一時的な不一致が予想される場合はdepth属性を使用しバッファーサイズを設定します

次の例はOpenCL パイプを実装するカーネルコードにおける depth属性の使用方法を示していますdepth(N)属性はバッファーされたパイプの 小深度を指定しますこの N はデータ値の数です読み出しカーネルと書き込みカーネルが特定のバッファーされたパイプに異なる深度を指定する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーは 2 つの深度のうち大きい深度を使用します

__kernel voidproducer (__global int in_data write_only pipe int __attribute__((blocking)) __attribute__((depth(10))) c) for (i = 0 i lt N i++) if (in_data[i]) write_pipe( c ampin_data[i] )

__kernel voidconsumer (__global int check_data __global int out_data read_only pipe int __attribute__((blocking)) c ) int last_val = 0

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

63

for (i = 0 i lt N i++) if (check_data[i]) read_pipe( c amplast_val ) out_data[i] = last_val

この例において書き込み動作は10 個のデータ値をパイプに正常に書き込むことができますパイプがフルの状態になると書き込みカーネルは読み出しカーネルがパイプのデータの一部を消費するまで失敗を返します

パイプの読み出しと書き込みの呼び出しは条件付きステートメントのためパイプの読み出しおよび書き込みの呼び出しには不均衡が発生する可能性がありますパイプにバッファー容量を追加するとproducerと consumerカーネルを切り離すことができますこの方法はconsumerカーネルがパイプからデータを読み取っていない際にproducerカーネルがパイプにデータを書き込んでいる場合に特に重要です 

5556 io 属性を使用した IO パイプの実装

OpenCL パイプ宣言に io属性を含めFPGA ボードの入力または出力フィーチャーと接続する特別なIO パイプを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

インテル FPGA SDK for OpenCL チャネル拡張の io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますchan_id 引数はカスタムプラットフォームの board_specxmlファイルにある IO インターフェイスの名前です同じ IO フィーチャーを使用しIO パイプを識別することができます

ペリフェラルインターフェイスの使用法は各デバイスのタイプによって異なる可能性があるためIO パイプをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいOpenCL カーネルのコードはペリフェラルインターフェイスが生成するデータの型と互換性がなければなりません外部 IO パイプとカーネルのバイトの順序が異なる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはバイトの順序を入出時にシームレスに変換します

注意 bull ボードに直接接続しておりIO パイプを介してペリフェラルデバイスと通信するパイプには暗黙的なデータの依存性が存在する可能性がありますオフラインコンパイラーはそれらの依存関係を認識できないためこの暗黙的なデータの依存性はコンパイルの問題を引き起こす可能性があります

bull 同一のペリフェラルと通信する外部 IO パイプはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを確認しFPGA ボードで使用可能な入力および出力フィーチャーを特定ください

例えばboard_specxmlファイルにはIO フィーチャーに関する次のような情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256 chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

64

chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのパイプで使用されるデータの型の幅をビット単位で指定します上記例の場合uintと floatのデータ型はどちらも 32 ビット幅ですその他のより大きなデータ型やベクトル化されたデータ型はboard_specxmlファイルで指定されている適切なビット幅に一致している必要があります

2 次のコード例で示されているように io属性を実装しますio属性名はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) に一致しなければなりません

__kernel void test (pipe uint pkt __attribute__((io(ldquoenetrdquo))) pipe float data __attribute__((io(ldquopcierdquo))))

注意 board_specxmlファイル内のチャネルの XML 要素で指定されている各 IO パイプに固有の io(chan_id) ハンドルを宣言してください

5557 パイプ呼び出し順序の強制

パイプの呼び出し順序を強制するにはメモリーフェンスもしくはバリアー機能をカーネルプログラムに導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンス前後におけるパイプの同期呼び出し間に制御フローの依存性を作成するために必要です

インテル FPGA SDK for OpenCL オフラインコンパイラーが計算ユニットを生成する際それぞれが独立している命令のすべてに対し命令レベルの並列性を構築するわけではありませんそのためパイプの読み出しおよび書き込み動作はそれらに制御やデータの依存性がない場合でも互いに独立して実行されない可能性がありますパイプ呼び出しが相互に通信する場合やパイプが外部デバイスにデータを書き込む場合にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますパイプ c0と c1はバッファーされていないパイプですc0と c1からのパイプ読み出し動作のスケジュールはc0とc1へのパイプ書き込み動作と逆の順序になる可能性がありますつまりproducerカーネルが 初に c0に書き込む一方でconsumerカーネルは c1から読み出す可能性があるということですconsumerカーネルが空のパイプから読み出しているためこのパイプ呼び出しにおけるスケジューリングの変更はデッドロックを発生させる可能性があります

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe (c0 ampsrc[2i ]) write_pipe (c1 ampsrc[2i+1])

__kernel void consumer (__global uint restrict dst const uint iterations read_only pipe uint __attribute__((blocking)) c0 read_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) read_pipe (c0 ampdst[2i+1]) read_pipe( c1 ampdst[2i])

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

65

bull パイプ呼び出しの順序を強制しデッドロックが発生しないようにするにはメモリーフェンス関数(mem_fence) をカーネルに含めます

各カーネルのパイプフラグとともに mem_fence呼び出しを挿入すると書き込みおよび読み出しのパイプ呼び出しにシーケンシャルな順序付けが適用されます次に変更後の producerとconsumerカーネルコードを示します

__kernel void producer (__global const uint src const uint iterations write_only_pipe uint __attribute__((blocking)) c0 write_only_pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_pipe(c1 ampsrc[2i+1])

__kernel void consumer (__global uint dst const uint iterations read_only_pipe uint __attribute__((blocking)) c0 read_only_pipe uint __attribute__((blocking)) c1) for(int i = 0 i lt iterations i++) read_pipe(c0 ampdst[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) read_pipe(c1 ampdst[2i+1])

この例ではproducerカーネルの mem_fenceはc0へのパイプ書き込み動作が c1より先に発生するようにしています同様に consumerカーネルの mem_fenceはc0からの読み取り動作が c1より先に行われるようにしています 

55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義

OpenCL Specification version 20 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしパイプを使用するカーネルは共通のグローバルメモリーバッファーと同期化されたメモリーアクセスを介しデータを共有できます メモリーフェンスが渡された後にパイプに書き込まれたデータが読み出しパイプから確実に見えるようにするにはメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull パイプの同期呼び出しとメモリー動作における制御フローの依存性を作成するにはmem_fence呼び出しに CLK_GLOBAL_MEM_FENCEフラグを追加します

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

66

write_pipe(c1 ampsrc[2i+1])

このカーネルで mem_fence関数はc0への書き込み動作と src[2i] へのメモリーアクセスがc1への書き込み動作と src[2i+1] へのメモリーアクセスの前に必ず実行されるようにしていますこれによりc0に書き込まれたデータはc1にデータが書き込まれる前に読み出しパイプから見えるようになります 

556 ホストパイプを介したカーネルとの直接通信

cl_intel_fpga_host_pipe拡張機能はカーネルとホストプログラムにおいてポイントとポイントのパイプ通信を可能にしますこの拡張を行わない場合OpenCL 内のパイプはカーネル間の通信にのみ使用することができホストプログラムとの直接通信に使用することはできません

この拡張機能はclCreatePipeの flags引数に 2 つの新しい値を認証しパイプホストをアクセス可能にしますまた4 つの新しい API 関数を追加し (clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGA)ホストのアクセスを有効にすることで作成したパイプをホストが読み書きできるようにします新しいカーネル引数属性のオプションが追加されカーネル言語においてパイプカーネル引数の反対側の端をホストプログラムに指定することでパイプが別のカーネルに接続されなくなりますカーネルの定義においてパイプカーネル引数はホストパイプまたは他のカーネルのどちらかへの接続に限定されておりランタイムにこの 2 つを動的に切り替えることはできません

パイプカーネル引数にホストアクセス可能のマークが付けられている場合カーネル言語のパイプアクセサーは2x 関数のサブセットに制限され (予約はサポートされていません)メモリーの一貫性または可視性の保証はOpenCL 同期ポイントを超えて行われます

ホストがアクセス可能なパイプのサポートはcl_intel_fpga_host_pipeと公示されているデバイスプロパティーです

注意 bull このホストパイプの実装における制限はプラットフォームが 2 つのホストパイプしかサポートしていないことです1 つは読み出し用もう一つは書き出し用ですさらにコパイラーは 32 ビット幅のパイプのみを許容しますよって cl_intel_fpga_host_pipe拡張機能の使用例の章でulong4が使用されています

bull cl_intel_fpga_host_pipe拡張を使用しているホストプログラムはOpenCL 20 の機能のサポート状況 (187 ページ) に記されているようにCLcl_ext_intelfpgahヘッダーファイルを含みOpenCL 20 のサポートを有効にする必要があります

関連情報cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

5561 intel_host_accessible カーネル引数属性オプション

cl_intel_fpga_host_pipe拡張機能によりオプションの intel_host_accessibleカーネル引数属性が追加されますこの属性をカーネルパイプ引数に適用することでホストはカーネルパイプ引数をホストがアクセス可能なパイプに接続し他のカーネルパイプ引数に接続しないことを指定します

__attribute__((intel_host_accessible))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

67

5562 ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数

clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGAのホスト API 関数を追加するとホストプログラムはホストがアクセス可能なパイプカーネル引数に (clSetKernelArg引数を使用し) バインドされたcl_memパイプオブジェクトに読み書きできるようになります

bull clReadPipeIntelFPGAおよび clWritePipeIntelFPGA関数はパイプ幅のシングルワードで動作します

bull clMapHostPipeIntelFPGA関数はホストパイプで多数のワードの読み取りまたは書き込みを実行する際のレイテンシーとオーバーヘッドを低減する高度なメカニズムです

bull clUnmapHostPipeIntelFPGA関数を使用するとホストプログラムは先にclMapHostPipeIntelFPGA関数呼び出しが作成したマップ領域の一部または全体に書き込みもしくは読み出しを行ったことを OpenCL ランタイムに通知することができるようになります

表 1 バインドされた cl_mem オブジェクトの API 関数

関数 説明

cl_int clReadPipeIntelFPGA (cl_mem pipe gentype ptr)

以下の特性を持つパイプからデータパケットを読み取ります1 CL_MEM_HOST_READ_ONLYフラグで作成されている2 write_only定義と intel_host_accessibleカーネル

引数属性を持つカーネル引数にバインドされている各 clReadPipeIntelFPGA関数呼び出しは1 パケットをパイプから読み取ります動作はノンブロッキングでありデータがパイプ内で正常に読み取れるようになるまで待機しません

cl_int clWritePipeIntelFPGA (cl_mem pipe gentype ptr)

次の特性を持つパイプにデータパケットを書き込みます1 CL_MEM_HOST_WRITE_ONLYフラグを使用し作成されている2 read_only定義と intel_host_accessible引数属性を

持つカーネル引数にバインドされている各 clWritePipeIntelFPGA関数呼び出しは1 パケットをパイプに書き込みます動作はノンブロッキングであり正常に書き込める容量がパイプにできるまで待機しません返されるステータスのCL_SUCCESSはカーネルの読み取りにデータが利用可能なことを意味するわけではありませんホストパイプに以前にマップされたバッファーのマップが解除されるとデータは 終的にカーネルの読み取りに利用可能になります

void clMapHostPipeIntelFPGA (cl_mem pipe cl_map_flags map_flags size_t requested_size size_t mapped_size cl_int errcode_ret)

ホストアドレス空間にvoid を返しますCL_MEM_HOST_WRITE_ONLYフラグで作成されている場合パイプはこのアドレス空間にデータを書き込むことができますまたCL_MEM_HOST_READ_ONLYフラグで作成されている場合パイプはこのアドレス空間からデータを読み取ることができますmapped_size引数はメモリーのランタイムによって決定するホストがアクセス可能な 大バイト数を指定しますmapped_size で指定される値は呼び出し側が指定する requested_size引数以下の値になります返された void に対する読み出しまたは書き込み後ホストは 1 回以上の clUnmapHostPipeIntelFPGA関数呼び出しを実行しデバイスに転送するデータが準備できていること (書き込み時) およびメモリーを再利用できること (読み込みおよび書き込みに時) をランタイムに通知する必要があります前回のclMapHostPipeIntelFPGA関数呼び出しでマッピングされたメモリーをclUnmapHostPipeIntelFPGA関数が解除する前に新

continued

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

68

関数 説明

たに clMapHostPipeIntelFPGA関数が呼び出された場合2 回目の clMapHostPipeIntelFPGA関数呼び出しで返されるバッファーは 初の呼び出しで返されたバッファーと重複しません

cl_int clUnmapHostPipeIntelFPGA ( cl_mem pipe void mapped_ptr size_t size_to_unmap size_t unmapped_size )

clMapHostPipeIntelFPGA関数によって返されたホストがアドレス指定可能なバッファーの size_to_unmapバイトをホストがすでに使用していないことをランライムに通知します書き込み可能なホストパイプの場合clUnmapHostPipeIntelFPGAを呼び出すとマッピングが解除されたデータをカーネルが利用できるようになりますsize_to_unmapの値が clMapHostPipeIntelFPGA関数で指定された mapped_sizeの値より小さい場合clUnmapHostPipeIntelFPGA関数を複数回呼び出しバッファー全容量のマッピングを解除する必要がありますclUnmapHostPipeIntelFPGA関数呼び出しを複数回含めclMapHostPipeIntelFPGA関数呼び出しで返されたバッファーの一連のバイトのマッピングをclMapHostPipeIntelFPGA呼び出しで定義された mapped_sizeの値まで解除することができます

5563 ホストがアクセス可能なパイプの作成

OpenCL 22 API Specification の Section 541 で定義されている clCreatePipe関数はflagsパラメーターを含んでいますclCreatePipe関数の flagsの有効値はCL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSです flagsへ渡された値が 0 の場合このフラグはどちらも暗黙的にデフォルトとして渡されると Specification は定義しています

ホストのパイプへのアクセス (読み取りまたは書き込み) を有効にするためcl_intel_fpga_host_pipe拡張機能は次の 2 つの flags値を clCreatePipeに対し正当なものにします

bull CL_MEM_HOST_READ_ONLY

bull CL_MEM_HOST_WRITE_ONLY

この flagsのうち 1 つが clCreatePipe関数に渡されると対応する cl_memオブジェクトは初の引数として clReadPipeIntelFPGAと clWritePipeIntelFPGA関数に渡されます

cl_intel_fpga_host_pipe拡張の残りの部分においてこのようなパイプはホストパイプとして表されます

警告 CL_MEM_HOST_READ_ONLYと CL_MEM_HOST_WRITE_ONLYを同じパイプに指定することまたはこのどちらかの値を CL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSのどちらかもしくは両方と混在させることは不当です無効な flagsの組み合わせは OpenCL ランタイムに検出されclCreatePipeがCL_INVALID_VALUEエラーを返す原因になります

5564 cl_intel_fpga_host_pipe 拡張機能の使用例

以下はcl_intel_fpga_host_pipe拡張のカーネルとホストコードの例です

カーネルコード

pragma OPENCL EXTENSION cl_intel_fpga_host_pipe enable

kernel void reader(__attribute__((intel_host_accessible)) __read_only pipe ulong4 host_in) ulong4 val if (read_pipe(host_in ampval))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

69

kernel void writer(__attribute__((intel_host_accessible)) __write_only pipe ulong4 device_out) ulong4 val if (write_pipe(device_out ampval))

ホストコード

cl_kernel read_kern = clCreateKernel(program reader NULL)

cl_kernel write_kern = clCreateKernel(program writer NULL)

cl_mem read_pipe = clCreatePipe(context CL_MEM_HOST_READ_ONLY sizeof( cl_ulong4 ) 128 Number of packets that can be buffered NULL amperror)

cl_mem write_pipe = clCreatePipe(context CL_MEM_HOST_WRITE_ONLY sizeof( cl_ulong4 ) 64 Number of packets that can be buffered NULL amperror)

Bind pipes to kernelsclSetKernelArg(read_kern 0 sizeof(cl_mem) (void )ampwrite_pipe)clSetKernelArg(write_kern 0 sizeof(cl_mem) (void )ampread_pipe)

Enqueue kernels

cl_ulong4 valif (clReadPipeIntelFPGA (read_pipe ampval)) cl_int result = clWritePipeIntelFPGA (write_pipe ampval) Check write successfailure and handle

56 任意精度での整数の実装

インテル FPGA SDK for OpenCL の任意精度での整数拡張を使用しカスタムビット幅で整数を定義します整数のカスタムビット幅は 大 64 ビットまで定義できます

任意精度の整数拡張機能を使用するにはカーネルコードのヘッダーファイルのリストに次の行を含めます

include ihc_apinth

ihc_apinthヘッダーファイルを含むカーネルをコンパイルする際は-I$INTELFPGAOCLSDKROOTincludekernel_headersオプションを aocコマンドとともに含める必要があります以下に例を示します

aoc ltother command optionsgt -I $INTELFPGAOCLSDKROOTincludekernel_headers ltmy_kernel_filegt

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

70

ヘッダーは任意精度の整数拡張を有効にし符号付きおよび符号なしの任意精度の整数に対する C スタイル宣言を定義するマクロを次のように備えています

define ap_intltdgt intd_tdefine ap_uintltdgt uintd_t

例えば 10 ビットの符号付きおよび符号なしの任意精度の整数は次のように宣言できます

int10_t x_signeduint10_t x_unsigned

任意精度の整数は 大 64 ビット幅まで宣言することが可能です

ヘッダーファイルを使用せずに整数を任意の精度で利用するには次のプラグマディレクティブで拡張を有効にします

pragma OPENCL EXTENSION cl_intel_arbitrary_precision_integers enable

プラグマ宣言の後次のように任意の精度で整数を宣言することができます

ap_intltdgt intd_t my_signed_integerap_uintltdgt uintd_t my_unsigned_integer

結果のビット幅が引数のビット幅より大きい演算を行う場合は引数の 1 つを結果のビット幅に明示的にキャストする必要があります

例えば次の演算を行った場合結果は宣言された整数のサイズをオーバーフローします

int10_t aint10_t bint20_t res

res = a b

この例においてコンパイラーは2 つの 10 ビットの整数を乗算する乗数をインスタンス化し結果を別の 10 ビットの整数に納めようと試みます結果は符号拡張されるか20 ビットまでゼロ拡張されます

オーバーフローを防ぐには次のように引数の 1 つを結果のビット幅に明示的にキャストします

res = ((int20_t)a) b

注意 x86-64 のプラットフォームに向けてプログラムをコンパイルすると任意の精度での整数のビット幅は32 ビットまたは 64 ビットに切り上げられますFPGA プラットフォームにカーネルをコンパイルするとビット幅は切り上げられず任意の精度の整数は宣言されたビット幅のまま維持されます

その結果x86-64 のプログラムで正しく動作するように見える演算を FPGA カーネルにコンパイルするとオーバーフローし精度を失う可能性がありますx86-64 プラットフォームにおいてビット幅を切り上げることで与えられる追加精度はFPGA カーネルのコンパイル時に発生する可能性があるオーバーフローと精度損失の問題をマスクします

57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用

定義済みプリプロセッサーマクロを活用するとカーネルコードの一部を条件付きでコンパイルできるようになります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

71

bull デバイス固有のコード (例えば FPGA_board_1) をカーネルプログラムに含めるにはカーネルプログラムを次のように構成します

if defined(AOCL_BOARD_FPGA_board_1) FPGA_board_1-specific statementselse FPGA_board_2-specific statementsendif

カーネルのコンパイルを特定のボードに対して行うと定義済みプリプロセッサーマクロAOCL_BOARD_ltboard_namegt が 1 に設定されますltboard_namegt がFPGA_board_1 の場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA_board_1 に固有のパラメーターとフィーチャーをコンパイルします

bull インテル FPGA SDK for OpenCL オフラインコンパイラー固有のコンパイラーフィーチャーと適化を導入するにはカーネルプログラムを次のように構成します

if defined(INTELFPGA_CL) statementselse statementsendif

この INTELFPGA_CLは インテル にて定義済みのオフラインコンパイラー用のプリプロセッサーマクロです

関連情報カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)(111 ページ)

58 __constant アドレス空間修飾子の宣言

__constantアドレス空間修飾子をカーネルに含める際にはいくつかの考慮すべき制限と回避策があります

関数スコープ__constant 変数

インテル FPGA SDK for OpenCL オフラインコンパイラーは関数スコープの__constant変数をサポートしません関数スコープの__constant変数はファイルスコープの constant 変数に置き換えてくださいまた関数スコープの__constant変数をホストがカーネルに渡す__constantバッファーに置き換えることも可能です

ファイルスコープ__constant 変数

ホストが常に同じ定数データをカーネルに渡す場合そのデータを初期化された constant ファイルスコープ配列としてカーネルファイルで宣言することを検討ください初期化された constant ファイルスコープ配列宣言はデータを格納するための ROM をハードウェアに直接作成しますこの ROM はNDRange のすべてのワークアイテムが利用可能です

以下に例を示します

__constant int my_array[8] = 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7

__kernel void my_kernel (__global int my_buffer) size_t gid = get_global_id(0) my_buffer[gid] += my_array[gid 8]

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

72

この場合ファイルスコープの定数データはカーネルの呼び出しにわたって変化しないためオフラインコンパイラーは my_arrayの値を ROM に設定します

ホストから__constant パラメーターへのポインター

カーネルの呼び出しにわたってデータが固定されていない場合ファイルスコープの定数データをカーネルコードの__constantパラメーターへのポインターに置き換えることが可能ですその後次の方法でホストアプリケーションを修正する必要があります

1 グローバルメモリーのポインターに関連付けられた cl_memメモリーオブジェクトを作成します

2 カーネルを実行する前にclEnqueueWriteBufferで定数データを cl_memオブジェクトにロードします

3 clSetKernelArg関数でcl_memオブジェクトをカーネルに引数として渡します

constant 変数が複合型の場合は次の表で示されているように typedef引数を使用し簡潔にします

表 2 ファイルスコープ__constant 変数と__constant パラメーターへのポインターの置き換え

元のソースコードの構成 以下のような構文に書き換え

__constant int Payoff[2][2] = 1 3 5 3__kernel void original(__global int A) A = Payoff[1][2] and so on

__kernel void modified(__global int A__constant Payoff_type PayoffPtr ) A = (PayoffPtr)[1][2] and so on

注意 ホストアプリケーションとカーネルでは同じ型定義を使用してください

59 構造体データ型を OpenCL カーネルに引数として含める

OpenCL カーネルの構造体パラメーター (struct) は値もしくは構造体へのポインターとして渡します

注意 __global struct引数は構造体を格納するためにホストプログラムに作成する必要があるバッファーを指定しますポインターのエイリアシングを防ぐため構造体へのポインター宣言にrestrict修飾子を含めます

591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致

OpenCL カーネルで構造体データ型 (struct) を引数として使用する場合ホストアプリケーションとカーネルコードにおいてメンバーのデータ型を一致させデータメンバーのアライメントを揃えてください

メンバーのデータ型を一致させるにはカーネルコードのデータ型に対応するデータ型の cl_バージョンをホストアプリケーションで使用しますデータ型の cl_バージョンはopenclhヘッダーファイルにあります例えばカーネルコードに float4型のデータメンバーがある場合ホストアプリケーションにおいて宣言する対応するデータメンバーはcl_float4です

ホストとカーネルアプリケーションにおける構造とstructデータメンバーのアライメントを揃えます異なるホストコンパイラー間においては変動性があるためアライメントは慎重に管理してください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

73

例えば構造体にfloat4の OpenCL データ型がある場合これらのデータアイテムのアライメントはOpenCL Specification を満たす必要があります (float4に対しては 16 バイトのアライメント)

インテル FPGA SDK for OpenCL オフラインコンパイラーが OpenCL カーネルをコンパイルする際は次の規則が適用されます

1 組み込みのスカラー型とベクトル型のアラインメントはOpenCL Specification version 10 のSection 615 で説明されている規則に従います

オフラインコンパイラーは通常サイズに基づいてデータ型のアライメントを行いますただしコンパイラーは 3 要素ベクトルの値を4 要素ベクトルと同じ方法でアライメントします

2 配列はその要素の 1 つと同じアラインメントを有します

3 struct (または union) はそのデータメンバーのいずれかに必要な 大アライメントと同じアライメントを有します

以下に例を示します

struct my_struct char data[3] float4 f4 int index

データ型が float4であるためオフラインコンパイラーは上記の struct要素を 16 バイトの境界でアライメントしますその結果dataと indexもまた 16 バイトのアライメント境界を有します

4 オフラインコンパイラーは structのデータメンバーを並び替えません

5 オフラインコンパイラーは通常各データメンバーのアライメント要件を満たすためstructのデータメンバー間に 小限のデータ構造パディングを挿入します

a OpenCL カーネルコードではpacked属性を struct宣言に適用することでデータのパッキングを指定することができます (すなわちデータ構造パディングを挿入しない)データのパッキングを課す場合はデータメンバーのアラインメントが OpenCL のアラインメント要件を満たしていることを確認してください インテル FPGA SDK for OpenCL はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

b OpenCL カーネルコードではaligned(N) 属性をデータメンバーに適用しデータ構造パディングの量を指定することができますここで N はパディングの量を表しますSDK はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

Windows システムにおいてMicrosoft Visual Studio コンパイラーの一部のバージョンではデフォルトで構造体データ型をパッキングしますデータのパッキングが不要な場合はデータ構造パディングの量を次のように指定してください

struct my_struct __declspec(align(16)) char data[3]

Note that cl_float4 is the only known float4 definition on the host __declspec(align(16)) cl_float4 f4 __declspec(align(16)) int index

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

74

ヒント データ構造パディングを追加することに代わりchar型または char配列のダミーの structメンバーを挿入する方法もあります

関連情報bull 構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

bull OpenCL Specification version 10

592 データ構造パディング挿入の無効化

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造体のメンバー間への自動的なパディング挿入を無効にする指示を出すことができます

bull 自動パディング挿入を無効にするにはカーネルソースコードの structデータ構造の前にpacked属性を挿入します

例えば次のようになります

struct __attribute__((packed)) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float restrict A __global struct Context restrict c) if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

593 構造体のアライメントの指定

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造に特定のアライメントを設定するよう指示を出すことができます

bull 構造のアライメントを指定するにはカーネルソースコードの structデータ構造の前にaligned(N) 属性を挿入します

次に例を示します

struct __attribute__((aligned(2))) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float A __global struct Context restrict c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

75

if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

510 レジスターの推論

インテル FPGA SDK for OpenCL オフラインコンパイラーではプライベートアドレス空間のデータをレジスターまたはブロック RAM に実装することが可能です 変数へのアクセスが固定されており動的インデックスを必要としない場合オフラインコンパイラーは通常レジスターを選択します可変インデックスで配列にアクセスすると配列は通常ブロック RAM に実装されますプライベートデータをレジスターとして実装することは単一のサイクルで発生する必要があるデータのアクセス (例えば単一ワークアイテムのループでのフィードバックなど) に有効です

オフラインコンパイラーはプライベート配列を単一の値のレジスターまたは区分的なレジスターとして推論します区分的な実装は非常に効率的なハードウェアをもたらしますがオフラインコンパイラーがデータのアクセスを静的に決定できなければなりません区分的な実装を容易にするためにアクセスポイントを配列にハードコードしますまた配列にアクセスするループを展開することでレジスターの推論を容易にすることもできます

配列のアクセスを静的に推論できない場合オフラインコンパイラーは配列をレジスターとして推論する場合がありますただしオフラインコンパイラーは単一のワークアイテムカーネルに対しそれらの配列のサイズを 64 バイトに制限します複数のワークアイテムを有するカーネルには実質的にサイズ制限はありません

次のコードを例に示します

int array[SIZE]for (int j = 0 j lt N ++j) for (int i = 0 i lt SIZE - 1 ++i) array[i] = array[i + 1]

array[i]へのインデックスはループが展開されていないため静的に推論することができませんarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイト以下である場合オフラインコンパイラーは array[SIZE]を単一の値としてレジスターに実装しますarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイトより大きい場合オフラインコンパイラーは配列全体をブロック RAM に実装します複数のワークアイテムカーネルの場合サイズが 1 キロバイト (KB) 未満である限りオフラインコンパイラーは単一の値として array[SIZE]をレジスターに実装します

5101 シフトレジスターの推論

シフトレジスターのデザインパターンは多くのアプリケーションを効率的に FPGA へ実装するために非常に重要なデザインパターンですしかしシフトレジスターのデザインパターンを実装することに対し 初は違和感を抱くかもしれません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

76

次のコードを例に示します

channel int in out

define SIZE 512Shift register size must be statically determinable

__kernel void foo() int shift_reg[SIZE] The key is that the array size is a compile time constant

Initialization loop pragma unroll for (int i=0 i lt SIZE i++) All elements of the array should be initialized to the same value shift_reg[i] = 0 while(1) Fully unrolling the shifting loop produces constant accesses pragma unroll for (int j=0 j lt SIZEndash1 j++) shift_reg[j] = shift_reg[j + 1] shift_reg[SIZE ndash 1] = read_channel_intel(in)

Using fixed access points of the shift register int res = (shift_reg[0] + shift_reg[1]) 2

lsquooutrsquo channel will have running average of the input channel write_channel_intel(out res)

各クロックサイクルでカーネルは新しい値を配列にシフトしますこのシフトレジスターをブロックRAM に配置することにより インテル FPGA SDK for OpenCL オフラインコンパイラーは配列への複数のアクセスポイントを効率的に処理できますシフトレジスターのデザインパターンはフィルター (例えばSobel フィルターなどのイメージフィルターや有限インパルス応答 (FIR) フィルターなどの時間遅延フィルター) を実装する際に理想的な方法です

カーネルコードにシフトレジスターを実装する際は次の点に注意してください

1 シフトループを展開し配列のすべての要素にアクセスできるようにします

2 すべてのアクセスポイントは一定のデータアクセスを持つ必要があります例えば複数のアクセスポイントを使用しネスト化されたループに計算を書き込む場合はこれらのループを展開し一定のアクセスポイントを確立します

3 配列の要素すべてを同じ値に初期化します特定の初期値が不要な場合は要素を初期化せずに維持することも可能です

4 大規模な配列へのアクセスが静的に推論できない場合オフラインコンパイラーは非効率なハードウェアを作成することになりますそれらのアクセスが必要な場合は__privateメモリーの代わりに__localメモリーを使用してください

5 大規模なシフトレジスターを条件付きでシフトしないでください非効率なハードウェアの作成を防ぐためシフトはシフトコードを含むループの反復で必ず行わなければなりません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

77

511 倍精度浮動小数点演算の有効化

インテル FPGA SDK for OpenCL ではすべての倍精度浮動小数点関数に対し暫定的なサポートを提供します

OpenCL カーネルで倍精度浮動小数点のデータ型を宣言する前に次の OPENCL EXTENSIONプラグマをカーネルコードに含めます

pragma OPENCL EXTENSION cl_khr_fp64 enable

512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター

ループ内で累算を実行する単一ワークアイテムカーネルは インテル FPGA SDK for OpenCL オフラインコンパイラーの単一サイクル浮動小数点アキュムレーターの機能を活用することができますオフラインコンパイラーはそれらのカーネルのインスタンスを探索しループで実行される累積をアキュムレーター構造へマッピングしようと試みます

オフラインコンパイラーは値を加算または減算するアキュムレーターをサポートしますこの機能を活用するにはオフラインコンパイラーがアキュムレーターを推論できるように累算を記述します

注意 bull アキュムレーターはArria 10 デバイスでのみ利用可能です

bull アキュムレーターはループの一部である必要があります

bull アキュムレーターは初期値の 0 を持つ必要があります

bull アキュムレーターを条件付きにすることはできません

次はオフラインコンパイラーによる正しいアキュムレーターの推論をもたらす記述例です

channel float4 RANDOM_STREAM

__kernel void acc_test(__global float a int k) Simplest example of an accumulator In this loop the accumulator acc is incremented by 5 int i float acc = 00f for (i = 0 i lt k i++) acc+=5 a[0] = acc

__kernel void acc_test2(__global float a int k) Extended example showing that an accumulator can be conditionally incremented The key here is to describe the increment as conditional not the accumulation itself int i float acc = 00f for (i = 0 i lt k i++) acc += ((i lt 30) 5 0) a[0] = acc

__kernel void acc_test3(__global float a int k) A more complex case where the accumulator is fed by a dot product int i float acc = 00f for (i = 0 i lt k i++ ) float4 v = read_channel_intel(RANDOM_STREAM) float x1 = vx float x2 = vy

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

78

float y1 = vz float y2 = vw acc += (x1y1+x2y2) a[0] = acc

__kernel void loader(__global float a int k) int i float4 my_val = 0 for(i = 0 i lt k i++) if ((i4) == 0) write_channel_intel(RANDOM_STREAM my_val) if ((i4) == 0) my_valx = a[i] if ((i4) == 1) my_valy = a[i] if ((i4) == 2) my_valz = a[i] if ((i4) == 3) my_valw = a[i]

5121 アキュムレーターを推論するためのプログラミング手法

単一サイクル浮動小数点アキュムレーター機能の活用はカーネルコードのアキュムレーターの記述を変更し効率を改善したりプログラミングの制約を回避したりすることで行うことができます

複数のループを使用するアキュムレーターの記述

複数のループを使用し一部のループを展開した状態でアキュムレーターを記述する場合を以下に示します

float acc = 00ffor (i = 0 i lt k i++) pragma unroll for(j=0j lt 16 j++) acc += (x[i+j]y[i+j])

この場合-fp-relaxedの インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションでカーネルをコンパイルし累積が公開されるようにオフラインコンパイラーが操作を再配置できるようにすることが重要です-fp-relaxedでカーネルをコンパイルしない場合アキュムレーターの構成は高いイニシエーションインターバル (II) をともなうことになりますイニシエーションインターバルは連続するループ反復の開始から開始までのサイクル数ですイニシエーションインターバルの値が大きいほどアキュムレーター構造体が次のループ反復を処理するまでの時間が長くなります

複数ループのアキュムレーターの記述変更

-fp-relaxedオフラインコンパイラーのコマンドオプションでアキュムレーターの記述をコンパイルできない場合はコードを書き換え累積を公開します

上記コード例の場合は次のように書き換えます

float acc = 00ffor (i = 0 i lt k i++) float my_dot = 00f pragma unroll for(j=0j lt 16 j++) my_dot += (x[i+j]y[i+j]) acc += my_dot

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

79

変数またはゼロ以外の初期値を含むアキュムレーターの記述変更

ゼロ以外の値で始まるアキュムレーターの記述にオフセットを適用する場合を下に示します

float acc = array[0]for (i = 0 i lt k i++) acc += x[i]

アキュムレーターハードウェアは記述に変数またはゼロ以外の初期値をサポートしないため記述を書き換える必要があります

float acc = 00ffor (i = 0 i lt k i++) acc += x[i]acc += array[0]

上記のように記述を書き換えるとカーネルはループでアキュムレーターを使用できるようになりますその後のループ構造にはarray[0]のインクリメントが続きます

513 整数のプロモーション規則

intX_tのデータ型を使用する際に適用される整数のプロモーション規則はCC++の標準規則とは異なります以下の異なる規則を考慮しカーネルをデザインしてください

bull 両方のオペランドが標準の整数型 (charや shortなど) の場合整数は CC++標準に従ってプロモートされますつまり演算は32 ビット以上の 大オペランドのデータ型とサイズで実行されますこの式はより大きい方のデータ型で結果を返します

bull オペランドがどちらも intX_tデータ型の場合データ型が 32 ビットより小さい場合でも 大の intX_tデータ型で演算は実行されますこの式はそのデータ型で結果を返します

bull 式に標準データ型 1 つと intX_tデータ型 1 つが含まれる場合intX_tデータ型のプロモーション規則が適用されますこの式の型は常に intX_tデータ型になります例えば 大のデータ型が標準整数型の shortの場合結果で返されるデータ型は int16_tです

bull リテラルは CC++のデフォルトにおいて intデータ型のためキャストなしでリテラルを使用すると式の型は常に少なくとも 32 ビットになります例えば次のようなコードの場合比較は 32 ビットで行われます

int5_t apif (ap lt 4)

bull オペランドの符号が異なり符号なしの型が少なくとももう一方の型と同じサイズである場合演算は符号なしで実行されますそれ以外の場合は符号なしオペランドは符号付きの値に変換されます

例えば次のようなコードの場合-1 は 32 ビットの負の値 (0xffffffff) に拡張されuint3_tは 32 ビットの正の値 7 (0x00000007) となり等しくなりません

uint3_t x = 7if (x = -1) FAIL

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

80

6 ホストアプリケーションの設計

インテルではホストに対する要件についてのガイドラインおよびホストアプリケーション構築における手順を提供しています該当する場合はOpenCL カーネルのホストアプリケーションを作成または変更する際にこれらのデザイン戦略を実行してください

ホストのプログラミング要件 (81 ページ)

グローバルメモリーの手動分割における OpenCL バッファーの割り当て (82 ページ)

カーネル実行中におけるプロファイルデータの収集 (86 ページ)

カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

ホストアプリケーションの管理 (92 ページ)

SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て (102 ページ)

徐々に速度低下する OpenCL システムのデバッグ (104 ページ)

61 ホストのプログラミング要件

インテル FPGA SDK for OpenCL で使用するために OpenCL ホストアプリケーションをデザインする際はアプリケーションが次のホストプログラミング要件を満たしていることを確認ください

611 ホストマシンのメモリー要件

ホストアプリケーションを実行するマシンは複数のコンポーネントを同時にサポートするための十分なホストメモリーが必要です

ホストマシンは次のコンポーネントをサポートする必要があります

bull ホストアプリケーションおよびオペレーティングシステム

bull ホストアプリケーションのワーキングセット

bull 一度に割り当てることのできる OpenCL メモリーバッファーの 大量デバイス側の cl_memバッファーはすべてホストプロセスの対応するストレージエリアに関連付けられますしたがってホストメモリーに必要な容量はFPGA がサポートしている外部メモリーの量と同等になる可能性があります

612 ホストバイナリーの要件

ホストアプリケーションをコンパイルする際はx86-64 (64 ビット) または ARMreg 32-bit ARMV7-A for SoC のいずれかのアーキテクチャーをターゲットにしてください インテル FPGA SDK forOpenCL のホストランタイムはx86-32 (32 ビット) バイナリーをサポートしません

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

613 複数のホストスレッド

インテル FPGA SDK for OpenCL のホストライブラリーはスレッドセーフです

clSetKernelArg関数を除く OpenCL API はすべてスレッドセーフです

clSetKernelArgの同時呼び出しが異なる cl_kernelオブジェクトで実行される限り任意のホストスレッドから clSetKernelArgを呼び出しても再入可能な方法で呼び出しても安全です

関連情報マルチスレッドホストアプリケーション

614 順不同のコマンドキュー

OpenCL ホストランタイムのコマンドキューは順不同なコマンドの実行をサポートしません

615 カーネルを同時に実行するための複数のコマンドキューにおける要件

同じ OpenCL プログラムオブジェクトにあるカーネルを同時実行するには同時に実行する各カーネルに個別のコマンドをインスタンス化します

62 グローバルメモリーの手動分割における OpenCL バッファーの割り当て

グローバルメモリーバッファーを手動で分割するとバッファー間のメモリーアクセスを制御しメモリー帯域幅を 大化することができますバッファーの分割は同じメモリータイプのインターフェイス間または異なるメモリータイプのインターフェイス間で行うことが可能です

621 同じメモリータイプの複数のインターフェイスでのバッファーの分割

同じメモリータイプの複数のインターフェイスにおいてメモリーを分割する際はOpenCL カーネルコンパイル中のバーストインターリーブを 初に無効にする必要があります次にOpenCL バッファーを割り当てるメモリーバンクをホストアプリケーションに指定する必要があります

デフォルトで インテル FPGA SDK for OpenCL オフラインコンパイラーは各グローバルメモリータイプをバーストインターリーブ方式でコンフィグレーションしますバーストインターリーブ方式のコンフィグレーションは通常メモリーバンク間に 良のロードバランスをもたらしますただしインターリーブ領域以外へのメモリー分割がより効率的な場合もあります

次の図はバーストインターリーブでのメモリー分割とインターリーブ以外のメモリー分割における違いを表しています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

82

0x7FFF_FFFFAddress

0x7FFF_FC000x7FFF_FBFF

0x7FFF_F800

0x0000_0FFF

0x0000_0C000x0000_0BFF

0x0000_08000x0000_07FF

0x0000_04000x0000_03FF

0x0000_0000

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Address0x7FFF_FFFF

0x4000_00000x3FFF_FFFF

0x0000_0000

Burst-Interleaved Separate Partitions

使用可能なグローバルメモリータイプの一部またはすべてを手動で分割するには次の作業を実行します

1 OpenCL カーネルを -no-interleaving=ltglobal_memory_typegt フラグでコンパイルし指定されたメモリータイプのメモリーバンクを個別のアドレスでコンフィグレーションします

-no-interleaving=ltglobal_memory_typegt フラグの使用方法に関してはグローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) の章を参照ください

2 ホストアプリケーションに OpenCL バッファーを作成しCL_CHANNELフラグでバッファーをいずれかのバンクへ割り当てます

mdash CL_CHANNEL_1_INTELFPGAを指定しバッファーを使用可能な 下位メモリー領域に割り当てます

mdash CL_CHANNEL_2_INTELFPGAを指定しメモリーを 2 番目のバンクに割り当てます (利用可能な場合)

注意

それぞれのバッファーは単一メモリーバンクにのみ割り当ててくださいランタイムに 2 番目のバンクが利用できない場合メモリーは 1 番目のバンクに割り当てられますグローバルメモリーが利用できない場合はclCreateBuffer呼び出しは失敗しエラーメッセージCL_MEM_OBJECT_ALLOCATION_FAILUREが表示されます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

83

関連情報グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) (115 ページ)

622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割

FPGA ボードのボードサポートパッケージでは異なるメモリーテクノロジー (DRAM や SRAM など) で構成されるグローバルメモリースペースを組み立てることが可能ですボードサポートパッケージは複数のインターフェイスで構成されるそのようなメモリーの 1 つをデフォルトのメモリーとして指定しますバッファーはすべてそこにあります

異種メモリーを使用するにはclファイルのコードを次のように変更します

1 次のいずれかの方法でFPGA ボードで使用可能なグローバルメモリータイプの名前を確認してください

mdash ボードメーカーの資料を参照する

mdash ボードのカスタムプラットフォームの board_specxmlファイルで名前を検索する各グローバルメモリータイプの名前はglobal_mem要素の name属性に割り当てられた一意の文字列です

2 特定のグローバルメモリータイプにバッファーを割り当てるようにホストに指示するにはbuffer_location(ltmemory_typegt) 属性を挿入しますここで ltmemory_typegtはボードメーカーより提供されているグローバルメモリータイプの名前です

__kernel void foo(__global __attribute__((buffer_location(DDR))) int x __global __attribute__((buffer_location(QDR))) int y)

buffer_location属性を指定しない場合ホストはバッファーをデフォルトのメモリータイプに自動的に割り当てますデフォルトのメモリータイプを確認するにはボードメーカーから提供されている資料を参照してくださいまたはカスタムプラットフォームの board_specxmlファイルで 初に定義されているメモリータイプもしくは属性 default=1が割り当てられたメモリータイプを検索します

インテルでは次のように buffer_location属性をプリプロセッサーマクロに定義し再利用を容易にすることを推奨しています

define QDR__global __attribute__((buffer_location(QDR))) define DDR__global __attribute__((buffer_location(DDR)))__kernel void foo (QDR uint data DDR uint lup) statements

注意

カーネル引数をデフォルト以外のメモリーに割り当てる場合 (上記コードであれば QDRuint dataおよび DDR uint lup)その引数を constantキーワードで宣言することはできませんさらにその引数から派生するポインターでアトミック操作を実行することはできません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

84

clCreateProgramWithBinary関数を使用し OpenCL ランタイムにカーネルをロードするとデフォルトでホストはバッファーをメインメモリーに割り当てますカーネルの呼び出し中にホストはカーネル引数にバインドされている異種メモリーバッファーをメインメモリーに自動的に再配置します

3 異種メモリーバッファーが 初にメインメモリーに割り当てられるのを防ぐにはclCreateBuffer関数を呼び出す際にCL_MEM_HETEROGENEOUS_INTELFPGAフラグを含めますまた clSetKernelArgを使用し cl_memバッファーを buffer_location属性を使用した引数にまずバインドした後にそのバッファーに対する読み取りまたは書き込みを実行してください次に例を示します

mem = clCreateBuffer(context flags|CL_MEM_HETEROGENEOUS_INTELFPGA memSize NULL amperrNum)

clSetKernelArg(kernel 0 sizeof(cl_mem) ampmem)clEnqueueWriteBuffer(queue mem CL_FALSE 0 N 0 NULL ampwrite_event)clEnqueueNDRangeKernel(queue kernel 1 NULL global_work_size NULL 0 NULL ampkernel_event)

例えば次の clCreateBuffer呼び出しはデフォルト以外のメモリーバンクの使用可能な下位メモリー領域にメモリーを割り当てます

mem = clCreateBuffer(context (CL_MEM_HETEROGENEOUS_INTELFPGA|CL_CHANNEL_1_INTELFPGA) memSize NULL amperrNum)

clCreateBuffer呼び出しはカーネル引数で指定した内容に基づきメモリーを特定のグローバルメモリータイプに割り当てますメモリータイプにあるメモリーオブジェクト (cl_mem)が異なるメモリーテクノロジーに対応するカーネル引数として設定されている場合ホストはカーネルをキューする際にそのメモリーオブジェクトを自動的に移動しますバッファーは複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

異種グローバルメモリーアクセスの 適化に関する詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの異種メモリーバッファーとグローバルメモリーの手動分割の章を参照ください

関連情報bull グローバルメモリーの手動分割

bull 異種メモリーバッファー

623 ホストアプリケーションでのパイプオブジェクトの作成

カーネルに OpenCL パイプを実装するには インテル FPGA SDK for OpenCL 固有のパイプオブジェクトをホストアプリケーションに作成する必要があります

SDK 固有のパイプオブジェクトはOpenCL Specification version 20 で説明されているように真の OpenCL パイプオブジェクトではありませんこの実装は準拠したソリューションによるインテルFPGA 製品からの移行を可能にしますSDK 固有のパイプオブジェクトはメモリーオブジェクト(cl_mem) ですがホストはパイプ自体にメモリーを割り当てません

次の clCreatePipeホスト API はパイプオブジェクトを作成します

cl_mem clCreatePipe(cl_context context cl_mem_flags flags cl_uint pipe_packet_size cl_uint pipe_max_packets const cl_pipe_properties properties cl_int errcode_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

85

clCreatePipeホスト API 関数についての詳細はOpenCL Specification version 20 のSection 541 を参照ください

以下はclCreatePipeホスト API 関数の構文例です

cl_int statuscl_mem c0_pipe = clCreatePipe(context 0 sizeof(int) 1 NULL ampstatus)status = clSetKernelArg(kernel 1 sizeof(cl_mem) ampc0_pipe)

注意 SDK はランタイムの動的なチャネル割り当てをサポートしません SDK は一致する名前に基づきコンパイル中にパイプを静的にリンクします

関連情報OpenCL Specification version 20 (API)

63 カーネル実行中におけるプロファイルデータの収集

カーネルの実行がホストアプリケーションの完了後に終了する場合カーネルの実行中にプロファイルデータを収集するようFPGA に対し明示的に要求することができますほとんどのアプリケーションではカーネルの実行完了時にプロファイルデータを自動的にリードバックするデフォルトの動作で十分です

コンパイル中に OpenCL カーネルをプロファイリングするとprofilemonファイルが自動的に生成されますその後プロファイルデータはFPGA でカーネルの実行が完了した後に profilemonに書き込まれますただしカーネルの実行がホストアプリケーション終了後に完了した場合そのカーネル呼び出しのプロファイル情報はprofilemonファイルに存在しなくなりますこの場合プロファイル情報をカーネルの実行中に取得するようホストコードを修正することができます

重要 カーネルの実行中にプロファイルデータを収集するとカーネルのレイテンシーが増加しカーネルの実行にかなりのオーバーヘッドが追加される可能性があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

86

bull カーネルの実行中にプロファイルデータを収集するよう FPGA に要求するには次のホストライブラリー呼び出しを呼び出します

extern CL_API_ENTRY cl_int CL_API_CALL

clGetProfileInfoIntelFPGA(cl_event)

上記 cl_eventはカーネルのイベントですこのホストライブラリー呼び出しに渡すカーネルイベントはclEnqueueNDRangeKernel呼び出しに渡すものと同じである必要があります

重要

mdash clGetProfileInfoIntelFPGAの呼び出し前にカーネルの実行が完了した場合この関数はイベントエラーメッセージを返します

mdash clGetProfileInfoIntelFPGAおよびclGetProfileDataDeviceIntelFPGA関数呼び出しを使用しているホストプログラムにはCLcl_ext_intelfpgahヘッダーファイルを含む必要があります

注意

カーネルの実行中に clGetProfileInfoIntelFPGA関数を呼び出すとプロファイルカウンターが一時的に無効になり インテル FPGA Dynamic Profiler for OpenCL がFPGA からデータを収集できるようになりますそのためいくつかのプロファイル情報がこの中断中に失われますこの関数を非常に短い間隔で呼び出すとプロファイルデータがカーネルの実際のパフォーマンス動作を正確に反映しない可能性があります

次のホストコードを例に説明します

int main() clEnqueueNDRangeKernel(queue kernel NULL) clEnqueueNDRangeKernel(queue kernel NULL)

このホストアプリケーションはカーネルが 2 回起動した後に完了するという前提で動作しますカーネルの呼び出しごとに 1 組のプロファイルデータが生成されるためprofilemonファイルには合計 2 組のプロファイルデータが生成されますカーネルの実行中にプロファイルデータを収集するにはホストコードを次のように変更します

int main() clEnqueueNDRangeKernel(queue kernel ampevent)

Get the profile data before the kernel completes clGetProfileInfoIntelFPGA(event)

Wait until the kernel completes clFinish(queue)

clEnqueueNDRangeKernel(queue kernel NULL)

clGetProfileInfoIntelFPGAへの呼び出しによりprofilemonファイルに新しいエントリーが追加されます インテル FPGA Dynamic Profiler for OpenCL GUI はその後レポートにこのエントリーを解析します

インテル FPGA Dynamic Profiler for OpenCL についての詳細は次の章を参照ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

87

bull インテル FPGA SDK for OpenCL ベストプラクティスガイドのパフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング

関連情報bull パフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング (140 ページ)

631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング

完了時にプロファイラーデータを自動的に生成するエンキューされたカーネルとは異なり (コンパイラーフラグが設定されている場合)自動実行カーネルは終了しませんしたがってclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しでカーネルをプロファイルするタイミングを明示的に指定する必要がありますプロファイラーデータはすべてprofilemonファイルへ出力されますホストライブラリー呼び出しで収集されるデータは自動実行のプロファイルデータのスナップショットになります

次はclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しのコード例です

cl_int clGetProfileDataDeviceIntelFPGA (cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret)

以下が詳細です

bull read_enqueue_kernelsパラメーターはエンキューされたカーネルをプロファイリングしますこのリリースにおいてこのパラメーターは無効です

bull read_auto_enqueuedパラメーターは自動実行カーネルをプロファイリングします

bull 以下は今後のリリースにおけるプレースホルダーパラメーターです

mdash clear_counters_after_readback

mdash param_value_size

mdash param_value

mdash param_value_size_ret

mdash errcode_ret

注意 このホストライブラリー呼び出しは自動実行カーネルのみをポートしていますread_enqueue_kernelsパラメーターに TRUEを入力できますがブール値は無視されますこれはエンキューされたカーネルがプロファイリングされないという意味ではありませんコンパイラーの profileフラグがエンキューされたカーネルを含むように設定されている場合通常通り実行の終わりにプロファイルデータはキャプチャーされます唯一の違いはclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しはエンキューされたカーネルに対し自動的に行われるプロファイリングとは別にエンキューされたカーネルをプロファイリングしないことです

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

88

clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは成功時にCL_SUCCESSを返しますそれ以外の場合は次のエラーのいずれかを返します

bull デバイスが有効なデバイスではない場合は CL_INVALID_DEVICE

bull プログラムが有効なプログラムではない場合は CL_INVALID_PROGRAM

注意 clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは与えられたデバイスで与えられたプログラムのプログラミング操作をトリガーしませんホストライブラリー呼び出し時にプログラムがまだデバイスにプログラミングされていない場合ホストライブラリー呼び出しはCL_INVALID_PROGRAMエラーを返します

表 3 clGetProfileDataDeviceIntelFPGA ホストライブラリー呼び出しパラメーターの組み合わせ

read_auto_enqueued

エンキューされたカーネルのみをプロファイリング注意 実行が完了すると自動的にプロファイル情報を出力します

False

自動実行カーネルのみをプロファイリング True

エンキューされたカーネルと自動実行カーネルの両方をプロファイリング

True

632 プロファイルデータの取得

実行中のカーネルからのプロファイルデータの取得はリードバック動作中に一時停止します

注意 データ取得が一時停止してもカーネル自体はまだ実行していますしたがってリードバック動作中にカーネルデータは記録されません

データ取得の一時停止はすべてのカーネル間において完全には同期されませんカーネル間におけるプロファイルデータの取得停止のスキューはデバイスとの通信リンクドライバーのオーバーヘッドおよび通信バス上の輻輳によって異なりますカーネル間におけるプロファイルデータの正確な同期スナップショットに依存するべきではありません

633 複数の自動実行プロファイリング呼び出し

自動実行カーネルは継続的に実行されるためホストアプリケーションは複数のclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを実行中の特定の時点または特定の時間範囲に含め自動実行カーネルをプロファイリングすることができますホストアプリケーションが clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを呼び出すたびにプロファイルカウンターが読み取られゼロにリセットされますclGetProfileDataDeviceIntelFPGAを複数回呼び出すことでホストアプリケーションは時間範囲にわたり自動実行カーネルをプロファイリングできます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

89

図 -13 複数の自動実行プロファイリングのキャプチャーフロー

main() clEnqueueNDRangeKernel() system startsclGetProfileDataDeviceIntelFPGA () Time AclGetProfileDataDeviceIntelFPGA () Time BclFinish()

AR0

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 0

Counter 1

AR2 AR8

AR9

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 18

Counter 19

Collect_Autorun_Profiling

CRA

profile_ctrl profile_data

Host

daisy_out

profile_shift

カウンター実行中

カウンターは無効

(~1000us)

カウンター読み取り(Time A) (Time B)

カウンターリセット

カーネルは実行中

カウンター実行中

カウンターは無効

(~1000us)

カウンター実行中

カーネルは実行中

カウンター読み取り カウンター

リセット

64 カスタムプラットフォーム固有の関数へのアクセス

カスタムプラットフォームで利用可能なユーザーがアクセスできる関数をオプションでアプリケーションに含めることができますただしホストアプリケーションを FPGA クライアントドライバー (FCD)にリンクするとそれらのカスタムプラットフォーム固有の関数を直接参照することはできません FCDとリンク中にカスタムプラットフォーム固有のユーザーがアクセス可能な関数を参照するにはホストアプリケーションに clGetBoardExtensionFunctionAddressIntelFPGA拡張を含めます

clGetBoardExtensionFunctionAddressIntelFPGA拡張はカスタムプラットフォームからユーザーがアクセス可能な関数へのポインターを取得する API を指定します

注意 Linux システムの場合clGetBoardExtensionFunctionAddressIntelFPGA関数はFCD の有無にかかわらず機能しますWindows システムの場合この関数は FCD と併用する場合にのみ機能しますカスタムプラットフォームにおいて FCD がサポートされているかはボードメーカーへお問い合わせください

拡張インターフェイスの定義は INTELFPGAOCLSDKROOThostincludeCLcl_exthファイルで確認できます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

90

bull カスタムプラットフォームでユーザーがアクセス可能な関数へのポインターを取得するにはホストアプリケーションで次の関数を呼び出します

void clGetBoardExtensionFunctionAddressIntelFPGA ( const char function_name cl_device_id device )

以下に詳細を説明します

function_name はカスタムプラットフォームのメーカーが提供するユーザーがアクセス可能な関数の名前を指します

また

device はclGetDeviceIDs関数によって返されるデバイス ID です

ユーザーがアクセス可能な関数を識別するとclGetBoardExtensionFunctionAddressIntelFPGA関数はユーザーがアクセス可能な関数へのポインターを返しますカスタムプラットフォームにその関数が存在しない場合clGetBoardExtensionFunctionAddressIntelFPGAは NULLを返します

注意

インストーラブルクライアントドライバー (ICD) を介しclGetBoardExtensionFunctionAddressIntelFPGA API にアクセスする際はICD 拡張 API の clGetExtensionFunctionAddressIntelFPGAが 初にclGetBoardExtensionFunctionAddressIntelFPGA API へのポインターを取得していることを確認してください

次のコード例はICD を介したカスタムプラットフォーム固有の関数へのアクセス方法を示しています

clGetBoardExtensionFunctionAddressIntelFPGA_fn clGetBoardExtensionFunctionAddressIntelFPGA = (clGetBoardExtensionFunctionAddressIntelFPGA_fn) clGetExtensionFunctionAddressForPlatform (platform clGetBoardExtensionFunctionAddressIntelFPGA) if (clGetBoardExtensionFunctionAddressIntelFPGA == NULL) printf (Failed to get clGetBoardExtensionFunctionAddressIntelFPGAn)

void board_extension_function_ptr = clGetBoardExtensionFunctionAddressIntelFPGA(function_namedevice_id)

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

65 構造パラメーター変換に向けたホストプログラムの変更

OpenCL カーネルにおいて構造パラメーターを定数へのポインター構造に変換する場合ホストアプリケーションを適宜変更する必要があります

ホストアプリケーションに次の変更を加えます

1 構造体のコンテンツを格納するための cl_memバッファーを割り当てます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

91

注意 異なる構造体の値を使用するカーネルごとに個別の cl_memバッファーが必要です

2 構造体のカーネル引数を構造体のコンテンツへのポインターではなく構造体のバッファーへのポインターで設定します

3 カーネルをキューする前に構造体のバッファーのコンテンツを設定します次のいずれかの手順を実行しカーネルが起動する前に構造体のバッファーが設定されるようにします

mdash カーネルキューと同じコマンドキューに構造体バッファーをキューします

mdash 個別のカーネルキューと構造体のバッファーキューをイベントと同期させます

4 アプリケーションが構造体バッファーを使用するカーネルを呼び出す必要がなくなった際にはcl_memバッファーを解放します

関連情報bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

bull ホストとカーネルにおける構造体データ型のデータレイアウトの一致 (73 ページ)

66 ホストアプリケーションの管理

インテル FPGA SDK for OpenCL にはホストアプリケーションのコンパイルとリンクに必要なフラグおよびライブラリーに関する情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

注意 ホストアプリケーションを SoC FPGA ボードにクロスコンパイルするにはユーティリティーコマンドに--armオプションを含めます

注意 Linux システムにおいてGNU Project Debugger (GDB) を使用しホストアプリケーションをデバッグする場合はホストアプリケーションを実行する前に次のコマンドを呼び出します

handle SIG44 nostop

このコマンドを呼び出していない場合GDB のデバッグプロセスは次のエラーメッセージとともに終了します

Program received signal SIG44 Real-time event 44

661 Makefile フラグメント例の表示 (example-makefile または makefile)

ホストランタイムライブラリーに対してホストアプリケーションをコンパイルおよびリンクするために インテル FPGA SDK for OpenCL で利用可能な Makefile フラグメント例を表示するにはexample-makefileまたは makefileユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

92

bull コマンドプロンプトで aocl example-makefile または aocl makefile ユーティリティーコマンドを呼び出しますソフトウェアは次のような出力を表示します

The following are example Makefile fragments for compiling and linkinga host program against the host runtime libraries included with the Intel FPGA SDK for OpenCL

Example GNU makefile on Linux with GCC toolchain

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_prog host_progo g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile on Windows with Microsoft Visual C++ command line compiler

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_progexe host_progobj link -nologo OUThost_progexe host_progobj $(AOCL_LINK_CONFIG)

host_progobj host_progcpp cl MD Fohost_progobj -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile cross-compiling to ARM SoC from Linux or Windows withLinaro GCC cross-compiler toolchain

CROSS-COMPILER=arm-linux-gnueabihf- AOCL_COMPILE_CONFIG=$(shell aocl compile-config --arm) AOCL_LINK_CONFIG=$(shell aocl link-config --arm)

host_prog host_progo $(CROSS-COMPILER)g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp $(CROSS-COMPILER)g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

662 ホストアプリケーションのコンパイルとリンク

OpenCL ホストアプリケーションは標準 OpenCL ラインタイム API を使用しデバイスのコンフィグレーションデータのバッファーカーネルの起動および同期を管理しますまたファイル IOアクセラレーターデバイスで実行しないソースコードの一部などの機能も含んでいます インテル FPGA SDKfor OpenCL にはOpenCL API を記述している C ヘッダーファイルホストアプリケーションとリンクする必要があるボード固有の MMD ライブラリーおよびホストランタイムライブラリーの情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

重要 Windows システムの場合MDフラグを追加しホストランタイムライブラリーを Microsoft CRuntime ライブラリーのマルチスレッド DLL (ダイナミックリンクライブラリー) バージョンにリンクする必要がありますまたホストアプリケーションをMDコンパイルフラグでコンパイルするかNODEFAULTLIBリンカーオプションでランタイムライブラリーの選択を上書きする必要があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

93

注意 ホストアプリケーションを実行する際は INTELFPGAOCLSDKROOThostltOS_platformgtbinフォルダーへのパスをライブラリー検索パスに含めます

ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config) (95 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示 (ldflags) (96ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs) (96 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-configまたは linkflags) (96 ページ)

6621 ホストアプリケーションと Khronos ICD Loader Library のリンク

インテル FPGA SDK for OpenCL はKhronos Group の OpenCL ICD 拡張をサポートしていますOpenCL ICD 拡張機能を使用するとシステムに複数の OpenCL 実装を行うことができますOpenCL ICD Loader Library ではインストールされているプラットフォームのリストを選択し選択した OpenCL の実装に特化した OpenCL API 呼び出しを実行できます

SDK のホストランタイムライブラリーに加えインテルはOpenCL Specification version 10 およびOpenCL Specification versions 111220 に実装されている API をサポートする ICDLoader Library のバージョンを提供します他のメーカーが提供する ICD ライブラリーを使用する場合該当メーカーが発行している資料を参照しICD ライブラリーのリンク方法を確認ください

OpenCL ホストアプリケーションを ICD Loader Library にリンクする前にボード MMD ライブラリーをロードするための FCD を設定する必要がありますFCD をまだ設定していない場合FPGA ボードの管理 (20 ページ) にて詳細を確認ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

94

ICD と FCD がどちらも正しくセットアップされていることを確認してくださいこれは aocldiagnose ndashicd-only ユーティリティーを使用し確認することができますこのユーティリティーは対応する ICD または FCD を作成しライブラリーがシステムにレジスターされているかどうかを確認します

bull aocl diagnoseユーティリティーの出力に ICD diagnostics PASSEDが表示されるとホストアプリケーションを作成する際にホストアプリケーションは自動的に ICD LoaderLibrary に接続します

bull aocl diagnoseユーティリティーが ICD を検出しなかった場合次の手順で ICD の設定を確認してください

mdash Windows システムにおいてはregeditを管理者権限で開きWindows レジストリーキーの HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors に移動しますName の値は altera_icddllになりますこの動的ライブラリーファイルは ltINTELFPGAOCLSDKROOTgthostwindows64binにありますType はDWORD でありData は 00000000 になりますレジストリーキーは次の例ようになります

HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]alteracl_icddll=dword00000000

mdash Linux システムにおいてはetcOpenCLvendorsAlteraicdファイルがシステム内に存在しlibalteraclsoのテキストが含まれていることを確認してください

bull aocl diagnoseユーティリティーが FCD を検出しなかった場合次の手順で FCD の設定を確認してください

mdash Windows システムにおいてはHKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards レジストリーキーのライブラリーですべてのユーザーのインストールが選択されていることを確認してくださいもしくは HKEY_CURRENT_USERSOFTWAREIntelOpenCLBoards レジストリーキーを確認してくださいNameの値は ltpath_to_the_mmd_librarygt になりData は 0 に設定された DWORDですレジストリーキーは次の例のようになります

[HKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards]cboard_vendor amy_board_mmddll=dword00000000

mdash Linux システムの場合はoptIntelOpenCLBoardsmy_boardfcdファイルがシステムに存在しメーカー固有のライブラリー名が含まれていることを確認してください(databoard_vendor_alibmy_board_mmdsoなど)

注意

bull ボードメーカーが複数のライブラリーを提供している場合それらが特定の順序になっているかを再度確認してくださいライブラリーをロードする正しい順序に関してはボードメーカーにお問い合わせくださいライブラリーはロードする順序通りにレジストリーに並べる必要があります

bull インテル Arria 10 SoC ボードにおいてカスタムプラットフォームに SD フラッシュカードイメージをビルドする際はlibalteraclsoのテキストを含むAlteraicdファイルを作成くださいAlteraicdファイルをカスタムプラットフォームのetcOpenCLvendorsディレクトリーに保存します詳細はBuilding the Software and SD Card Image for the Intel Arria 10 SoCDevelopment Kit Reference Platform を参照ください

6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)

ホストアプリケーションのコンパイルに必要なフラグのリストを表示するにはcompile-configユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

95

1 コマンドプロンプトで aocl compile-config ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL API ヘッダーファイルが存在するフォルダーまたはディレクトリーへのパスを表示します例えば

bull Windows システムの場合パスは-IINTELFPGAOCLSDKROOThostincludeになります

bull Linux システムの場合パスは-I$INTELFPGAOCLSDKROOThostincludeになります

この INTELFPGAOCLSDKROOT はソフトウェアのインストール位置を指します

2 このパスをC プリプロセッサーに追加します

注意 INTELFPGAOCLSDKROOThostincludeCLフォルダーまたはディレクトリーにあるopenclh OpenCL ヘッダーファイルをホストソースに含めます

6623 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示(ldflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なパスを表示するにはldflagsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldflags ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL プラットフォームとランタイム API を提供する OpenCL ホストランタイムライブラリーとホストアプリケーションをリンクするためのパスを表示しますOpenCL ホストランタイムライブラリーは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあります

6624 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs)

ホストアプリケーションをリンクするために必要な OpenCL ホストランタイムライブラリー名およびMMD ライブラリー名を表示するにはldlibsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldlibs ユーティリティーコマンドを呼び出します

ソフトウェアは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあるホストランタイムライブラリーのリストを表示しますまたカスタムプラットフォームのltboard_family_namegtltOS_platformgtlibディレクトリー にあるカスタムプラットフォーム固有の MMD ライブラリーのリストも表示します

注意

FCD が正しく設定されているとソフトウェアは MMD ライブラリーのリストを表示しません

mdash Windows システムの場合出力は OpenCLlibになります

mdash Linux システムの場合出力は-lOpenCLになります

6625 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示(link-config または linkflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なフラグの一覧を表示するにはlink-configまたは linkflagsユーティリティーコマンドを呼び出します

このユーティリティーコマンドはldflagsと ldlibsユーティリティーコマンドの機能を兼ね備えています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

96

bull コマンドプロンプトで aocl link-config または aocl linkflags コマンドを呼び出します

mdash Windows システムの場合出力はlibpathINTELFPGAOCLSDKROOThostwindows64lib OpenCLlibになります

mdash Linux システムの場合出力は-L$INTELFPGAOCLSDKROOThost[linux64|arm32]lib -lOpenCLになります

663 OpenCL ICD 拡張 API の使用

ICD を使用する際にOpenCL Specification に正式に記載されていない OpenCL ホスト API 関数を呼び出す場合はclGetExtensionFunctionAddress関数を 初に呼び出しそのホストAPI 関数への関数ポインターを取得後その関数ポインターを使用しホスト API 関数を呼び出す必要がありますこれは関数名に IntelFPGAを含む非標準の呼び出しすべてに適用されます

次のコード例を参照ください

extern CL_API_ENTRY cl_int CL_API_CALLclGetProfileDataDeviceIntelFPGA( cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret )

以下の関数呼び出しを

cl_int status = clGetProfileDataDeviceIntelFPGA (device program false true false 0 NULL NULL NULL)

以下の構文を使用するコードと置き換え関数ポインターの定義およびロードを行います

typedef cl_int (clGetProfileDataDevice_fn) (cl_device_id cl_program cl_bool cl_bool cl_bool size_t void size_t cl_int )clGetProfileDataDevice_fn get_profile_data_ptr = (clGetProfileDataDevice_fn) clGetExtensionFunctionAddressForPlatform (clGetProfileDataDeviceIntelFPGA)

その後関数呼び出しとして関数ポインターを使用します

cl_int status = (get_profile_data_ptr) (device program false true false 0 NULL NULL NULL)

664 ホストを経由した FPGA のプログラミング

インテル FPGA SDK for OpenCL オフラインコンパイラーはホストアプリケーションから独立してカーネルをコンパイルするオフラインコンパイラーです カーネルを OpenCL ランタイムにロードするにはclCreateProgramWithBinary関数をホストアプリケーションに含めます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

97

注意 ホストシステムが複数のプロセッサーで構成されている場合FPGA には一度に 1 つのプロセッサーしかアクセスできません例えば2 つのプロセッサーに対応する 2 つのホストアプリケーションが同じFPGA にカーネルを同時に起動しようとしているとします2 番目のホストアプリケーションはデバイスがビジーであることを示すエラーメッセージを受け取ります2 番目のホストアプリケーションは1番目のホストアプリケーションが OpenCL のコンテキストを解放するまで実行できません

1 オフラインコンパイラーで OpenCL カーネルをコンパイルしaocxファイルを作成します

2 ホストアプリケーションに clCreateProgramWithBinary関数を含めaocxファイルから cl_program OpenCL プログラムオブジェクトを作成します

3 ホストアプリケーションに clBuildProgram関数を含め指定したデバイスで実行可能なプログラムファイルを作成します

以下はclCreateProgramWithBinaryを使用し FPGA デバイスをプログラムするホストコード例です

size_t lengths[1]unsigned char binaries[1] =NULLcl_int status[1]cl_int errorcl_program programconst char options[] =

FILE fp = fopen(programaocxrb)fseek(fp0SEEK_END)lengths[0] = ftell(fp)binaries[0] = (unsigned char)malloc(sizeof(unsigned char)lengths[0])rewind(fp)fread(binaries[0]lengths[0]1fp)fclose(fp)

program = clCreateProgramWithBinary(context 1 device_list lengths (const unsigned char )binaries status amperror)clBuildProgram(program1device_listoptionsNULLNULL)

clBuildProgram関数が正常に実行されるとCL_SUCCESSが返されます

4 clCreateKernelsInProgramまたは clCreateKernel関数を使用しプログラム実行可能ファイルからカーネルオブジェクトを作成します

5 カーネルを実行するための関数を含めスケジュールされたカーネルを FPGA で実行するようホストランタイムに指示します

mdash NDRange カーネルを実行するためのコマンドをエンキューするにはclEnqueueNDRangeKernelを使用します

mdash 単一ワークアイテムのカーネルをエンキューするにはclEnqueueTaskを使用します

注意

インテルでは使用されていないイベントオブジェクトを解放することを推奨していますSDK は明示的な指示があるまでイベントオブジェクトを解放せずに保持し続けます使用していないイベントオブジェクトを保持し続けると不必要にメモリーが消費されます

イベントオブジェクトの解放にはclReleaseEvent関数を呼び出します

複数の FPGA のプログラムをメモリーにロードすることができますホストはそれらを使用し必要に応じて FPGA を再プログラムします

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

98

OpenCL ホストランタイムの API 呼び出しに関してはOpenCL Specification version 10 を参照ください

関連情報OpenCL Specification version 10

6641 複数の FPGA デバイスのプログラミング

システムに複数の FPGA デバイスをインストールする場合ホストコードを変更し特定の FPGA デバイスをプログラムするようホストランタイムに指示できます

重要 ホストアプリケーションを FCD にリンクすると異なるカスタムプラットフォームから複数の FPGA デバイスをターゲットにすることができますただし161 よりも前のバージョンの SDK と互換性のあるカスタムプラットフォームにおいてはこの機能に対するサポートが制限されています

次のように 大 128 の FPGA デバイスをシステムに提示できます

bull それぞれが単一の FPGA で構成されている複数の FPGA アクセラレーターボード

bull PCIe スイッチを介しホストシステムに接続する単一アクセラレーターボード上の複数の FPGA

bull 上記の組み合わせ

ホストランタイムはそれぞれの FPGA デバイスすべてにカーネルをロードすることができますまたFPGA デバイスは並列に動作できます

関連情報カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

66411 OpenCL FPGA デバイスの診断

ホストはシステムにインストールされている OpenCL FPGA のデバイス数を特定する必要があります

1 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出します

2 ホストアプリケーションに次のコード行を追加しホストに Open CL FPGA のデバイス数を特定させます

Get the platformciErrNum = clGetPlatformID(ampcpPlatform)

Get the devicesciErrNum = clGetDeviceIDs(cpPlatform CL_DEVICE_TYPE_ALL 0 NULL ampciDeviceCount)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) が含まれます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

99

関連情報FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

66412 デバイス情報の照会

OpenCL FPGA デバイスの情報を照会するようホストに指示することができます

bull システムにインストールされている OpenCL FPGA デバイスのリストを出力するようホストに指示するには次のコード行をホストアプリケーションに追加します

char buf[1024]for (unsigned i = 0 i lt ciDeviceCount i++) clGetDeviceInfo(cdDevices[i] CL_DEVICE_NAME 1023 buf 0) printf(Device d sn i buf)

デバイス情報を照会するとホストは次のように FPGA デバイスの一覧を表示します Device ltNgtltboard_namegt ltname_of_FPGA_boardgt

以下が詳細になります

bull ltNgt はデバイスの番号です

bull ltboard_namegt はaocコマンドを呼び出す際に FPGA デバイスをターゲットにするボードの指定です

bull ltname_of_FPGA_boardgt はFPGA ボードに公示されている名前です

例えばシステムに同一の FPGA ボードが 2 つある場合ホストは次のような出力を生成します

Device 0 board_1 Stratix V FPGA BoardDevice 1 board_1 Stratix V FPGA Board

注意 clGetDeviceInfo関数は aoc -list-boards コマンドの呼び出し時にインテルFPGA SDK for OpenCL オフラインコンパイラーが画面上に表示するボードタイプを返します(board_1など)アクセラレーターボードに FPGA が複数含まれている場合各デバイスは「ボード」として扱われ一意の名前が付けられます

関連情報利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

66413 複数の 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 Stringunsigned char load_file(const char filename size_t size_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

100

FILE fp = fopen(aocx_namerb) fseek(fp0SEEK_END) size_t len = ftell(fp) char result = (unsigned char)malloc(sizeof(unsigned char)len) rewind(fp) fread(resultlen1fp) fclose(fp) size_ret = len return result

Create a Program that is compiled for the devices in the device_listcl_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 devicesn aocx_name num_devices) const unsigned char binaries = (const unsigned char)malloc(num_devicessizeof(unsigned char)) size_t lengths=(size_t)malloc(num_devicessizeof(size_t)) cl_int err for(cl_uint i=0 iltnum_devices i++) binaries[i] = load_file(aocx_nameamplengths[i]) if (binaries[i]) printf(couldnt load sn aocx_name) exit(-1)

cl_program p = clCreateProgramWithBinary(context num_devices device_list lengths binaries NULL amperr) free(lengths) free(binaries) if (err = CL_SUCCESS) printf(Program Create Errorn) return p

main program

main () Normal OpenCL setup program = createMultiDeviceProgram(context device_list num_devices programaocx)clBuildProgram(programnum_devicesdevice_listoptionsNULLNULL)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

101

665 ランタイム環境の終了とエラー回復

ホストアプリケーションが予期せず終了した場合ランタイム環境を再起動しFPGA を再プログラムする必要があります

ランタイム環境はホストアプリケーションの一部としてコンパイルされるライブラリーですホストアプリケーションが終了するとランタイム環境もまた実行する追跡アクティビティーとともに終了しますホストアプリケーションを再起動すると新しいランタイム環境および関連する追跡アクティビティーが再度初期化されます初期化関数はカーネルのハードウェア状態をリセットします

同様にホストアプリケーションが予期せず終了した場合特定のハードウェア (PCIe ハード IP など)のコンフィグレーションが不完全に終わりますこれらのハードウェアのコンフィグレーションを復元するためにホストは FPGA を再プログラムする必要があります

カスタマイズされたハードウェアブロックを実装するカスタムプラットフォームを使用している場合ホストアプリケーションを再起動しそれらのブロックをリセットすることでデザインに影響を与える可能性があることに注意してください

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すと利用可能なすべてのデバイスに対してカーネルとチャネルはすべてリセットされます

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すとデバイスのリセット時にFIFO バッファーとチャネルがリセットされます

bull ホストアプリケーションはclCreateBufferおよび clEnqueueWriteBuffer関数呼び出しを介しメモリーバッファーを初期化します新しいホスト実行において前回のホスト実行時のバッファーの内容へはアクセスすることができません

67 SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て

インテルでは インテル SoC で動作する OpenCL カーネルはFPGA DDR メモリーではなく共有メモリーにアクセスすることを推奨していますFPGA DDR メモリーには非常に高い帯域幅でカーネルがアクセス可能ですただしARM CPU から FPGA DDR メモリーへの読み出しおよび書き込み動作はダイレクトメモリーアクセス (DMA) を使用していないため非常に低速ですFPGA DDR メモリーはテスト目的でカーネル間または単一のカーネル内で一時データを渡すためだけに予約ください

注意 bull カーネル間の共有バッファーは揮発性としてマークしあるカーネルによるバッファーの変更が他のカーネルも認識できるようにしてください

bull 共有メモリーにアクセスするにはホストコードの変更のみが必要ですカーネルコードの変更は必要ありません

bull ライブラリー関数 mallocまたは new演算子で物理的に共有されたメモリーを割り当てることはできませんまたCL_MEM_USE_HOST_PTRフラグは共有メモリーでは機能しません

DDR メモリーでは共有メモリーは物理的に連続している必要がありますFPGA はSG-DMA コントローラーコアなしでは実質的に連続したメモリーを消費することができませんmalloc関数および new演算子は実質的に連続したメモリーへアクセスするためのものです

bull 共有メモリーの CPU キャッシュは無効になっています

bull 共有メモリーを使用する際はデータのコピー 1 つがホストとカーネルの両方で使用されますこのメモリーを使用するとOpenCL メモリーの呼び出しはバッファー読み取りバッファー書き込みマッピングおよびアンマッピングに対しゼロコピー転送で実行されます

ARM CPU と FPGA は共有メモリーに同時にアクセスできますclEnqueueReadBufferおよびclEnqueueWriteBuffer呼び出しをホストコードに含めFPGA または CPU にデータを認識させる必要はありません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

102

bull 共有メモリーの割り当てとアクセスには次の例のようなホストコードを構築します

cl_mem src = clCreateBuffer(hellip CL_MEM_ALLOC_HOST_PTR size hellip)int src_ptr = (int)clEnqueueMapBuffer (hellip src size hellip)src_ptr = input_value host writes to ptr directlyclSetKernelArg (hellip src)clEnqueueNDRangeKernel(hellip)clFinish()printf (ldquoResult = dnrdquo dst_ptr) result is available immediatelyclEnqueueUnmapMemObject(hellip src src_ptr hellip)clReleaseMemObject(src) actually frees physical memory

CONFIG_CMA_SIZE_MBYTESカーネルコンフィグレーションオプションを含め割り当てに有効な共有メモリーの 大総量を制御することができます実際には割り当てられた共有メモリーの総量はCONFIG_CMA_SIZE_MBYTESの値よりも小さくなります

重要

1 ターゲットボードに複数の DDR メモリーバンクがある場合clCreateBuffer( CL_MEM_READ_WRITE )関数はメモリーを非共有 DDR メモリーバンクに割り当てますただしFPGA が共有メモリーである単一DDR バンクへアクセスできる場合clCreateBuffer(CL_MEM_READ_WRITE ) はCL_MEM_ALLOC_HOST_PTRフラグを使用するのと同様にメモリーを共有メモリーに割り当てます

2 clCreateBuffer( CL_MEM_ALLOC_HOST_PTR size )関数で要求する共有メモリーはLinux OpenCL カーネルドライバーに割り当てられLinuxカーネルの連続したメモリー割り当て (CMA) 機能に依存しますCMA を有効にしコンフィグレーションする方法に関してはIntel FPGA SDK for OpenCL Intel Arria 10SoC Development Kit Reference Platform Porting Guideの Recompiling theLinux Kernel for the Intel Arria 10 SoC Development Kit および Compilingand Installing the OpenCL Linux Kernel Driverの章を参照ください

bull 共有ハードプロセッサーシステム (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 に共有メモリーとして割り当てます

bull ホストがコンスタントメモリーを共有 HPS DDR システムに割り当てカーネル実行後にそれを変更すると変更が有効にならない可能性がありますその結果続くカーネル実行に古いデータが使用される可能性がありますカーネルの実行に古いコンスタントメモリーが使用されないようにするため次のいずれかを実行してください

a コンスタントメモリーの初期化後はそれを変更しない

b 複数の__constantデータセットが必要な場合複数のコンスタントメモリーバッファーを作成する

c 可能であればアクセラレーターボードの FPGA DDR にコンスタントメモリーを割り当てる

関連情報bull Recompiling the Linux Kernel for the Intel Arria 10 SoC Development Kit

bull Compiling and Installing the OpenCL Linux Kernel Driver

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

103

68 徐々に速度低下する OpenCL システムのデバッグ

ホストアプリケーションのループがイベントを解放しないまま作成を続けるとOpenCL システムが実行中に徐々に遅くなることがありますこの速度低下を緩和するにはホストアプリケーションがスケジューリングや時間のプロファイリングに不要になった cl_eventオブジェクトを解放する必要があります

OpenCL システムに多数の不要なイベントが存在するために速度低下が発生しているかどうかを確認するにはコンテキストのコールバック警告またはエラーを出力するコンテキストコールバック関数を次のコード例に示すように定義します

void oclContextCallback (const char errinfo const void size_t void ) printf (Context callback sn errinfo)int main() hellip Create the context context = clCreateContext (NULL num_devices device ampoclContextCallback NULL ampstatus) hellip

システムで発生しているイベント数がイベントオブジェクトのしきい値制限である 1000 を超えるとコールバック関数は次の警告メッセージを出力します

[Runtime Warning] Too many event objects in the host This causes deterioration in runtime performance

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

104

7 OpenCL カーネルのコンパイル

インテル FPGA SDK for OpenCL はカーネルのコンパイルプロセスのカスタマイズを可能にするコンパイラーのオプション一覧を提供します インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドはaocコマンドコンパイラーのオプションと設定カーネルファイル名から構成されますaocコマンドを呼び出し特定の FPGA ボードをターゲットにしたりレポートを生成したり 適化に向けた手法を実装したりするようコンパイラーに指示することができます

OpenCL カーネルをコンパイルする前に QUARTUS_ROOTDIR_OVERRIDE 環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアを指定していることを確認してください

この環境変数の設定が正しくない場合 インテル FPGA SDK for OpenCL スタートガイド の インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章に記載されている手順に基づき設定を変更してください

CompilingEncryptedSource

aocコマンドでは提供されている暗号化されたclファイルをコンパイルする際にその暗号化されたファイルのみをコンパイルすることが可能です暗号化された複数のclファイルを aocコマンドで同時にコンパイルすることはできませんご自身で暗号化したカーネルソースファイルをコンパイルすることはできません

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル

OpenCL カーネルのコンパイルおよびハードウェアのコンフィグレーションファイル (aocxファイル) の作成は1 ステップで行うことができます

インテルでは次のような状況においてこの 1 ステップコンパイル手法を使用することを推奨しています

bull インテル FPGA SDK for OpenCL デザインフローでカーネルを 適化しFPGA に展開するaocxファイルの作成準備が整っている場合

bull 適化を必要としない単純なカーネルが 1 つ以上ある場合

カーネルのコンパイルおよびaocxファイルの生成を 1 ステップで行うには aocltyour_kernel_filename1gtcl [ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

インテル FPGA SDK for OpenCL オフラインコンパイラーはclファイルを一時ファイルにグループ化しますその後このファイルを使用しaocxファイルを生成します

注意 aocコマンドを実行しaocoファイル ( aoc ltyour_kernel_filenamegtaoco) をコンパイルする場合オフラインコンパイラーはaocrファイルとaocxファイルをどちらも生成します

72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネルのコンパイルおよび OpenCL パーサーの出力の生成を行うには-cオプションを aocコマンドに含めます

注意 -cフラグはインクリメンタルコンパイルフローではサポートされていません

bull コマンドプロンプトで aoc -c ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

aocコマンドを-cフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを生成します

mdash 各clカーネルソースファイルのaocoファイルオフラインコンパイラーはaocoファイルを数秒から数分で作成します

73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネル (cl) をコンパイルし各カーネルに向けたaocoオブジェクトファイルを生成後それらをリンクしaocrファイルを作成するには-rtlオプションをaocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

106

bull 1 つもしくは複数のカーネルソースファイルをコンパイルするにはコマンドプロンプトで aoc-rtl ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtclに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを作成します

mdash 各clカーネルソースファイルのaocoファイルその後オフラインコンパイラーはそれらをリンクしaocrファイルを生成しますaocoファイルまたはaocrファイルの生成は数秒から数分で行われます

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

bull 1 つ以上のaocoオブジェクトファイルをコンパイルするには aoc -rtlltyour_kernel_filenamegtaoco [ltyour_kernel_filename2gtaoco ]コマンドをコマンドプロンプトで呼び出します

この [ ltyour_kernel_filename2gtaoco ] はオブジェクトファイルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtaocoに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーは次のファイルとディレクトリーを作成します

mdash オフラインコンパイラーはすべてのaocoファイルをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)

インテル FPGA SDK for OpenCL オフラインコンパイラーがカーネルのコンパイル中にヘッダーファイルを検索するディレクトリーリストにディレクトリーを追加するには -I=ltdirectorygt オプションを aocコマンドに含めます

ヘッダーファイルがカーネルと同じディレクトリーにある場合は -I=ltdirectorygt オプションをaocコマンドに含める必要はありませんオフラインコンパイラーは現在のフォルダーまたはディレクトリーでヘッダーファイルを自動的に検索します

bull コマンドプロンプトで aoc -I=ltdirectorygt ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

107

注意 Windows システムの場合インクルードパスの末尾にスラッシュが含まれていないことを確認してくださいオフラインコンパイラーは末尾のスラッシュ () またはバックスラッシュ () を不正と認識します

次のような方法で aocコマンドを呼び出すとオフラインコンパイラーはエラーメッセージを生成します

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

インクルードパスの正しい指定方法は以下のようになります

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

75 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)

aocrファイル名またはaocxファイル名を指定するには -o ltfilenamegt オプションをaocコマンドに含めます

bull 複数ステップでのコンパイルフローを実行する場合は出力ファイル名を次のように指定します

a 中間コンパイルの段階でオフラインコンパイラーが作成するaocoファイルの名前を指定するには aoc -rtl -o ltyour_object_filenamegtaocr ltyourkernel_filenamegtclコマンドを呼び出します

b 終コンパイルの段階でオフラインコンパイラーが作成するaocxファイルの名前を指定するには aoc -o ltyour_executable_filenamegtaocxltyour_object_filenamegtaocrコマンドを呼び出します

bull 1 ステップでのコンパイルフローを実行する場合は aoc -oltyour_executable_filenamegtaocx ltyour_kernel_filenamegtclコマンドを呼び出しaocxファイル名を指定します

76 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)

特定の FPGA ボードに対し OpenCL カーネルをコンパイルするには -board=ltboard_namegtオプションを aocコマンドに含めます

警告 -rtlフラグをともなう中間コンパイル中にkernel1clファイルをボード X (-board=X) にkernel2clファイルをボード Y (-board=Y) にコンパイルすると インテル FPGA SDK forOpenCL オフラインコンパイラーは aoc -rtl kernel1aoco kernel2aocoコマンドを実行した際にエラーメッセージを発行し終了します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

108

-board=ltboard_namegt オプションを aocコマンドに含めてカーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはプリプロセッサーマクロAOCL_BOARD_ltboard_namegt を 1 に定義しますこれによりデバイスに 適化されたコードをカーネルにコンパイルすることができます

bull カスタムプラットフォームで利用可能な FPGA ボードの名前を取得するには aoc -list-boards コマンドを呼び出します

オフラインコンパイラーは以下のような出力を生成します

Board ListFPGA_board_1

この FPGA_board_1はltboard_namegt です

特定のカスタムプラットフォームの利用可能な FPGA ボードをすべて一覧表示することも可能です-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc ndashboard-package=ltcustom_platform_pathgt -list-boards=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーは特定のカスタムプラットフォームで利用可能なボードの一覧を表示します

bull OpenCL カーネルを FPGA_board_1 にコンパイルするには aoc-board=FPGA_board_1 ltyour_kernel_filenamegtclコマンドを呼び出しますオフラインコンパイラーはプリプロセッサーマクロ AOCL_BOARD_FPGA_board_1を 1 に定義しFPGA_board_1 をターゲットとするカーネルコードをコンパイルします

bull 複数のカスタムプラットフォーム (ボードパッケージ) がインストールされている場合特定のカスタムプラットフォームのボードバリアントでカーネルをコンパイルできます-board-package=ltcustom_platform_pathgt オプションを -board=ltboard_namegt とともに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -board=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーはltcustom_platform_pathgt で指定されているボードでカーネルをコンパイルします

bull システムで利用可能なカスタムプラットフォームのリストを表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します インテル FPGA SDK for OpenCL オフラインコンパイラーは次の例のような出力を生成します

Installed board packagesltboard_package_1gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_2gt

この ltboard_package_Ngt はシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

109

ヒント 特定の FPGA ボードをターゲットとするコンパイル済みのカーネルファイルを容易に識別するためインテルでは-oオプションを aocコマンドに含めカーネルバイナリーの名前を変更することを推奨しています

bull 1 ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次のコマンドを呼び出します

aoc -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 複数ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次の作業を実行します

1 以下のコマンドを呼び出しaocoファイルを生成します

aoc -rtl -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltmy_object_filenamegt_FPGA_board_1aocr

2 以下のコマンドを呼び出しaocxファイルを生成します

aoc -board=FPGA_board_1 ltyour_object_filenamegt_FPGA_board_1aocr -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 2 つの FPGA で構成されるアクセラレーターボードの場合各 FPGA デバイスには同等の「ボード」名が付けられます (例えば board_fpga_1board_fpga_2 など)kernel_1clのターゲットを board_fpga_1kernel_2clのターゲットを board_fpga_2 にするには次のコマンドを呼び出します

aoc -board=board_fpga1 kernel_1claoc -board=board_fpga2 kernel_2cl

関連情報インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-oltfilenamegt) (108 ページ)

77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)

デザインがフィッティング制約を満たしていないためにOpenCL カーネルのコンパイルがハードウェアの生成段階で失敗することがありますこの場合aocコマンドの -high-effortオプションを使用しカーネルを再コンパイルしてください

フィッティング制約の問題によってカーネルのコンパイルが失敗すると インテル FPGA SDK forOpenCL オフラインコンパイラーは次のエラーメッセージを表示します

Error Kernel fit error recommend using -high-effortError Cannot fit kernel(s) on device

bull この問題を解決するには次のコマンドを実行しカーネルを再コンパイルします

aoc -high-effort ltyour_kernel_filenamegtcl

コマンドを呼び出すとオフラインコンパイラーは次のメッセージを表示します

High-effort hardware generation selected compile time may increase significantly

オフラインコンパイラーはカーネルの再コンパイルとハードウェアの生成を 3 回試みます-high-effortを試みた後もコンパイルが失敗する場合はカーネルを変更してください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

110

78 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt)

fmax ターゲットのスケジュールはスケジューリングプロセス中にスケジューラーが試みるパイプライン化の努力目標を決定します

次のオプションの一方または両方を使用しカーネル固有の fmax ターゲットを指定できます

bull __attribute__((scheduler_target_fmax_mhz(__x))) ソースレベル属性を使用する

bull aocコマンドの-fmax=ltfmax target in Mhzgt ですべてのカーネルをグローバルにコンパイルするようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示する

コマンドラインオプションとソースレベル属性をどちらも使用する場合カーネル属性が優先されます次のコードを例にします

kernel void k1() __attribute__((scheduler_target_fmax_mhz(200))) kernel void k2()

オフラインコンパイラーに aocコマンドの-fmax=300をコンパイルするよう指示するとコンパイラーはカーネル k1を 300 MHzカーネル k2を 200 MHz でスケジュールします

重要 スケジュールされたターゲット fmax はコンパイル中のパイプライン化の努力目標を決定します インテル Quartus Prime 開発ソフトウェアプロエディションコンパイラーを実行し実際の fmax の値を取得してください

79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーはマクロの定義を渡し条件付きでのコードのコンパイルを可能にするプリプロセッサーマクロをサポートします

bull プリプロセッサーマクロの定義をオフラインコンパイラーに渡すには aoc -Dltmacro_namegt ltkernel_filenamegtclコマンドを呼び出します

bull 定義済みのプリプロセッサーマクロの既存値を上書きするには aoc -Dltmacro_namegt=ltvaluegt ltkernel_filenamegtclコマンドを呼び出します

次のカーネル sumのコードを例にします

ifndef UNROLL_FACTOR define UNROLL_FACTOR 1endif

__kernel void sum (__global const int restrict x __global int restrict sum) int accum = 0

pragma unroll UNROLL_FACTOR for(size_t i = 0 i lt 4 i++) accum += x[i + get_global_id(0) 4]

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

111

sum[get_global_id(0)] = accum

UNROLL_FACTORの 1 を 4 に上書きし設定するには aoc -DUNROLL_FACTOR=4sumclコマンドを呼び出しますこのコマンドを呼び出すことはsumカーネルソースコードのdefine UNROLL_FACTOR 1の行をdefine UNROLL_FACTOR 4に置き換えることと同等です

bull プリプロセッサーマクロを使用しカーネルのソースコードを変更することなくオフラインコンパイラーによるカーネルの 適化を制御するには aoc -olthardware_filenamegtaocx -D ltmacro_namegt=ltvaluegtltkernel_filenamegtclを呼び出します

以下に詳細を説明します

-oはオフラインコンパイラーが生成するaocxファイル名を指定するために使用するオフラインコンパイラーのオプションです

lthardware_filenamegt は指定したプリプロセッサーマクロの値を使用しオフラインコンパイラーが生成するaocxファイルの名前です

ヒント

コンパイル結果をどちらもファイルシステムに保存するにはaocコマンドの-oフラグを使用しカーネルを個別のバイナリーとしてコンパイルします

例えば同じカーネルを必要なワークグループサイズの 64 および 128 で複数回コンパイルする場合次のように WORK_GROUP_SIZEプリプロセッサーマクロをカーネル属性reqd_work_group_sizeに定義できます

__attribute__((reqd_work_group_size(WORK_GROUP_SIZE11)))__kernel void myKernel()for (size_t i = 0 i lt 1024 i++) statements

次のコマンドを入力しカーネルを複数回コンパイルします

aoc ndasho myKernel_64aocx ndashDWORK_GROUP_SIZE=64 myKernelcl

aoc ndasho myKernel_128aocx ndashDWORK_GROUP_SIZE=128 myKernelcl

710 コンパイル進捗レポートの生成 (-v)

インテル FPGA SDK for OpenCL オフラインコンパイラーにコンパイルの進捗を報告させるには-vオプションを aocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

112

bull フルコンパイルの進捗をオフラインコンパイラーに報告させるには aoc -vltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc Setting up project for CvP revision flowaoc Hardware generation completed successfully

bull ハードウェアを構築しない中間コンパイルの進捗をオフラインコンパイラーに報告させるにはaoc -rtl -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc To compile this project run aoc ltyour_kernel_filenamegtaoco

bull エミュレーションに向けたコンパイルの進捗を報告するようオフラインコンパイラーに指示するには aoc -march=emulator -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parserexaoc OpenCL parser completed successfullyaoc Compiling for Emulation aoc Emulator Compilation completed successfullyEmulator flow is successful

関連情報bull ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-

rtl) (106 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

711 リソース推定使用率要約の画面表示 (-report)

デフォルトにおいてインテル FPGA SDK for OpenCL オフラインコンパイラーはハードウェアのリソース使用率をコンパイル中に見積もりますオフラインコンパイラーはPCIeメモリーコントローラーDMA エンジンなどの外部インターフェイスの使用率も計算に含めますカーネルのコンパイル中にオフラインコンパイラーは推定されるリソース使用率の要約を ltyour_kernel_filenamegtディレクトリーの ltyour_kernel_filenamegtlogファイルに生成します 推定されるリソース使用率の要約を画面上で確認するには-reportオプションを aocコマンドに含めてください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

113

推定リソース使用率の要約はフルコンパイルを実行しなくても確認することができますハードウェアのコンフィグレーションファイルを生成する前に画面上で使用率の要約を確認するには-rtlオプションを aocコマンドに含めてください

bull コマンドプロンプトで aoc -rtl ltyour_kernel_filenamegtcl -report コマンドを呼び出しますオフラインコンパイラーは次のような出力を生成します

+--------------------------------------------------------------------+ Estimated Resource Usage Summary +----------------------------------------+---------------------------+ Resource + Usage +----------------------------------------+---------------------------+ Logic utilization 35 ALUTs 22 Dedicated logic registers 15 Memory blocks 29 DSP blocks 0 +----------------------------------------+---------------------------

関連情報ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)(106 ページ)

712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)

すべての警告メッセージを抑制するには-Wオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -W ltyour_kernel_filenamegtclコマンドを呼び出します

713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)

警告メッセージをすべてエラーメッセージに変換するには-Werrorオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -Werror ltyour_kernel_filenamegtclコマンドを呼び出します

714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0)

clまたはaocoファイルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはデフォルトでソース情報をコンパイラーレポートに含めソースコードをaocxバイナリーに組み込みます -g0オプションを aocコマンドに含めソース情報をコンパイラーレポートから削除しソースコードとカスタマー IP 情報をaocxファイルから削除します

bull レポートのソース情報とaocxファイルのソースコードおよびカスタマー IP の情報を削除するには aoc -g0 ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

114

715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーでは異なるメモリータイプにわたりグローバルメモリーをバーストインターリーブすることはできません -no-interleaving=ltglobal_memory_typegt オプションを aocコマンドに含め同じタイプのグローバルメモリーバンクすべてのバーストインターリーブを無効にしそれらを手動で管理することができますメモリーバッファーの手動分割はグローバルメモリーにデフォルトで設定されているバーストインターリーブ方式でのコンフィグレーションを上書きします

注意 -no-interleaving オプションはグローバルメモリータイプのパラメーターを必要としますメモリータイプが指定されていない場合オフラインコンパイラーはエラーメッセージを発行します

bull デフォルトのグローバルメモリーのバーストインターリーブを無効にするようオフラインコンパイラーに指示するにはaoc ltyour_kernel_filenamegtcl -no-interleaving=default コマンドを呼び出します

アクセラレーターボードには複数のグローバルメモリータイプが含まれる場合がありますデフォルトのグローバルメモリータイプを特定するにはご利用のカスタムプラットフォームのボードメーカーより提供されている資料を確認ください

bull 異種メモリーのシステムにおいて特定のグローバルメモリータイプのバーストインターリーブを無効にするようオフラインコンパイラーに指示するには次の作業を実行します

a カスタムプラットフォームの Board_specxmlファイルで利用可能なグローバルメモリータイプ名を確認します (DDRクアッドデータレート (QDR) など)

b 例えばDDR のメモリータイプのバーストインターリーブを無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDRコマンドを呼び出しますオフラインコンパイラーはDDR メモリーバンクの手動分割を有効にし他のメモリーバンクをバーストインターリーブ方式でコンフィグレーションします

c 複数のタイプのグローバルメモリーバッファーのバーストインターリーブを無効にするには-no-interleaving=ltglobal_memory_typegt オプションを各グローバルメモリータイプに含めます

例えばDDR と QDR のバーストインターリーブをどちらとも無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDR -no-interleaving=QDRコマンドを呼び出します

注意 バッファーを複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

716 グローバルメモリーのリング型相互接続の強制 (-global-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーはデザインのさまざまな特性を考慮しグローバルメモリーの 適な相互接続トポロジーの選択を試みます

コンパイラーの選択を無効にしリング型トポロジーを強制するには -global-ring オプションを aocコマンドで使用しますこのオプションはツリー型トポロジーの使用によって fmax が制限されている場合などにカーネルの fmax を向上させることができます特に4 バンク以上のグローバルメモリーをともなうボードサポートパッケージをターゲットとするデザインの fmax にこのオプションは有効に働きます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

115

例 aoc -global-ring ltyour_kernel_filenamegtcl

717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製(-duplicate-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーが (自動選択または-global-ringでリングを強制し) グローバルメモリーの相互接続のためのリング型トポロジーを実行する際のグローバルメモリーへのカーネル書き込みスループットを向上させるには -duplicate-ring オプションを aocコマンドで使用します

このオプションは相互接続の幅を広げるためより多くの書き込みが並行して発生するようになりますしたがってより多くの領域を消費します

例 aoc -duplicate-ring ltyour_kernel_filenamegtcl

関連情報グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ)

718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)

-const-cache-bytes=ltNgt フラグを aocコマンドに含めインテル FPGA SDK forOpenCL オフラインコンパイラーにコンスタントメモリーキャッシュサイズをコンフィグレーションするよう指示します ( も近い 2 の乗数に切り上げられます)

デフォルトのコンスタントキャッシュサイズは 16 kB です

bull コンスタントメモリーキャッシュサイズのコンフィグレーションには aoc -const-cache-bytes=ltNgt ltyour_kernel_filenamegtclコマンドを呼び出しますこのltNgt はバイト単位のキャッシュサイズを表します

例えばOpenCL カーネル myKernelclのコンパイル時に 32 kB のキャッシュをコンフィグレーションするには aoc -const-cache-bytes=32768 myKernelclコマンドを呼び出します

注意 __constantアドレス空間をいずれのカーネルも使用していない場合この引数の効果はありません

719 浮動小数点演算処理順序の緩和 (-fp-relaxed)

-fp-relaxedオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーがバランスの取れたツリー構造のハードウェアを実装し浮動小数点演算の処理順序を緩和するようにします

バランスの取れたツリー構造の実装は結果における数値の変動性と引き換えにより効率的なハードウェアをもたらします

注意 この 適化のための制御を実装するには浮動小数点演算の結果における小さな変動を許容できるプログラムでなければなりません

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

116

bull オフラインコンパイラーに対しバランスの取れた木構造のハードウェア実装を実行するよう指示するには aoc -fp-relaxed ltyour_kernel_filenamegtclコマンドを呼び出します

720 浮動小数点演算における丸め処理の削減 (-fpc)

-fpcオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーに中間で行われる浮動小数点演算の丸め処理および変換を可能な限り削除し精度を維持するための追加ビットを持つよう指示します

この 適化に向けた制御を実装すると丸め処理のモードも変更されますこのモードでは一連の浮動小数点演算処理 (乗算加算減算) の 後でのみゼロに丸める処理が行われます

bull オフラインコンパイラーに丸め処理の回数を削減するよう指示するには aoc -fpcltyour_kernel_filenamegtclコマンドを呼び出します

721 OpenCL コンパイルの高速化 (-fast-compile)

コンパイル時間を 40から 90削減しカーネルのaocxファイルを短時間で作成するには-fast-compile インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

-fast-compileフィーチャーは 適化の作業を減らすことによりコンパイル時間を大幅に削減します

コマンドプロンプトで aoc -rtl ltyour_kernel_filename1gtcl-fast-compile コマンドを呼び出します

警告 -fast-compileフィーチャーを有効にすると次のようなパフォーマンス上の問題が発生する可能性があります

bull リソース使用率の増加

bull fmax の低下およびそれにより発生するアプリケーションパフォーマンスの低下

bull 電力効率の低下

インテルでは-fast-compileオプションを内部での開発目的にのみ使用することを推奨しています

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

117

注意 bull -fast-compileコンパイラーオプションは インテル Arria 10 以降のデバイスをターゲットにする OpenCL デザインをコンパイルする場合にのみ使用することができます

bull デザインの完成後 OpenCL カーネルを-fast-compileオプションを指定せずに複数のシードでコンパイルし 高のパフォーマンスを確立します

bull -fast-compileフィーチャーが有効になっているか否かにかかわらずOpenCL システムの初期コンパイルを新しいボードおよび新しいバージョンのインテル FPGA SDK for OpenCL プロエディションで行う場合45 分から 60 分の時間が追加で必要ですこの追加される時間では今後のコンパイルに備えコンパイルの一部をキャッシュしています (この動作はカーネルのパフォーマンスに影響しません)このキャッシュを作成するには環境変数$AOCL_TMP_DIR を共有できる書き込み可能なディレクトリーに定義しますデフォルトでこのキャッシュはLinux の場合vartmpaocl$USERにWindows の場合USERPROFILEAppDataLocalaoclに格納されますこの書き込み可能なディレクトリーは共有ネットワーク位置に設定することで共有できます

キャッシュを作成後は現在のバージョンのインテル FPGA SDK for OpenCL および現在のターゲットボードに対し再度キャッシュを作成する必要はありません

722 カーネルのインクリメンタルコンパイル (-incremental)

OpenCL デザインに加える変更をインクリメンタルにコンパイルするには-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

複数のカーネルを持つ大規模なシステムにおいて単一のカーネルのみ変更する場合 インテル FPGASDK for OpenCL オフラインコンパイラーでは前回のコンパイル結果を再利用し変更したカーネルのみを合成配置ルーティングすることができますこのインクリメンタルコンパイルフィーチャーはコンパイル時間の大幅な短縮につながります

注意 インクリメンタルコンパイルフィーチャーは内部での OpenCL デザインの開発目的に限り有効にしてください 高の回路パフォーマンスを確立するため 終デザインではフルコンパイルを実行してください

インクリメンタルコンパイルフロー例

aoc-incrementalltyour_kernel_filenamegtcl

Update kernels in your OpenCL design

aoc-incremental-fast-compileltyour_kernel_filenamegtcl

1 aoc -incremental ltyour_kernel_filenamegtclコマンドを呼び出しインクリメンタルモードが有効になっている状態で初期セットアップのコンパイルをクリーンなディレクトリーに行います

注意 セットアップをコンパイルする際は-incrementalフラグを必ず有効にしてください

このセットアップのコンパイルは以前のコンパイル結果を再利用しませんセットアップをコンパイルする際は-fast-compileオフラインコンパイラーコマンドオプションを aocコマンドに含めないでくださいこのオプションを含めると今後のインクリメンタルコンパイル時にエラーが発生する可能性が高くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

118

ヒント

インテルではコンパイルの時間が問題にならない場合は必ずセットアップのコンパイルを新しく実行し今後のインクリメンタルコンパイル時にコンパイルが失敗する可能性を低下させることを推奨しています連続して多くのインクリメンタルコンパイルを実行するとコンパイルが失敗する可能性が高くなりますまたハードウェアのパフォーマンスおよび生成されたaocxファイルの効率も低下します

2 ご自身の OpenCL デザインのカーネルを修正します

デザインには複数のclファイルを含めることが可能です

3 デザインのインクリメンタルコンパイルを実行します 適なコンパイル速度を得るために-fast-compileフラグも aocコマンドに含めます

aoc -incremental -fast-compile ltyour_kernel_filenamegtcl

4 reporthtmlファイルの Incremental compile セクションでオフラインコンパイラーが検出した変更を確認してください

reporthtmlファイルは ltyour_kernel_filenamegtreportsディレクトリーにあります

7221 インクリメンタルコンパイルレポート

-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションで OpenCL のデザインをコンパイルするとオフラインコンパイラーはIncremental compile セクションを ltyour_kernel_filenamegt プロジェクトディレクトリーの reporthtmlファイルに含めます

インクリメンタルコンパイルレポートはOpenCL のデザインに関する次のようなメトリクスを提供します

bull レポートの下部にある ltgt of design not preservedメトリクスはデザインの全体的な変更の簡単な概要を示しますこれはコンパイル時間を予測する も良い判断材料です

注意

インクリメンタルコンパイルレポートに表示される FPGA リソースは インテル FPGASDK for OpenCL オフラインコンパイラーが作成する推定エリアモデルに基づき計算されますエリアの数字は標準コンパイル (インクリメンタルではないコンパイル) 時の推定エリア使用量を表しますこの数字をもとに標準コンパイル時にデザインが消費するエリアを見積もることが可能です

FPGA のリソース情報は インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアコンパイルレポートの 終的なエリアと完全に一致しない場合があります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

119

図 -14 セットアップコンパイル時のインクリメンタルコンパイルレポート

図 -15 インクリメンタルコンパイル時のコンパイルレポート

7222 インクリメンタルコンパイルのその他のコマンドオプション

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーに含まれているオプションの機能を有効にしOpenCL デザインのコンパイルをカスタマイズすることができます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

120

複数のカーネルのパーティションへのグループ化 (-incremental-grouping=ltfilenamegt)

デフォルトにおいて インテル FPGA SDK for OpenCL オフラインコンパイラーはインクリメンタルコンパイル時にデザイン内の各カーネルを個別のパーティションに配置します -incremental-grouping=ltpartition_filenamegt コマンドオプションを aocコマンドに含め複数のカーネルを単一のパーティションにまとめることができます通常デザインに含まれるパーティションが少ないほどコンパイル速度は早くなります

例 aoc -incremental-grouping=ltpartition_filenamegtltyour_kernel_filenamegtcl

注意 1 つのカーネルのみを変更した場合でもオフラインコンパイラーはグループ内のすべてのカーネルを再コンパイルしますインテルでは通常同時に変更するカーネルをグループ化することを推奨しています

グループ化されたカーネルが多数のロードおよびストア動作を実行する場合-incremental=aggressiveオプションも aocコマンドに含めコンパイルスピードをさらに加速させることが可能です

-Incremental-groupingオプションに渡すパーティションファイルはプレーンテキストファイルですファイル内の各行は新しいパーティションを指定しておりカーネル名をセミコロン () で区切ったリストを含んでいます例えばパーティションファイルの以下の行は3 つのパーティションを指定しそれぞれに 4 つのカーネルを含んでいます

reader0reader1reader2reader3accum0accum1accum2accum3writer0writer1writer2writer3

アグレッシブモードによるデザインのコンパイル (-incremental=aggressive)

エリア使用量とスループットを引き換えにインクリメンタルコンパイルを加速するには -incremental=aggressiveコマンドオプションを aocコマンドに含めます

このフィーチャーはデザイン内のカーネルが多数のバッファーに対してロードおよびストア動作を行う場合や-incremental-groupingコマンドオプションで複数のカーネルをグループ化した場合に特に有効です

例 aoc -incremental=aggressive -incremental-grouping=ltpartition_filenamegt ltyour_kernel_filenamegtcl

注意 bull アグレッシブモードを有効にするとFmax の低下が示すよりも大きいスループットの低下が生じる可能性があります

bull 各 OpenCL デザインのインクリメンタルコンパイルを行っている間はコンパイルモードを変更しないでくださいデザインをアグレッシブモードでコンパイルする場合そのデザインに対して続けて実行するインクリメンタルコンパイルではすべてアグレッシブモードを有効にしますインクリメンタルコンパイルのモードを切り替えるたびにコンパイルが完了するまでの時間が長くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

121

カスタム入力ディレクトリーの指定 (-incremental-input-dir=ltpath_to_directorygt)

オフラインコンパイラーはインクリメンタルコンパイル中にデフォルトのltyour_kernel_filenamegt プロジェクトディレクトリーを現在の作業ディレクトリーに作成し中間コンパイルファイルを保存しますインクリメンタルコンパイルをデフォルトのプロジェクトディレクトリー以外に配置するには -incremental-input-dir=ltpath_to_directorygtコマンドオプションを aocコマンドに含めます

次のいずれかまたは両方のシナリオでデザインをコンパイルする場合-incremental-input-dirオプションを含める必要があります

bull aocコマンドを前回のコンパイルとは違う作業ディレクトリーから実行する場合

bull -o ltfilenamegt コマンドオプションを前回のコンパイルに含めた場合

mykernelclファイルが初期の作業ディレクトリーにあり同じ mykernelclファイルの別のリビジョンが new_revサブディレクトリーにある以下のシナリオを例にします

aoc -incremental mykernelclcd new_revaoc -incremental -fast-compile mykernelcl -incremental-input-dir=mykernel

このシナリオにおいてオフラインコンパイラーはmykernelプロジェクトディレクトリーにある初期コンパイル時のファイルを再利用しそれをもとに 2 回目のコンパイルを行いますオフラインコンパイラーは元の mykernelディレクトリー内のファイルを変更することなくnew_revmykernelプロジェクトディレクトリーを 2 回目のコンパイルに作成します

-incremental-input-dirコマンドオプションは複数のデベロッパーが同じインクリメンタルセットアップコンパイルを共有する場合に有効です各デベロッパーはその後のインクリメンタルコンパイルを他のデベロッパーのコンパイル結果を上書きすることなく自分の作業スペースで実行できます

自動再試行の無効化 (-incremental-flow=no-retry)

インクリメンタルコンパイルが失敗した場合デフォルトでオフラインコンパイラーはコンパイルの再試行を自動的に行いますその場合パーティションは保存されずに 2 回目のコンパイルが実行されますこの 2 回目のコンパイルはデザイン全体を再コンパイルするため完了までに時間がかかります

オフラインコンパイラーの自動再試行メカニズムを無効にするには-incremental-flow=no-retryコマンドオプションを aocコマンドに含めますこのフィーチャーを有効にすると 初の試みが失敗に終わった際にオフラインコンパイラーは 2 回目のインクリメンタルコンパイルを実行しませんまたオフラインコンパイラーはaocxファイルを生成しません

このフィーチャーを有効にすることにより次のような独自の失敗軽減ストラテジーを実行することが可能になります

bull 複数のシードを並行してコンパイルすることにより 低 1 つのコンパイルが再試行なしで成功する可能性を高める

bull インクリメンタル高速コンパイルに代わり非インクリメンタル高速コンパイル ( aoc -fast-compile ltyour_kernel_filenamegtcl) を実行する

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

122

7223 インクリメンタルコンパイルフィーチャーの制限

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーは インテル Arria10 FPGA をターゲットとする OpenCL デザインにのみ利用可能です

デバイスのサポートのほかにインクリメンタルコンパイルには次の制限があります

bull インクリメンタルコンパイルフィーチャー (-incremental) または高速コンパイルフィーチャー (-fast-compile)もしくはその両方を有効にするとエリアFmax電力の低下が発生します

bull 輻輳したデザインのインクリメンタルコンパイルでは初期セットアップのコンパイルと比較しFmax が大幅に低下することがあります (25以上)Fmax の低下を許容できない場合非インクリメンタル高速コンパイルを実行し一定のコンパイル時間の短縮を維持しながら Fmax の低下量を軽減します

bull オフラインコンパイラーは -l ltlibrary_namegtaoclibオフラインコンパイラーコマンドオプションを呼び出すことで行った RTL ライブラリーの変更を検出しませんRTL ライブラリーを変更した後はセットアップコンパイルを再度行う必要があります

オフラインコンパイラーはセットアップコンパイルを再度実行するよう警告メッセージを表示し注意喚起します

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)

注意 ECC (誤り訂正符号) は初期のインテル FPGA SDK for OpenCL のフィーチャーでプレビューの段階にあります訂正されたエラーおよび検出されたものの訂正されなかったエラーを報告するこのフィーチャーを 大限に活用するにはECC に対応するカスタムプラットフォームをボードメーカーより入手する必要があります

-eccオプションを aocコマンドに含み インテル FPGA SDK for OpenCL オフラインコンパイラーが誤り訂正符号をカーネルのメモリー (M20k および MLAB) で有効にするようにします

ECC の実装には各 32 ビットワードに対しシングルエラー訂正機能とダブルエラー検出機能があります

注意 ECC フィーチャーを有効にするとRAM と ALM の両方でエリアオーバーヘッドが発生しシステムのFmax が低下します

bull オフラインコンパイラーで誤り訂正符号のハードウェア実装を有効にするには aoc -eccltyour_kernel_filenamegtclコマンドを呼び出します

724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)

インテル FPGA SDK for OpenCL オフラインコンパイラーでOpenCL カーネルの呼び出しキューを削除しカーネルのエリア使用量を低減するには -no-hardware-kernel-invocation-queue オプションを aocコマンドに含めます

例 aoc -no-hardware-kernel-invocation-queueltyour_kernel_filenamegtcl

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

123

このオプションを使用することでカーネルの実行時間が長くなる場合がありますカーネルの呼び出しキューはOpenCL ランタイム環境においてカーネルの起動をアクセラレーターにキューすることを可能にしますそのためアクセラレーターはカーネルの呼び出し終了後すぐに同じカーネルの次の実行をスタートできます

注意 -No-hardware-kernel-invocation-queue オプションはカーネルの実行時間がカーネルの呼び出しキュー (20-100us) に隠れているシステムや OpenCL ランタイム環境のオーバーヘッドより長い場合または インテル FPGA SDK for OpenCL オフラインコンパイラーでカーネルのフィットが難しい場合にのみ使用します

カーネル呼び出しキューの使用方法に関してはIntel FPGA SDK for OpenCL Pro Edition BestPractices Guide のトピックUtilizing Hardware Kernel Invocation Queue を参照ください

関連情報Utilizing Hardware Kernel Invocation Queue

725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)

デザインの特定の領域で使用されているハンドシェイクプロトコルを変更するにはaocコマンドの-hyper-optimized-handshaking=ltauto|offgt オプションを使用します

-hyper-optimized-handshaking オプションには次のいずれかの値を設定できます

auto オプションを指定しないデフォルトの動作です可能な場合コンパイラーは 適化を有効にしますそうでない場合は offに設定されます

より高い fmax を要求する場合にこの値を使用しますこのオプションを有効にすると インテル FPGA SDK for OpenCL オフラインコンパイラーはストールを許容するノードのハンドシェイクパスにパイプラインレジスターを追加しますこれによりエリアとレイテンシーが増加する代わりに fmax が高くなります

例 aoc -hyper-optimized-handshakingltyour_kernel_filenamegtcl

off コンパイラーはfmax が低下する潜在的な可能性と引き換えに低レイテンシーに向けた 適化を試みますこのハンドシェイクの高度な 適化を無効にするとエリアの縮小につながる可能性もありますこれはfmax をあまり必要としない小規模なデザインにおいてレイテンシーとエリアを低減できるため効果的です

例 aoc -hyper-optimized-handshaking=offltyour_kernel_filenamegtcl

注意 -hyper-optimized-handshaking オプションは インテル Stratixreg 10 をターゲットにするデザインにのみ適用されます インテル Stratix 10 デバイス以外のターゲットデバイスにこのオプションを使用するとコンパイルが失敗しエラーが発生します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

124

8 OpenCL カーネルのエミュレーションとデバッグ

インテル FPGA SDK for OpenCL Emulator はカーネルの機能性を評価します

インテル FPGA SDK for OpenCL Emulator はx86-64 Windows または Linux ホストで実行するaocxファイルを生成しますこの機能によりカーネルの機能性をエミュレーションし毎回実際のFPGA で実行することなくデザインを反復することが可能になりますLinux のプラットフォームではエミュレーターを使用し機能のデバッグを実行することも可能です

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインのエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインを SoC ボードへターゲットにすることが可能です

エミュレーターは64 ビットの Windows および Linux のオペレーティングシステムをサポートしていますLinux システムではGNU C Library (glibc) version 215 以降のバージョンが必要ですお使いの Linux システムがこの要件を満たさない場合レガシーエミュレーターを利用できる可能性があります詳細はレガシーエミュレーターの使用 (135 ページ) を確認ください

1 高速エミュレーターの設定 (125 ページ)

2 エミュレーションに向けたチャネルカーネルコードの変更 (126 ページ)

3 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128ページ)

4 OpenCL カーネルのエミュレーション (129 ページ)

5 Linux における OpenCL カーネルのデバッグ (130 ページ)

6 インテル FPGA SDK for OpenCL Emulator の制限 (131 ページ)

7 ハードウェアとエミュレーターの結果の不一致 (131 ページ)

8 高速エミュレーターの環境変数 (133 ページ)

9 高速エミュレーターでサポートされている拡張機能 (133 ページ)

10 高速エミュレーターの既知の問題 (134 ページ)

11 レガシーエミュレーターの使用 (135 ページ)

81 高速エミュレーターの設定

インテル FPGA SDK for OpenCL プロエディションを管理者権限でインストールしている場合次の手順を実行する必要はありません インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合は高速エミュレーターを有効にするための作業を行う必要があります

インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合高速エミュレーターを使用する前に次の手順を実行してください

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

1 高速エミュレーターをインストール可能なクライアントドライバー (ICD) エントリーを手動で設定します

bull Linux の場合etcOpenCLvendorsIntel_FPGA_SSG_Emulatoricdファイルが環境変数 INTELFPGAOCLSDKROOT が指定するディレクトリーにあるファイルと一致することを確認しますINTELFPGAOCLSDKROOT 環境変数はSDK をインストールする位置を指しています

ファイルが一致しない場合やetcOpenCLvendorsにファイルが存在しない場合はIntel_FPGA_SSG_Emulatoricdファイルを INTELFPGAOCLSDKROOT 環境変数で指定されている位置からetcOpenCLvendorsディレクトリーへコピーします

bull Windows の場合レジストリーキー HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendorsが次の値を含んでいることを確認してください[HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]intelocl64_emudll=dword00000000

2 インテル FPGA サポートプレビューで インテル FPGA SDK for OpenCL を手動でインストール (または再インストール) します

この手順により64 ビットの インテル SDK for OpenCL オフラインコンパイラーコマンドラインインターフェイス (ioc64) がシステムにインストールされます

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

bull OpenCL Vector Addition Design Example

82 エミュレーションに向けたチャネルカーネルコードの変更

エミュレーターはカーネル間のチャネルをエミュレーションしますFPGA ボードの入出力フィーチャーに接続する IO チャネルのエミュレーションはサポートしていません IO チャネルの読み書きを行うチャネルを持つアプリケーションをエミュレーションするにはカーネルを変更しIO チャネルに代わる読み取りまたは書き込みチャネルを追加しますまたそのチャネルを使用するソースコードを条件付きにします

インテル FPGA SDK for OpenCL はEMULATORのマクロの定義を設定しませんコマンドラインまたはソースコードで手動にて設定する必要があります

次のカーネルを例に説明します

channel unlong4 inchannel __attribute__((io(eth0_in)))

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ulong4 data = read_channel_intel(inchannel) statements

IO チャネルに接続するチャネルを持つカーネルをエミュレーションするエミュレーターを有効にするには次の手順を実行します

1 次のいずれかの方法でカーネルコードを変更します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

126

mdash 次のように一致する write_channel_intel呼び出しを追加する

ifdef EMULATOR

__kernel void io_in (__global char restrict arr int size) for (unsigned i = 0 i lt size i++) ulong4 data = arr[i] arr[i] being an alternate data source write_channel_intel(inchannel data) endif

mdash IO チャネルアクセスを次のようにメモリーアクセスに置き換える

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ifndef EMULATOR

ulong4 data = read_channel_intel(inchannel)

else ulong4 data = arr[i] arr[i] being an alternate data source

endif statements

2 エミュレーション中にこの条件付きカーネルを作成および起動するようホストアプリケーションを変更します

関連情報io チャネル属性を使用した IO チャネルの実装 (44 ページ)

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション

インテル FPGA SDK for OpenCL Emulator は値によってパイプやチャネルを渡すカーネルをサポートします

値によってチャネルまたはパイプを渡すカーネルは次のようにエミュレーションできます

channel uint my_ch

void my_function (channel uint ch __global uint dst int i) dst[i] = read_channel_intel(ch)

__kernel voidconsumer (__global uint restrict dst) for (int i=0ilt5i++) my_function(my_ch dst i )

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

127

822 チャネル深度のエミュレーション

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE環境変数を使用しエミュレーションに向けてカーネルをコンパイルすることで変更できます

この CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数は次の値を取ることができます

ignoredepth カーネルのエミュレーション実行時間が 短になるよう選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性は無視されます

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数が設定されていない場合はこの値がデフォルトで使用されます

default 明示的に深度属性が指定されているチャネルはその深度を持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるよう選択されたデフォルトのチャネル深度が与えられます

strict エミュレーションのチャネル深度はすべてFPGA のコンパイルに指定されている深度に一致するように与えられます

重要 チャネルに対する CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数はカーネルをコンパイルする前に設定する必要がありますパイプの場合はホストプログラムを実行する前に設定する必要があります

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)

エミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorおよび-fast-emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に次の作業を実行します

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認してください

bull LD_LIBRARY_PATH 環境変数の設定に インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認します

bull x86-64 のホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator -fast-emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向けてインテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートではカーネルソースコードの機能的なエラーの原因を特定できます

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

128

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

84 OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行しますOpenCL 高速エミュレーターはFPGA ハードウェアをターゲットとする際とは異なる OpenCL プラットフォームを使用します

カーネルをエミュレーションするには次のステップを実行します

1 ホストプログラムを変更しエミュレーターの OpenCL プラットフォームを選択します

次のプラットフォーム名を選択しホストプログラムのエミュレーション用 OpenCL プラットフォームを選択します

Intel(R) FPGA Emulation Platform for OpenCL(TM)

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細についてはホストアプリケーションと Khronos ICD Loader Library のリンクを確認ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置へ動かします現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを次のように実行します

mdash Windows の場合

a set CL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を定義します

b ホストアプリケーションを実行します

c set CL_CONFIG_CPU_EMULATE_DEVICES=を呼び出し変数の設定を解除します

mdash Linux の場合は envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要のある同一のエミュレーションデバイス数を指定します

注意

エミュレーション用 OpenCL プラットフォーム (Intel(R) FPGA EmulationPlatform for OpenCL(TM)) は物理的なボードへのアクセスを提供しませんエミュレーションされたデバイスのみ利用可能です

ヒント

エミュレーターデバイスを 1 つだけ使用する場合はCL_CONFIG_CPU_EMULATE_DEVICES環境変数を設定する必要はありません

5 ホストまたはカーネルプログラムの変更後にテストを行う場合変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

129

85 Linux における OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL Emulator にデバッガーで OpenCL カーネルを実行しホストアプリケーションの一部として機能的にデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証と設定を行うことができます

注意 カーネルのデバッグはホストのデバッグから独立していますWindows の Microsoft Visual StudioDebugger や Linux の GDB など既存のツールでホストコードをデバッグしてください

デバッグに向けて OpenCL カーネルをコンパイルするには次のステップを実行します

1 特定のアクセラレーターボードをターゲットとするデバッグのaocxファイルを生成するためaoc -march=emulator -fast-emulator -gltyour_kernel_filenamegtclコマンドを呼び出します

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94ページ) を確認ください

3 ltyour_kernel_filenamegtaocxファイルがホストが容易に検索できる位置にあることを確認してください現在の作業ディレクトリーが推奨されます

4 アプリケーションの実行には envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt gdb --argsltyour_host_program_namegt [lthost_program_argumentsgt] コマンドを呼び出しますこの ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムの変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行します

カーネルをデバッガーで実行するには次の作業を実行します

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルを呼び出す前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグを開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yと返答します 初のプログラム実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 エミュレーターはOpenCL ランタイムでいくつかのエラーの詳細をレポートしますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

130

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

86 インテル FPGA SDK for OpenCL Emulator の制限

インテル FPGA SDK for OpenCL Emulator のフィーチャーにはいくつかの制限があります

bull 実行モデル

エミュレーターはFPGA バリアントと同じコンパイルモードをサポートしますそのためclCreateProgramBinary関数を呼び出しエミュレーションのための cl_programオブジェクトを作成する必要があります

bull 並列実行

並行するカーネルの実行のモデリングには制限があります実行中にエミュレーターは通信しているワークアイテムを実際には並行して実行しませんよって異なるカーネルが同期化のためにバリアーなしでグローバルメモリーにアクセスしている場合など並行して実行されている動作によっては実行ごとに一貫性のないエミュレーション結果が生成される可能性があります

bull エミュレーターはホストランタイムとカーネルを同じアドレス空間で実行しますホストアプリケーションで特定のポインターや配列を使用することによりカーネルプログラムが失敗する場合がありますまたその逆も同じです使用例としては外部に割り当てられたメモリーのインデックス化やランダムなポインターへの書き込みなどがありますValgrind などのメモリーリーク検出ツールを使用しプログラムを分析することができますただしカーネルでの範囲を超える書き込み動作によってホストに致命的なエラーが発生する可能性がありますまたその逆も同様です

bull チャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合エミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

87 ハードウェアとエミュレーターの結果の不一致

カーネルをエミュレーションするとOpenCL システムはハードウェアにコンパイルされたカーネルとは異なる結果を生成することがありますシミュレーションでカーネルを実行することでハードウェアにカーネルをコンパイルする前にさらにカーネルをデバッグすることが可能です

警告 この結果における不一致はインテル FPGA SDK for OpenCL Emulator がハードウェアの計算の一部を正確にモデル化できない場合またはプログラムが未定義の動作に依存している場合に通常発生します

エミュレーターとハードウェアの結果の不一致を引き起こす も一般的な理由は次のとおりです

bull OpenCL カーネルコードがpragma ivdepディレクティブを使用しているエミュレーターは真の依存関係が pragma ivdepディレクティブによって壊されている場合OpenCL システムをモデル化しませんハードウェアをフルコンパイルする際にこれは誤った結果として考えられます

bull OpenCL カーネルコードが初期化されていないデータに依存している初期化されていないデータとは初期化されていない変数初期化されていないまたは部分的に初期化されたグローバルバッファーローカル配列プライベート配列などです

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

131

bull OpenCL カーネルコードの動作が正確な浮動小数点演算の結果に依存しているエミュレーターが CPU の浮動小数点計算ハードウェアを使用する一方でハードウェアの実行には FPGA コアとして実装されている浮動小数点コアが使用されます-fp-relaxedの aoc オプションをOpenCL カーネルコードに使用すると演算の順序が変わり浮動小数点の計算結果がさらに変動する可能性があります

注意 OpenCL の標準は各プラットフォームの浮動小数点計算の 下位ビットが 1 つ以上異なることを許容します一方でそれはどのプラットフォームでも正しいと見なされます

bull OpenCL カーネルコードの動作が異なるカーネルのチャネルアクセスの順序に依存しているチャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合にエミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

bull OpenCL カーネルまたはホストコードが範囲外のグローバルメモリーにアクセスしている

注意

mdash 初期化されていないメモリーの読み取りおよび書き込み動作はプラットフォームに依存しますカーネル内のすべてのアドレスを使用している場合clCreateBuffer関数呼び出しを割り当てている場合clEnqueueReadBufferとclEnqueueWriteBuffer関数呼び出しを転送している場合はグローバルメモリーのバッファーサイズを確認してください

mdash Valgrind などのソフトウェアメモリーリーク検出ツールをエミュレーションされたバージョンの OpenCL システムで使用するとメモリーに関する問題を分析できますこれらのツールからの警告がないということは問題がないということを意味するわけではありませんこれは単にツールが問題を検出できなかったことを意味するだけですインテルではこのような状況においてOpenCL カーネルまたはホストコードの手動検証を推奨しています

bull OpenCL カーネルコードが範囲外のローカルまたはプライベート変数にアクセスしている例えば範囲外のローカルまたはプライベート配列にアクセスしている場合やスコープ外になったプライベート変数にアクセスしている場合です

注意

範囲外の変数へのアクセスは通常ソフトウェアのスタックにおいてアクセスされている変数付近の無関係な変数に影響を及ぼすためこれらの問題はソフトウェア用語でスタックの破損問題と呼ばれていますエミュレーションされた OpenCL カーネルは通常の CPU 機能として実装されており破損する可能性のあるスタックを実際に持っていますハードウェアをターゲットにしている場合はスタックが存在しないためスタックの破損問題は必ず別の形で現れますスタックの破損が疑われる場合はValgrind などのメモリーリーク検証ツールを使用することが可能ですがスタック関連の問題の特定は通常困難ですインテルではスタック関連の問題をデバッグするためOpenCL カーネルコードを手動で検証することを推奨しています

bull OpenCL カーネルコードがシフトされる型よりも大きいシフトを使用している例えば 64 ビットの整数を 65 ビットでシフトしている場合などですOpenCL specification version 10 によるとこのようなシフトの動作は未定義です

bull エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度がカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なるこのチャネル深度の相違はカーネルのエミュレーションは問題なく機能する一方でハードウェアでの実行はハングアップするという状況を引き起こす可能性がありますチャネル深度の相違を修正する方法についてはチャネル深度のエミュレーション (128 ページ) を参照してください

bull 出力されるラインの順序に関してはprintf関数で出力される順序がエミュレーターとハードウェアで異なる場合がありますこれはハードウェアにおいて printfデータはグローバルメモリーバッファーに格納されカーネルの実行が完了した際またはバッファーがフルになった際にのみバッファーからフラッシュされるためですエミュレーターの printf関数はx86 stdoutを使用しています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

132

bull 型のアップキャストでアライメントされていないロードやストアを実行するとFPGA とエミュレーターでは異なる結果が生じる可能性がありますこの型のロードおよびストアはC99 の仕様では定義されていません

次例のような演算では予期しない結果になる可能性があります

int tmp = ((int ) (my_ptr + 5))

関連情報シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

88 高速エミュレーターの環境変数

高速エミュレーターの動作を変更する環境変数をいくつか利用することが可能です

OCL_TBB_NUM_WORKERS

エミュレーターが使用できる 大スレッド数を示しますデフォルト値は 32 大値は 255 です各スレッドは単一のカーネルを実行できます

アプリケーションで複数のカーネルを同時に実行する必要がある場合OCL_TBB_NUM_WORKERSを適切に設定する必要があります (使用されているカーネルの数またはそれ以上の値に設定してください)

CL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE

利用可能な OpenCL ローカルメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE

利用可能な OpenCL プライベートメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE

エミュレーションに向けて OpenCL カーネルをコンパイルするとカーネルをハードウェアに向けてコンパイルする際に生成されるチャネル深度とは異なるチャネル深度になりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数で変更できます詳細はチャネル深度のエミュレーション (128 ページ) を参照ください

関連情報チャネル深度のエミュレーション (128 ページ)

89 高速エミュレーターでサポートされている拡張機能

高速エミュレーターはさまざまな OpenCL 拡張機能に対しさまざまなレベルのサポートを提供しています

次の OpenCL の拡張機能は高速エミュレーターで完全にサポートされています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

133

bull cl_intel_fpga_host_pipe

bull cl_khr_byte_addressable_store

bull cl_khr_icd

bull cles_khr_int64

また次の OpenCL 拡張機能をレガシーエミュレーターと同様のレベルでサポートしています

bull cl_intel_channels

bull cl_khr_local_int32_base_atomics

bull cl_khr_local_int32_extended_atomics

bull cl_khr_global_int32_base_atomics

bull cl_khr_global_int32_extended_atomics

bull cl_khr_fp64

bull cl_khr_fp16

810 高速エミュレーターの既知の問題

高速エミュレーターの使用はいくつかの既知の問題に影響を受ける可能性があります起こりうる問題を回避するため高速エミュレーターを使用する際はこれらの問題を考慮ください

自動実行カーネル

自動実行カーネルはclReleaseProgram() 呼び出しの後ではなくホストプログラムの終了後にのみシャットダウンします

コンパイラー診断

一部のコンパイラー診断は高速エミュレーターに未実装です

clEnqueueNDRangeKernel() が返す CL_OUT_OF_RESOURCES エラー

高速エミュレーターがデフォルトでサポートしているよりも多くの__privateまたは__localメモリーをカーネルが使用している場合に発生する可能性があります

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE またはCL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE 環境変数を設定してください詳細は高速エミュレーターの環境変数 (133 ページ) を参照ください

clCreateKernel() が返す CL_INVALID_VALUE エラー

clBuildProgram() の呼び出しが行われていない可能性があります

プログラムがバイナリーから作成されている場合でもこの呼び出しは OpenCL 仕様に必要です詳細はOpenCL Specification version 10 の Section 542 を参照してください

uses_global_work_offsetカーネル属性は認識されない属性であるという警告

OpenCL 高速エミュレーターはuses_global_work_offsetカーネル属性をサポートしていません属性が無視されることを通知する警告がコンパイル時に出されることがありますがこの警告は高速エミュレーターにおけるカーネルの実行には影響しないため無視しても問題ありません

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

134

関連情報bull 高速エミュレーターの環境変数 (133 ページ)

bull The OpenCL Specification Version 10

811 レガシーエミュレーターの使用

インテル FPGA SDK for OpenCL バージョン 181 およびそれ以前のバージョンにおけるデフォルトのエミュレーターは現在も入手可能であり利用することができます ただしインテル FPGAOpenCL システムのエミュレーションには高速エミュレーターの利用を推奨しています

OpenCL カーネルのエミュレーションとデバッグ (125 ページ) で紹介されている推奨事項の多くはどちらのエミュレーターにも適用されますただしレガシーエミュレーターには次の章以降で説明されている違いがいくつかあります

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインでエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインのターゲットを SoC にすることが可能です

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)

レガシーエミュレーターでのエミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に以下の作業を実行してください

mdash FPGA アクセラレーターボードに対しボードメーカーから提供されているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認します

bull Windows システムでカーネルをエミュレーションするにはMicrosoft のリンカーおよびコンパイル用のライブラリーが別途必要になりますPATH 環境変数設定に インテル FPGA SDK forOpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設が インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

135

bull x86-64 ホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull 特定のボードをターゲットとするエミュレーションに向けてカーネルをコンパイルするには aoc-march=emulator -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向け インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードの機能的なエラーの原因を特定できるようになります

関連情報bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

81111 レガシーエミュレーターでのチャネル深度のエミュレーション

レガシーエミュレーターをターゲットにしている場合はエミュレーターのチャネル深度モデル作成における制御が異なります

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルをハードウェアに向けてコンパイルする際に生成されるデフォルトのチャネル深度とは異なりますこの動作はカーネルをエミュレーションに向けてコンパイルする際に-emulator-channel-depth-modelオプションを使用し変更することが可能です

-emulator-channel-depth-modelコンパイラーオプションは次の値を取ることができます

default 明示的な深度属性を持つチャネルは指定された深度持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるように選択されたデフォルトのチャネル深度が与えられます

strict FPGA のコンパイルに指定されている深度と一致するチャネル深度がエミュレーションのすべてのチャネル深度に与えられます

ignore-depth

カーネルのエミュレーション実行時間が 短になるように選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性はいずれも無視されます

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはご自身のカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行します

以下の手順でカーネルをエミュレーションしてください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

136

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションを構築するために必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーをどちらも表示します

2 ホストアプリケーションを構築し手順 1 で検索したライブラリーにリンクします

注意

複数のデバイスを他の OpenCL SDK と共にエミュレーションするにはホストアプリケーションをホストランタイムのライブラリーに接続する前 にKhronos ICD Loader Libraryに接続しますホストアプリケーションと ICD Loader Library の接続はホストアプリケーションの Makefileを変更して行います詳細は ホストアプリケーションと KhronosICD Loader Library のリンク (94 ページ) を参照ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置に移動します現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを実行するには

mdash Windows の場合 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を 初に定義しその後ホストアプリケーションを実行します

ホストアプリケーションを実行した後 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=を呼び出し変数の設定を解除します

mdash Linux の場合 envCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要がある同一のエミュレーションデバイス数を指定します

注意

環境変数 CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA を設定するとエミュレーションされたデバイスのみが利用可能になりますつまり物理的なボードへのアクセスはすべて無効になります

5 ホストまたはカーネルプログラムを変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行してください

エミュレーションされたカーネルを呼び出すたびに共有ライブラリーのコピーであるltprocess_IDgt-libkernelsoがデフォルトの一時ディレクトリーに作成されますこのltprocess_IDgt は各エミュレーションの実行に割り当てられた固有の数値ですWindows ではTMP または TEMP 環境変数を設定しデフォルトのディレクトリーを変更することができますLinux では TMPDIR の設定です

関連情報bull OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-

config または linkflags) (96 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL レガシーエミュレーターにOpenCL カーネルをデバッガーで実行しホストアプリケーションの一部としてデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証および設定を行うことが可能です

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

137

注意 カーネルのデバッグはホストのデバッグから独立していますWindows では Microsoft VisualStudio DebuggerLinux では GDB など既存のツールでホストコードをデバッグしてください

レガシーエミュレーションでのデバッグに向けて OpenCL カーネルをコンパイルするには以下を行います

1 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) (135 ページ) の説明に従いカーネルをコンパイルしてください

2 ホストアプリケーションを構築しKhronos ICD Loader Library に接続します詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ) を参照ください

3 ltyour_kernel_filenamegtaocxファイルがホストが特定できる位置にあることを確認します現在の作業ディレクトリーが推奨されます

4 env CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtgdb --args ltyour_host_program_namegt [lthost_program_argumentsgt]コマンドを呼び出しアプリケーションを実行しますここで ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムを変更した後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行してください

デバッガーでカーネルを実行するには以下を行います

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルが呼び出される前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグをまだ開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行の前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yを返答します 初のプログラムの実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 レガシーエミュレーターはOpenCL ランタイムにいくつかのエラーの詳細を報告しますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

138

9 カーネルの reporthtml ファイルのレビュー

注意 analyze-area インテル FPGA SDK for OpenCL ユーティリティーオプションは廃止されましたカーネルの推定エリア使用率を確認するにはreporthtmlファイルを参照してください

廃止されたエリアレポートに関する参考情報はAltera SDK for OpenCL Best Practices Guideversion 160 の Review Your Kernels Area Report to Identify Inefficiencies in ResourceUsage の章を参照ください

OpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーは面積ループ構造メモリーの使用率カーネルのパイプラインなどカーネルのさまざまな側面を分析する HTML レポートを自動的に生成しますHTML レポートを起動するには ltyour_kernel_filenamegtreportsディレクトリーのreporthtmlファイルを開きます

HTML レポートについての詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

関連情報bull カーネルの reporthtml ファイルのレビュー

bull Altera SDK for OpenCL Best Practices Guide version 160

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

10 OpenCL カーネルのプロファイリング

インテル FPGA Dynamic Profiler for OpenCL はFPGA での OpenCL カーネル実行中に収集したパフォーマンスデータを測定し報告します インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスカウンターに依存しパフォーマンスデータを収集しますパフォーマンスデータはその後Profiler GUI で確認することができます

1 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) (140 ページ)

2 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report) (141 ページ)

3 自動実行カーネルのプロファイリング (142 ページ)

101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

パフォーマンスカウンターで OpenCL カーネルのパイプラインを測定するにはaocコマンドの-profile=(all|autorun|enqueued)オプションをカーネルをコンパイルする際に含めます

注意 パフォーマンスカウンターで Verilog コードを測定するとハードウェアのリソース使用率が増加 (つまり FPGA のエリア使用率が増加) し通常パフォーマンスが低下します

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ltyour_kernel_filenamegtaocxファイルの Verilog コードをパフォーマンスカウンターで測定するには aoc -profile=(all|autorun|enqueued)ltyour_kernel_filenamegtclコマンドを呼び出します以下に詳細を説明します

mdash all引数は ltyour_kernel_filenamegtclファイルのすべてのカーネルをパフォーマンスカウンターで測定しますこれは引数が指定されていない場合のデフォルトのオプションです

mdash autorun引数は自動実行のカーネルのみをパフォーマンスカウンターで測定します

mdash enqueued引数は自動実行以外のカーネルのみをパフォーマンスカウンターで測定します

注意

mdash 複数の異なるカーネルをプロファイリングする際は異なるaocxファイルに同じカーネル名を使用しないでください同じカーネル名が付けられている場合それらのカーネルのプロファイルデータは正確なものになりません

mdash clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しへの入力にかかわらず インテル FPGA Dynamic Profiler for OpenCL はコンパイル中に示したカーネルタイプのみをプロファイルします

mdash すべてのカーネルまたはエンキューされたカーネルの OpenCL カーネルパイプラインをパフォーマンスカウンターで測定するとOpenCL ランタイム環境でのハードウェアのカーネル呼び出しキューの使用が無効になりますそのためプロファイルの時間が異なる場合があります

注意

自動実行カーネルをプロファイルするとカウンターに対するハードウェアのオーバーヘッドが発生します大規模なデザインの場合オーバーヘッドによって fmax およびデザイン周波数が低下する可能性がありますまた インテル FPGA Dynamic Profiler for OpenCL がすべてのカーネルをプロファイルするとデザインがチップに収まらなくなる可能性もあります

bull ローカルディスクからホストアプリケーションを実行しltyour_kernel_filenamegtaocxファイルを FPGA で実行しますカーネルの実行中カーネルパイプライン全体のパフォーマンスカウンターはプロファイル情報を収集しますホストは現在の作業ディレクトリーの profilemonモニター記述ファイルにその情報を保存します

注意

ネットワークディスクのアクセスが遅いためネットワークのディレクトリーからホストアプリケーションを実行すると各カーネルの実行に遅れをもたらす可能性がありますこの遅れによりホストアプリケーションの全体的な実行時間が長くなる可能性がありますさらにランタイムがプロファイル出力データをディスクに格納している間にカーネルの起動に遅れが発生する可能性もあります

102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report)

インテル FPGA Dynamic Profiler for OpenCL の reportユーティリティーコマンドを使用しプロファイラー GUI を起動することができますプロファイラー GUI ではカーネルの実行中にインテルFPGA Dynamic Profiler for OpenCL が収集するカーネルのパフォーマンスデータの統計情報を確認できます

インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスデータを現在の作業ディレクトリーの profilemonファイルに格納します

bull インテル FPGA Dynamic Profiler for OpenCL GUI を起動するには aocl reportltyour_kernel_filenamegtaocx profilemon[ltyour_kernel_filenamegtsource]ユーティリティーコマンドを呼び出します

重要 コマンドにsourceファイルを指定しない場合 インテル FPGA Dynamic Profiler forOpenCL GUI はソースコードタブを持たなくなります

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

141

103 自動実行カーネルのプロファイリング

自動実行カーネルのプロファイル機能は自動実行カーネルのプロファイルを可能にします

autorun属性でマークされたカーネルは自動実行カーネルと呼ばれますしたがって自動実行カーネルはホストが明示的に他のカーネルを起動する前に自動的に開始され完了すると自動的に再起動しますautorun属性についての詳細はホストとカーネル間の通信ハードウェアの省略を参照ください

自動実行カーネルは終了することがないためホストライブラリー呼び出しのclGetProfileDataDeviceIntelFPGAを呼び出し自動実行のプロファイルデータをキャプチャーする必要がありますホストアプリケーションに指示することでこの呼び出しは実行中の任意のタイミングで行うことができます

注意 自動実行カーネルのプロファイリング機能はグローバルメモリーを使用する自動実行カーネルをサポートしておらずカーネルの個別プロファイリングも行うことができません

関連情報bull ホストとカーネル間の通信ハードウェアの省略 (175 ページ)

bull エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ページ)

bull プロファイルデータの取得 (89 ページ)

bull 複数の自動実行プロファイリング呼び出し (89 ページ)

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発

インテル Code Builder for OpenCL は インテル FPGA SDK for OpenCL の一部として提供されているソフトウェア開発ツールですこのツールは インテル FPGA をターゲットとする一般的に広く利用されている統合開発環境での OpenCL アプリケーションの開発を可能にします

インテル Code Builder for OpenCL はOpenCL によって加速された Windows および Linux アプリケーションの作成構築デバッグ分析を可能にする一連の Microsoft Visual Studio およびEclipse のプラグインを提供します

111 Microsoft Visual Studio に向けた インテル Code Builder forOpenCL オフラインコンパイラープラグインのコンフィグレーション

Microsoft Visual Studio に向けてインテル Code Builder for OpenCL プラグインを有効にするには次の手順を実行します

1 Visual Studio ソフトウェアでProject gt Properties を選択します

2 Project gt Properties gt Code Builder のページでDevice を目的の FPGA デバイスに変更します

3 CC++ gt General プロパティーページの Additional Include Directories にOpenCL コードのヘッダーファイルが配置されているディレクトリーへのフルパスを入力します($(INTELFPGAOCLSDKROOT)include)

4 Linker gt General プロパティーページの Additional Library Directories にOpenCL コードのランタイムインポートライブラリーファイルが配置されているディレクトリーへのフルパスを入力します例えば 64 ビットのアプリケーションには$(INTELFPGAOCLSDKROOT)libx64を追加します

5 Linker gt Input プロパティーページAdditional Dependencies の OpenCL ICD のインポートライブラリーファイル名に OpenCLlibを入力します

112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション

Eclipse IDE に向けてインテル Code Builder for OpenCL オフラインコンパイラープラグインを有効にするには次の手順を実行します

1 CodeBuilder_ltversiongtjarプラグインファイルを$INTELFPGAOCLSDKROOTeclipse-plug-inから ltECLIPSE_ROOT_FOLDERgtdropinsへコピーします

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

注意 Linux では$INTELFPGAOCLSDKROOTbinを LD_LIBRARY_PATH環境変数に追加する必要があります

2 Eclipse IDE を実行します

3 Windows gt Preferences を選択します

4 インテル OpenCL ダイアログに切り替えます

5 OpenCL バイナリーのディレクトリーを$INTELFPGAOCLSDKROOTbinに設定します

オフラインコンパイラーのコンフィグレーションが完了するとCode-Builder メニューを使用し次の基本的な操作を実行できます

bull 新しいセッションの作成

bull 既存のセッションを開く

bull セッションの保存

bull セッションの構築

bull セッションのコンパイル

bull セッションのコンフィグレーション

インテル Code Builder for OpenCL に関する詳細はDeveloper Guide for Intel SDK forOpenCL Applications を参照くださいMicrosoft Visual Studio に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Microsoft Visual Studio を参照くださいEclipse に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Eclipse を参照ください

関連情報bull Developer Guide for Intel SDK for OpenCL Applications

bull Intel Code Builder for OpenCL API for Microsoft Visual Studio

bull Intel Code Builder for OpenCL API for Eclipse

113 インテル Code Builder for OpenCL でのセッションの作成

インテル Code Builder for OpenCL でセッションを作成するには次の手順を実行します

1 Code-Builder gt OpenCL Kernel Development gt New Session を選択します

2 セッション名セッションファイルを格納するフォルダーへのパスおよびセッションのコンテンツを指定します (空のセッションまたは事前に定義された OpenCL コードを持つセッションのどちらか)

3 Done をクリックします

セッションが作成されると新しいセッションが Code Builder Sessions Explorer ビューに表示されます

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

144

図 -16 Code Builder Session Explorer

注意 Code Builder Session Explorer ビューが表示されない場合はCode-builder gt OpenCLKernel Development gt Windows gt Code Builder Session Explorer を選択します

114 セッションのコンフィグレーション

コンフィグレーションとは割り当てられた変数反復回数特定のカーネルのグローバルサイズとローカルサイズなどの一連の分析の入力です分析が必要な入力のセットごとに個別のコンフィグレーションを作成することができます

Code Builder Session Explorer のセッションを右クリックし Session Options を選択するとセッションをコンフィグレーションできますあるいはCode-Builder gt OpenCL KernelDevelopment gt Session Options を選択するとSession Settings ダイアログボックスを開くことができます

Session Settings ダイアログボックスでは次の内容をコンフィグレーションすることができます

bull ターゲットマシンOpenCL プラットフォームOpenCL デバイスなどのデバイスオプション

bull オフラインコンパイラーフラグやビルドアーキテクチャーなどのビルドオプション

bull aocxおよびaocoファイルなどのビルドアーティファクトや静的レポート

bull ジョブアーキテクチャーやネットワーク設定などの一般的なオプション

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

145

Device Options タブの OpenCL platform ドロップダウンリストから インテル FPGA SDKfor OpenCL を選択していることを確認してください

Build Options タブの OpenCL Build Options セクションに インテル FPGA SDK forOpenCL オフラインコンパイラーフラグを手動で入力します

注意 カーネルにチャネルがある場合ワークフローをコンフィグレーションする必要がありますワークフローは一連のカーネルであり連続して実行することができますワークフローはあるカーネルの入力が前のカーネルの出力と接続しているチャネルでワークロードを実行するために使用できます (両方のカーネルに同じ変数を割り当てる必要があります)

セッションのコンフィグレーションと変数管理についてはDeveloper Guide for Intel SDK forOpenCL Applications を参照ください

関連情報bull Configuring a Session in Microsoft Visual Studio

bull Configurations and Settings in Eclipse

bull Variable Management in Microsoft Visual Studio

bull Variable Management in Eclipse

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

146

12 インテル FPGA SDK for OpenCL のアドバンスト機能

インテル FPGA SDK for OpenCL が提供するアドバンスト機能を使用しデザインアーキテクチャーの以下の側面および インテル FPGA SDK for OpenCL オフラインコンパイラーの動作を制御することができます

121 OpenCL ライブラリー

OpenCL ライブラリーは複数の機能を含む単一のファイルです各機能は任意のクロック周波数で動作するデータ処理ロジックで構成されています OpenCL ライブラリーはOpenCL あるいはレジスター転送レベル (RTL) で作成できますこのライブラリーファイルをインクルードしOpenCL カーネル内の関数を使用することができます

図 -17 インテル FPGA SDK for OpenCL のライブラリーサポートの概要

OpenCL

Verilog

VHDL OpenCL Kernel

OpenCL LibraryIntel FPGA SDK for OpenCL

Offline CompilerOffline Compiler

Executable File (aocx)

以前に作成したライブラリーを使用することも独自のライブラリーを作成することも可能ですOpenCL ライブラリーの使用にあたりハードウェアデザインやライブラリーコンポーネントの実装に関する詳細な知識は必要ありませんOpenCL ライブラリーを作成するには次のファイルとコンポーネントを作成する必要があります

表 4 OpenCL ライブラリーの作成に必要なファイルとコンポーネント

ファイルまたはコンポーネント 説明

RTL コンポーネント

RTL ソースファイル RTL コンポーネントを定義する VerilogSystem VerilogまたはVHDL ファイルですインテル Quartus Prime IP ファイル (qip)SDC ファイル(sdc)Tcl Script ファイル (tcl) などの付加的なファイルは使用することができません

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ファイルまたはコンポーネント 説明

eXtensible Markup Language ファイル (xml) RTL コンポーネントのプロパティーを記述します インテル FPGASDK for OpenCL オフラインコンパイラーはこれらのプロパティーを使用し RTL コンポーネントを OpenCL パイプラインに統合します

ヘッダーファイル (h) RTL コンポーネントにより実装される関数のシグニチャーを宣言するCスタイルのヘッダーファイルです

OpenCL エミュレーションモデルファイル (cl) エミュレーションでのみ使用される RTL コンポーネントの C モデルを提供しますハードウェアのフルコンパイルには RTL ソースファイルを使用します

OpenCL の機能

OpenCL ソースファイル (cl) OpenCL 関数の定義を含んでいますこれらの関数はエミュレーションおよびハードウェアのフルコンパイルの際に使用されます

ヘッダーファイル (h) OpenCL ソースファイルで定義される関数のシグネチャーを宣言する Cスタイルのヘッダーファイルです

注意 RTL と OpenCL ライブラリー関数に使用されるヘッダーファイルに違いはありません単一のヘッダーファイルで両方の関数の型を宣言することができます単一のライブラリーにRTL と OpenCL のライブラリーの関数をどちらも含めることができます

RTL モジュールと OpenCL パイプラインの理解 (148 ページ)

OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 (161 ページ)

OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化 (162 ページ)

RTL モジュールの検証 (164 ページ)

複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ)

OpenCL ライブラリーのコマンドラインオプション (170 ページ)

関連情報OpenCL ライブラリーのコマンドラインオプション (170 ページ)

1211 RTL モジュールと OpenCL パイプラインの理解

OpenCL のライブラリー機能によりVerilogSystemVerilogVHDL で記述された RTL モジュールを OpenCL カーネルで使用することができます この章では インテル FPGA SDK for OpenCL オフラインコンパイラーがRTL モジュールをインテル FPGA SDK for OpenCL パイプラインアーキテクチャーに統合する方法の概要を説明します

次の状況において RTL モジュールを使用してください

bull 適化および検証がされた RTL モジュールをOpenCL 関数として書き直すことなく OpenCL カーネルで使用する場合

bull OpenCL で効果的に表現できない OpenCL カーネル機能を実装する必要がある場合

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

148

12111 インテル FPGA SDK for OpenCL パイプラインのアプローチの概要

次の図はインテル FPGA SDK for OpenCL パイプラインのアーキテクチャーを表しています

図 -18 インテル FPGA SDK for OpenCL パイプラインステージの並列実行モデル右側の動作は左側の OpenCL カーネルコードにおける SDK のパイプライン実装を表しています黄色の各ボックスはパイプラインにある動作またはデータの値です各動作に付けられている数字はパイプラインのスレッド数を表します

Load A Load B

Add

Store C

global ID (gid)

gid

gid

2

1

0

2 2

3

1

void kernel pe (global int A global int B global int C) int gid = get_global_id(0)

int a = A[gid] int b = B[gid]

C[gid] = a + b

各レベルの動作がパイプラインの 1 ステージであると仮定します各ステージにおいてインテル FPGASDK for OpenCL はそのステージに存在するスレッドに基づきすべての動作を並列で実行します例えばスレッド 2 では Load ALoad B を実行し現在のグローバル ID を (gidを介し) 次のパイプラインステージにコピーしますRISC (縮小命令セットコンピューター) プロセッサーでのパイプライン化された命令の実行と同様SDK のパイプラインステージもまた並列して実行を行いますステージの実行がすべて完了しなければスレッドは次のパイプラインステージに進みません

Add

oready

iready

ivalid

ovalid

一部の動作ではインテル FPGA SDK for OpenCL パイプラインをストールさせることができます例えばメモリーのロードやストア動作のような可変レイテンシー動作などがそれにあたりますストールをサポートするにはready 信号と valid 信号をパイプライン全体に伝播しオフラインコンパイラーがパイプラインステージをスケジュールできるようにしますただしすべての動作のレイテンシーが固定されている場合ready 信号は必要ありませんこのような場合オフラインコンパイラーはパイプラインを 適化し静的に動作をスケジュールするためパイプラインの実装に必要なロジックが大幅に削減されます

12112 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合

カーネルのコンパイル中に OpenCL ライブラリーを指定するとオフラインコンパイラーはライブラリーの RTL モジュールをパイプライン全体に統合します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

149

図 -19 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合この図はRTL モジュール myModを図 18 (149 ページ) のパイプラインへ統合しているものです

Load A Load B

myMod

Store C

gid

gid

gid

4

3

0

4 4

5

3

myMod

oready

iready

ivalid

ovalid

extern int myMod(int int)void kernel pe(global int A global int B global int C)

int gid = get_global_id(0) int a = A[gid] int b = B[gid] C[gid] = myMod(a b)

2

1

gid2

gid1

3 cycles

示されている RTL モジュールはバランスの取れたレイテンシーを有しRTL モジュールのスレッドはパイプラインのステージ数と一致していますレイテンシーのバランスが取れているためRTL モジュールのスレッドは SDK のパイプラインをストールさせることなく実行することができます

RTL の仕様ファイルで RTL モジュールのレイテンシーを設定するとオフラインコンパイラーはパイプラインのレイテンシーのバランスを取ることができるようになります RTL は Avalontrade Streaming(Avalontrade -ST) インターフェイスをサポートしているためRTL モジュールのレイテンシシーは可変です (つまり固定ではありません)ただし性能を 大限に上げるためにはレイテンシーの変動は小さくなければなりませんさらにレイテンシーを ltRTL module description filenamegtxml仕様ファイルで指定するとRTL モジュールは安定状態で実際のレイテンシーの適切な概算を得られるようになります

関連情報bull Avalon Interface Specifications

bull Pipelined Read Transfer with Variable Latency

bull Pipelined Read Transfers with Fixed Latency

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ)

bull RTL モジュールの XML 構文 (154 ページ)

12113 ストールのない RTL

インテル FPGA SDK for OpenCL オフラインコンパイラーではレイテンシーを固定し RTL モジュール周辺のストールロジックを削除することによりハードウェアのリソース使用率とパフォーマンスを適化できます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

150

可変レイテンシーを持ちAvalon-ST の入出力信号を使用する RTL モジュールは入力データの準備が整うまで待機します一方インテル FPGA SDK for OpenCL パイプラインはRTL モジュールからの有効な出力データを受け取るまでストールします固定レイテンシーを有する RTL モジュールではltRTL module description file namegtxml仕様ファイルを次の記述のように変更することでRTL のストールを削除することができます

1 可能な場合に RTL モジュール周囲のストールロジックを削除するようオフラインコンパイラーに指示するにはFUNCTION要素の IS_STALL_FREE属性をyesに設定します

この変更はRTL モジュールが EXPECTED_LATENCYサイクルごとに有効なデータを生成することをオフラインコンパイラーに通知します

注意 EXPECTED_LATENCYはFUNCTION要素のxmlファイルで指定する属性です

2 レイテンシーがモジュールのパイプラインステージ数に等しくなるよう EXPECTED_LATENCYの値を指定します

注意 不正確な EXPECTED_LATENCYの値を指定するとRTL モジュールがパイプラインの他の部分と同期しなくなります

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを通して無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールではivalid=0入力の処理に注意する必要があります

12114 RTL モジュールインターフェイス

RTL モジュールが他のコンパイラーによって生成された動作と適切に通信するにはRTL モジュールの入力および出力の両方において単純化された Avalon-ST インターフェイスをサポートする必要があります

次の図は図 19 (150 ページ) で示されている RTL モジュール myModの 終的なインターフェイスを表しています

Upstream module

Downstream module

oready ivalid A B

iready ovalid C

myMod

この図において myModはABのデータ信号や ivalid (入力) および oready (出力) のコントロール信号を介しアップストリームのモジュールと通信していますivalidコントロール信号はデータ信号 Aおよびデータ信号 Bが有効なデータを含む場合のみ1に等しくなります (ivalid =1)コントロール信号 oreadyが 1 に等しくなると (oready = 1)データ信号 Aと Bが有効であれば (ivalid = 1)myMod RTL モジュールはそれらの信号の処理を行うことができることを示しますivalid = 1で oready = 0の場合アップストリームのモジュールは次のクロックサイクルで ivalidAおよび Bの値を保持すると考えられます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

151

myModはデータ信号 Cおよびコントロール信号の ovalid (出力) と iready (入力) を介しダウンストリームのモジュールと通信しますovalidコントロール信号はデータ信号 Cが有効なデータを含む場合にのみ1に等しくなります (ovalid = 1)ireadyコントロール信号が 1に等しくなると (ivalid = 1)データ信号 Cが有効であればダウンストリームのモジュールは処理が可能なことを示しますovalid = 1で iready = 0の場合myMod RLT モジュールは次のクロックサイクルで ovalidと C信号の有効性を保持すると考えられます

myModモジュールはoreadyを 1 クロックサイクル間アサートしアクティブサイクルに向け準備が整っていることを示しますmyModモジュールのデータの準備ができているサイクルをレディーサイクルと呼びますレディーサイクル中myModモジュールの上にあるモジュールはivalidをアサートし myModにデータを送信することができます

バックプレッシャー下でのデータ転送に関する詳細な説明はAvalon Interface Specifications のData Transfer with Backpressureを参照くださいレディーレイテンシーに関する情報は参考にしないでください

関連情報Data Transfer with Backpressure

12115 Avalon Streaming (Avalon-ST) インターフェイス

オフラインコンパイラーは入力と出力の両方において RTL モジュールがreadyLatency = 0の Avalon-ST インターフェイスをサポートすることを想定しています

図 19 (150 ページ) で示されているようにRTL モジュールには 4 つのポートがなければなりません

bull Avalon-ST インターフェイス入力の ivalidと iready

bull Avalon-ST インターフェイス出力の ovalidと oready

次にバックプレッシャーでの入力データ転送のタイミング図を示していますAvalon-ST インターフェイスに関する詳細はAvalon Interface Specifications の Avalon Streaming Interfaces の章を参照ください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

152

固定レイテンシーを持つ RTL モジュールの場合出力信号 (ovalidと oready) は一定の高い値を持つことができ入力レディー信号 (iready) は無視することができます

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを介し無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールにおいてはivalid = 0入力の処理に注意する必要があります

12116 RTL リセットおよびクロック信号

RTL モジュールのリセットおよびクロックはOpenCL パイプラインの他の部分と同じクロックおよびリセットドライバーに接続されています

共通のクロックドライバーとリセットドライバーであるためRTL モジュールは OpenCL カーネルと同じクロックドメインで動作しますモジュールは インテル FPGA SDK for OpenCL の programユーティリティーまたは clCreateProgramwithBinaryホスト関数でOpenCL カーネルが 初に FPGA にロードされた際にのみリセットされますつまりホストがカーネルを連続するclEnqueueNDRangeKernelまたは clEnqueueTask呼び出しで再起動した場合関連するRTL モジュールはこの再起動時にリセットされません

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

153

カーネルのクロック周波数を設定する過程を次に説明します

1 インテル Quartus Prime ソフトウェアのフィッターはカーネルクロックに積極的な制約を適用します

2 インテル Quartus Prime ソフトウェアのタイミングアナライザーは静的なタイミング解析を実行しフィッターが実際に達成する周波数を決定します

3 カーネルのクロックを駆動するフェーズロックループ (PLL) は上記 2 で決定された周波数をカーネルのクロック周波数に設定します

オプションにより RTL モジュールはOpenCL カーネルクロックの 2 倍の周波数で動作するシステム全体のクロックにアクセスできますこのシステム全体のクロックを RTL モジュールの入力信号に接続するにはAVALON要素のタイプ clock2xを含めますこの 2 つのクロックは定義された位相関係を持ちません

121161 ストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテル Stratix10 デザイン固有のリセット要件

インテル Stratix 10 OpenCL デザインに RLT モジュールを作成する際は特定のロジックリセット要件を満たしていることを確認してください

ストールのない RTL モジュールのリセット要件

ストールのない RTL モジュールはレイテンシーが固定されたモジュールであり インテル FPGA SDKfor OpenCL オフラインコンパイラーはストールロジックを削除し 適化することができます

bull インテル Stratix 10 のデザインに向けストールのない RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールのない RTL モジュールに対するリセットシグナルのディアサート後モジュールは 15 クロックサイクル以内に動作可能でなければなりませんリセット信号がモジュール内でパイプライン化されている場合この要件はリセットのパイプライン化を 15 ステージ以下に制限します

ストールをサポートする RTL モジュールのリセット要件

ストールをサポートする RTL モジュールは可変レイテンシーを持ち正確に機能するためにバックプレッシャー入力および出力インターフェイスに依存します

bull インテル Stratix 10 デザインにストールをサポートする RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールをサポートする RTL モジュールにリセット信号をアサートした後モジュールは oreadyおよび ovalidインターフェイス信号を 40 クロックサイクル内にディアサートしなければなりません

bull ストールをサポートする RTL モジュールにリセット信号をディアサートした後モジュールは 40 クロックサイクル以内に完全に動作可能になる必要がありますモジュールは準備が完了したことを oreadyインターフェイス信号をアサートし知らせます

関連情報ストールのない RTL (150 ページ)

12117 RTL モジュールの XML 構文

この章では倍精度平方根関数を実装する RTL モジュールのシンプルな XML 仕様ファイルの構文を提供しますRTL モジュールはVerilog ラッパーで VHDL に実装されています

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

154

次の XML 仕様ファイルはOpenCL のヘルパー関数 my_sqrtfdを実装する RTL モジュールmy_fp_sqrt_doubleのものです (どちらの名前もライン 2 にあります)

1 ltRTL_SPECgt 2 ltFUNCTION name=my_sqrtfd module=my_fp_sqrt_doublegt 3 ltATTRIBUTESgt 4 ltIS_STALL_FREE value=yesgt 5 ltIS_FIXED_LATENCY value=yesgt 6 ltEXPECTED_LATENCY value=31gt 7 ltCAPACITY value=1gt 8 ltHAS_SIDE_EFFECTS value=nogt 9 ltALLOW_MERGING value=yesgt 10 ltATTRIBUTESgt 11 ltINTERFACEgt 12 ltAVALON port=clock type=clockgt 13 ltAVALON port=resetn type=resetngt 14 ltAVALON port=ivalid type=ivalidgt 15 ltAVALON port=iready type=ireadygt 16 ltAVALON port=ovalid type=ovalidgt 17 ltAVALON port=oready type=oreadygt 18 ltINPUT port=datain width=64gt 19 ltOUTPUT port=dataout width=64gt 20 ltINTERFACEgt 21 ltC_MODELgt 22 ltFILE name=c_modelcl gt 23 ltC_MODELgt 24 ltREQUIREMENTSgt 25 ltFILE name=my_fp_sqrt_double_s5v gt 26 ltFILE name=fp_sqrt_double_s5vhd gt 27 ltREQUIREMENTSgt 28 ltRESOURCESgt 29 ltALUTS value=2057gt 30 ltFFS value=3098gt 31 ltRAMS value=15gt 32 ltMLABS value=43gt 33 ltDSPS value=15gt 34 ltRESOURCESgt 35 ltFUNCTIONgt 36 ltRTL_SPECgt

表 5 XML 仕様ファイルにおける要素と属性

XML 要素 説明

RTL_SPEC XML 仕様ファイルにおける 上位の要素ですこのような 上位の要素はファイルに 1 つしか存在できません

FUNCTION RTL モジュールが実装する OpenCL 関数を定義する要素ですFUNCTION要素の name属性は関数の名前を指定しますOpenCL カーネルから呼び出すことのできる異なる関数を宣言する複数の FUNCTION要素を持つことが可能です異なるパラメーターを指定することで同じ RTL モジュールに複数の関数を実装できます

ATTRIBUTES RTL モジュールのさまざまな特性 (レイテンシーなど) を記述する他の XML 要素を含む要素です例にある RTL モジュールは32 の値を持つ WIDTHという PARAMETER設定を 1 つ取りますその他の ATTRIBUTES固有の要素に関しては表 6 (156 ページ) を参照ください

注意

異なるモジュールに複数の OpenCL ヘルパー関数を作成する場合や異なるPARAMETER設定で同じ RTL モジュールを使用する場合は関数ごとに個別のFUNCTION要素を作成する必要があります

INTERFACE RTL モジュールのインターフェイスを記述する他の XML 要素を含む要素です例にある XML仕様ファイルではすべての RTL モジュールが提供する必要のある Avalon-ST インターフェイス信号 (clockresetnivalidireadyovalidoready) を示していますこの信号名はxmlファイルで指定する名前と一致している必要があります信号名が一致しない場合ライブラリー作成時にエラーが発生します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

155

XML 要素 説明

C_MODEL 関数に OpenCL C モデルを実装する 1 つ以上のファイルを指定する要素ですモデルはエミュレーション時にのみ使用されますただしC_MODEL要素と関連するファイルはライブラリーファイル作成時に存在している必要があります

REQUIREMENTS 1 つ以上の RTL リソースファイル (vsvvhdhexmif) を指定する要素ですこれらのファイルに指定されたパスはXML 仕様ファイルの位置に対応します各 RTL リソースファイルはOpenCL システム全体に対応する関連するプラットフォームデザイナーコンポーネントの一部になります注意

インテル FPGA SDK for OpenCL ライブラリー機能はqipファイルをサポートしませんサポートされていないリソースファイルタイプを含むライブラリーを使用しOpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーのエラーが発生します

 

RESOURCES RTL モジュールが使用する FPGA リソースを指定するオプションの要素ですこの要素を指定しない場合RTL モジュールが使用する FPGA リソースはデフォルトのゼロになります

121171 ATTRIBUTES を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの特性を設定するために指定できる XML 要素が ATTRIBUTESにあります

表 6 RTL モジュールの XML 仕様ファイルにおける ATTRIBUTES 要素に関連する XML 要素

注意 IS_STALL_FREEおよび EXPECTED_LATENCYを除きすべての要素には安全な値があります属性に指定する値に確信がない場合は安全な値を設定してください安全な値を使用するライブラリーでカーネルをコンパイルすると機能的なハードウェアをもたらしますただしハードウェアは実際のサイズよりも大きい場合があります

XML 要素 説明

IS_STALL_FREE インテル FPGA SDK for OpenCL オフラインコンパイラーにRTL モジュール周囲のすべてのストールロジックを削除するように指示しますIS_STALL_FREEをyesに設定しモジュールでストールを生成しないことおよび受信ストールの適切な処理ができないことを示しますモジュールはストールの入力を単純に無視しますIS_STALL_FREEをnoに設定する場合モジュールはストールおよび有効な信号をすべて適切に処理する必要があります

注意 IS_STALL_FREEをyesに設定する際はIS_FIXED_LATENCYもyesに設定する必要がありますまたRTL モジュールが内部状態がを持つ場合ivalid=0入力を適切に処理する必要があります

不正な IS_STALL_FREEを設定するとハードウェに不正確な結果をもたらします

IS_FIXED_LATENCY RTL モジュールのレイテンシーが固定されているかどうかを示しますRTL モジュールが常に既知のクロックサイクル数で出力を計算する場合はIS_FIXED_LATENCYをyesrdquoに設定しますEXPECTED_LATENCY要素に指定する値はクロックサイクル数を指定しますIS_FIXED_LATENCYの安全な値はnordquoですIS_FIXED_LATENCY=noを設定する際にEXPECTED_LATENCYの値は少なくとも 1 でなければなりません

注意

特定のモジュールではIS_FIXED_LATENCYをyesにしIS_STALL_FREEをnoに設定することができますこのようなモジュールは固定のクロックサイクル数で出力を生成しストール信号を適切に処理します

EXPECTED_LATENCY RTL モジュールの予想されるレイテンシーを指定しますIS_FIXED_LATENCYをyesに設定するとEXPECTED_LATENCYの値はモジュールにあるパイプラインのステージ数を示しますこの場合この値はモジュールの正確なレイテンシーに設定する必要があります正確に設定されていない場合オフラインコンパイラーは不正確なハードウェアを生成しますレイテンシーが可変のモジュールにおいてはオフラインコンパイラーはこのモジュール周辺のパイプラインを指定した EXPECTED_LATENCYの値でバランスを取りますストールをサポートしireadyなどの信号を必要とするモジュールにおいてはEXPECTED_LATENCYの値は 低でも 1 に設定する必要があります指定した値と実際のレイテンシーは異なることがありパイプラインのストール数に影響を与える場合があります ただし生成されるハードウェアは正しいものです

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

156

XML 要素 説明

CAPACITY このモジュールが同時に処理できる複数の入力の数を指定しますIS_STALL_FREE=noおよびIS_FIXED_LATENCY=noも設定する場合はCAPACITYの値を指定する必要がありますそれ以外の場合は CAPACITYの値を指定する必要はありませんCAPACITYが EXPECTED_LATENCYよりもわずかでも小さい場合オフラインコンパイラーは必要に応じて容量のバランスをとる FIFO バッファーをこのモジュールの後に自動的に挿入しますCAPACITYの安全な値は 1です

HAS_SIDE_EFFECTS RTL モジュールに副作用があるかどうかを示します内部状態のあるモジュールや外部メモリーと通信するモジュールは副作用をともなうモジュールの例になりますHAS_SIDE_EFFECTSをyesに設定しモジュールに副作用があることを示しますHAS_SIDE_EFFECTSをyesに指定すると 適化を行う際に副作用のあるモジュールへの呼び出しは削除されません副作用がありストールのないモジュール (IS_STALL_FREE=yesでありHAS_SIDE_EFFECTS=yesのモジュール) は無効なデータを受け取る可能性があるためivalid=0の入力を適切に処理する必要がありますHAS_SIDE_EFFECTSの安全な値はyesです

ALLOW_MERGING オフラインコンパイラーにRTL モジュールの複数のインスタンスをマージするよう指示しますALLOW_MERGINGをyesに設定しモジュールの複数のインスタンスのマージを可能にしますインテルではALLOW_MERGINGをyesに設定することを推奨していますALLOW_MERGINGの安全な値はnoです

注意 HAS_SIDE_EFFECTS=yesでモジュールをマークしてもマージを防ぐことはできません

PARAMETER RTL モジュールのパラメーター値を指定しますPARAMETERの属性bull namemdashRTL モジュールのパラメーター名を指定しますbull valuemdashパラメーターに 10 進数の値を指定しますbull typemdashシステムパラメーターにRTL モジュールのパラメーター値として使用される値を指定します次

のシステムパラメーター名を type属性で使用できますmdash bspaddresswidthmdashボードサポートパッケージの OpenCL グローバルメモリーにコンフィグレ

ーションされたメモリー範囲のアドレスを指定するために必要なAvalon メモリーバス幅を指定します

注意 RTL モジュールのパラメーター値はvalue属性または type属性を使用し指定できます

121172 INTERFACE を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはRTL モジュールのインターフェイスの側面を指定するために定義できる XML 要素が INTERFACEにあります(Avalon-ST インターフェイスなど)

表 7 RTL モジュール XML 仕様ファイルの INTERFACE 要素に関連のある必須 XML 要素

XML 要素 説明

INPUT RTL モジュールの入力パラメーターを指定しますINPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

AOCL はOpenCL のデータ型に対応する幅のみをサポートしますつまり 8 (uchar)1632641282565121024 (long16) ビットのみをサポートします

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力パラメーターは連結されて入力ストリームを形成します構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

出力 RTL モジュールの出力パラメーターを指定します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

157

XML 要素 説明

OUTPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

SDK はOpenCL のデータ型に対応する幅のみをサポートしますつまり8 (uchar)1632641282565121024 (long16) ビットのみのサポートです

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力ストリームからの戻り値は出力ストリームの出力パラメーターを介し送信されます構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

RTL モジュールが外部メモリーと通信する場合はXML 要素を追加し含める必要があります

ltMEM_INPUT port=m_input_A access=readonlygtltMEM_INPUT port=m_input_sum access =readwritegtltAVALON_MEM port=avm_port0 width=512 burstwidth=5 optype=read buffer_location=gt

表 8 外部メモリーアクセスをサポートするために追加する XML 要素

XML 要素 説明

MEM_INPUT RTL モジュールへのポインター入力を記述しますMEM_INPUT属性bull portmdashポインター入力の名前を指定しますbull accessmdashRTL モジュールにおけるこのポインターの使用方法をインテル FPGA SDK

for OpenCL オフラインコンパイラーに指定します有効なアクセスの値はreadonlyと readwrite ですRTL モジュールがこのポインターでのみ書き込む場合はreadwriteを accessに割り当てます

外部メモリーへのポインターはすべて 64 ビットである必要があるためMEM_INPUTに関連付けられる width属性はありません

AVALON_MEM RTL モジュールの Avalon-MM インターフェイスを宣言しますAVALON_MEM属性bull portmdashRTL モジュールの対応するポート名のルートを指定します例えば port が

avm_port0_の値を持っている場合RTL モジュールの Avalon-MM インターフェイスのポート名はすべてavm_port0_で始まります

bull width mdash デ ー タ幅 を指定 し ま す こ の 値は ア ク セ ラ レ ー タ ー ボ ー ド のboard_specxml ファイルの対応する幅の値と一致している必要がありますboard_specxml ファイルでは幅の値は global_mem の interface要素で指定されています詳細は インテル FPGA SDK for OpenCL カスタムプラットフォームツールキットユーザーガイドの Board_specxml ファイル内の XML 要素属性およびパラメーターにある global_mem の章を参照ください

bull burstwidthmdashバーストサイズを表すために必要なビット数を指定します burstwidth = log(maxburst) +1 を使用しバーストサイズを計算しますこのmaxburstはboard_specxmlファイルで指定された対応する 大バーストサイズです例えば maxburst=16 の場合burstwidth=5 です

bull optypemdash Avalon-MM ポートが外部メモリーから読み取り (read) を行うか書き込み(write) を行うかを指定しますoptypeには readまたは writeのいずれかしか割り当てることができません

bull Buffer_locationmdash異種メモリーをサポートします異種メモリーコンパイルフローは現在検証されていないためこの属性は空白のままにしてください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

158

上のコード例で定義された AVALON_MEM要素に対応する RTL モジュールポートは次のようになります

output avm_port0_enableinput [5110] avm_port0_readdatainput avm_port0_readdatavalidinput avm_port0_waitrequestoutput [310] avm_port0_addressoutput avm_port0_readoutput avm_port0_writeinput avm_port0_writeackoutput [5110] avm_port0_writedataoutput [630] avm_port0_byteenableoutput [40] avm_port0_burstcount

MEM_INPUTで指定するポインターと AVALON_MEMで指定する Avalon-MM インターフェイス間に想定の関係はありませんRTL モジュールは 1 つのポインターを使用し0 から複数の Avalon-MMインターフェイスのアドレスを指定することができます

関連情報Board_specxml ファイル内の XML 要素属性およびパラメーター

121173 リソースを指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの FPGA リソース使用率を指定するために定義できるオプションの要素が RESOURCESにあります特定の要素を指定しない場合はデフォルト値のゼロになります

表 9 RTL モジュールの XML 仕様ファイルの RESOURCES 要素に関連する XML 要素

XML 要素 説明

ALUTS モジュールが使用する組み合わせ対応可能なルックアップテーブル (ALUT) の数を指定します

FFS モジュールが使用する専用のロジックレジスター数を指定します

RAMS モジュールが使用するブロック RAM の数を指定します

DSPS モジュールが使用するデジタル信号処理 (DSP) ブロックの数を指定します

MLABS モジュールが使用するメモリーロジックアレイ (MLAB) の数を指定します各 MLAB は 10の ALM を消費するためこの値はメモリーに使用される ALM (アダプティブロジックモード)の数を 10 で割った値に等しくなります

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

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

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

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

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

159

表 10 外部メモリーと通信する RTL モジュールのコード例

複雑な RTL モジュール 簡潔化された RTL モジュール

my_rtl_fn does out_ptr[idx] = fn(in_ptr[idx])my_rtl_fn (in_ptr out_ptridx)

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 forOpenCL オフラインコンパイラーにおいて非常に控えめなポインター分析が行われます

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

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

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

bull RTL モジュールがポインターへ書き込む場合OpenCL カーネルの他の部分はこのポインターに対する読み書きはできません

bull RTL モジュールがポインターから読み取る場合OpenCL カーネルの他の部分および他の RTL モジュールもまたこのポインターから読み取ることができます

bull MEM_INPUT属性の accessフィールドを設定することでRTL モジュールのメモリーポインターの使用方法を指定できます値を検証する方法がないためアクセスを行うための値が正しく設定されていることを確認してください

12119 RTL モジュールに入るスレッドの順序

RTL モジュールに入るスレッドが定義された順序に従うと想定しないでくださいさらにRTL モジュールはスレッドを並べ替えることができますよってスレッド 0 がスレッド 1 の前にモジュールに入るとは限りません

121110 RTL モジュールの OpenCL C モデル

OpenCL ライブラリーの各 RTL モジュールにはOpenCL C モデルが必要ですOpenCL C モデルはエミュレーション時に OpenCL システム全体を検証します

平方根関数の OpenCL C モデルファイル例

double my_sqrtfd (double a) return sqrt(a)

インテルではOpenCL システムをエミュレーションすることを推奨していますOpenCL システムをエミュレーションしない場合はXML 仕様ファイルで指定した関数名と一致する名前の空の関数を作成してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

160

関連情報RTL モジュールの XML 構文 (154 ページ)

121111 RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

RTL モジュールを使用し OpenCL ライブラリーを作成するとパーシャルリコンフィグレーションに関係する問題が発生する場合があります

パーシャルリコンフィグレーション (PR) をサポートしていないデバイスでライブラリーを作成し検証した後にライブラリーのユーザーがライブラリーの RTL モジュールを PR 領域で使用するとPR 後にモジュールが正しく機能しない可能性があります

PR を使用するデバイスで RTL モジュールを正しく機能させるため次の内容を確認してください

bull RTL モジュールは初期化されたコンテンツのメモリーロジックアレイブロック (MLAB) を使用していないこと

bull RTL モジュールはロジックのパワーアップ値に関していかなる仮定もしていないこと

PR コーディングの完全なガイドラインに関してはインテル Quartus Prime プロエディション ユーザーガイドパーシャルリコンフィグレーションのパーシャルリコンフィグレーションデザインの作成を参照ください

1212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

OpenCL ライブラリーファイルを作成する前にヘルパー関数を持つ各 OpenCL ソースファイルをaocoファイルにパッケージ化しますRTL モジュールとは異なりXML 仕様ファイルを作成する必要はありません

OpenCL で書かれたヘルパー関数を共有するためのライブラリーは通常作成する必要はありません例えば ltshared_filegtclなどのソース形式でヘルパー関数を配布しincludeltshared_filegtcl行を OpenCL カーネルのソースコードに挿入することができます

次のような状況においてライブラリーを作成することを検討ください

bull ヘルパー関数が複数のファイルにあり配布を簡素化する必要がある

bull ヘルパー関数のソースコードの公開を望まない

ヘルパー関数はアセンブリー言語のような LLVM IR として関連するライブラリーにコメントなしで格納されます

aocoファイルの作成にハードウェアの生成は必要ありません-cオフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

注意 ライブラリーには OpenCL ヘルパー関数のみを含むことができますライブラリーが OpenCL カーネルを含んでいる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはエラーメッセージを発行します

bull OpenCL ソースファイルをaocoファイルにパッケージ化するには次のコマンドを呼び出します aoc -c -shared ltOpenCL_source_file_namegtcl -oltOpenCL_object_file_namegtaoco

このオフラインコンパイラーコマンドオプション-sharedはOpenCL ライブラリーに含むために適したaocoファイルの作成をコンパイラーに指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

161

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

1213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化

OpenCL ライブラリーファイルを作成する前に各 RTL コンポーネントをaocoファイルにパッケージ化します

aocoファイルの作成においてハードウェアの生成は必要ありません-c インテル FPGA SDK forOpenCL オフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

bull RTL コンポーネントをaocoファイルにパッケージ化するには次のコマンドを呼び出しますaoc -c ltRTL component description file namegtxml -o ltRTLobject file namegtaoco

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull RTL モジュールの検証 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

12131 インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限

インテル FPGA SDK for OpenCL はOpenCL ライブラリーにおける RTL モジュールの使用をいくつかの制約と制限をともないサポートしています

RTL モジュールを作成する際は次の制約内で動作させることを確認してください

bull RTL モジュールは単一入力の Avalon-ST インターフェイスを使用する必要がありますつまりreadyと validロジックの単一ペアがすべての入力を制御しなければなりません

必要な Avalon-ST ポートを提供しRTL モジュールをストールのないモジュールとして宣言するオプションもありますこの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはモジュールに向けてラッパーを作成するため適切なストール動作を実装する必要はありません構文と使用法に関する詳細はRTL モジュールの XML 構文およびシンプルな関数で動作するOpenCL ライブラリーの使用 (例 1) を参照ください

注意 RTL モジュールが内部状態を持つ場合はivalid信号を適切に処理する必要があります詳しくはストールのない RTL を参照ください

bull RTL モジュールはカーネルのクロック周波数にかかわらず正確に動作する必要があります

bull データの入力および出力サイズはcharの 8 ビットから long16の 1024 ビットまでの有効なOpenCL データ型と一致する必要があります

例えば RTL モジュールで 24 ビットの値を使用する場合入力が 32 ビットになるよう宣言しSDK ライブラリーのヘッダーファイルで関数シグニチャーを宣言し uintデータ型を受け取るようにしますその後RTL モジュールで 32 ビットの入力を受け入れ上位 8 ビットを破棄します

bull RTL モジュールは外部 IO 信号に接続することができません入出力信号はすべてOpenCL カーネルから発行される必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

162

bull RTL モジュールにはclockポートresetnポートAvalon-ST 入力および出力ポート(ivalidovalidireadyoready) が必要ですここで指定されている通りに名前を付けてください

bull 外部メモリーと通信する RTL モジュールには対応するカスタムプラットフォームパラメーターに一致する Avalon メモリーマップド (Avalon-MM) ポートのパラメーターが必要ですオフラインコンパイラーは幅またはバーストの調整を行いません

bull 外部メモリーと通信する RTL モジュールは次のように動作する必要があります

mdash バースト境界を越えてバーストしないこと

mdash クロックサイクルごとに要求を行いアービトレーションロジックを独占しハードウェアをストールさせないことRTL モジュールは定期的に要求を一時停止し他のロードまたはストアユニットが動作を実行できるようにする必要があります

bull RTL モジュールは独立した OpenCL カーネルとして動作することはできませんRTL モジュールはヘルパー関数にしかなれずカーネルのコンパイル時に OpenCL カーネルに統合されます

bull RTL モジュールのインスタンス化に対応する関数呼び出しはすべて他のインスタンス化から完全に独立していますハードウェアの共有はありません

bull カーネルコード (kernelとしてマークされた関数) はaoclibライブラリーファイルに組み込まないでくださいカーネルコードをライブラリーファイルに組み込むとオフラインコンパイラーはエラーメッセージを発行しますヘルパー関数をライブラリーファイルに組み込むことは可能です

bull RTL コンポーネントはすべての入力を同時に受け取る必要があります単一の ivalid入力はすべての入力が有効なデータを含んでいることを意味します

bull SDK は IO RTL モジュールをサポートしません

bull RTL モジュールのパラメーターはOpenCL カーネルソースファイルではなく ltRTLmodule description file namegtxml仕様ファイルでのみ設定できます同じ RTLモジュールを複数のパラメーターで使用するには個別の FUNCTIONタグを各パラメーターの組み合わせに作成します

SDK の RTL モジュールのライブラリー機能に対するサポートには現在次の制限があります

bull RTL モジュールへのデータ入力はOpenCL カーネルコードを介した値でのみ渡すことができます参照渡し構造体またはチャネルを介し RTL モジュールにデータ入力を渡さないでくださいチャネルデータの場合はまずチャネルからデータを抽出し抽出したスカラーデータを RTL モジュールに渡します

注意 参照渡しまたは構造体によってデータ入力を RTL モジュールに渡すとオフラインコンパイラーで致命的なエラーが発生します

bull デバッガー (Linux の GDBなど) はエミュレーション中にライブラリー関数にステップインできませんさらに 適化レポートおよびエリアレポートはライブラリー関数の横にコード行番号を含みません

bull RTL モジュールのソースファイル名は インテル FPGA SDK for OpenCL オフラインコンパイラー IP ファイル名と競合することはできませんRTL モジュールのソースファイルとオフラインコンパイラーの IP ファイルはどちらも ltkernel file namegtsystemsynthesissubmodulesディレクトリーに格納されます名前が競合するとディレクトリーにある既存のオフラインコンパイラー IP ファイルがRTL モジュールのソースファイルに上書きされます

bull SDK はqipファイルをサポートしませんネスト化されたqipファイルを手動で解析しRTLファイルのフラットリストを作成する必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

163

bull 単独では正しく動作する一方でOpenCL カーネルの一部としては正しく動作しない RTL モジュールをデバッグすることは非常に困難です ltRTL module description filenamegtxmlファイルの ATTRIBUTES要素にあるパラメーターをすべて再度確認してください

bull オフラインコンパイラーのエリア見積りツールはすべてRTL モジュールのエリアが 0 であると仮定していますSDK は現在RTL モジュールのエリアモデルを指定する機能をサポートしていません

bull RTL モジュールはカーネルクロックと同位相でありカーネルクロック周波数の 2 倍の2x クロックにアクセスできません

関連情報bull RTL モジュールの XML 構文 (154 ページ)

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

bull ストールのない RTL (150 ページ)

1214 RTL モジュールの検証

OpenCL ライブラリーの作成者はライブラリーの RTL モジュールを独立したエンティティーとしてまた OpenCL システムの一部として検証する責任があります

1 各 RTL モジュールを標準のハードウェア検証方法にて検証します

2 インテル FPGA SDK for OpenCL ライブラリーデザイン例の 1 つを変更しOpenCL システム全体において RTL モジュールをテストします

この手順はライブラリーのユーザーがハードウェアの問題に直面しないようにするために重要です

XML 仕様ファイルの ATTRIBUTES要素の値を正しく設定していることが重要ですOpenCL システム全体をシミュレーションすることはできないためインターフェイスレベルのエラーによって発生する問題はハードウェアを動作させるまで検出されない可能性があります

3 注意 インテル FPGA SDK for OpenCL libraryユーティリティーはXML 仕様ファイルとソースファイルの整合性を確認しますがそれにはいくつかの制限があります

aocl library [ltcommand optiongt]コマンドを呼び出します

bull サポートされている ltcommand optionsgt リストは aocl library コマンドで呼び出します

bull libraryユーティリティーはXML 仕様ファイルの ATTRIBUTESMEM_INPUTAVALON_MEM要素内の要素に割り当てられている値のエラーを検出しません

bull library ユーティリティーはRTL 構文のエラーを検出しませんRTL 構文のエラーについては ltyour_kernel_filenamegtquartus_sh_compilelogファイルを確認する必要がありますただしエラーの解析には時間を要する可能性があります

1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化

OpenCL ライブラリーに含めるaocoファイルを作成後 インテル FPGA SDK for OpenCLlibraryユーティリティーコマンドオプションを呼び出しそれらをライブラリーファイルにパッケージ化します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

164

bull 複数のオブジェクトファイルを単一のライブラリーファイルにパッケージ化するには次のコマンドを呼び出します aocl library create -o ltlibrary filenamegtaoclib ltobject file 1gtaoco [ltobject file 2gtaoco ltobject file Ngtaoco]

aocl libraryユーティリティーコマンドは ltlibrary file namegtaoclibライブラリーファイルを作成しますこのファイルにはコマンドで指定したaocoオブジェクトファイルが含まれていますライブラリーファイルにはRTL ベースのオブジェクトファイルおよびOpenCL ベースのオブジェクトファイルをどちらも含むことができます

1216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定

OpenCL カーネルで OpenCL ライブラリーを使用するにはカーネルをコンパイルする際にライブラリーファイル名とディレクトリーを指定します

重要 ライブラリーを使用してもカーネルのコンパイル時間は短縮されません

bull OpenCL ライブラリーを インテル FPGA SDK for OpenCL オフラインコンパイラーに指定するには次のコマンドを呼び出します aoc -l ltlibrary_file_namegtaoclib [-Lltlibrary directorygt] ltkernel file namegtcl

この-l ltlibrary_file_namegtaoclibコマンドオプションはライブラリーファイル名を指定し-L ltlibrary directorygt コマンドオプションはライブラリーファイルを含むディレクトリーを指定します

-l ltlibrary file namegt および-L ltlibrary directorygt の複数のインスタンスをオフラインコンパイラーコマンドに含めることができます

例えば関数 my_div_fd()my_sqrtfd()myrsqrtfd()を含むライブラリーを作成する場合OpenCL のカーネルコードは次のようになります

include ldquolib_headerhrdquo

kernel void test_lib ( global double restrict in global double restrict out int N) int i = get_global_id(0) for (int k =0 k lt N k++) double x = in[iN + k] out[iN + k] = my_divfd (my_rsqrtfd(x) my_sqrtfd(my_rsqrtfd (x)))

注意 ライブラリー関連の行は太字で強調されています

対応する lib_headerhファイルは次のようになります

double my_sqrtfd (double x)double my_rsqrtfd(double x)double my_divfd(double a double b)

1217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー)

インテル FPGA SDK for OpenCL シミュレーターは OpenCL ライブラリーの機能性を評価します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

165

インテル FPGA SDK for OpenCL シミュレーターはx86-64 Windows または Linux ホストで動作するaocxファイルを生成しますこの機能により毎回ハードウェアにライブラリーをコンパイルしたり FPGA で動作させたりすることなくカーネルの機能性のシミュレーションやデザインのイタレーションができるようになります

OpenCL ライブラリーの動的なパフォーマンスをより深く理解することが必要な場合や OpenCL ライブラリー機能の正確性に関しエミュレーションや OpenCL のレポートツールが提供する内容以上の情報が必要な場合はシミュレーターを使用してください

シミュレーターはサイクル精度が高くハードウェアを生成するのと同じネットリストを持ちデバッグに向けた完全な波形を提供することが可能です波形は Mentor Graphics ModelSim ソフトウェアで確認してください

12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

シミュレーションに向け OpenCL ライブラリーをコンパイルするには-march=simulatorオプションを aocコマンドに含めますシミュレーション中の波形収集を有効にするには-ghdlオプションを aocコマンドに含めます

bull ライブラリーのシミュレーションを実行する前に次の作業を実行してください

mdash FPGA アクセラレーターボードにボードメーカーが提供しているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアのインストールフォルダーを指していることを確認します

bull Windows システムでライブラリーをシミュレーションするにはMicrosoft のリンカーおよびコンパイル時のライブラリーが追加で必要になりますPATH 環境変数設定に インテル FPGASDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設定が インテル FPGA SDK for OpenCL スタートガイドのインテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

bull 特定のボードをターゲットとするシミュレーションをコンパイルするには aoc-march=simulator -ghdl -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードにおける機能的なエラーの原因を特定できるようになります

12172 OpenCL ライブラリーのシミュレーション

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

166

シミュレーション中に生成された波形を確認するには Mentor Graphics ModelSim ソフトウェアをインストールしコンフィグレーションする必要があります

重要 エミュレーターとシミュレーターを同じ端末またはコマンドプロンプトセッションから実行する場合シミュレーターを実行する前にエミュレーターの環境変数設定(CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA) を解除しますエミュレーター環境変数の設定が解除されていないとシミュレーションはエラーにより失敗します

エミュレーターとシミュレーターは別々の端末セッションまたはコマンドプロンプトセッションから実行することもできます

OpenCL ライブラリーをシミュレーターで実行するには以下を行います

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションの構築に必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーの一覧を表示します

2 ホストアプリケーションを構築し手順 1 のライブラリーにリンクします

ヒント

他の OpenCL SDK とともに複数のデバイスをエミュレーションするにはホストランタイムのライブラリーに接続する前 にホストアプリケーションを Khronos ICD LoaderLibrary に接続しますホストアプリケーションを ICD Loader Library に接続するにはホストアプリケーションの Makefileを変更します詳細はホストアプリケーションとKhronos ICD Loader Library のリンクを確認ください

3 必要であればaocxファイルをホストが容易に見つけることのできる位置に動かします現在の作業ディレクトリーが推奨されます

4 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA環境変数を設定しシミュレーションデバイスを有効にします

mdash Windows の場合

set CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

mdash Linux の場合

env CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

注意

環境変数 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA を設定するとシミュレーションデバイスのみが利用可能になりますすなわち物理的なボードおよびエミュレーションデバイスへのアクセスは無効になります

ホストプログラムがシミュレーションデバイスを識別できない場合CL_CONTEXT_COMPILER_MODE_INTELFPGA=3を設定する必要があります

5 ホストプログラムを実行します

ホストコードとデバイスをデバッグするにはgdb または Eclipse でホストコードを実行します

ホストプログラムを実行すると波形ファイル vsimwifが作成されますこの波形ファイルはホストコードを実行時に ModelSim ソフトウェアで確認することができますvsimwifファイルはホストプログラムを実行しているディレクトリーと同じディレクトリーに書き込まれます

6 ホストまたはカーネルプログラムを変更しテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしシミュレーションを再度実行してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

167

12173 シミュレーターの制限

シミュレーターの制限を確認しシミュレーションを試みる際に発生する可能性がある問題をトラブルシューティングしてください

Windows のコンパイルが失敗しホストプログラムがaocxファイルの破損を報告している場合

deviceclファイルをコンパイルする際のディレクトリーパスが長すぎる可能性があります-oコンパイラーオプションを使用し短いパスでコンパイル結果を出力してください

socket=-11エラーが transcriptlogに記録される場合

次のエラーメッセージが表示される場合 ModelSim - Intelreg FPGA Edition と ModelSim SE のリソースを混同しています

Message srchls_cosim_ipc_socketcpp202 void IPCSocketMasterconnect()Assertion `sockfd = -1 ampamp IPCSocketMasterconnect() call to accept() failed failed

ModelSim リソースの混同例には ModelSim SE でデバイスをコンパイルしホストプログラムをModelSim - Intel FPGA Edition で実行している場合などがあります

ホストプログラムを実行するとセグメンテーション違反が発生する場合

ホストプログラムを実行した際にセグメンテーション違反が発生する場合は同じ端末またはコマンドプロンプトセッションからエミュレーターとシミュレーターを実行している可能性がありますシミュレーターを実行する前にエミュレーターの環境変数設定を必ず解除してください

同じ端末セッションまたはコマンドプロンプトセッションでデバイスとホストプログラムをコンパイルしないようにしてください別々のセッションを使用することで起こりうる環境変数の競合を回避できます

1218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)

インテルでは倍精度関数を 3 つ実装した (sqrtrsqrtdivide) RTL を含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example1tgzターボールにはライブラリーカーネルおよびホストシステムが含まれていますexample1clカーネルソースファイルには2 つのカーネルが含まれますカーネルのtest_libはライブラリー関数を使用しますすなわちカーネルの test_builtinは組み込み関数を使用しますホストは両方のカーネルを実行しそれらの出力とランタイムを比較しますインテルでは同じ方法でご自身がデザインしたライブラリー関数を検証することを推奨しています

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページからexample1tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example1aocx Create buffersGenerate random data for conversionEnqueuing both library and builtin in kernels 4 times with global size 65536Kernel computation using library function took 535333 secondsKernel computation using built-in function took 539949 secondsReading results to buffers

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

168

Checking resultsLibrary function throughput is within 5 of builtin throughputPASSED

関連情報OpenCL デザイン例のページ

1219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2)

インテルではグローバルメモリーと通信する 2 つの RTL モジュールを含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example2tgzターボールにはライブラリーカーネルそしてホストシステムが含まれていますこの例においてグローバルメモリーと通信する RTL コードはカスタムプラットフォームまたはリファレンスプラットフォームに依存しますコンパイルがStratix V Network Reference Platform に対応するボードをターゲットとしていることを確認してください

インテルではRTL モジュールの copyElement()および sumOfElements() を インテルFPGA SDK for OpenCL オフラインコンパイラーを使用し生成しました インテル FPGA SDK forOpenCL オフラインコンパイラーはコードの追加入力を示します

Example2clカーネルソースファイルは 2 つのカーネルを含みますカーネル test6はcopyElement() RTL 関数を呼び出す NDRange カーネルでありデータを B[]から A[]へコピーし global_id+100を C[]に格納しますカーネル test11はRTL 関数を使用する単一ワークアイテムのカーネルですsumOfElements() RTL 関数は範囲[i N]の A[]の要素の合計を確定し残りを C[i]に追加します

注意 sumOfElements(i=0)の 初の呼び出しの実行はその後の呼び出しよりも時間がかかります

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページから example2tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example2aocx Running test6Launching the kernel test6 with globalsize=128 localSize=16Loading example2aocx Running test11Launching the kernel test11 with globalsize=1 localSize=1PASSED

関連情報bull OpenCL デザイン例のページ

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull Intel FPGA SDK for OpenCL Stratix V Network Reference Platform Porting Guide

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

169

12110 OpenCL ライブラリーのコマンドラインオプション

インテル FPGA SDK for OpenCL オフラインコンパイラーの一連のコマンドおよびSDK ユーティリティーはOpenCL ライブラリーに関連するタスクを実行するために呼び出すことができるオプションを含んでいます

表 11 ライブラリーに関連する インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドオプション

コマンドオプション 説明

-shared -rtlコマンドオプションとともにOpenCL ソースファイルをオブジェクトファイル (aoco) へコンパイルしますその後それをライブラリーに含めることができますaoc -rtl -shared ltOpenCL source file namegtcl -oltOpenCL object file namegtaoco

-I=ltlibrary_directorygt ltlibrary directorygt をヘッダーファイルの検索パスに追加します

aocl -I ltlibrary_header_file_directorygt -lltlibrary_file_namegtaoclib ltkernel_file_namegtcl

-L=ltlibrary directorygt ltlibrary directorygt を OpenCL ライブラリーの検索パスに追加します「-L」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-l=ltlibrary_file_namegtaoclib OpenCL ライブラリーファイル ( ltlibrary_file_namegtaoclib) を指定します「 -l 」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-library-debug ライブラリーに関連のあるデバッグ出力を生成します追加の出力の一部はstdout に表示されその他の部分は ltkernel_file_namegtltkernel_file_namegtlog ファイルに表示されます

aoc -l=ltlibrary_file_namegtaoclib -library-debugltkernel_file_namegtcl

表 12 インテル FPGA SDK for OpenCL ライブラリーユーティリティー (aocl library) のコマンドオプション

コマンドオプション 説明

hdl-comp-pkg ltXML_specification_filegtxml

単一の HDL コンポーネントをaocoファイルにパッケージ化しますそれをその後ライブラリーに含みますこのコマンドの呼び出しは aoc -rtlltXML_specification_filegtxmlを呼び出すことに類似していますただしaoclは環境チェックを行わないため処理時間は短くなります

aocl library hdl-comp-pkg ltXML_specification_filegtxml -o ltoutput_filegtaoco

-rtl ltXML_specification_ filegtxml hdl-comp-pkg ltXML_specification_ filegtxmlと同じ機能ですaocl library -rtl ltXML_specification_ filegtxml

create hdl-comp-pkgユーティリティーオプションまたは aoc -shared コマンドを呼び出すことによって作成したaocoファイルからライブラリーファイルそしてその他のaoclibライブラリーを作成します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

170

コマンドオプション 説明

aocl library create [-name ltlibrary_namegt] [-vendor ltlibrary_vendorgt] [-versionltlibrary_versiongt] [-o ltoutput_filegtaoclib][aoco] [aoclib]

この-name-vendor-versionはオプションの情報文字列でそれらを指定しライブラリーに加えることができます

list ltlibrary_namegt ライブラリーの RTL コンポーネントをすべてリスト表示します現在このオプションはOpenCL 関数のリスト化には利用できません

aocl library list ltlibrary_namegt

help インテル FPGA SDK for OpenCL ライブラリーユーティリティーオプションのリストとその説明を画面上に表示しますaocl library help

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性

インテル FPGA SDK for OpenCL はデザインのコンスタントローカルおよびプライベート変数に適用できるカーネルメモリー属性を提供しますそれらを使用しローカルメモリーシステムおよびプライベートメモリーシステムのオンチップメモリーアーキテクチャーをカスタマイズすることが可能です

注意 これらのローカルメモリーカーネル属性はコンスタントローカルまたはプライベート変数にのみ適用してください

表 13 ローカルメモリーをコンフィグレーションするための OpenCL の属性

属性 説明

register ローカル変数がレジスターのパイプラインを介して伝達される必要があることを指定しますレジスター変数の実装はFF のみで行うこともFF と RAM ベースのFIFO を組み合わせて行うことも可能です

memory(impl_type) ローカル変数をメモリーシステムに実装する必要があることを指定しますメモリーカーネル属性を含めることはローカル変数を__local修飾子で宣言することと同等ですオプションで文字列引数を渡しメモリーの実装タイプを指定することが可能ですimpl_type に BLOCK_RAMまたは MLABを指定するとメモリーはそれぞれメモリーブロック (M20K など) またはメモリーロジックアレイブロック(MLAB) を使用し実装されます

numbanks(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

bankwidth(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN バイト幅のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

singlepump ローカル変数を実装しているメモリーシステムをシングルポンピングする必要があることを指定します

doublepump ローカル変数を実装しているメモリーシステムをダブルポンピングする必要があることを指定します

numreadports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の読み出しポートを有する必要があることを指定しますN は 0 より大きい整数値です

numwriteports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の書き込みポートを有する必要があることを指定しますN は 0 より大きい整数値です

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

171

属性 説明

merge(label direction) 2 つ以上の変数を同じメモリーシステムに実装するように強制しますlabel は任意の文字列です結合しようとしている変数に同じラベルを割り当てますdirection に widthもしくは depthを指定しメモリーをそれぞれ幅方向または深さ方向のどちらに結合するかを特定します

bank_bits(b 0 b 1 b n ) メモリーシステムを2n のバンクに分割するよう強制しますb 0 b 1 b nはバンク選択ビットを形成しています重要 b 0 b 1 hellipb n はかならず連続する正の整数にしてください

bank_bits属性なしで numbanks(n)属性を指定するとバンク選択ビットはデフォルトで 下位ビット (01helliplog2(numbanks)-1) になります

max_concurrency(N) メモリーが 大 N 個のプライベートコピーを保有しN 回のループの同時反復を常に実行することを指定しますここで N は2 の累乗に切り上げられます(宣言またはアクセスパターンによって) 変数の範囲がループに限定されている場合この属性を適用しますループがpragma max_concurrency M も持っている場合作成されるプライベートコピーの数はmin(MN)になります

表 14 メモリー属性のコード例

ユースケース例 構文

レジスターに変数を実装する int __attribute__((register)) a[12]

それぞれ 8 バイト幅の 8 つのバンクを持つメモリーシステムを実装する int __attribute__((memory numbanks(8) bankwidth(8)) b[16]

ダブルポンピングのメモリーシステムを128 バイト幅のバンク 1 つ書き込みポート 1 つ読み出しポート 4 つとともに実装する

int __attribute__((memory numbanks(1) bankwidth(128) doublepump numwriteports(1) numreadports(4)) c[32]

structのデータメンバーにメモリー属性を適用することも可能ですstruct 宣言の structデータメンバーに属性を指定してくださいstructのオブジェクトのインスタンス化に属性を適用するとこの属性は structデータメンバーの宣言で指定された属性を上書きします以下を例として示します

struct State int array[100] __attribute__((__memory__)) int reg[4] __attribute__((__register__)) __kernel void sum() struct State S1 struct State S2 __attribute__((__memory__)) some uses

オフラインコンパイラーは S1 をメモリーに実装される S1array[100]とレジスターに実装される S1reg[4]の 2 つの変数に分割しますただしS2には memory属性が適用されているためコンパイラーは struct宣言でオブジェクト S2に適用された属性を無視しそれを分割しません

関連情報bull ローカルメモリーのバンキングによるカーネルパフォーマンスの向上

bull メモリーレプリケーションファクタの制御によるローカルメモリーへのアクセスの 適化

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

172

1221 変数固有の属性を使用する際の制約

サポートされていない変数固有の属性の使用法または不正なメモリー構成を検出した場合 インテルFPGA SDK for OpenCL オフラインコンパイラーではエラーが発生するもしくは警告を発行します

コンパイルエラーの原因となる変数固有の属性のサポートされていない使い方

bull カーネル属性をコンスタントローカルまたはプライベート変数の宣言以外の宣言で使用している (例えば関数パラメーターの宣言グローバル変数宣言関数宣言など)

bull register属性を他の変数固有の属性と組み合わせて使用している

bull singlepumpと doublepump属性をどちらも同じ変数宣言に含んでいる

bull singlepumpおよび doublepump属性をnumreadportsまたは numwriteports属性を含まずに指定している

bull numreadports属性を指定する際に numwriteports属性を同じ変数宣言に含んでいないまたはその逆

bull 同じ変数宣言に numbanksと bankwidth属性を含まずに次の属性のいずれかを指定している

mdash numreadports

mdash numwriteports

mdash singlepump

mdash doublepump

コンパイル時にオフラインコンパイラーが警告を発行する原因となる不正なメモリー構成

bull 変数固有の属性で定義されているメモリー構成が利用可能なストレージサイズを超えている (例えば8 バンクのローカルメモリーを整数変数に指定するなど)

コンパイルエラーの原因となる不正なメモリー構成

bull バンク幅がデータのストレージサイズよりも小さい (例えば 4 バイト整数の配列の場合バンク幅は2 バイトです)

bull 変数にメモリーのコンフィグレーションを指定しているコンパイラーの制約またはコーディングスタイルのためオフラインコンパイラーはメモリーを分割するのではなく同じメモリーに変数を実装します

bull register属性を変数に指定しているコンパイラーの制約またはコーディングスタイルによりオフラインコンパイラーは変数をレジスターに実装できません

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性

インテル FPGA SDK for OpenCL にはロジック使用率を低減しカーネルのパフォーマンスを向上させるカーネル属性が含まれておりそれを単一のワークアイテムカーネルに含むことができますこれらのカーネル属性により インテル FPGA SDK for OpenCL オフラインコンパイラーは不要なハードウェアの生成を省略し効率を向上させることが可能になります

1231 カーネルインターフェイスに向けたハードウェア

インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルのパイプライン周辺にハードウェアを生成します一部の OpenCL アプリケーションではこれらのインターフェイスのハードウェアコンポーネントは不要です

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

173

カーネルパイプライン周辺のハードウェアは次のような機能において必要です

bull ワークアイテムおよびワークグループ ID の振り分け

bull カーネル引数とワークグループのサイズに関するホストとの通信

図 20 (174 ページ) はオフラインコンパイラーが次のカーネルをコンパイルする際に生成するハードウェアを表しています

__kernel void my_kernel(global int arg) hellip int sum = 0 for(unsigned i = 0 i lt n i++) if(sum lt m) sum += val arg = sum hellip

図 -20 カーネルパイプライン周辺に インテル FPGA SDK for OpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

12311 カーネル ID を生成し振り分けるハードウェアの省略

Max_global_work_dim(0)カーネル属性はグローバルローカルまたはグループ ID を生成しコンパイルされたカーネルに振り分けるロジックを省略するよう インテル FPGA SDK forOpenCL オフラインコンパイラーに指示します

意味的に max_global_work_dim(0)カーネル属性はカーネルのグローバルワークサイズがゼロであることを指定しますこのカーネル属性を設定するとカーネルがグローバルローカルまたはグループ ID を使用しないことを意味しますカーネルコード内のこの属性の存在はカーネルが単一のワークアイテムカーネルであるということをオフラインコンパイラーに対し保証しています

次のカーネルをコンパイルするとオフラインコンパイラーは図 21 (175 ページ) で表されているインターフェイスハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__kernel void plusK (int N int k) for (int i = 0 i lt N ++i) int data_in = read_channel_intel(chan_in)

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

174

write_channel_intel(chan_out data_in + k)

図 -21 max_global_work_dim(0) 属性をともなうカーネルに向けて インテル FPGA SDK forOpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

現在のカーネル実装に複数のワークアイテムがありグローバルローカルまたはグループ ID を使用していない場合次のようにカーネルコードを変更するとmax_global_work_dim(0)カーネル属性を使用することができます

1 ワークアイテムと同じ数だけ反復する forループのカーネル本体をラップする

2 変更したカーネルを 1 つのワークアイテムのみで起動する

12312 ホストとカーネル間の通信ハードウェアの省略

autorunカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーにホストとカーネルの通信に使用されるロジックを省略するよう指示します autorun属性を使用するカーネルはホストが明示的に起動するカーネルよりも前に自動的に実行を開始しますさらにこのカーネルは実行が終了するとすぐに自動的に再起動します

autorunカーネル属性はオフラインコンパイラーに対しカーネルが独立して実行されどのホストからもエンキューされないことを通知します

autorun属性を活用するにはカーネルが次の基準をすべて満たしている必要があります

1 IO チャネルを使用しないこと

注意 カーネルからカーネルへのチャネルはサポートされています

2 引数を持たないこと

3 max_global_work_dim(0)属性または reqd_work_group_size(XYZ) 属性のどちらかを持つこと

注意 reqd_work_group_size(XYZ) 属性のパラメーターは 232 の除数である必要があります

前述のようにautorun属性のあるカーネルは引数を持つことができずホストが明示的に起動することなく実行を開始しますそのためオフラインコンパイラーはホストとカーネルの通信のためのロジックを生成する必要がありませんこのロジックを省略するとロジック使用率が低下しオフラインコンパイラーがパフォーマンスの 適化をさらに適用することが可能になります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

175

autorun属性の一般的な使用例はカーネル間の 1 つ以上のチャネルからデータを読み取りデータを処理しその結果を 1 つ以上のチャネルに書き込むカーネルですカーネルをコンパイルするとオフラインコンパイラーは図 22 (176 ページ) で表されているようにハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__kernel void plusOne () while(1) int data_in = read_channel_intel(chan_in) write_channel_intel(chan_out data_in + 1)

図 -22 インターフェイスハードウェアのない単一ワークアイテムカーネル

Host Link Hardware

Kernel ID Generators

Kernel

12313 clEnqueueNDRangeKernel API の global_work_offset引数をサポートするハードウェアの省略

uses_global_work_offset(0) のカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーに対しNDRange カーネルの 0 以外または NULL 以外のglobal_work_offset引数をサポートするために必要なハードウェアを省略するよう指示します

このカーネル属性は0 もしくは NULL の global_work_offset引数で必ずエンキューされるカーネルすべてに推奨されますこのカーネル属性が設定されるとインテル FPGA ホストランタイムは0 以外もしくは NULL 以外の global_work_offset引数でカーネルがエンキューされた場合にCL_INVALID_GLOBAL_OFFSETエラーコードを返します

124 num_compute_units(XYZ) 属性を使用したカーネルの複製

num_compute_units(XYZ) カーネル属性を含めると単一ワークアイテムの OpenCL カーネルを複製することができます

計算ユニット数の指定 で示されているようにnum_compute_units(N) カーネル属性をカーネルに含めることで インテル FPGA SDK for OpenCL オフラインコンパイラーに対し複数の計算ユニットを生成しデータを処理するよう指示しますnum_compute_unit(N) 属性はオフラインコンパイラーにカーネルの同一のコピーを N 個ハードウェアに生成するよう指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

176

注意 データに依存するカーネルの処理を制御している特定の計算ユニットを識別するにはget_compute_id()組み込み関数を呼び出します

関連情報bull get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

bull 計算ユニット数の指定 (33 ページ)

1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ

それぞれの違いがわずかで共通するコードを多く持つ複数の計算ユニットを作成するにはnum_compute_units (XYZ) 属性を使用しているカーネルで get_compute_id() 組み込み関数を呼び出します

注意 get_compute_id() 関数はautorunおよび max_global_work_dim(0) カーネル属性を使用するカーネルにのみ使用することができます

計算 ID の取得はカーネルをソースコードに複写し各カーネルのコピーに特定のコードを追加することに代わる有用な方法ですカーネルが num_compute_units(XYZ) 属性を使用しget_compute_id() 関数を呼び出すと インテル FPGA SDK for OpenCL オフラインコンパイラーは固有の計算 ID を各計算ユニットに割り当てますその後 get_compute_id() 関数はそれらの固有の計算 ID を取得します計算 ID を使用することで関連付けられている計算ユニットの動作を指定し同じカーネルのソースコードから派生した他の計算ユニットと異なる動作をさせることが可能です例えばget_compute_id() の戻り値を使用しチャネルの配列にインデックスを付け各計算ユニットが読み書きするチャネルを指定することができます

num_compute_units属性は 大 3 つの引数を受け取ります(num_compute_units(XYZ))get_compute_id() 関数とともにこの属性を使用すると1 次元2 次元および 3 次元のロジック配列の計算ユニットを作成することが可能になります計算ユニットの 1D 配列の使用例には線形パイプラインのカーネル (カーネルのデイジーチェーンとも呼ばれる) があります計算ユニットの 2D 配列の使用例はカーネルのシストリックアレイです

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

177

図 -23 4x4 配列の計算ユニットの概略図次のコード例はnum_compute_units(44)を単一ワークアイテムカーネルで指定しておりこれは 4x4=16 の計算ユニットで構成される 4x4 配列になります

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__attribute__((num_compute_units(44)))__kernel void PE()

row = get_compute_id(0) col = get_compute_id(1)

hellip

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

0

3

2

1

3210col

row

3D 配列の計算ユニットにおいては論理計算ユニット配列の計算ユニットの XYZ 座標をget_compute_id(0)get_compute_id(1)get_compute_id(2)をそれぞれ使用することで取得できますこの場合の API はワークアイテムの組み込み関数 API(get_global_id()get_local_id()get_group_id()) と非常に類似しています

グローバル IDローカル IDおよびグループ ID はホストがカーネルを呼び出す方法によってランタイムで変化しますただし計算 ID はコンパイル時に認識されるためオフラインコンパイラーは各計算ユニットに 適化されたハードウェアを生成できます

1242 カーネルコピーでのチャネル使用

カーネルを複製コピーした計算ユニットにチャネルを実装するにはチャネルの配列を作成しget_compute_id() の戻り値を使用しその配列にインデックスを付けます

次のコード例は複数の計算ユニットにチャネルを実装しています

define N 4channel int chain_channels[N+1]

__attribute__((max_global_work_dim(0)))__kernel void reader(global int data_in int size) for (int i = 0 i lt size ++i) write_channel_intel(chain_channels[0] data_in[i])

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

178

__attribute__((max_global_work_dim(0)))__attribute__((autorun)) __attribute__((num_compute_units(N))) __kernel void plusOne() int compute_id = get_compute_id(0) int input = read_channel_intel(chain_channels[compute_id]) write_channel_intel(chain_channels[compute_id+1] input + 1)

__attribute__((max_global_work_dim(0)))__kernel void writer(global int data_out int size) for (int i = 0 i lt size ++i) data_out[i] = read_channel_intel(chain_channels[N])

図 -24 チャネルを実装するカーネルコピーのトポロジー例この図は上記 OpenCL アプリケーションコードが生成するカーネルグループのトポロジーを表しています

reader writer+1 +1 +1 +1

DDR4 DDR4kernel copies created using num_compute_units(N)

注意 このカーネルコピーの実装はソースコードに 4 つのカーネルを個別に定義しchain_channels[N]へアクセスするためのインデックスをそれぞれハードコーディングすることと機能的に同等です

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

インテル 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() 関数は次のような目的で使用します

bull 大規模なストリックアレイを処理する要素間など空間的に離れたデータパスの間のクリティカルパスの切断

bull 空間的に異なるカーネル実装によって発生する配置とルーティングエフォートの負荷の軽減

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

179

__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 つより多くのレジスターをパスに挿入する場合があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

180

A OpenCL 機能のサポート状況

インテル FPGA SDK for OpenCL のホストランタイムは明確にした内容と例外をともなうかたちでOpenCL プラットフォームレイヤーおよびアプリケーションプログラミングインターフェイス (API)に準拠しています

OpenCL10 の機能のサポート状況 (181 ページ)

OpenCL 12 の機能のサポート状況 (186 ページ)

OpenCL 20 の機能のサポート状況 (187 ページ)

インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ)

A1 OpenCL10 の機能のサポート状況

以降の章ではOpenCL Specification version 10 に記載されている OpenCL 機能のサポート状況の概要を説明します

A11 OpenCL10 C プログラミング言語の実装

OpenCL は一部制限をともなうかたちで C99 に基づいていますOpenCL Specification version10 の Section 6 はOpenCL C プログラミング言語について説明しています インテル FPGA SDKfor OpenCL は明確化された内容と例外をともない OpenCL C プログラミング言語に準拠しています次の表はOpenCL プログラミング言語の実装における機能に対するサポート状況の概要です内容を明確化することなくサポートしている OpenCL プログラミング言語の実装に関しては記載していません

サポート状況の表の見方

シンボル 説明

この機能はサポートされており備考欄にてサポートされている内容を明確にしています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

セクション

機能 サポート状況 備考

611 組み込みスカラーデータ型

倍精度浮動小数点 倍精度浮動小数点の組み込みスカラーデータ型すべてに対する暫定サポートですこの機能はOpenCL Specification version 10 に準拠していない可能性があります現在次の倍精度浮動小数点関数はOpenCL Specification version10 に準拠すると考えられています

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

セクション

機能 サポート状況 備考

add subtract multiply divide ceil floor rint trunc fabs fmax fmin sqrt rsqrt exp exp2 exp10 log log2 log10 sin cos asin acos sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

半精度浮動小数点 スカラーの加算減算乗算に対するサポートです単精度浮動小数点との変換をサポートしますこの機能はOpenCL Specification version 10 に準拠していない可能性がありますこの機能はエミュレーターでサポートされています

612 組み込みベクトルデータ型 3 要素のベクトルに対する暫定サポートです3 要素ベクトルのサポートはOpenCL Specification version 10 を補うものです

613 その他の組み込みデータ型 SDK はイメージをサポートしていないためイメージ型またはサンプラー型をサポートしていません

621 暗黙的な変換 スカラー型とベクトル型の暗黙的な変換に関する重要な説明についてはOpenCL Specification version 12 の Section 626UsualArithmetic Conversions を参照してください

622 明示的なキャスト SDK ではスカラーを異なる要素型のベクトルにキャストできます

65 アドレス空間修飾子 関数スコープ__constant変数はサポートされていません

66 イメージアクセス修飾子 X SDK はイメージをサポートしていません

67 関数修飾子

672 オプションの属性修飾子 カーネルのパフォーマンス向上に向けた reqd_work_group_sizeの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照くださいSDK は vec_type_hintと work_group_size_hint属性修飾子の解析は行いますがそれらを無視します

69 プリプロセッサーディレクティブとマクロ

pragmaディレクティブ (pragmaunroll)

インテル FPGA SDK for OpenCL オフラインコンパイラーはpragmaunrollのみサポートしています整数引数をアンロールディレクティブに割り当てループ展開の範囲を制御することができます例えばpragma unroll 4はループの 4 つの反復を展開します展開係数のないアンロールディレクティブの場合デフォルトでオフラインコンパイラーはループを完全に展開しようと試みますカーネルのパフォーマンス向上に向けたpragma unrollの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

値 1に定義された__ENDIAN_LITTLE__

ターゲット FPGA はリトルエンディアンです

__IMAGE_SUPPORT__ X __IMAGE_SUPPORT__は未定義ですSDK はイメージをサポートしていません

610 Attribute Qualifiersmdashオフラインコンパイラーは以下ように属性修飾子を解析します

6103 変数の属性を指定する (endian) X

6104 ブロック属性と制御フローステートメント属性の指定

X

6105 属性修飾子の拡張 オフラインコンパイラーはさまざまな構文構造の属性を解析することができますまた内部使用のためにいくつかの属性名を予約していますこれらのカーネル属性を使用しカーネルのパフォーマンスを 適化する方法については インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

182

セクション

機能 サポート状況 備考

6112 数学関数

組み込み数学関数 倍精度浮動小数点の組み込み数学関数に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

組み込み数学関数の half_とnative_

倍精度浮動小数点の組み込み数学関数 half_および native_に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

6115 ジオメトリック関数 倍精度浮動小数点の組み込みジオメトリック関数に対する暫定サポートですこの関数は OpenCL Specification version 10 に準拠していない可能性がありますSDK でサポートされる組み込みのジオメトリック関数のリストについては組み込みジオメトリック関数の引数型 を参照してください

6118 イメージ読み取りおよび書き込み機能 X SDK はイメージをサポートしていません

6119 Synchronization Functionsmdash バリアー同期機能

内容の明確化と例外bull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合バリアーは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合バリアーはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

ワークアイテムの制限はカーネルにサポートされているワークグループの大サイズでありこの制限はランタイムに強制されます

61111

グローバルメモリーからローカルメモリーローカルメモリーからグローバルメモリーの非同期コピーおよびプリフェッチ

実装は単純なものですワークアイテム (000) はコピーを実行しwait_group_eventsがバリアーとして実装されますbull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合wait_group_eventsは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合wait_group_eventsはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

関連情報bull Intel FPGA SDK for OpenCL ベストプラクティスガイド

bull 組み込みジオメトリック関数の引数型 (184 ページ)

A12 OpenCL C プログラミング言語の制約

インテル FPGA SDK for OpenCL は特定のプログラミング言語機能に関し OpenCLSpecification version 10 の Section 68 で示されている OpenCL Specification の制約に準拠します

重要 インテル FPGA SDK for OpenCL オフラインコンパイラーは許可されていない特定のプログラミング言語機能に対する制約を強制しません使用しているカーネルコードにOpenCL Specificationversion 10 がサポートしていない機能が含まれていないようにしてください

次の表は インテル FPGA SDK for OpenCL が強制する OpenCL C プログラミング言語の制約に関する補足説明のみを記載しています他の制約はすべてOpenCL Specification version 10 のSection 68 の内容と完全に一致します

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

183

機能 サポート状況 備考

構造体型のカーネル引数 X 構造体引数をグローバルメモリーの構造体へのポインターに変換します

既約の制御フロー X オフラインコンパイラーはこの制約に関しエラーは返しませんがこの機能はサポートされていません

32 ビット未満の組み込み型メモリーへの書き込み

サイズが 32 ビット未満のストア操作はメモリーの性能が低下する可能性がありますがサポートされています

異なるアドレス空間に属する structまたはunion要素

X オフラインコンパイラーはこの制約を強制しません警告 structまたは union要素を異なるアドレス空間に割り当てると致

命的なエラーが発生する可能性があります

サポート状況表の見方

シンボル 説明

この機能はサポートされています備考欄にてサポートされている内容を明確化しています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

A13 組み込みジオメトリック関数の引数型

インテル FPGA SDK for OpenCL はスカラーおよびベクトル引数の組み込みジオメトリック関数を特定の制限をともないサポートしています

関数 引数型

浮動 倍精度

cross

dot

distance

length

normalize

fast_distance mdash

fast_length mdash

fast_normalize mdash

サポート状況表の見方

記号 説明

この機能はサポートされています

mdash この機能は OpenCL Specification で定義されていません

A14 数値コンプライアンスの実装

OpenCL Specification version 10 の Sectoin 7 はOpenCL に準拠するデバイスがサポートする必要がある C99 と IEEE 754 標準の機能を説明しています インテル FPGA SDK for OpenCL はIEEE 標準 754-2008 形式の 32 ビットおよび 64 ビットの浮動小数点値で動作しますがすべての浮動小数点演算子が実装されているわけではありません 

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

184

以下の表は浮動小数点演算子の実装状況の概要です

セクション 機能 サポート状況 備考

71 丸めモード 整数と単精度または半精度の浮動小数点型の変換においてはすべての丸めモードをサポートしています整数と倍精度の浮動小数点型の変換については暫定的な形式ですべての丸めモードをサポートしていますがOpenCL Specification version10 に準拠していない可能性があります

72 INFNaN非正規化数 単精度の演算における無限大 (INF) および非数 (NaN) の結果はOpenCL Specification version 10 に準拠する形式で生成されます非正規化数を処理する演算のほとんどは浮動小数点演算の前後にフラッシュされます倍精度浮動小数点演算に対しては暫定的なサポートでありOpenCLSpecification version 10 に準拠していない可能性があります

73 浮動小数点の例外 X

74 ULP の相対誤差 単精度浮動小数点演算はOpenCL Specification version 10 の埋め込みプロファイルに対する数値精度要件に準拠しています倍精度浮動小数点演算については暫定サポートでありOpenCLSpecification version 10 に準拠していない可能性があります

75 エッジケースの動作

A15 イメージのアドレス指定とフィルタリングの実装

インテル FPGA SDK for OpenCL はイメージのアドレス指定とフィルタリングをサポートしませんSDK はイメージをサポートしていません

A16 アトミック関数

OpenCL Specification version 10 の Section 9 には一部の OpenCL 実装においてサポートされる場合があるオプションの機能が記載されています インテル FPGA SDK for OpenCL は条件付きでアトミック関数をサポートしますサポートされているこの関数の実装はOpenCL SpecificationVersion 10 に準拠していない可能性があります

bull Section 95 の Atomic Functions for 32-bit Integers に関しSDK は 32 ビットのグローバルおよびローカルメモリーのアトミック関数をすべてサポートしますSDK はまたOpenCLSpecification version 11 の Section 61111OpenCL Specification version 12 のSection 61211 に記載されている 32 ビットのアトミック関数もサポートしています

mdash SDK はOpenCL Specification version 10 の Section 97 に記載されている 64 ビットのアトミック関数をサポートしていません

注意 アトミック関数を使用するとデザインのパフォーマンスが低下する可能性がありますカーネルに複数の型のアトミック関数を実装する場合 (atomic_addと atomic_subなど)ハードウェアの動作周波数がさらに低下する可能性があります

A17 埋め込みプロファイルの実装

OpenCL Specification version 10 の Section 10 はOpenCL の埋め込みプロファイルについて説明しています インテル FPGA SDK for OpenCL は明確化した内容および例外をともないOpenCL の埋め込みプロファイルに準拠しています

次の表はOpenCL 埋め込みプロファイルの明確化した内容および例外の概要です

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

185

項目 機能 サポート状況 備考

1 64 ビット整数 64 ビット整数はOpenCL Specification version 10 の埋め込みプロファイルに対し補助的な形式でサポートされています

2 3D イメージ X SDK はイメージをサポートしていません

3 image_channel_data_typeの値による 2D および 3D イメージの作成

X SDK はイメージをサポートしていません

4 サンプラー X SDK はサンプラーをサポートしていません

5 丸めモード CL_DEVICE_SINGLE_FP_CONFIGのデフォルトの丸めモードはCL_FP_ROUND_TO_NEARESTです

6 単精度の基本的な浮動小数点演算に対し記載されている制約事項

X

7 半精度型 X OpenCL Specification version 10 のこの項目はSDK に適用されません

8 CL_UNORM_INT8CL_SNORM_INT8CL_UNORM_INT16CL_SNORM_INT16から float への変換に対して記載されているエラー範囲

A2 OpenCL 12 の機能のサポート状況

以降の章ではOpenCL Specification version 12 に記載されている OpenCL 機能のサポート状況の概要を説明します

A21 OpenCL 12 のランタイムの実装

インテル FPGA SDK for OpenCL はサブバッファーオブジェクトの実装をサポートしていますサブバッファーオブジェクトに関する詳細はOpenCL Specification version 12 の Section 52 を参照ください

SDK は次の API の実装もサポートしています

bull clSetMemObjectDestructorCallback

bull clGetKernelArgInfo

bull clSetEventCallback

これらの API についての詳細はOpenCL Specification 12 の Section 541573 および 59をそれぞれ参照ください

関連情報OpenCL Specification version 12

A22 OpenCL 12 C プログラミング言語の実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 12 の Section 6 で指定されている OpenCL C プログラミング言語機能の多くをサポートしています SDK は明確にした内容および例外をともないOpenCL C プログラミング言語に準拠しています

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

186

注意 サポート状況欄の「」はサポートされている機能であり備考欄においてサポートされている内容を明確にしていますサポート状況欄の「」は備考欄で特定されている内容を除きサポートされている機能です

表 15 OpenCL 12 C プログラミング言語機能のサポート状況

セクション 機能 サポート状況 備考

613 その他の組み込みデータ型 この機能は OpenCL Specification version 12 に準拠していない可能性があります

61212 各種ベクトル関数 SDK は次の組み込みベクトル関数を追加しサポートしていますbull vec_step

bull shuffle

bull shuffle2

61213 printf この機能は OpenCL Specification version 12 に準拠していない可能性があります詳細は下記を確認ください

OpenCL の printf関数は一部例外をともないC99 の printf関数に類似する構文と機能を持ちます詳細はOpenCL Specificationversion 12 を参照くださいprintf関数の使用においてコンパイル手順バッファーまたはフラグに対する特別な要件はありません通常の aocコマンドでprintf命令を含むカーネルをコンパイルすることができますカーネルの実行中に printfデータは インテル FPGA SDK for OpenCL オフラインコンパイラーが自動的に割り当てるグローバルprintfバッファーに格納されますこのバッファーのサイズは 64 kB でありprintf呼び出しのデータ引数の合計サイズがこのサイズを超えてはいけませんカーネルの実行が完了すると printfバッファーのコンテンツは標準出力されますprintfステートメントのフォーマット文字列は256 文字を超えることはできませんバッファーのオーバーフローはシームレスに処理されますつまりprintf命令は無制限に実行することができますただしprintfバッファーがオーバーフローするとカーネルのパイプラインの実行はホストがバッファーを読み取りバッファー内容を出力するまでストールしますprintf関数はデータをグローバルメモリーバッファーに格納するためそのような関数が含まれている場合カーネルのパフォーマンスは低下しますprintf関数の使用上の制限はありませんprintf命令はifと elseのステートメントやループなどで使用することができますカーネルは複数のワークアイテムで実行される複数の printf命令を含むことができますprintf呼び出しのフォーマット文字列引数と文字列リテラル引数は特別なメモリー領域を使用し FPGA からホストシステムに転送されますprintf文字列引数の合計サイズが大きい場合このメモリー領域はオーバーフローする可能性があります (一般的な OpenCL アプリケーションでは通常 3000 文字以下が安全です)オーバーフローした場合エラーメッセージ cannot parse auto-discovery string atbyte offset 4096がホストプログラムの実行中に出力されますprintfからの出力はワークアイテムが並行して printf関数を実行しても混在することはありませんただし並行して実行される printfの順序は保証されていませんつまり printf命令が並行するデータパスにある場合printf出力はプログラム順に表示されない可能性があります

関連情報OpenCL Specification version 12

A3 OpenCL 20 の機能のサポート状況

以降の章ではOpenCL Specification version 20 に記されている OpenCL の機能のサポート状況の概要を提供します

A31 OpenCL 20 のヘッダー

インテル FPGA SDK for OpenCL はすべての OpenCL バージョンをサポートする統一ヘッダーを提供します

OpenCL 20 の機能を使用するには次の 2 行をコードに含めてください

define CL_TARGET_OPENCL_VERSION 200include ltCLopenclhgt

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

187

注意 SDK は現在OpenCL 20 の API をすべてサポートしているわけではありませんサポートされていない API を呼び出すとその API が完全にはサポートされていないことを示すエラーコードが返されます

A32 OpenCL 20 ランタイムの実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 20 の Section 56 に記載されているように共有仮想メモリーの実装に対する暫定サポートを提供しています共有仮想メモリーに関する詳細は OpenCL Specification version 20 の Section 56 を参照ください

重要 ご利用のボード仕様を参照しボードが共有仮想メモリーをサポートしていることを確認してください

関連情報OpenCL Specification version 20 (API)

A33 OpenCL 20 C プログラミング言語のパイプにおける制約

インテル FPGA SDK for OpenCL はOpenCL のパイプに対する暫定サポートを提供します次の表はOpenCL Specification version 20 に記載されているパイプ固有の OpenCL C プログラミング言語の実装に対するサポート状況を示しています

注意 サポート状況欄の「」はサポートされている機能であり一部については備考欄においてサポートされている内容を明確化していますSDK がサポートしていない機能は「X」で識別されています

表 16 パイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数ついての詳細はOpenCL Specification version 20 の Section 613162 で提供されています

関数 サポート状況

int read_pipe (pipe gentype p gentype ptr)

int write_pipe (pipe gentype p const gentype ptr)

int read_pipe (pipe gentype p reserve_id_t reserve_id uint index gentypeptr)

X

int write_pipe (pipe gentype p reserve_id_t reserve_id uint index constgentype ptr)

X

reserve_id_t reserve_read_pipe (pipe gentype p uint num_packets)

reserve_id_t reserve_write_pipe (pipe gentype p uint num_packets)

X

void commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

bool is_valid_reserve_id (reserve_id_t reserve_id) X

表 17 ワークグループのパイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613163で提供されています

関数 サポート状況

reserve_id_t work_group_reserve_read_pipe (pipe gentype p uint num_packets) X

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

188

関数 サポート状況

reserve_id_t work_group_reserve_write_pipe (pipe gentype p uint num_packets)

void work_group_commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void work_group_commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

表 18 パイプクエリーの組み込み関数に対するサポート状況パイプクエリーの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613164 で提供されています

関数 サポート状況

uint get_pipe_num_packets (pipe gentype p) X

uint get_pipe_max_packets (pipe gentype p) X

関連情報OpenCL Specification version 20 (C Language)

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限

項目 制限

大コンテキスト数 ホストメモリーのサイズによってのみ制限されます

大デバイス数 128

ランタイムの 小グローバルメモリー割り当て ランタイムはコンテキストが作成されると 64 kB のデバイスメモリーを割り当てますこのメモリーはプログラム変数の場合はグローバルアドレス空間に静的変数の場合は関数内に予約されていますOpenCL カーネルが printf関数を使用する場合ランタイムは 64 kB のデバイスメモリーを追加し割り当てます

大キュー数 1024

注意 各コンテキストはシステム目的でキューを 2 つ使用します

コンテキストあたりの 大プログラムオブジェクト数 20

コンテキストあたりの 大イベントオブジェクト数 ホストメモリーのサイズによってのみ制限されます

コンテキスト内のイベント間における依存関係の 大数

1000

コマンドあたりのイベント依存関係の 大数 20

大同時実行カーネル数 キューの合計数

エンキューされるカーネルの 大数 1000

FPGA デバイスあたりの 大カーネル数 ハードウェアに静的な制限はありませんエミュレーターは 256 です

カーネルあたりの 大の引数の数 128

カーネル引数の 大合計サイズ カーネルあたり 256 バイト

各カーネルのローカルメモリーにおける宣言済み変数の 大数

128

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20190401 191 bull 以下のトピックを新しく追加しましたmdash ループの投機的実行 (speculated_iterations Pragma) (32 ページ)mdash メモリー属性の指定 (34 ページ)

bull ループの並列性 (max_concurrency Pragma) (31 ページ) に無制限の並行性に関する注意を加えました

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)においてIntelFPGAを関数名に含む非標準の呼び出しに ICD を使用する場合の手順を更新しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)(140 ページ) にパフォーマンスカウンターを使用した OpenCL カーネルのパイプライン計測に関する注記を追加しました

bull ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) (123 ページ) を追加し-no-hardware-kernel-invocation-queueオプションに関し説明しています

bull グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ) を追加し-global-ringオプションに関し説明しています

bull グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring) (116 ページ) を追加し-duplicate-ringオプションに関し説明しています

bull ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) (124 ページ) を追加し-hyper-optimized-handshakingオプションに関し説明しています

bull 整数のプロモーション規則 (80 ページ) を追加し整数のプロモーションに関し説明しています

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) およびカーネル実行中におけるプロファイルデータの収集 (86 ページ) にCLcl_ext_intelfpgahヘッダーファイルを含める際の注意を追加しました

bull uses_global_work_offset(0) カーネル属性に関する新しい項目clEnqueueNDRangeKernel API の global_work_offset 引数をサポートするハードウェアの省略 (176 ページ) を追加しました

bull OpenCL10 C プログラミング言語の実装 (181 ページ) の以下の内容を変更しましたmdash 613 に対するサポート状況の内容を変更し説明を追加mdash 614615 および 6102 を削除mdash 66 および 6118 の説明を追加mdash 6112 および 6115 に関する説明を更新mdash 6119 および 61111 のサポート状況を変更

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull OpenCL C プログラミング言語の制約 (183 ページ) において以下の内容を変更していますmdash 次の機能に関する注記を削除しました

bull 関数へのポインターbull ビットフィールドbull externstaticautoregisterのストレージクラス指定子bull 再帰bull event_t型の__kernel関数のへの引数宣言

mdash 特別な注意がない機能をすべて削除しましたmdash 以下の機能を削除しました

bull アドレススペース間のポインター割り当てbull イメージbull 定義済み識別子

mdash 「32 ビット未満の組み込み型メモリーへの書き込み」に関する説明を更新しました

bull 組み込みジオメトリック関数の引数型 (184 ページ) にサポート状況表の見方を追加しました

bull 数値コンプライアンスの実装 (184 ページ) の71 の説明を更新しましたbull 埋め込みプロファイルの実装 (185 ページ) の項目 4 に説明を追加しましたbull OpenCL 12 のランタイムの実装 (186 ページ) のイメージオブジェクトに対する

サポート情報を削除しましたbull OpenCL 12 C プログラミング言語の実装 (186 ページ) のprintfに対するサ

ポート情報と注記およびその他のデータ型の組み込み関数についての注記を更新しました

bull OpenCL 20 のヘッダー (187 ページ) の古い情報を削除し新しい情報を追加しました

bull 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages) (18 ページ) に-list-board-packagesオプションの詳細を追加しました

bull FPGA ボードのインストール (install) (21 ページ) において手順 6 の FCD に関する詳細および手順 5 の例を追記しました

bull FPGA ボードのアンインストール (uninstall) (22 ページ) にFCD に関する詳細を追記しました

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ) に-board-package=ltboard_package_pathgt に関する詳細を追記しました

bull 高速エミュレーターの既知の問題 (134 ページ) のAutoRun (自動実行) の表記をAutorun に変更しました (英語版のみ)

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) を追加し-fmax=ltfmax target in MHzgt に関し説明しています

bull Windows での ICD Loader Library への接続およびLinux での ICD LoaderLibrary への接続の項目を削除しWindows および Linux における ICD と FCD ドライバーに関する情報を次の項目に追加しましたmdash ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ペー

ジ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表

示 (ldflags) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示

(ldlibs) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情

報の表示 (link-config または linkflags) (96 ページ)bull OpenCL ICD 拡張 API の使用 (97 ページ) の項目を追加しOpenCL ICD 拡張

API の使用方法を説明しています

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

191

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull カーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ)において次の内容を変更しましたmdash タイトルの変更mdash 概要説明の変更mdash registerの説明を FF と FIFO の情報とともに更新mdash memory属性の名前と説明を更新しメモリーの実装型に関する詳細を追加mdash max_concurrency(N) 属性およびそれに関する説明の追加mdash 構造型データメンバーでのメモリー属性の指定に関する情報を追加

bull 変数固有の属性を使用する際の制約 (173 ページ) にconstant 変数に関する内容を記載しnumbanks属性に関する箇条書きの項目を削除しました

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) の項目を追加しfmax ターゲット属性と aoc コマンドオプションに関して説明しています

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ) を更新し高速エミュレーターが現在はデフォルトであり推奨されることを反映しました

20181224 1811 bull RTL リセットおよびクロック信号 (153 ページ) を更新しOpenCL カーネルクロックの2倍の周波数で動作するシステム全体のクロックに対する RTL モジュールのアクセスに関する内容を説明しています

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のEXPECTED_LATENCY要素に関する説明を更新しストールをサポートし ireadyなどの信号を必要とするモジュールに対する EXPECTED_LATENCY値の要件を含めました

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のIS_FIXED_LATENCYXML 要素の説明を更新しIS_FIXED_LATENCY=noが設定されている場合のEXPECTED_LATENCY値の要件を含めました

bull PARAMETER要素を ATTRIBUTES を指定する XML 要素 (156 ページ) に追加しました

bull unique_212unique_212_Connect_42_ul_rlt_5pj_w5 (162 ページ) の箇条書きの2番目の項目において「正確にクロック 1 つ」を削除しました

bull インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt) (108 ページ) を更新し-oオプションの構文から=を削除しましたaocコマンドで出力ファイル名を指定する正しい方法は-o ltfilenamegt ですこのオプションは-o=ltfilenamegt と誤って記載されていましたまたこのコマンドオプションを使用する本プログラミングガイドの構文例はすべて今回の更新において訂正されています

20180927 181 bull RTL モジュールインターフェイス (151 ページ) の重複していた内容を削除しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

192

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20180924 181 bull インテル FPGA SDK for OpenCL プロエディションのインテル FPGA SDK forOpenCL オフラインコンパイラーには新しいフロントエンドがありますこの新しいフロントエンドによって変更になった内容の概要は Intel FPGA SDK for OpenCLPro Edition Release Notes の Improved Intel FPGA SDK for OpenCLCompiler Front End を参照ください

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ) に新しい OpenCL シミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

(166 ページ)mdash OpenCL ライブラリーのシミュレーション (166 ページ)mdash シミュレーターの制限 (168 ページ)

bull 高速エミュレーターの設定 (125 ページ) に新しい OpenCL 高速エミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash 高速エミュレーターの環境変数 (133 ページ)mdash 高速エミュレーターでサポートされている拡張機能 (133 ページ)mdash 高速エミュレーターの既知の問題 (134 ページ)

bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ) を更新しstructカーネルパラメーターは値または structへのポインターとして渡さなければならないことを示しました

bull 参照でのチャネル渡しに対するサポートは終了したため参照でのチャネル渡しに関する参照内容を削除しました

20180803 180 bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ) の誤記を訂正しました正しいフラグは CL_MEM_HETEROGENEOUS_INTELFPGAですこれまでこのフラグは誤って CL_MEM_HETEROGENEOUS_INTELになっていました

20180614 180 bull ハードウェアを構築せずに行うカーネルのコンパイル (-c) (106 ページ) のaoc -cコマンドの動作についての説明を訂正しました-cコマンドオプションでフォルダーやサブディレクトリーは作成されません

20180523 180 bull カーネルコピーでのチャネル使用 (178 ページ) のコード例を訂正しデザイン例が正常にコンパイルされるようにしました

20180504 180 bull インテル Quartus Prime 開発ソフトウェアスタンダードエディションに関する情報を削除しました

bull 中間コンパイルでの aocコマンドおよび関連するすべての内容において-cを-rtlに変更しました インテル FPGA SDK for OpenCL プロエディションは-rtlフラグを中間コンパイルに提供します

bull 次の項目に記載されているデバイスの 大数を 128 に増加しましたmdash FPGA ボードのインストール (install) (21 ページ)mdash FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)mdash ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)mdash オフラインまたはホストなしでの FPGA のプログラミング (program

ltdevice_namegt) (24 ページ)mdash フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)mdash 複数の FPGA デバイスのプログラミング (99 ページ)

bull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) のワンステップでの OpenCL カーネルのコンパイルフローに記載されている図およびトピックの内容を更新しました

bull 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー (12 ページ) の複数のステップによる インテル FPGA SDK forOpenCL プロエディションデザインフローの図を更新し-rtl高速コンパイルおよびインクリメンタルコンパイルに関する情報を追記しました

bull データの処理効率を 適化するためのプログラミング手法 (27 ページ) にループの並列性 (max_concurrency Pragma) (31 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

193

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull 項目のタイトルをローカルメモリー効率の 適化に向けたプログラミング手法からローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35ページ) へ変更しました

bull IO チャネルのエミュレーション (46 ページ) の章においてカーネルとホストまたはカーネルと他のプロセス間における通信のエミュレーション (Linux 限定) を削除しました

bull 値によってチャネルまたはパイプを渡すカーネルのエミュレーション (127 ページ)を更新し値によるパイプまたはチャネル渡しに関する情報を追加しましたまた参照によるチャネル渡しに対するサポートは非推奨です

bull 項目のタイトルを「チャネルまたはパイプの複数のコマンドキュー実装に向けた要件」からカーネルを同時に実行するための複数のコマンドキューにおける要件 (82ページ) に変更し内容を更新しました

bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ) の項目を次のサブ項目とともに追加しましたmdash インクリメンタルコンパイルレポート (119 ページ)mdash インクリメンタルコンパイルのその他のコマンドオプション (120 ページ)mdash インクリメンタルコンパイルフィーチャーの制限 (123 ページ)

bull 早期の ECC 機能に関するメモリーの誤り訂正符号をともなうカーネルのコンパイル(-ecc) (123 ページ) の項目を追加しました

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) の次の内容を変更していますmdash 項目のタイトルを新しいカーネル引数属性オプションから

intel_host_accessible カーネル引数属性オプション (67 ページ) に変更mdash 項目のタイトルを新しい API 機能から ホストがアクセス可能なパイプカーネル

引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数(68 ページ) に変更

bull インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ) の次の内容を変更していますmdash ランタイムでのサポートが終了したことによる環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA の参照項目を削除

mdash キューの 大数を更新bull RTL モジュールの XML 構文 (154 ページ) にRESOURCES要素に関する内容を

追加しましたmdash リソースを指定する XML 要素 (159 ページ) の項目を追加

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテルStratix 10 デザイン固有のリセット要件 (154 ページ) の項目を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にカーネル内に登録される割り当ての組み込み関数 (179 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

194

日付 バージョン 変更内容

2017 年 12 月 20171208 bull 次の項目を新しく追加しましたmdash 自動実行カーネルのプロファイリング (142 ページ)mdash エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ペー

ジ)mdash プロファイルデータの取得 (89 ページ)mdash 複数の自動実行プロファイリング呼び出し (89 ページ)mdash インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの

開発 (143 ページ)mdash Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフ

ラインコンパイラープラグインのコンフィグレーション (143 ページ)mdash Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラ

ープラグインのコンフィグレーション (143 ページ)mdash インテル Code Builder for OpenCL でのセッションの作成 (144 ページ)mdash セッションのコンフィグレーション (145 ページ)

bull RTL モジュールの XML 構文 (154 ページ) のXML 仕様ファイルからltPARAMETER name=WIDTH value=32gt を削除しました

2017 年 11 月 20171106 bull トピックを各章へ移動しましたbull リファレンスの商標を次のように変更しました

mdash マクロ ALTERA_CLを INTELFPGA_CLへmdash 環境変数 ALTERAOCLSDKROOTを INTELFPGAOCLSDKROOTへmdash 環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_ALTERA をCL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA へ

mdash clGetExtensionFunctionAddressをclGetExtensionFunctionAddressIntelFPGAへ

mdash 環境変数 CL_CONTEXT_EMULATOR_DEVICE_ALTERA をCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA へ

mdash write_channel_alteraを write_channel_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash CL_MEM_BANKを CL_CHANNELへmdash CL_MEM_BANK_1_INTELを CL_CHANNEL_1_INTELFPGAへmdash CL_MEM_BANK_2_INTELを CL_CHANNEL_2_INTELFPGAへmdash Arria 10 を インテル Arria 10 へmdash Quartus Prime をインテル Quartus Prime へmdash インテル FPGA SDK for OpenCL Profiler を インテル FPGA Dynamic

Profiler for OpenCL へmdash TimeQuest タイミングアナライザーをタイミングアナライザーへmdash Qsys Pro をプラットフォームデザイナーへ

bull インテル FPGA SDK for OpenCL の FPGA プログラミングフロー (8 ページ) にFPGA データフローのアーキテクチャー図と関連する記述を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の項目にRTL モジュールインターフェイス (151 ページ) を追加しRTL モジュールインターフェイスの動作例を提供しています

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) のタイミング図を更新しました

bull ブロッキングのチャネル書き込みの実装 (42 ページ) とブロッキングのチャネル読み取りの実装 (43 ページ) においてlttypegt の定義から「一定にできない」という記述を削除しました

bull 徐々に速度低下する OpenCL システムのデバッグ (104 ページ) の項目を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

195

日付 バージョン 変更内容

bull PLDA ウェブサイトへのリンクを OpenCL カーネルのコンパイル (105 ページ) に追加しました

bull カーネルの命名ガイドライン (26 ページ) において箇条書きの 後のポイントを更新しキーワードとなる VHDL と Verilog を含めました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) に制御可能なデザインの側面を一覧にしました

bull OpenCL ライブラリー (147 ページ) に RTL の拡張を追加しましたbull RTL モジュールと OpenCL パイプラインの理解 (148 ページ) の項目をインテル

FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ) と RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149 ページ)に分割しました

bull インテル FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ)の左側のコード例を右側の図に合わせました図の下部を図を説明する段落の上に移動させました

bull RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149ページ) に Avalon -ST の関連リンクを追加しました

bull ストールのない RTL (150 ページ) のパラグラフを手順ごとに分割し関連リンクを追加しました

bull 複数のワークアイテムの決定論的な順序付けにおける要件 (38 ページ) にワークアイテムの順序付けにおける 3 番目の要件を追加しました

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) を更新しましたbull 新しいトピック OpenCL コンパイルの高速化 (-fast-compile) (117 ページ) を追

加し-option=ltvaluegt の規則を実装しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のlog ファイルへのリファレンスを HTML レポートに置き換え二重ダッシュのコマンドオプションを単一ダッシュに置き換えました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にStratix 10 に対するサポートを追加しました

bull ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得(16 ページ) に二重ダッシュおよび aoc コマンドの-option ltvaluegt の表記規則が非推奨となったことを強調する注記を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

196

日付 バージョン 変更内容

bull 次の項目に単一ダッシュと-option=ltvaluegt の表記規則を適用しましたmdash コンパイラーバージョンの表示 (-version) (17 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプショ

ンリストの表示 (引数なし-help-h) (17 ページ)mdash 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-

boards および-list-board-packages) (18 ページ)mdash 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)mdash ヘッダーファイル位置の指定 (-I=ltdirectorygt) (107 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の

指定 (-o ltfilenamegt) (108 ページ)mdash 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル

(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

mdash カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) (110 ページ)

mdash カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) (111 ページ)

mdash リソース推定使用率要約の画面表示 (-report) (113 ページ)mdash グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt) (115 ページ)mdash コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-

cache-bytes=ltNgt) (116 ページ)mdash 浮動小数点演算処理順序の緩和 (-fp-relaxed) (116 ページ)mdash 浮動小数点演算における丸め処理の削減 (-fpc) (117 ページ)mdash チャネル深度のエミュレーション (128 ページ)mdash エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-

emulator) (128 ページ)mdash OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

(161 ページ)mdash OpenCL ライブラリーのコマンドラインオプション (170 ページ)mdash パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

(140 ページ)bull カスタムプラットフォーム固有の関数へのアクセス (90 ページ) にICD Loader の

関連リンクを追加しましたbull 計算ユニット数の指定 (33 ページ)num_compute_units(XYZ) 属性を使用し

たカーネルの複製 (176 ページ)OpenCL カーネルのエミュレーション (129 ページ) に計算ユニットに関する注記を追加しました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にインテル Stratix 10 に対するサポートを追加しました

bull ハードウェアとエミュレーターの結果の不一致 (131 ページ) の項目を追加しましたbull OpenCL C プログラミング言語の制約 (183 ページ) にサポート状況表の見方を

追加しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のフローチャートを簡略化しそれにともなう記述を更新しました

bull AOCL_BOARD_PACKAGE_ROOT は廃止されているためリファレンスを本プログラミングガイドから削除しました

bull aocl installのインスタンスをaocl installltpath_to_customplatformgt に更新しました

bull aocl uninstallのインスタンスをaocl uninstallltpath_to_customplatformgt に更新しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

197

日付 バージョン 変更内容

bull ホストパイプに関する次の項目を新しく追加しましたmdash ホストパイプを介したカーネルとの直接通信 (67 ページ)mdash intel_host_accessible カーネル引数属性オプション (67 ページ)mdash ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプ

オブジェクトと通信するための API 関数 (68 ページ)mdash ホストがアクセス可能なパイプの作成 (69 ページ)mdash cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

bull OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化(41 ページ) にチャネル拡張を有効にするためのプラグマを追加しました

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ) および外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ) のデザイン例のコンパイル手順を更新しました

bull インテル FPGA SDK for OpenCL チャネル拡張の実装における制約 (39 ページ)の「単一のチャネル呼び出しサイト」の項目を「複数のチャネル呼び出しサイト」に置き換えました

2017 年 5 月 20170508 bull コード例の関数の商標を次のように変更しましたmdash read_channel_alteraを read_channel_intelへmdash write_channel_alteraを write_channel_intelへmdash read_channel_nb_alteraを read_channel_nb_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash clGetBoardExtensionFunctionAddressAlteraを

clGetBoardExtensionFunctionAddressIntelFPGAへbull IO チャネルのエミュレーション (46 ページ) を追加しましたbull 任意精度での整数の実装 (70 ページ) を追加しましたbull ネスト化されたループの結合 (28 ページ) を追加しましたbull ループ開始間隔の指定 (II) (30 ページ) を追加しましたbull チャネル深度のエミュレーション (128 ページ) を追加しましたbull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) を追加しまし

たbull pragma OPENCL EXTENSION cl_altera_channels enableへ

のリファレンスをすべて削除しましたチャネルの実装にこのプラグマは必要ありません

bull 異種メモリーに関する情報を次のように再編成しましたmdash メモリーにおけるポインターサイズの指定の内容をローカルメモリーサイズへ

のポインターの 適化に向けたプログラミング手法 (35 ページ) へ統合mdash 次の 3 項目に構成を変更

bull グローバルメモリーの手動分割における OpenCL バッファーの割り当て(82 ページ)

bull 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)

bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ)mdash グローバルメモリーにおけるバッファー位置の指定の内容を異なるメモリータイ

プ (異種メモリー) 間でのバッファーの分割 (84 ページ) に移動(これまではアクセス効率の 適化に向けたプログラミング手法にありました)

bull カーネル実行中におけるプロファイルデータの収集 (86 ページ) を更新しプロファイルデータの収集がカーネル起動時に与える影響についての警告を加えました

bull OpenCL カーネルのコンパイル (105 ページ) に暗号化されたclファイルをコンパイルする際の制約を加え更新しました

bull インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限 (162 ページ) を更新しRTL モジュールは入力を制御するために単一入力のAvalon-ST インターフェイスを使用する必要があることを明記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

198

日付 バージョン 変更内容

bull OpenCL Profiler の変更によって影響を受ける項目を以下のように更新しましたmdash インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) (141

ページ) に新しいコマンドオプションを含め更新mdash 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデ

ザインフロー (12 ページ) の図 5 (13 ページ) に新しいコマンドオプションを反映させて更新

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) のコード例を訂正しました

bull チャネルのワークアイテムのシリアル実行 (39 ページ) の複数のワークアイテムをともなうループのチャネル実行の章に記載されているコード例を訂正しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の章に以下の更新を行いましたmdash RTL モジュールと外部メモリーの通信 (159 ページ) を更新しRTL モジュール

と外部メモリーの通信において推奨される手法を明記mdash RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

(161 ページ) を更新しインテル Quartus Prime 開発ソフトウェアプロエディションユーザーガイドのパーシャルリコンフィグレーションへのリンクを追記

mdash bankbitsと mergeの内容をカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) に追加

mdash コード例の関数の商標を以下のように変更bull read_channel_alteraを read_channel_intelへbull write_channel_alteraを write_channel_intelへ

2016 年 10 月 20161031 bull Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更しました

bull Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコンパイラーに商標を変更しました

bull ビッグエンディアンシステムに対するサポートが廃止削除されたため次の内容が変更になっていますmdash ビッグエンディアンシステムのためのカーネルのコンパイル (--big-endian) の

項目を削除mdash ビッグエンディアン (64 ビット) をホストアプリケーションがターゲットにでき

るアーキテクチャーのリストから削除bull OpenCL バイナリーのコンパイル環境の表示の項目を追加しaoc envコマンドを

導入しましたbull 適化レポートへのソースの参照先追加 (-g) を削除しましたオフラインコンパイ

ラーは自動的にソース情報をコンパイラーレポートに含めx86 Linux マシンでのエミュレーション中のシンボリックデバッグを有効にします

bull コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) の項目を追加し-g0 aocコマンドオプションを導入しました

bull インテル FPGA SDK for OpenCL エミュレーターの制限事項から「エミュレーターはハーフデータ型をサポートしません」という記述を削除しました

bull ホストアプリケーションと Khronos ICD Loader Library のリンクにおいてサポート内容を更新しましたインテルが提供する ICD Loader Library はOpenCLSpecification version 10 およびOpenCL Specification version 111220 で実装されている API をサポートします

bull FPGA ボードの管理における以下内容を更新しましたmdash SDK が複数のカスタムプラットフォームのインストールをサポートすることを明

記複数のボードをインストレールする際に SDK ユーティリティーを各ボードに使用するにはAOCL_BOARD_PACKAGE_ROOT 環境変数設定が関連するボードのカスタムプラットフォームのサブディレクトリーに対応している必要があります

mdash カスタムプラットフォームが複数あるシステムではMMD ライブラリーに直接リンクするのではなくホストプログラムが ACD を使用しボードを検出する必要があることを明記

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

199

日付 バージョン 変更内容

bull カーネルの reporthtml ファイルのレビューの章を追加しanalyze-areaユーティリティーオプション廃止の通知を追加しましたHTML レポートの導入により以下の項目を削除しましたmdash エリアレポートでのカーネルのリソース使用率情報のレビューmdash エリアレポートへのアクセスmdash エリアレポートのレイアウト

bull 複数のステップによるデザインフローのデザイン手順および複数のステップによるインテル FPGA SDK for OpenCL デザインフローの図を更新しエリアレポートをHTML レポートに置き換えましたまた-gを有効化するための情報を削除しました

bull レジスターの推論のコード例に続く文章においてハードウェアでの配列の実装をオフラインコンパイラーが決定する方法の説明を訂正しました

bull Windows での ICD Loader Library のリンクの内容をより明確化しましたbull OpenCL 機能のサポートの章に次の更新を行いました

mdash Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更mdash Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコ

ンパイラーに商標を変更mdash インテル FPGA SDK for OpenCL 割り当ての制限の章の次の内容を修正

bull ランタイムの 小メモリー割り当てに関する情報を更新bull 大キュー数を 70 から 256 へ更新bull FPGA デバイスあたりの 大カーネル数の 64 を変更ハードウェアにコンパ

イルする場合の静的な制限はなくなりエミュレーターにコンパイルする場合は 256 になります

mdash OpenCL 10 C プログラミング言語の実装の半精度浮動小数点の備考欄にこの機能はエミュレーターでサポートされているという注記を追加さらに半精度浮動小数点のサポート状況を「X」から「」へ更新

mdash OpenCL 20 機能のサポート状況にOpenCL 20 のヘッダーを加えOpenCL20 のヘッダーを使用しサポートされていない API を呼び出すとエラーの原因になることを追記

2016 年 5 月 20160502 bull AOCL プログラミングモデルの回路図を Altera SDK for OpenCL FPGAProgramming Flow の章に追加しました

bull AOCL FPGA プログラミングフローの図をAltera Offline Compiler KernelCompilation Flows の章へ移動しました

bull 複数ステップでの AOCL デザインフローの図とそれに関連する内容をエリアレポートのレビュー手順を含めて更新しました

bull 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの機能に関する情報を追加しました詳細は単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの章を参照ください

bull OpenCL カーネルのエミュレーションの章にICD を使用する他の OpenCL SDK とともにエミュレーションを行うための複数のデバイスサポートに関する情報を追加しました

bull 強化されたエリアレポート機能に関する情報を追加しましたmdash analyze-area AOCL ユーティリティーコマンドを呼び出しHTML エリアレ

ポートを生成するオプションを追加mdash HTML エリアレポートのレイアウトを説明する項目を追加

bull Windows での ICD Loader Library のリンクにおいて変更後の Makefileのコード例から$(AOCL_LDLIBS) を削除しました

bull チャネルおよびパイプの複数のワークアイテムの順序付けの章においてチャネルまたはパイプ呼び出しがワークアイテムに対し不変であることを確認するために AOCLが使用する特性を変更しました

bull インテル FPGA SDK for OpenCL アドバンスト機能の章を追加しましたbull OpenCL 機能のサポート状況の章の OpenCL 12 のランタイムの実装にAOCL が

clSetEventCallbackclGetKernelArgInfoclSetMemObjectDestructorCallback の API をサポートすることを注記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

200

日付 バージョン 変更内容

2015 年 11 月 20151102 bull aocコマンドを引数なしで呼び出しAltera Offline Compiler のヘルプメニューにアクセスするオプションを追加しました

bull 複数のホストスレッドの章を更新しOpenCL ホストランタイムはスレッドセーフであることを明記しました

bull 複数のカーネルのソースファイルサポートを反映するため以下の図と章を更新しましたmdash AOCL FPGA プログラミングフローの章の AOCL FPGA プログラミングフロ

ーの図mdash ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコン

パイルの章mdash ハードウェアを構築せずに行うカーネルのコンパイル (-c) の章

bull チャネルに対する複数のワークアイテムの順序付けの誤解を招く文章を削除しましたbull チャネル実装の概要の図を更新しましたbull 次の章の OpenCL パイプに関する内容を更新しました

mdash OpenCL パイプ機能の概要のパイプネットワーク実装の概要の図mdash OpenCL のパイプ実装における制約の章のエミュレーションサポートmdash 誤ったコードを正しい構文に修正mdash パイプハンドルの宣言の io 属性を使用した IO パイプの実装にリンクを追加

bull ホストを経由した FPGA のプログラミングに注意事項を追記しましたイベントオブジェクトは使用後に解放し過剰なメモリー使用を防ぐ必要があります

bull OpenCL 機能のサポート状況の以下の内容を更新しましたmdash OpenCL Specification のバージョンに基づき各機能のサポート状況と制限事

項を分類mdash OpenCL に準拠する倍精度浮動小数点関数リストに次の関数を追加

sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

mdash OpenCL 12 のランタイムの実装にサブバッファーオブジェクトのサポートを追加

mdash OpenCL 12 のランタイムの実装に共有仮想メモリーに対する暫定サポートを追加

mdash Altera SDK for OpenCL 割り当ての制限にランタイムの 小グローバルメモリーの割り当て制限を追加

2015 年 5 月 1500 bull カーネルの命名ガイドラインにOpenCL カーネルを kernelclと命名することに反対する内容を追記しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) にローカルディスクからホストアプリケーションを実行し低速なネットワークディスクアクセスに起因する潜在的な遅延を回避する必要があることを明記しました

bull OpenCL カーネルのエミュレーションとデバッグの注記を変更しSoC をターゲットとするデザインのエミュレーションは SoC 以外のボードで行う必要があることを示しました

bull OpenCL カーネルのエミュレーションのホストアプリケーションを実行するコマンドを更新し ltprocess_IDgt-libkernelsoを含むデフォルトの一時ディレクトリーを上書きする命令を追加しました

bull カーネルコンパイル時のハードウェア生成フィッティングエラーの解決に--high-effort aocコマンドフラグを導入しました

bull 倍精度浮動小数点演算の有効化に倍精度浮動小数点演算を有効にするためのOPENCL EXTENSIONプラグマを導入しました

bull OpenCL パイプのサポートを導入しました詳しくはOpenCL パイプの実装 (またその章内の項目) およびホストアプリケーションでのパイプオブジェクトの作成を参照してください

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

201

日付 バージョン 変更内容

bull AOCL チャネル拡張の制約にチャネル ID の配列への静的なインデックス付けの方法を表すコード例を追加しました

bull 複数のホストスレッドにOpenCL ホスト関数の呼び出しを複数のスレッドを持つホストアプリケーションで同期するための推奨事項を追加しました

bull ICD と ACD のサポートを導入しました詳しくはホストアプリケーションとKhronos ICD Loader Library のリンクを参照してください

bull clGetBoardExtensionFunctionAddressAlteraを導入しユーザーが利用可能な関数をリファレンスできるようにしました詳細はカスタムプラットフォーム固有の関数へのアクセスを参照してください

bull OpenCL 機能のサポート状況の以下内容を更新しましたmdash Alterareg SDK for OpenCL が暫定的にサポートする倍精度浮動小数点関数の

一覧を表示mdash OpenCL C プログラミング言語のパイプにおける制約を追記

2014 年 12 月 1410 bull 情報フローを再編成しましたAltera reg SDK for OpenCL (AOCL) または AlteraRTE OpenCL を使用して実行する可能性のある作業に基づき情報を提供しています

bull --util ltNgt および-O3の AOC (Altera Offline Compiler) オプションに関連する情報を削除しました

bull OpenCL カーネルのコンパイルに以下の PLDA QuickUDP IP コアライセンスに関する情報を追加しました1 PLDA QuickUDP IP コアライセンスは Stratix V ネットワークリファレンスプ

ラットフォームまたは QuickUDP IP コアを使用するカスタムプラットフォームに必要です

2 QuickUDP IP コアライセンスを不適切にインストールするとQuickTCP IP コアに関するエラーメッセージが表示されコンパイルは失敗します

bull 大規模なシフトレジスターの条件付きシフトは推奨されないという注記を追加しました

bull 複数のデバイスでのシステムのエミュレーションの章を削除しました現在は新しいenvCL_CONTEXT_EMULATOR_DEVICE_ALTERA=ltnumber_of_devicesgtコマンドが複数のデバイスをエミュレーションするために利用可能です

bull 言語サポートの制限を AOCL エミュレーターの制限の章から削除しましたbull OpenCL 機能のサポートの章の AOCL の割り当て制限でFPGA あたりの 大カー

ネル数を 32 から 64 に更新しました

2014 年 6 月 1400 bull --estimate-throughputおよび--sw-dimm-partitionの AOC オプションを削除しました

bull -march=emulator-g--big-endian--profileの AOC オプションを追加しました

bull --no-interleavingはltglobal_memory_typegt 引数を必要としますbull -fp-relaxed=trueは現在--fp-relaxedですbull -fpc=trueは現在--fpcですbull SoC 以外のデバイスにおいて aocl diagnostic は現在 aocl

diagnose および aocl diagnose ltdevice_namegt ですbull programおよび flashはltdevice_namegt 引数を必要としますbull FPGA ボードのデバイス名の識別を追加しましたbull AOCL プロファイラーユーティリティーを追加しましたbull AOCL のチャネル拡張と関連する項目を追加しましたbull チャネルの属性を追加しましたbull ホストとカーネルにおける構造体データ型のデータレイアウトの一致を追加しましたbull レジスターインターフェイスおよびシフトレジスターインターフェイスを追加しまし

たbull Channels and Multiple Command Queues を追加しましたbull SoC で動作する OpenCL カーネルの共有メモリーアクセスを追加しましたbull カーネル実行中におけるプロファイルデータの収集を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

202

日付 バージョン 変更内容

bull OpenCL カーネルのエミュレーションとデバッグとそれに関連するサブ項目を追加しました

bull AOC カーネルのコンパイルフローを更新しましたbull -v を更新しましたbull ホストバイナリーの要件を更新しましたbull グローバルメモリーアクセスの分割と異種グローバルメモリーアクセスの分割を

グローバルメモリーアクセスの分割に統合しましたbull 付録 A の AOC 割り当ての制限を更新しましたbull max_unroll_loopsmax_share_resources

num_share_resourcestaskのカーネル属性を削除しましたbull packedと aligned(ltNgt) のカーネル属性を追加しましたbull OpenCL 機能のサポート状況の章の以下 AOCL 割り当て制限の内容を更新しまし

たmdash 大コンテキスト数mdash 大キュー数mdash コンテキストあたりの 大イベントオブジェクト数

2013 年 12 月 1311 bull 「-W と-Werror」の章を削除し「-W」と「-Werror」の 2 章に再編成しましたbull 複数のデバイスのサポートを反映するために次の内容を更新しました

mdash AOCL FPGA プログラミングフローの図mdash --list-boards の章mdash -board ltboard_namegt の章mdash 複数の FPGA デバイスのプログラミングの項目をFPGA のプログラミングに追

加bull 異種グローバルメモリーのサポートを反映するため以下の内容を追加しました

mdash --no-interleaving の章mdash カーネルのプラグマと属性に buffer_locationのカーネル属性mdash 異種グローバルメモリーアクセスの分割の章

bull 付録OpenCL 機能のサポート状況においてサポート状況の指定を更新しましたbull OpenCL プログラミング言語の実装の章からOpenCL プログラミング言語の制約

に関する情報を削除しましたまた新しく OpenCL プログラミング言語の制約の章を作成しその内容を記載しました

2013 年 11 月 1310 bull 情報フローを再編成しましたbull インテル FPGA SDK for OpenCL コンパイルフローを更新後AOCL FPGA プロ

グラミングフローにタイトルを変更しましたbull 1 ステップでの AOC コンパイルフローと 2 ステップでの AOC コンパイルフローの

図を追加しましたbull AOCL バージョン 131 の内容の章を更新しましたbull 以下の章を削除しました

mdash OpenCL カーネルソースファイルのコンパイルmdash Altera Offline Kernel Compiler の使用mdash FPGA ボードの設定mdash 特定の FPGA ボードのターゲットmdash OpenCL アプリケーションの実行mdash カーネルソースファイルの統合mdash アライメントされたメモリー割り当てmdash FPGA ハードウェアのプログラミングmdash FPGA のフラッシュメモリーのプログラミング

bull OpenCL カーネルソースファイルのコンパイルを更新後AOC コンパイルフローへ名称を変更しました

bull OpenCL カーネルへのファイルスコープ構造の受け渡しを OpenCL カーネルでの構造体引数の使用にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張を更新しカーネルのプラグマと属性へタイトルを変更しました

bull FPGA へのカーネルのロードを FPGA のプログラミングにタイトルを変更しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

203

日付 バージョン 変更内容

bull ホストプログラムのコンパイルおよびリンクホストプログラムのコンパイルの設定およびライブラリーパスとリンクを 1 つの章に統合しました

bull プリプロセッサーマクロの章を追加しましたbull グローバルメモリーアクセスの 適化のタイトルをグローバルメモリーアクセス

の分割に変更しました

2013 年 6 月 130 SP10 bull FPGA ボードの設定の章を追加しましたbull カーネルプログラミング時の考慮事項からターゲット FPGA ボードの指定の項目

を削除しましたbull 特定の FPGA ボードのターゲットとコンパイルレポートの生成の項目をOpenCL カ

ーネルソースファイルのコンパイルに追加しましたbull ファイルスコープ__constant アドレス空間修飾子のタイトルを__constant アドレ

ス空間修飾子に変更し次の項目を挿入しましたmdash 関数スコープ__constant 変数mdash ファイルスコープ__constant 変数mdash ホストからの__constant パラメーターの指定

bull OpenCL カーネルへのファイルスコープ構造の受け渡しの項目をカーネルプログラミング時の考慮事項に追記しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの変更をカーネル属性とプラグマの指定による OpenCL カーネルの拡張にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張の章の unrollプラグマディレクティブの内容を更新しました

bull 順不同のコマンドキューおよび構造パラメーター変換に向けたホストプログラムの変更の項目をホストプログラミング時の考慮事項に追加しました

bull clCreateProgramWithBinary を使用した FPGA へのカーネルのロード およびアライメントされたメモリー割り当ての章を更新しました

bull フラッシュプログラミング手順を更新しましたbull 付録 B のオプションの拡張の内容を更新しアトミック関数にタイトルを変更しまし

たbull 付録 B からプラットフォームレイヤーとランタイムの実装を削除しました

2013 年 5 月 1301 bull 明示的なメモリーフェンス機能がサポートされるようになったため関連する内容をOpenCL プログラミング言語の実装の表から削除しました

bull FPGA のフラッシュメモリーのプログラミングの章を更新しましたbull カーネル属性とプラグマの指定による OpenCL カーネルの変更の章を追加しカー

ネルのパフォーマンスを 適化するために実装可能なカーネル属性とプラグマを導入しました

bull グローバルメモリーアクセスの 適化の章を追加しデータの分割に関する説明を追加しました

bull 付録 A からaocl プラグムコマンドを使用した FPGA のプログラミングの章を削除しました

2013 年 5 月 1300 bull コンパイルフローを更新しましたbull カーネルのコンパイラーコマンドを更新しましたbull Altera SDK for OpenCL ユーティリティーコマンドを追加しましたbull OpenCL プログラミング時の考慮事項を追加しましたbull フラッシュプログラミング手順を更新しこれを付録 A に移動しましたbull 新しい clCreateProgramWithBinary FPGA ハードウェアプログラミング

フローを追加しましたbull ホストを必要としない clCreateProgramWithBinaryハードウェアプログラ

ミングフローを付録 A の aocl プラグマコマンドを使用した FPGA プログラミングに移動しました

bull 割り当て制限と OpenCL 言語サポートに関する 新情報を付録 B へ移動しました

2012 年 11 月 1210 初版

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

204

  • インテル FPGA SDK for OpenCLプロエディション プログラミングガイド
  • 目次
  • 1 インテルreg FPGA SDK for OpenCLtrade の概要
    • 11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件
    • 12 インテル FPGA SDK for OpenCLのFPGAプログラミングフロー
      • 2 インテル FPGA SDK for OpenCLオフラインコンパイラーのカーネルコンパイルフロー
        • 21 シンプルなカーネルに向けたワンステップコンパイル
        • 22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー
          • 3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得
            • 31 ソフトウェアバージョンの表示 (version)
            • 32 コンパイラーバージョンの表示 (-version)
            • 33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)
              • 331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)
                • 34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)
                • 35 利用可能なFPGAボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages)
                • 36 OpenCLバイナリーのコンパイル環境の表示 (env)
                  • 4 FPGAボードの管理
                    • 41 FPGAボードのインストール (install)
                    • 42 FPGAボードのアンインストール (uninstall)
                    • 43 FPGAボードのデバイス名の照会 (diagnose)
                    • 44 ボード診断テストの実行 (diagnose ltdevice_namegt)
                    • 45 オフラインまたはホストなしでのFPGAのプログラミング (program ltdevice_namegt)
                    • 46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)
                      • 5 OpenCLカーネルの構築
                        • 51 カーネルの命名ガイドライン
                        • 52 データの処理効率を最適化するためのプログラミング手法
                          • 521 ループ展開 (unroll Pragma)
                          • 522 ネスト化されたループの結合
                          • 523 ループ開始間隔の指定 (II)
                          • 524 ループの並列性 (max_concurrency Pragma)
                          • 525 ループの投機的実行 (speculated_iterations Pragma)
                          • 526 ワークグループサイズの指定
                          • 527 計算ユニット数の指定
                          • 528 SIMDワークアイテム数の指定
                          • 529 メモリー属性の指定
                            • 53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法
                            • 54 インテル FPGA SDK for OpenCL チャネル拡張の実装
                              • 541 インテル FPGA SDK for OpenCL チャネル拡張の概要
                              • 542 チャネルにおけるデータの動作
                              • 543 チャネルに対する複数のワークアイテムの順序付け
                                • 5431 チャネルのワークアイテムのシリアル実行
                                  • 544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約
                                  • 545 OpenCLカーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化
                                    • 5451 チャネルのハンドル宣言
                                    • 5452 ブロッキングのチャネル書き込みの実装
                                      • 54521 ノンブロッキングのチャネル書き込みの実装
                                        • 5453 ブロッキングのチャネル読み取りの実装
                                          • 54531 ノンブロッキングのチャネル読み取りの実装
                                            • 5454 ioチャネル属性を使用したIOチャネルの実装
                                            • 5455 IOチャネルのエミュレーション
                                            • 5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例
                                            • 5457 depth属性を使用するバッファーされたチャネルの実装
                                            • 5458 チャネルの呼び出し順序の強制
                                              • 54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義
                                                • 55 OpenCLパイプの実装
                                                  • 551 OpenCLパイプ機能の概要
                                                  • 552 パイプデータの動作
                                                  • 553 パイプにおける複数のワークアイテムの順序付け
                                                    • 5531 パイプにおけるワークアイテムのシリアル実行
                                                      • 554 OpenCLのパイプ実装における制約
                                                      • 555 カーネルに向けたOpenCLパイプの有効化
                                                        • 5551 他のOpenCL SDKとの互換性の確保
                                                        • 5552 パイプハンドルの宣言
                                                        • 5553 パイプ書き込みの実装
                                                        • 5554 パイプ読み出しの実装
                                                        • 5555 depth属性を使用するバッファーされたパイプの実装
                                                        • 5556 io属性を使用したIOパイプの実装
                                                        • 5557 パイプ呼び出し順序の強制
                                                          • 55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義
                                                              • 556 ホストパイプを介したカーネルとの直接通信
                                                                • 5561 intel_host_accessibleカーネル引数属性オプション
                                                                • 5562 ホストがアクセス可能なパイプカーネル引数にバインドされたcl_memパイプオブジェクトと通信するためのAPI関数
                                                                • 5563 ホストがアクセス可能なパイプの作成
                                                                • 5564 cl_intel_fpga_host_pipe拡張機能の使用例
                                                                    • 56 任意精度での整数の実装
                                                                    • 57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用
                                                                    • 58 __constantアドレス空間修飾子の宣言
                                                                    • 59 構造体データ型をOpenCLカーネルに引数として含める
                                                                      • 591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致
                                                                      • 592 データ構造パディング挿入の無効化
                                                                      • 593 構造体のアライメントの指定
                                                                        • 510 レジスターの推論
                                                                          • 5101 シフトレジスターの推論
                                                                            • 511 倍精度浮動小数点演算の有効化
                                                                            • 512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター
                                                                              • 5121 アキュムレーターを推論するためのプログラミング手法
                                                                                • 513 整数のプロモーション規則
                                                                                  • 6 ホストアプリケーションの設計
                                                                                    • 61 ホストのプログラミング要件
                                                                                      • 611 ホストマシンのメモリー要件
                                                                                      • 612 ホストバイナリーの要件
                                                                                      • 613 複数のホストスレッド
                                                                                      • 614 順不同のコマンドキュー
                                                                                      • 615 カーネルを同時に実行するための複数のコマンドキューにおける要件
                                                                                        • 62 グローバルメモリーの手動分割におけるOpenCLバッファーの割り当て
                                                                                          • 621 同じメモリータイプの複数のインターフェイスでのバッファーの分割
                                                                                          • 622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割
                                                                                          • 623 ホストアプリケーションでのパイプオブジェクトの作成
                                                                                            • 63 カーネル実行中におけるプロファイルデータの収集
                                                                                              • 631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング
                                                                                              • 632 プロファイルデータの取得
                                                                                              • 633 複数の自動実行プロファイリング呼び出し
                                                                                                • 64 カスタムプラットフォーム固有の関数へのアクセス
                                                                                                • 65 構造パラメーター変換に向けたホストプログラムの変更
                                                                                                • 66 ホストアプリケーションの管理
                                                                                                  • 661 Makefileフラグメント例の表示 (example-makefileまたはmakefile)
                                                                                                  • 662 ホストアプリケーションのコンパイルとリンク
                                                                                                    • 6621 ホストアプリケーションとKhronos ICD Loader Libraryのリンク
                                                                                                    • 6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)
                                                                                                    • 6623 OpenCLホストランタイムライブラリーおよびMMDライブラリーへのパスの表示 (ldflags)
                                                                                                    • 6624 OpenCLホストランタイムライブラリーおよびMMDライブラリーのリスト表示 (ldlibs)
                                                                                                    • 6625 OpenCLホストランタイムライブラリーおよびMMDライブラリーに関する情報の表示 (link-config または linkflags)
                                                                                                      • 663 OpenCL ICD拡張APIの使用
                                                                                                      • 664 ホストを経由したFPGAのプログラミング
                                                                                                        • 6641 複数のFPGAデバイスのプログラミング
                                                                                                          • 66411 OpenCL FPGAデバイスの診断
                                                                                                          • 66412 デバイス情報の照会
                                                                                                          • 66413 複数のFPGAデバイスへのカーネルのロード
                                                                                                              • 665 ランタイム環境の終了とエラー回復
                                                                                                                • 67 SoCをターゲットとするOpenCL カーネルへの共有メモリーの割り当て
                                                                                                                • 68 徐々に速度低下するOpenCLシステムのデバッグ
                                                                                                                  • 7 OpenCL カーネルのコンパイル
                                                                                                                    • 71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル
                                                                                                                    • 72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)
                                                                                                                    • 73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)
                                                                                                                    • 74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)
                                                                                                                    • 75 インテル FPGA SDK for OpenCLオフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)
                                                                                                                    • 76 特定のFPGAボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)
                                                                                                                    • 77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)
                                                                                                                    • 78 カーネルのFmaxターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt)
                                                                                                                    • 79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)
                                                                                                                    • 710 コンパイル進捗レポートの生成 (-v)
                                                                                                                    • 711 リソース推定使用率要約の画面表示 (-report)
                                                                                                                    • 712 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージの抑制 (-W)
                                                                                                                    • 713 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)
                                                                                                                    • 714 コンパイラーレポートのデバッグデータの削除およびaocxファイルのソースコードの削除 (-g0)
                                                                                                                    • 715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)
                                                                                                                    • 716 グローバルメモリーのリング型相互接続の強制 (-global-ring)
                                                                                                                    • 717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)
                                                                                                                    • 718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)
                                                                                                                    • 719 浮動小数点演算処理順序の緩和 (-fp-relaxed)
                                                                                                                    • 720 浮動小数点演算における丸め処理の削減 (-fpc)
                                                                                                                    • 721 OpenCLコンパイルの高速化 (-fast-compile)
                                                                                                                    • 722 カーネルのインクリメンタルコンパイル (-incremental)
                                                                                                                      • 7221 インクリメンタルコンパイルレポート
                                                                                                                      • 7222 インクリメンタルコンパイルのその他のコマンドオプション
                                                                                                                      • 7223 インクリメンタルコンパイルフィーチャーの制限
                                                                                                                        • 723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)
                                                                                                                        • 724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)
                                                                                                                        • 725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)
                                                                                                                          • 8 OpenCLカーネルのエミュレーションとデバッグ
                                                                                                                            • 81 高速エミュレーターの設定
                                                                                                                            • 82 エミュレーションに向けたチャネルカーネルコードの変更
                                                                                                                              • 821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション
                                                                                                                              • 822 チャネル深度のエミュレーション
                                                                                                                                • 83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)
                                                                                                                                • 84 OpenCLカーネルのエミュレーション
                                                                                                                                • 85 LinuxにおけるOpenCLカーネルのデバッグ
                                                                                                                                • 86 インテル FPGA SDK for OpenCL Emulatorの制限
                                                                                                                                • 87 ハードウェアとエミュレーターの結果の不一致
                                                                                                                                • 88 高速エミュレーターの環境変数
                                                                                                                                • 89 高速エミュレーターでサポートされている拡張機能
                                                                                                                                • 810 高速エミュレーターの既知の問題
                                                                                                                                • 811 レガシーエミュレーターの使用
                                                                                                                                  • 8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)
                                                                                                                                    • 81111 レガシーエミュレーターでのチャネル深度のエミュレーション
                                                                                                                                      • 8112 レガシーエミュレーターでのOpenCLカーネルのエミュレーション
                                                                                                                                      • 8113 LinuxにおけるレガシーエミュレーターでのOpenCLカーネルのデバッグ
                                                                                                                                          • 9 カーネルのreporthtmlファイルのレビュー
                                                                                                                                          • 10 OpenCLカーネルのプロファイリング
                                                                                                                                            • 101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)
                                                                                                                                            • 102 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report)
                                                                                                                                            • 103 自動実行カーネルのプロファイリング
                                                                                                                                              • 11 インテル Code Builder for OpenCL を使用するOpenCLアプリケーションの開発
                                                                                                                                                • 111 Microsoft Visual Studioに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 112 Eclipseに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 113 インテル Code Builder for OpenCL でのセッションの作成
                                                                                                                                                • 114 セッションのコンフィグレーション
                                                                                                                                                  • 12 インテル FPGA SDK for OpenCL のアドバンスト機能
                                                                                                                                                    • 121 OpenCLライブラリー
                                                                                                                                                      • 1211 RTLモジュールとOpenCLパイプラインの理解
                                                                                                                                                        • 12111 インテルFPGA SDK for OpenCLパイプラインのアプローチの概要
                                                                                                                                                        • 12112 RTLモジュールのインテル FPGA SDK for OpenCLパイプラインへの統合
                                                                                                                                                        • 12113 ストールのないRTL
                                                                                                                                                        • 12114 RTLモジュールインターフェイス
                                                                                                                                                        • 12115 Avalon Streaming (Avalon-ST) インターフェイス
                                                                                                                                                        • 12116 RTLリセットおよびクロック信号
                                                                                                                                                          • 121161 ストールのないRTLモジュールおよびストールをサポートするRTLモジュールの インテル Stratix 10デザイン固有のリセット要件
                                                                                                                                                            • 12117 RTLモジュールのXML構文
                                                                                                                                                              • 121171 ATTRIBUTESを指定するXML要素
                                                                                                                                                              • 121172 INTERFACEを指定するXML要素
                                                                                                                                                              • 121173 リソースを指定するXML要素
                                                                                                                                                                • 12118 RTLモジュールと外部メモリーの通信
                                                                                                                                                                • 12119 RTLモジュールに入るスレッドの順序
                                                                                                                                                                • 121110 RTLモジュールのOpenCL Cモデル
                                                                                                                                                                • 121111 RTLモジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性
                                                                                                                                                                  • 1212 OpenCLライブラリーに向けたOpenCLヘルパー関数ファイルのパッケージ化
                                                                                                                                                                  • 1213 OpenCLライブラリーに向けたRTLコンポーネントのパッケージ化
                                                                                                                                                                    • 12131 インテル FPGA SDK for OpenCL ライブラリー機能に対するRTLサポートの制約と制限
                                                                                                                                                                      • 1214 RTLモジュールの検証
                                                                                                                                                                      • 1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化
                                                                                                                                                                      • 1216 OpenCLカーネルコンパイル時のOpenCLライブラリーの指定
                                                                                                                                                                      • 1217 シミュレーションによるOpenCLライブラリーのデバッグ (プレビュー)
                                                                                                                                                                        • 12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)
                                                                                                                                                                        • 12172 OpenCL ライブラリーのシミュレーション
                                                                                                                                                                        • 12173 シミュレーターの制限
                                                                                                                                                                          • 1218 シンプルな関数で動作するOpenCLライブラリーの使用 (例1)
                                                                                                                                                                          • 1219 外部メモリーと動作するOpenCLライブラリーの使用 (例2)
                                                                                                                                                                          • 12110 OpenCLライブラリーのコマンドラインオプション
                                                                                                                                                                            • 122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性
                                                                                                                                                                              • 1221 変数固有の属性を使用する際の制約
                                                                                                                                                                                • 123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性
                                                                                                                                                                                  • 1231 カーネルインターフェイスに向けたハードウェア
                                                                                                                                                                                    • 12311 カーネルIDを生成し振り分けるハードウェアの省略
                                                                                                                                                                                    • 12312 ホストとカーネル間の通信ハードウェアの省略
                                                                                                                                                                                    • 12313 clEnqueueNDRangeKernel APIのglobal_work_offset引数をサポートするハードウェアの省略
                                                                                                                                                                                        • 124 num_compute_units(XYZ) 属性を使用したカーネルの複製
                                                                                                                                                                                          • 1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ
                                                                                                                                                                                          • 1242 カーネルコピーでのチャネル使用
                                                                                                                                                                                            • 125 カーネル内に登録される割り当ての組み込み関数
                                                                                                                                                                                              • A OpenCL機能のサポート状況
                                                                                                                                                                                                • A1 OpenCL10の機能のサポート状況
                                                                                                                                                                                                  • A11 OpenCL10 Cプログラミング言語の実装
                                                                                                                                                                                                  • A12 OpenCL Cプログラミング言語の制約
                                                                                                                                                                                                  • A13 組み込みジオメトリック関数の引数型
                                                                                                                                                                                                  • A14 数値コンプライアンスの実装
                                                                                                                                                                                                  • A15 イメージのアドレス指定とフィルタリングの実装
                                                                                                                                                                                                  • A16 アトミック関数
                                                                                                                                                                                                  • A17 埋め込みプロファイルの実装
                                                                                                                                                                                                    • A2 OpenCL 12の機能のサポート状況
                                                                                                                                                                                                      • A21 OpenCL 12のランタイムの実装
                                                                                                                                                                                                      • A22 OpenCL 12 Cプログラミング言語の実装
                                                                                                                                                                                                        • A3 OpenCL 20の機能のサポート状況
                                                                                                                                                                                                          • A31 OpenCL 20のヘッダー
                                                                                                                                                                                                          • A32 OpenCL 20ランタイムの実装
                                                                                                                                                                                                          • A33 OpenCL 20 Cプログラミング言語のパイプにおける制約
                                                                                                                                                                                                            • A4 インテル FPGA SDK for OpenCL の割り当てにおける制限
                                                                                                                                                                                                              • B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴
Page 3: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus

544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約39545 OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化41

55 OpenCL パイプの実装53551 OpenCL パイプ機能の概要 53552 パイプデータの動作 54553 パイプにおける複数のワークアイテムの順序付け 55554 OpenCL のパイプ実装における制約56555 カーネルに向けた OpenCL パイプの有効化 58556 ホストパイプを介したカーネルとの直接通信 67

56 任意精度での整数の実装 7057 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用 7158 __constant アドレス空間修飾子の宣言 7259 構造体データ型を OpenCL カーネルに引数として含める73

591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致73592 データ構造パディング挿入の無効化75593 構造体のアライメントの指定 75

510 レジスターの推論 765101 シフトレジスターの推論76

511 倍精度浮動小数点演算の有効化78512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター78

5121 アキュムレーターを推論するためのプログラミング手法 79513 整数のプロモーション規則80

6 ホストアプリケーションの設計 8161 ホストのプログラミング要件81

611 ホストマシンのメモリー要件 81612 ホストバイナリーの要件81613 複数のホストスレッド82614 順不同のコマンドキュー 82615 カーネルを同時に実行するための複数のコマンドキューにおける要件82

62 グローバルメモリーの手動分割における OpenCL バッファーの割り当て 82621 同じメモリータイプの複数のインターフェイスでのバッファーの分割 82622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 84623 ホストアプリケーションでのパイプオブジェクトの作成 85

63 カーネル実行中におけるプロファイルデータの収集86631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング88632 プロファイルデータの取得 89633 複数の自動実行プロファイリング呼び出し 89

64 カスタムプラットフォーム固有の関数へのアクセス9065 構造パラメーター変換に向けたホストプログラムの変更 9166 ホストアプリケーションの管理92

661 Makefile フラグメント例の表示 (example-makefile または makefile) 92662 ホストアプリケーションのコンパイルとリンク93663 OpenCL ICD 拡張 API の使用97664 ホストを経由した FPGA のプログラミング 97665 ランタイム環境の終了とエラー回復 102

67 SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て 10268 徐々に速度低下する OpenCL システムのデバッグ104

目次

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

3

7 OpenCL カーネルのコンパイル10571 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル10572 ハードウェアを構築せずに行うカーネルのコンパイル (-c) 10673 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)10674 ヘッダーファイル位置の指定 (-I=ltdirectorygt) 10775 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o

ltfilenamegt)10876 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) 10877 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) 11078 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt) 11179 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) 111710 コンパイル進捗レポートの生成 (-v) 112711 リソース推定使用率要約の画面表示 (-report) 113712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)114713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセ

ージへの変換 (-Werror) 114714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) 114715 グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt)115716 グローバルメモリーのリング型相互接続の強制 (-global-ring) 115717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)116718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt) 116719 浮動小数点演算処理順序の緩和 (-fp-relaxed) 116720 浮動小数点演算における丸め処理の削減 (-fpc) 117721 OpenCL コンパイルの高速化 (-fast-compile)117722 カーネルのインクリメンタルコンパイル (-incremental) 118

7221 インクリメンタルコンパイルレポート 1197222 インクリメンタルコンパイルのその他のコマンドオプション1207223 インクリメンタルコンパイルフィーチャーの制限123

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)123724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) 123725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) 124

8 OpenCL カーネルのエミュレーションとデバッグ 12581 高速エミュレーターの設定12582 エミュレーションに向けたチャネルカーネルコードの変更 126

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション 127822 チャネル深度のエミュレーション128

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) 12884 OpenCL カーネルのエミュレーション 12985 Linux における OpenCL カーネルのデバッグ 13086 インテル FPGA SDK for OpenCL Emulator の制限 13187 ハードウェアとエミュレーターの結果の不一致13188 高速エミュレーターの環境変数 13389 高速エミュレーターでサポートされている拡張機能 133810 高速エミュレーターの既知の問題134811 レガシーエミュレーターの使用 135

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

4

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) 135

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション1368113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ 137

9 カーネルの reporthtml ファイルのレビュー 139

10 OpenCL カーネルのプロファイリング140101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) 140102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) 141103 自動実行カーネルのプロファイリング 142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発143111 Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフラインコンパイ

ラープラグインのコンフィグレーション143112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインの

コンフィグレーション 143113 インテル Code Builder for OpenCL でのセッションの作成144114 セッションのコンフィグレーション 145

12 インテル FPGA SDK for OpenCL のアドバンスト機能147121 OpenCL ライブラリー147

1211 RTL モジュールと OpenCL パイプラインの理解1481212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 1611213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化1621214 RTL モジュールの検証1641215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 1641216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 1651217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) 1651218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)1681219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) 16912110 OpenCL ライブラリーのコマンドラインオプション 170

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性 1711221 変数固有の属性を使用する際の制約173

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性1731231 カーネルインターフェイスに向けたハードウェア 173

124 num_compute_units(XYZ) 属性を使用したカーネルの複製 1761241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ 1771242 カーネルコピーでのチャネル使用 178

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

A OpenCL 機能のサポート状況 181A1 OpenCL10 の機能のサポート状況181

A11 OpenCL10 C プログラミング言語の実装 181A12 OpenCL C プログラミング言語の制約183A13 組み込みジオメトリック関数の引数型184A14 数値コンプライアンスの実装 184A15 イメージのアドレス指定とフィルタリングの実装 185A16 アトミック関数 185A17 埋め込みプロファイルの実装 185

目次

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

5

A2 OpenCL 12 の機能のサポート状況186A21 OpenCL 12 のランタイムの実装186A22 OpenCL 12 C プログラミング言語の実装 186

A3 OpenCL 20 の機能のサポート状況187A31 OpenCL 20 のヘッダー 187A32 OpenCL 20 ランタイムの実装 188A33 OpenCL 20 C プログラミング言語のパイプにおける制約 188

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限 189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴190

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

6

1 インテルreg FPGA SDK for OpenCLtrade の概要

インテルreg FPGA SDK for OpenCLtrade プログラミングガイド は インテル SDK (ソフトウェア開発キット) for OpenCL のコンパイラーとツールに関する説明推奨事項ならびに使用方法を提供します インテル FPGA SDK for OpenCL (1) は インテル FPGA 製品に向けた OpenCL(2) ベースの異種並列プログラミング環境です

11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件

インテル FPGA SDK for OpenCL プロエディションプログラミングガイド はOpenCL の概念とアプリケーションプログラミングインターフェイス (API) について精通されている方がご利用になることを前提としていますまたOpenCL アプリケーションの作成経験がありOpenCL Specificationversion 10 を理解されていることも前提としています

インテル FPGA SDK for OpenCL またはOpenCL 向けのインテル FPGA ランタイム環境 (RTE)を使用しデバイスをプログラムする前にそれぞれのスタートガイドを十分に理解してから作業を開始してくださいなおこのプログラミングガイドは次の作業をすでに実行していることを前提としています

bull OpenCL カーネルを開発および展開するための tar ファイルのダウンロードまたインストーラーを実行し SDK インテル Quartusreg Prime 開発ソフトウェアプロエディションデバイスサポートのインストール

bull OpenCL カーネルを展開するための RTE のダウンロードおよびインストール

bull SDK もしくは RTE を使用しインテル SoC FPGA をプログラムする場合は インテル SoC FPGAエンベデッド開発スイート (EDS) プロエディションのダウンロードとインストール

bull FPGA ボードのインストールと設定

bull ボードのインストールが正常に終了し正確に機能するかの確認

上記作業を実行していない場合はSDK のスタートガイドを参照し詳細を確認ください

関連情報bull OpenCL References Pages

bull OpenCL Specification version 10

bull インテル FPGA SDK for OpenCL スタートガイド

bull Intel FPGA RTE for OpenCL Pro Edition Getting Started Guide

(1) インテル FPGA SDK for OpenCL は Khronos 社が公開している仕様に基づいておりKhronosConformance Testing Process に合格しています現在の規格適合状況については wwwkhronosorgconformance を参照してください

(2) OpenCL および OpenCL のロゴは Apple Incの商標でありKhronos Grouptradeの許可を得て使用しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

12 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

インテル FPGA SDK for OpenCL を使用しているアプリケーションには2 つのメインコンポーネントがあります1 つは FPGA プログラミングビットストリームでありもう 1 つはアプリケーションとFPGA アクセラレーターを管理するホストプログラムです インテル FPGA SDK for OpenCL オフラインコンパイラーはまずホストプログラムが FPGA のプログラミングに使用するイメージファイルにご自身の OpenCL カーネルをコンパイルしますホスト側の C コンパイラーはホストプログラムをコンパイルしそれをインテル FPGA SDK for OpenCL ランタイムライブラリーにリンクします

図 -1 インテル FPGA SDK for OpenCL プログラミングモデルの回路図

インテル FPGA for OpenCL

ランタイム環境

システムのホスト コンパイラー

 ホストソースコード

(cまたは cpp)

ホストバイナリー

SDKオフライン コンパイラー

カーネルソースコード

( cl)

FPGAイメージ(aocx)

ホストアプリケーションを

ホストで実行

Quartus Prime開発ソフトウェアデザインスイート

ボード固有のカスタムプラットフォーム  デザイン

ターゲットプラットフォームに向けたポーティングまたはカスタ

マイズ

バージョンに互換性のあるターゲットプラットフォームに向けたSDKのボードディレクトリー

最終的な計算結果

ランタイムの実行

ホストアプリケーションのコードパス OpenCL Kernelのコードパス カスタムプラットフォームのパス

(カスタムプラットフォームはOpenCLボードとともに提供されます)

ボード開発者が作成するアイテム

SDKユーザーが作成するアイテム

インテルが提供するツールまたはデザイン

ボード開発者が提供するアイテム

サードパーティーが提供するツールまたはオープンソースツール

ツールが生成するアイテム プロセスまたはアクション

Intel FPGA SDK for OpenCLリファレンスプラットフォーム    デザイン

次の SDK コンポーネントと連携しインテル FPGA のプログラムを作成します

bull ホストアプリケーションとホストコンパイラー

bull OpenCL カーネルとオフラインコンパイラー

bull カスタムプラットフォーム

カスタムプラットフォームはボードサポートパッケージを提供しますボードメーカーは通常特定の OpenCL ボードをサポートするカスタムプラットフォームを開発しますオフラインコンパイラーはOpenCL カーネルをコンパイルしハードウェアプログラミングイメージを生成する際にカスタムプラットフォームをターゲットにしますホストはその後ホストアプリケーションを実行し通常ハードウェアイメージを FPGA にプログラムし実行します

例えば従来のプロセッサーなどでのシーケンシャルなプログラムの実装ではプログラムカウンターがハードウェアで実行される命令のシーケンスとハードウェアで順次実行される命令を制御しますインテル FPGA SDK for OpenCL などでの空間的なプログラムの実装では前提条件となるデータが利用可能になるとすぐに命令が実行されますプログラムはデータの依存関係を表す連続した流れとして解釈されます

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

8

図 -2 FPGA データフローアーキテクチャー

ロード ロード

ストア

FPGA領域(空間的な計算)

42

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

9

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフロー

インテル FPGA SDK for OpenCL オフラインコンパイラーではご自身の FPGA プログラミングイメージファイル (aocxファイル) を単一または複数のプロセスで作成可能ですご自身のカーネルの複雑さに応じて推奨されるコンパイル方法が決まります

図 -3 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

カーネルソースコード2 ( cl )

カーネルソースコード1 ( cl )

カーネルソースコード3 ( cl )

ホストバイナリー

標準Cコンパイラー

ホストコード

OpenCL Kernelのオフラインコンパイラー

カーネルバイナリーA(aocx )

FPGAのプログラミングに向けてaocxをメモリーにロード

PCIe

PCIe

ランタイムのプログラミング

統合されたカーネルバイナリー A(aoco aocx)

5 ( cl )4 (cl ) 6 (cl )

統合されたカーネルバイナリーB(aoco aocx )

カーネルバイナリーB(aocx )

OpenCLカーネルのオフラインコンパイラー

カーネルソースコード

カーネルソースコード

カーネルソースコード

ランタイムのプログラミング

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

OpenCL カーネルソースファイル (cl) はFPGA で動作する OpenCL カーネルのソースコードを含みますオフラインコンパイラーは1 つもしくは複数のカーネルを一時ファイルにグループ化した後この一時ファイルをコンパイルして以下のファイルとフォルダーを生成します

bull 中間オブジェクトファイルであるaoco オブジェクトファイルこのファイルにはコンパイルの後半段階に向けての情報が含まれます

bull ハードウェアコンフィグレーションファイルであるaocxイメージファイルこのファイルはランタイムに FPGA をプログラミングするために必要な情報を含みます

bull aocxファイルの作成に必要なデータを含む作業フォルダーまたはサブディレクトリーデフォルトの状態で作業ディレクトリーの名前はご自身のclファイル名です複数のカーネルソースファイルをコンパイルする場合作業ディレクトリーの名前は aocコマンドラインの 後にリストしたclファイル名です

aocxファイルはホストアプリケーションがターゲット FPGA のプログラムオブジェクトを作成するために使用するデータを含みますプログラムオブジェクトはOpenCL ランタイム API の概念ですホストアプリケーションはまずこれらのプログラムオブジェクトをメモリーにロードしますホストランタイムはその後これらのプログラムオブジェクトを使用しホストプログラムのカーネル起動動作の要求に基づきターゲット FPGA をプログラムします

21 シンプルなカーネルに向けたワンステップコンパイル

デフォルトでインテル FPGA SDK for OpenCL は1 つもしくは複数の OpenCL カーネルのコンパイルとハードウェアコンフィグレーションファイルの作成を一度の作業で行いますご自身のアプリケーションの OpenCL カーネルが 1 つの場合や複数のカーネルがアプリケーションにある場合でも 小のイタレーションのみを必要とする場合にこのコンパイルオプションを選択します

次の図はワンステップでコンパイルを行う OpenCL カーネルのデザインフローを表しています

図 -4 ワンステップでの OpenCL カーネルのコンパイルフロー

ltyour_kernel_filenamegtcl

aoc ltyour_kernel_filenamegtcl [-report]コンパイルの時間 (数時間)

説明

ファイル コマンド カーネルの実行

ltyour_kernel_filenamegtaocxltyour_kernel_filenamegtaoco ltyour_kernel_filenamegtaocr

FPGAにおける実行

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

11

コンパイルが正常に終了すると次のファイルとレポートが作成されます

bull aocoファイル

bull aocrファイル

bull aocxファイル

bull ltyour_kernel_filenamegtreportsreporthtmlファイルの概算リソース使用率の要約では暫定的に評価されたエリア使用率が提供されます単一ワークアイテムのカーネルの場合は 適化に向けたレポートでボトルネックが特定されます

注意 ワンステップのコンパイルフローでデザインのイタレーションを行うとイタレーションごとに FPGA のハードウェアをフルコンパイルしなければならないため非常に長い時間を費やしますその後 FPGA でカーネルを実行しパフォーマンスの測定をする必要があります

関連情報ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル (105 ページ)

22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

デザインの 適化に向けたイタレーションやその他の修正を繰り返し行う場合は複数のステップによるインテル FPGA SDK for OpenCL プロエディションのデザインフローを選択してください

次の図はSDK のデザインフローを段階で表していますデザインフローの各ステップは機能的なエラーとパフォーマンスのボトルネックを特定するためのチェックポイントとしての役割を果たしますこれによりイタレーションごとにフルコンパイルを実行することなくOpenCL のカーネルコードを修正することができるようになりますコンパイルステップは一部もしくはすべてを実行することのどちらも可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

12

図 -5 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

ltyour_kernel_filenamegtaocx

ltyour_kernel_filenamegtcl

aoc -march=emulator ltyour_kernel_filenamegtclコンパイル時間 (数秒)

エミュレーションは成功したか

aoc ltyour_kernel_filenamegtclコンパイル時間 (数時間)

カーネルのパフォーマンスに満足しているか

エミュレーション

フルデプロイメント

カーネルをFPGAで実行

NO

YES

NO

説明

ファイルコマンドカーネルの実行

カーネルパフォーマンスの

概算データは許容可能か

NO

aoc -c ltyour_kernel_filenamegtcl [-report]コンパイル時間 (数秒から数分)

中間コンパイル (-c)

ltyour_kernel_filenamegtaocr

注)HTMLレポートとカーネルのプロファイリングについては「Intel FPGA SDK for OpenCL ベストプラクティスガイド」を参照ください

ltyour_kernel_filenamegtreportsreporthtml

HTMLレポートのレビュー

aoc -profile ltyour_kernel_filenamegtcl [-fast-compile] [-incremental]コンパイル時間 (数時間)

プロファイリング

aoc -fast-compile ltyour_kernel_filenamegt clコンパイル時間 (数分から数時間)

デザイン変更はわずかである

aoc -incremental ltyour_kernel_filenamegtcl [-fast-compile]

インクリメンタルコンパイル高速コンパイル

ltyour_kernel_filenamegtaoco

aoc -rtl ltyour_kernel_filenamegtcl [-report]

中間コンパイル (-rtl)

ハードウェアの実行は

成功したか

YES

NO

NO YES

YES

YES

シミュレーションは成功したか

YES

NO

aoc -march=simulator [-ghdl]ltyour_kernel_filenamegtcl コンパイル時間 (数分)

シミュレーション

ltyour_kernel_filenamegtaocx

コンパイル時間 (数秒から数分)

コンパイル時間 (数分から数時間)

SDK のデザインフローには次のステップがあります

1 エミュレーション

x86-64 ホストシステムの 1 つもしくは複数のエミュレーションデバイスで OpenCL カーネルを実行しその機能性を評価しますLinux システムではエミュレーターはシンボリックデバッグのサポートを提供しますシンボリックデバッグを使用するとカーネルコードの機能的なエラーの原因を特定できます

2 中間コンパイル

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

13

中間コンパイルを行う方法は 2 つありますデザインフローにはこの 2 つの方法のうち 1 つもしくは両方を含むことが可能です

bull -cフラグを使用し 1 つもしくは複数のclカーネルソースファイルをコンパイルする方法これによりOpenCL パーサーからの出力を含むaocoオブジェクトファイルを生成するようオフラインコンパイラーに命令が出されます

bull -rtlフラグを使用し 1 つもしくは複数のclカーネルソースファイルまたはaocoファイルをコンパイルする方法ただしコンパイルはどちらか一方のファイルになりますこれによりオフラインコンパイラーに以下のタスクを実行するよう命令が出されます

mdash 入力ファイルがclファイルの場合オフラインコンパイラーはaocoファイルを各カーネルソースファイルに生成しそれらをリンクしaocrファイルを生成します

mdash 入力ファイルがaocoファイルの場合オフラインコンパイラーはそれらをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt ディレクトリーを作成します

オフラインコパイラーはaocrファイルを使用し 終的なaocxハードウェアコンフィグレーションファイルを生成します

注意

デフォルトのボードが X の環境において-cフラグでカーネルをコンパイルしデフォルトのボードが Y の環境においてaocoファイルを-rtlフラグでコンパイルする場合オフラインコンパイラーはaocoファイルからボード X を読み出しそれを続くコンパイルの段階へ渡します

3 HTML レポートのレビュー

OpenCL アプリケーションの ltyour_kernel_filenamegtreportsreporthtmlファイルをレビューし概算のカーネルのパフォーマンスデータが許容できるかを判断しますHTML レポートではパフォーマンスを向上させるためのカーネルの修正案も提供されます

4 シミュレーション (プレビュー)

OpenCL カーネルをシミュレーションで実行しその機能性を評価しますシミュレーションではコンパイルに長時間を費やすことなくカーネルの機能の正確性および動的なパフォーマンスの評価を行うことができますカーネルのデバッグに向けカーネルの波形をキャプチャーし表示することが可能です

5 高速コンパイル

ハードウェアでの OpenCL カーネルの機能性を評価します高速コンパイルステップはフルコンパイルに比べわずかな時間でaocxファイルを生成します インテル FPGA SDK for OpenCLオフラインコンパイラーは簡単な 適化のみを実行しコンパイル時間を削減します

6 インクリメンタルコンパイル

ハードウェアでの OpenCL カーネルの機能性を評価しますインクリメンタルコンパイルでは修正したカーネルのみをコンパイルしaocxファイルを生成します インテル FPGA SDK forOpenCL オフラインコンパイラーはデザイン全体のサイズではなく変更したデザインのサイズによってコンパイル時間をスケーリングし生産性を向上させます

7 プロファイリング

FPGA プログラミングイメージにパフォーマンスカウンターを挿入するようインテル FPGASDK for OpenCL オフラインコンパイラーに命令します実行中カウンターは性能情報を集めますその情報は インテル FPGA Dynamic Profiler for OpenCL GUI で確認することが可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

14

8 フルデプロイメント

デザインフロー全体における OpenCL カーネルのパフォーマンスに納得したらフルコンパイルを実行します実行後デプロイメントに適したaocxファイルが生成されます

HTML レポートとカーネルのプロファイリングについては インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

関連情報bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ)

bull OpenCL コンパイルの高速化 (-fast-compile) (117 ページ)

bull カーネルの reporthtml ファイルのレビュー (139 ページ)

bull OpenCL カーネルのコンパイル (105 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

bull OpenCL カーネルのプロファイリング (140 ページ)

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

15

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得

インテル FPGA SDK for OpenCL には2 つのコマンドオプションのセットが含まれます1 つはSDK ユーティリティーコマンド ( aocl ltcommand_optiongt )もう 1 つがインテル FPGASDK for OpenCL オフラインコンパイラーコマンド ( aoc ltcommand_optiongt ) ですそれぞれのコマンドセットにはソフトウェアコンパイラーおよびカスタムプラットフォームに関する一般的な情報を入手するために呼び出すことができるオプションが含まれています

注意 bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプション ( aocltcommand_optiongt ) は現在二重ダッシュ (--) ではなく単一ダッシュ (-) を使用します二重ダッシュの規則は 171 のリリースにて非推奨となり今後のリリースで削除される予定です

bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションは現在ltcommand_optiongt=ltvaluegt の規則に従っていますこの規則において valueはユーザー入力値をコンマで区切ったリストとすることが可能です -option value1 -optionvalue2の使用は 171 リリースで非推奨となり今後のリリースでは削除される予定です

ソフトウェアバージョンの表示 (version) (16 ページ)

コンパイラーバージョンの表示 (-version) (17 ページ)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help) (17ページ)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h) (17 ページ)

利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

OpenCL バイナリーのコンパイル環境の表示 (env) (19 ページ)

31 ソフトウェアバージョンの表示 (version)

インテル FPGA SDK for OpenCL のバージョンを表示するにはversionユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl version コマンドを呼び出します出力例

aocl ltversiongtltbuildgt (Intel(R) FPGA SDK for OpenCL(TM)Version ltversiongt Build ltbuildgt Copyright (C) ltyeargt IntelCorporation)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

32 コンパイラーバージョンの表示 (-version)

インテル FPGA SDK for OpenCL オフラインコンパイラーのバージョンを表示するには-versionコンパイラーコマンドを呼び出します

bull コマンドプロンプトで aoc -version コマンドを呼び出します出力例

Intel(R) FPGA SDK for OpenCL(TM) 64-Bit Offline CompilerVersion ltversiongt Build ltbuildgtCopyright (C) ltyeargt Intel Corporation

33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションに関する情報を表示するにはhelpユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl help コマンドを呼び出しますSDK はユーティリティーコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)

インテル FPGA SDK for OpenCL の特定のユーティリティーコマンドオプションについての情報を表示するにはhelp ユーティリティーコマンドの引数としてコマンドオプションを含めます

bull コマンドプロンプトで aocl help ltcommand_optiongt コマンドを呼び出します

例えばinstallユーティリティーコマンドオプションについての詳細情報を取得するにはaocl help install コマンドを呼び出します

出力例

aocl install - Installs a board onto your host system

Usage aocl install

DescriptionThis command installs a boards drivers and other necessary software for the host operating system to communicate with the boardFor example this might install PCIe drivers

34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションに関する情報を表示するには引数なしでコンパイラーコマンドを呼び出すか-helpまたは -hコマンドオプションでコンパイラーコマンドを呼び出します

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

17

bull コマンドプロンプトで次のコマンドのいずれかを呼び出します

mdash aoc

mdash aoc -help

mdash aoc -h

SDK はオフラインコンパイラーのコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

35 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示(-list-boards および-list-board-packages)

カスタムプラットフォームで利用可能な FPGA ボードのリストを表示するには-list-boardsオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -list-boards コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは以下のような出力を生成します

Board list ltboard_name_1gt ltboard_name_2gt

この ltboard_name_Ngt は特定の FPGA ボードをターゲットにするために aocコマンドで使用するボード名です

bull 複数のカスタムプラットフォームがインストールされている場合に特定のカスタムプラットフォームで利用可能な FPGA ボードの一覧を表示するには-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めますコマンドプロンプトで次のようにコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -list-boards

インテル FPGA SDK for OpenCL オフラインコンパイラーはカスタムプラットフォームで利用可能なボードの一覧を表示します

bull システムで利用可能なカスタムプラットフォームを一覧表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のような出力を生成します

Installed board packagesltboard_package_1gtltboard_package_2gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_3gtltboard_package_4gt

この ltboard_package_Ngt はご自身のシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

18

36 OpenCL バイナリーのコンパイル環境の表示 (env)

インテル FPGA SDK for OpenCL オフラインコンパイラーの入力引数およびコンパイルされたOpenCL デザインの環境を表示するにはenvユーティリティーコマンドを呼び出します

bull コマンドプロンプトでaocl env ltobject_file_namegt または aocl envltexecutable_file_namegt コマンドを呼び出します

ここで ltobject_file_namegt はOpenCL カーネルのaocoファイル名でltexecutable_file_namegt はカーネルのaocxファイル名です

aocl env vector_addaocxコマンドの出力例

INPUT_ARGS=-march=emulator -v devicevector_addcl -o binvector_addaocxBUILD_NUMBER=90ACL_VERSION=1610OPERATING_SYSTEM=linuxPLATFORM_TYPE=s5_net

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

19

4 FPGA ボードの管理

インテル FPGA SDK for OpenCL はご自身の FPGA ボードのインストールアンインストール診断およびプログラミングを行うために呼び出すことができるユーティリティーコマンドを含んでいます

aocl installユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストール可能ですカスタムプラットフォームのサブディレクトリーにはboard_envxmlファイルが含まれます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGAクライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFPGA クライアントドライバーの旧称はアルテラクライアントドライバー (ACD) です

aocl installユーティリティーを実行すると FCD が設定されますインストールされた BSP はシステムにレジスターされるためランタイムおよび SDK ユーティリティーは必要な BSP ファイルを見つけることができます

重要 インストール後は BSP を別のディレクトリーに移動させないでくださいBSP を移動する場合は以下を実行します

1 aocl uninstallユーティリティーを使用し現在の位置から BSP をアンインストールします

2 BSP ディレクトリーを変更します

3 aocl installユーティリティーを使用し新しい位置に BSP を再インストールします

FPGA ボードのインストール (install) (21 ページ)

FPGA ボードのアンインストール (uninstall) (22 ページ)

FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)

オフラインまたはホストなしでの FPGA のプログラミング (program ltdevice_namegt) (24 ページ)

フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)

関連情報bull FPGA ボードのインストール (install) (21 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

41 FPGA ボードのインストール (install)

FPGA アクセラレーターボードまたは SoC デバイスに向けた OpenCL アプリケーションを作成する前にボードメーカーが提供するカスタムプラットフォームをダウンロードおよびインストールする必要がありますほとんどのカスタムプラットフォームインストーラーには管理者権限が必要ですaocl install ltpath_to_customplatformgt ユーティリティーコマンドを呼び出しご自身のボードをホストシステムにインストールしてください

以下にボードのインストール手順を説明します一部のカスタムプラットフォームには下記以外のインストール手順が加わります詳細に関してはボードメーカーより提供されている資料を参照してください

注意 インテル Arriareg 10 SoC 開発キットを インテル Arria 10 SoC 開発キットリファレンスプラットフォーム (a10soc) とともに使用する場合のインストールについてはInstalling the Intel Arria 10Development Kit を参照ください

注意 インテル FPGA SDK for OpenCL を インテル Arria 10 GX FPGA 開発キットと使用する場合アプリケーションノートの AN 807 Configuring the Intel Arria 10 GX FPGA Development Kitfor the Intel FPGA SDK for OpenCLを参照ください

1 ボードメーカーが案内している手順に従いFPGA ボードをシステムに接続します

2 ボードメーカーの Web サイトからご自身の FPGA ボード用のカスタムプラットフォームをダウンロードします インテル FPGA SDK for OpenCL リファレンスプラットフォームのダウンロードついては インテル FPGA SDK for OpenCL プラットフォームのページを参照ください

ヒント

インテル FPGA SDK for OpenCL とともに提供されている BSP (a10_ref s10_refa10soc など) をインストールする場合はカスタムプラットフォームのインストールは不要ですBSP ファイルは INTELFPGAOCLSDKROOThldboardsにあります手順 4(21 ページ) に進んでください

3 システムフォルダー以外の任意のフォルダーにカスタムプラットフォームをインストールします

複数のカスタムプラットフォームでの aocl diagnoseなどSDK ユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストールできますカスタムプラットフォームのサブディレクトリーはboard_envxmlファイルを含みます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGA クライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFCDがカスタムプラットフォームに対し正しく設定されている限りFCD はインストールされているボードすべてをランタイムに検出します

4 QUARTUS_ROOTDIR_OVERRIDE ユーザー環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアのインストールディレクトリーを指定するように設定します

5 カスタムプラットフォームライブラリーへのパス (ボードサポートパッケージの MMD ライブリーへのパスであればltpath_to_customplatformgtwindows64binなど) をPATH(Windows) もしくは LD_LIBRARY_PATH (Linux) 環境変数設定に追加します

インテル FPGA SDK for OpenCL スタートガイドはinit_openclスクリプトに関するより詳細な情報を提供していますユーザー環境変数の設定および init_openclスクリプトの実行に関しては インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章を参照ください

6 コマンドプロンプトで aocl install ltpath_to_customplatformgt を呼び出します

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

21

aocl install ltpath_to_customplatformgt を呼び出すとFCD とボードドライバーがインストールされホストアプリケーションとハードウェアのカーネルプログラムの通信が可能になります

注意

bull ボードのインストールには管理者権限が必要ですWindows コマンドプロンプトを管理者として実行するにはStart gt All Programs gt Accessories をクリックしますAccessories の Command Prompt を右クリックし右クリックメニューにあるRun as Administrator をクリックします

Windows 81 または Windows 10 のシステムでは署名付きドライバーの検証を無効にしなければならない場合があります詳細については以下の内容を参照してください

mdash Windows 8 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-basesolutionsfb321729html

mdash Windows 10 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-baseembedded2017Why-does-aocl-diagnose-fail-while-using-Windows-10html

bull システムにドライバーがすでにインストールされており管理者権限なしで FCD をインストールする必要がある場合以下のように aocl installコマンドを-fcd-onlyフラグとともに呼び出しFCD インストールのプロンプトに従ってください

aocl install ltpath_to_customplatformgt -fcd-only

7 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出しますソフトウェアはltdevice_namegt を含む出力を生成しますltdevice_namegt はacl0 からacl127 の acl 番号です

注意

aocl diagnoseユーティリティーを実装した後に発生する可能性があるエラーに関してはIntel Arria 10 GX FPGA Development Kit Reference Platform Porting GuideのPossible Errors After Running the diagnose Utility の章を参照くださいご自身のアクセラレーターボードの ltdevice_namegt の照会に関してはFPGA ボードのデバイス名の照会の章を参照ください

8 FPGA ボードが正常にインストールされていることを確認するには aocl diagnoseltdevice_namegt コマンドを呼び出しボードメーカーが推奨する診断テストを実行します

関連情報bull FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

bull インテル FPGA SDK for OpenCL FPGA プラットフォームページ

42 FPGA ボードのアンインストール (uninstall)

FPGA ボードをアンインストールするにはuninstallユーティリティーコマンドを呼び出しカスタムプラットフォームのアンインストール後に関連する環境変数の設定を解除します

FPGA ボードをアンインストールするには次の手順を行います

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

22

1 ボードメーカーから提供されている手順に従いマシンからボードを外します

2 aocl uninstall ltpath_to_customplatformgt ユーティリティーコマンドを呼び出し現在のホストコンピュータードライバーを削除します (PCIeregドライバーなど) インテルFPGA SDK for OpenCL はFPGA ボードと通信するためにそれらのドライバーを使用します

注意

bull カスタムプラットフォームのアンインストールにはroot権限が必要ですドライバーを維持しながらインストールされている FCD を削除するには以下のように aocluninstall コマンドを-fcd-onlyフラグとともに呼び出しFCD のアンインストールのプロンプトに従ってください

aocl uninstall ltpath_to_customplatformgt -fcd-only

bull Linux システムにおいてFCD をデフォルトディレクトリーである opt Intel OpenCL Boards 以外の特定のディレクトリーにインストールした場合アンインストールを実行する前に環境変数 ACL_BOARD_VENDOR_PATHがその特定の FCD のインストールディレクトリーを指すよう設定されていることを確認してください

3 カスタムプラットフォームをアンインストールします

4 LD_LIBRARY_PATH 環境変数 (Linux の場合) または PATH 環境変数 (Windows の場合) の設定を解除します

43 FPGA ボードのデバイス名の照会 (diagnose)

一部の OpenCL ソフトウェアユーティリティーコマンドにはデバイス名 (ltdevice_namegt) を指定する必要がありますltdevice_namegt はFPGA デバイスに対応する acl 番号を参照します (例えば acl0 から acl127) アクセラレーターボードのリストを照会するとOpenCL ソフトウェアは使用するマシンにインストールされているデバイスのリストをデバイス名の順に生成します

bull マシンにインストールされているデバイスのリストを照会するにはコマンドプロンプトに aocldiagnose と入力しますソフトウェアは以下の例のような出力を生成します

aocl diagnose Running diagnostic from ALTERAOCLSDKROOTboardltboard_namegtltplatformgtlibexec

Verified that the kernel mode driver is installed on the host machine

Using board package from vendor ltboard_vendor_namegtQuerying information for all supported devices that are installed on the host machine

device_name Status Information

acl0 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 020000 at Gen 2 with 8 lanes FPGA temperature=430 degrees C

acl1 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 030000 at Gen 2 with 8 lanes FPGA temperature = 350 degrees C

Found 2 active device(s) installed on the host machine to perform a full diagnostic on a specific device please run aocl diagnose ltdevice_namegt

DIAGNOSTIC_PASSED

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

23

関連情報OpenCL FPGA デバイスの診断 (99 ページ)

44 ボード診断テストの実行 (diagnose ltdevice_namegt)

特定の FPGA ボードで詳細な診断を実行するにはdiagnose ユーティリティーコマンドの引数として ltdevice_namegt を含みます

bull コマンドプロンプトで aocl diagnose ltdevice_namegt コマンドを呼び出しますここで ltdevice_namegt はご自身の FPGA デバイスに対応する (acl0 から acl127 の) acl 番号です

システムにインストールされたボードのリストを照会するとltdevice_namegt を識別することができます

複数の FPGA ボードで diagnoseユーティリティーコマンドを使用し診断テストを実行する場合のボードに関する詳細はボードメーカーより提供されている資料を参照ください

45 オフラインまたはホストなしでの FPGA のプログラミング (programltdevice_namegt)

オフラインまたはホストなしで FPGA デバイスをプログラミングするにはprogramユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl program ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

注意 SoC をプログラミングするにはprogramユーティリティーコマンドを呼び出す際にデバイスのフルパスを次の例のように指定してください aocl program devltdevice_namegtltyour_kernel_filenamegtaocx

46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)

カスタムプラットフォームでサポートされている場合はflashユーティリティーコマンドを呼び出し指定されたスタートアップコンフィグレーションで FPGA を初期化します

注意 インテル Arria 10 SoC 開発キットなどのSoC ボードのマイクロ SD フラッシュカードのプログラミング例に関してはIntel FPGA SDK for OpenCL Intel Arria 10 SoC Development KitReference Platform Porting Guide のBuilding the SD Card Image の章を参照ください

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

24

bull コマンドプロンプトで aocl flash ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

関連情報Building the SD Card Image for the Intel Arria 10 SoC Development Kit

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

25

5 OpenCL カーネルの構築

インテルではOpenCL カーネルコードの構築方法に関する推奨事項を提供していますカーネルを作成する際もしくは別のアーキテクチャーをターゲットとして書かれたカーネルを変更する際はこのプログラミングにおける推奨事項を実行することを検討ください

カーネルの命名ガイドライン (26 ページ)

データの処理効率を 適化するためのプログラミング手法 (27 ページ)

ローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35 ページ)

インテル FPGA SDK for OpenCL チャネル拡張の実装 (36 ページ)

OpenCL パイプの実装 (53 ページ)

任意精度での整数の実装 (70 ページ)

条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用 (71 ページ)

__constant アドレス空間修飾子の宣言 (72 ページ)

構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

レジスターの推論 (76 ページ)

倍精度浮動小数点演算の有効化 (78 ページ)

単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター (78 ページ)

整数のプロモーション規則 (80 ページ)

51 カーネルの命名ガイドライン

インテルではファイル名に英数字のみを含めることを推奨しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ファイル名は英数字で始めてください

OpenCL アプリケーションのファイル名が英数字以外で始まっている場合以下のコンパイルエラーが発生します

Error Quartus compilation FAILEDSee quartus_sh_compilelog for the output log

bull 英数字以外の文字を使用しファイル名を区別しないでください

インテル FPGA SDK for OpenCL オフラインコンパイラーは英数字以外の文字をアンダースコア ( _ ) に変換しますファイル名の末尾のみを英数字以外の異なる文字にし2 つのファイルを区別すると (例えばmyKernelclと myKernelclなど)オフラインコンパイラーはその 2 つのファイル名をどちらもltyour_kernel_filenamegt _cl (前述の例の場合myKernel_cl) に変換します

bull Windows システムの場合カーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えないようにしてください

64 ビットの Windows 7 および Windows 81 にはファイルパスの長さに 260 文字の制限がありますカーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えるとオフラインコンパイラーは次のエラーメッセージを生成します

The filename or extension is too long The system cannot find the path specified

コンパイラーのエラーメッセージに加え次のメッセージが ltyour_kernel_filenamegtquartus_sh_compilelog ファイルに表示されます

Error Canrsquot copy ltfile_typegt files Canrsquot open ltyour_kernel_filenamegt for write No such file or directory

Windows 10 では260 文字の制限を除外することができます詳しくはWindows 10 の資料を参照してください

bull OpenCL のカーネルソースファイル (cl) に予約されているキーワードである「kernel」「Verilog」または「VHDL」の名前を付けないでください

ソースファイルに kernelclVerilogclまたは VHDLclの名前を付けるとオフラインコンラパイラーは特定の内部ファイルと同じ名前の中間デザインファイルを生成するためコンパイルエラーが発生します

52 データの処理効率を最適化するためのプログラミング手法

カーネルのデータ処理効率はループ展開ワークグループサイズの設定計算ユニットとワークアイテムの指定などの手法を実行し 適化してください

ループ展開 (unroll Pragma) (28 ページ)

ネスト化されたループの結合 (28 ページ)

ループ開始間隔の指定 (II) (30 ページ)

ループの並列性 (max_concurrency Pragma) (31 ページ)

ループの投機的実行 (speculated_iterations Pragma) (32 ページ)

ワークグループサイズの指定 (32 ページ)

計算ユニット数の指定 (33 ページ)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

27

SIMD ワークアイテム数の指定 (34 ページ)

メモリー属性の指定 (34 ページ)

521 ループ展開 (unroll Pragma)

ループ展開はループ本体を複数回複製しループのトリップカウントを減らすことで行われますループの展開はFPGA でのループ制御オーバーヘッドの削減または防止のために行いますループに依存関係がなくオフラインコンパイラーがループの反復処理を並列して実行できる場合はループを展開することで FPGA のレイテンシーとオーバーヘッドを低減させることもできますインテル FPGA SDK for OpenCL オフラインコンパイラーはプラグマでアノテートされていない場合でも単純なループを展開する場合がありますループを展開するようまたは明示的にループを展開しないようオフラインコンパイラーに指示するにはカーネルコードの展開するループの前にunrollカーネルプラグマを挿入します

注意

bull 可能な限り展開係数を指定してください展開係数 N を指定するにはpragma unrollltNgt ディレクティブをカーネルコードのループの前に挿入します

オフラインコンパイラーはループ展開を 大 ltNgt 回試みます

コードの一部を下記に示します展開係数に 2 の値を割り当てることによりループを 2 回展開するようオフラインコンパイラーに指示しています

pragma unroll 2for(size_t k = 0 k lt 4 k++) mac += data_in[(gid 4) + k] coeff[k]

bull ループを完全に展開する場合カーネルコードのループの前にpragma unrollディレクティブのみを挿入し展開係数を省略することができます

オフラインコンパイラーはトリップカウントを認識すると完全なループ展開を試みます展開要求が実行できない場合オフラインコンパイラーは警告を発行します

bull ループが展開されないようにするには展開係数に 1 を指定します (pragma unroll 1)

522 ネスト化されたループの結合

loop_coalesceプラグマを使用しループの機能に影響を与えずにネスト化されたループを 1 つのループに結合するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示しますループの結合はコンパイラーにループ制御に必要なオーバーヘッドを削減するよう指示することによりカーネルの使用領域を削減することができます

ネスト化されたループを結合するとコンポーネントのレイテンシーも低減されるためカーネルの使用領域をさらに削減することも可能ですただし場合によってはループを結合させることで重要なループを開始させるパスの間隔が長くなる場合があるためループの結合がカーネルすべてに適しているとは限りません

NDRange カーネルではloop_coalesceプラグマによりアノテートされていない場合でもコンパイラーは自動的にループ結合を試みますNDRange カーネルでループを結合することによりスループットが向上するとともにカーネルの使用領域が低減しますloop_coalesceプラグマを使用するとNDRange カーネルにおけるループの自動結合を防ぐことができます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

28

ネスト化されたループを結合するには次のようにプラグマを指定します

pragma loop_coalesce ltloop_nesting_levelgt

ltloop_nesting_levelgt パラメーターはコンパイラーが結合を試みるネスト化されたループのレベル数をオプションで指定する整数ですltloop_nesting_levelgt パラメーターを指定しない場合コンパイラーはネスト化されたループすべてを結合しようと試みます

ネスト化されたループの例を以下に示します

for (A) for (B) for (C) for (D) for (E)

ループ (A) の前にプラグマを配置するとこのループのネストレベルは次のように定義されます

bull ループ (A) のループネストレベルは 1

bull ループ (B) のループネストレベルは 2

bull ループ (C) のループネストレベルは 3

bull ループ (D) のループネストレベルは 4

bull ループ (E) のループネストレベルは 3

指定したループネストレベルによってコンパイラーは異なるループ結合を試みます

bull pragma loop_coalesce 1をループ (A) に指定した場合コンパイラーはこのネスト化されたループの結合を試みません

bull pragma loop_coalesce 2をループ (A) に指定した場合コンパイラーはループ (A) と(B) の結合を試みます

bull pragma loop_coalesce 3を (A) に指定した場合コンパイラーはループ (A)(B)(C)(E)の結合を試みます

bull pragma loop_coalesce 4をループ (A) に指定した場合コンパイラーはループ (A) からループ (E) すべてのループの結合を試みます

重要 pragma loop_coalesce 1を NDRange カーネルのループに指定するとそのループの自動ループ結合を防ぐことができます

以下はコンパイラーが 2 つのループを 1 つのループに結合する方法を簡単な例にて示しています

下記はネスト化された単純なループです

pragma loop_coalescefor (int i = 0 i lt N i++) for (int j = 0 j lt M j++) sum[i][j] += i+j

コンパイラーは 2 つのループを結合し次のような 1 つのループであるかのように実行します

int i = 0int j = 0while(i lt N) sum[i][j] += i+j j++

if (j == M)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

29

j = 0 i++

523 ループ開始間隔の指定 (II)

開始間隔 (II) は連続するループの反復が開始されるまでのクロックサイクル数です iiプラグマを使用しプラグマ宣言に続くループに II の設定を試みるよう インテル FPGA SDK for OpenCL オフラインコンパイラー に指示しますオフラインコンパイラーがそのループに対して指定された II を実現できない場合コンパイルエラーが発生します

iiプラグマはループがパイプライン化されている単一のワークアイテムカーネル (シングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルプロパティーについての詳細はインテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照してください

II の値が高いほど後続するループ反復の実行開始までの待機時間が長くなりますII および特定のループにおける II のパフォーマンスへの影響についての詳細を提供するコンパイラーレポートに関しては インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

カーネルのループによってはデフォルトでコンパイラーが選択する値よりも高い II の値を iiプラグマで指定するとスループットを低下させることなくカーネルの 大動作周波数 (fMAX) を向上させることができます

次の条件を満たすループはiiプラグマの使用に適しています

bull カーネルがシングルスレッドであるためループがパイプライン化されている

bull カーネルのスループットに重要ではないループである

bull ループの実行時間がそれに含まれる可能性のある他のループと比較して短い

ループの開始間隔を指定するには次のようにループの前にプラグマを指定します

pragma ii ltdesired_initiation_intervalgt

ltdesired_initiation_intervalgt パラメーターは後続のループ反復の開始を実行するまでに待機するクロックサイクル数を指定する整数であり必須です

カーネルにパイプライン化が可能な異なるループが 2 つある場合を考えます1 つはループに依存関係を持つ実行時間が短い初期化ループもう 1 つは処理の大部分を実行する実行時間が長いループですこの場合初期化ループがデザインの全体的なスループットに与える影響がもう一方のループに比べはるかに小さいことをコンパイラーは認識しません可能な場合コンパイラーは両方のループの IIを 1 でパイプライン化しようと試みます

初期化ループにはループに依存関係があるため生成されるハードウェアはフィードバックパスを持つようになりますこのようなフィードバックパスで II を実現するとクロック周波数の一部が犠牲になる可能性がありますメインループのフィードバックパスによっては残りのデザインがより高い動作周波数で動作できる場合があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

30

初期化ループにpragma ii 2を指定するとこのループに対する II の 適化をそれほど積極的に行う必要がないことをコンパイラーに通知します 適化をあまり積極的に行わないことでfmax を制限しているパスをコンパイラーがパイプライン化できるようになりカーネルのデザイン全体でより高いfmax を実現できるようになります

新しく指定される II により初期化ループの実行時間は長くなりますしかしfmax が高くなることでもう一方の長いループの実行時間が短縮されるため初期化ループの実行時間の増加は補償されます

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

524 ループの並列性 (max_concurrency Pragma)

max_concurrencyプラグマを使用しコンポーネントのループの並列性を制限できます

ループの並列性とはそのループの反復を同時に何回進行することができるかということですデフォルトにおいてインテル FPGA SDK for OpenCL はループの並列性を 大化しコンポーネントが 大のスループットで動作するように試みます

max_concurrencyプラグマはループがパイプライン化されている単一のワークアイテムカーネル (つまりシングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルのプロパティーについては インテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照ください

max_concurrencyプラグマを使用するとループのパイプライン化に必要なオンチップメモリーリソースを制御できるようになりますループ反復の同時実行を実現するためオフラインコンパイラーは単一の反復に専用のメモリーコピーを作成する必要がありますこのコピーはプライベートコピーと呼ばれます許可される並列性が高いほどより多くのプライベートコピーをコンパイラーは作成しなければなりません

カーネルの HTML レポート (reporthtml) はループの並列性に関する以下の情報を提供します

bull オフラインコンパイラーが選択した 大の並列性

この情報はループ解析レポートとカーネルメモリービューアーで確認できます

mdash ループ解析レポートの Details ペインのメッセージは同時実行の 大数は N に制限されていると報告します

注意 符号なしの N は0 以上の値になることが可能ですN = 0 は並列性が無制限であることを意味します

mdash カーネルメモリービューアーのローカルメモリーのバンクビューはプライベートコピーの数を図式化し表示します

bull メモリー使用量への影響

この情報はエリア解析レポートで確認可能ですDetails ペインのメッセージはオフラインコンパイラーが N 個のループ反復を同時実行するためN 個の独立したメモリーコピーを作成したことを報告します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

31

パフォーマンスよりも物理メモリーの低減を優先する場合以下のようにpragmamax_concurrency ltNgt をループに適用しますこのプラグマを適用するとオフラインコンパイラーは同時に実行するループの反復回数を N に制限しますループのメモリーのプライベートコピー数も N に減少します

pragma max_concurrency 1for (int i = 0 i lt N i++) int arr[M] Doing work on arr

ローカルメモリーに作成されループでアクセスされるプライベートコピーの数も__attribute__((max_concurrency(N))) を使用し制御することができます属性に関する詳細はカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) を参照ください__attribute__((max_concurrency(N))) を持つローカルメモリーにpragma max_concurency Mをともなうループでアクセスするとオフラインコンパイラーは同時に実行されるループの反復数を min(MN) に制限します

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

525 ループの投機的実行 (speculated_iterations Pragma)

speculated_iterationsプラグマを使用し インテル FPGA SDK for OpenCL オフラインコンパイラーにパイプライン化されたループのパフォーマンス向上を指示します

speculated_iterationsプラグマはループに適用されるため(他のループプラグマの位置と同様に) ループの直前に配置する必要があります以下に例を示します

pragma speculated_iterations k where k gt= 0

インテル FPGA SDK for OpenCL オフラインコンパイラーは他に影響を与えることなくk回の反復を追加し実行するハードウェアを生成しますこれによりループの II の短縮または fmax の増加どちらかが可能になります決定を左右するのはループの終了条件を計算する速度です計算に多くのサイクルを費やす場合はspeculated_iterationsを大きくすることを推奨します

注意 反復を追加することでループの次の呼び出しが開始されるまでの時間が長くなりますループの実際の反復回数が非常に少ない場合 (5 から 10 以下または同様の場合) はこれが要因の可能性がありますその場合pragma speculated_iterationsの値を 0 に指定すると後続のループの反復がすぐ開始されるようになります一方でこれはII を大きくし終了条件の算出に時間を与えることになりますHLD レポートのループ解析レポートを参照し終了条件が II のボトルネックであるかを確認してください

526 ワークグループサイズの指定

大のまたは必要なワークグループサイズを可能な限り指定してください インテル FPGA SDK forOpenCL オフラインコンパイラーはこの指定されたサイズに基づきOpenCL カーネルのハードウェア使用率を過剰なロジックをともなうことなく 適化します

max_work_group_sizeまたは reqd_work_group_size属性をカーネルで指定しない場合ワークグループサイズはコンパイル時間とランタイムの制約に応じたデフォルト値になります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

32

bull カーネルにバリアーが含まれる場合オフラインコンパイラーはデフォルトの 大ワークグループサイズである 256 ワークアイテムを設定します

bull カーネルが異なるスレッドの異なる動作を可能にする OpenCL 組み込み関数 (ローカルまたはグローバルスレッド IDワークグループ ID) の問い合わせを行わない場合オフラインコンパイラーはシングルスレッド実行モードを想定し 大ワークグループサイズを (111) に設定しますこの場合 OpenCL ランタイムもまたグローバルエンキューサイズを (111) に強制するためループのパイプライン化の 適化がオフラインコンパイラーで有効になります

ワークグループサイズを指定するには次のようにカーネルコードを修正します

bull カーネルのワークグループに向けてオフラインコンパイラーが規定するワークアイテムの 大数を指定するにはmax_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((max_work_group_size(51211)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

bull カーネルのワークグループにオフラインコンパイラーが規定するワークアイテムの必要数を指定するにはreqd_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((reqd_work_group_size(6411)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

527 計算ユニット数の指定

OpenCL カーネルのデータ処理効率を向上させるためカーネルの計算ユニットを複数生成するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示することができます各計算ユニットは複数のワークグループを同時に実行することができます

注意 カーネルの計算ユニット数を増加するとデータのスループットが向上する一方でFPGA リソースの消費率が増加しグローバルメモリーの帯域幅の競合が計算ユニット間で起こります

bull カーネルの計算ユニット数を指定するにはカーネルソースコードにnum_compute_units(N) 属性を挿入します

以下にコードの一部を例として示しますこのコードはカーネルに 2 つの計算ユニットをインスタンス化するようオフラインコンパイラーに指示しています

__attribute__((num_compute_units(2)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

33

size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは指定された数の計算ユニットにワークグループを動的に分配します

注意

ワークアイテムが実行されている特定の計算ユニットを識別するには組み込み関数のget_compute_id() を呼び出します詳細はget_compute_id() 関数を使用した複製カーネルのカスタマイズを参照ください

関連情報get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

528 SIMD ワークアイテム数の指定

手動でカーネルコードをベクトル化することなく複数のワークアイテムを SIMD (シングルインストラクションマルチプルワークアイテム) で実行しOpenCL カーネルのデータ処理効率を向上させることもできます インテル FPGA SDK for OpenCL オフラインコンパイラーにSIMD またはベクトル化された状態で実行するワークグループのワークアイテム数を指定してください

重要 reqd_work_group_size属性とともにnum_simd_work_items属性を導入します指定する num_simd_work_items属性はreqd_work_group_size属性に指定するワークグループサイズを均等に分割する必要があります

bull ワークグループの SIMD ワークアイテム数を指定するにはnum_simd_work_item(N) 属性をカーネルソースコードに挿入します

次のコード例は64 ワークアイテムの固定ワークグループサイズをカーネルに割り当てていますその後各ワークグループのワークアイテムを 4 つの SIMD ベクトルレーンに統合します

__attribute__((num_simd_work_items(4)))__attribute__((reqd_work_group_size(6411)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは可能な限りnum_simd_work_itemsに指定された値に従いカーネルのデータパスをベクトル化します

529 メモリー属性の指定

OpenCL カーネルの配列宣言にメモリー属性を適用することができます

int __attribute__((max_concurrency(k)) local_A[M]

この k は符号なしであり0 以上の値を取ることができますk の値は配列への 大同時アクセス数です インテル FPGA SDK for OpenCL オフラインコンパイラーは配列のコピーを k 個作成しますk=0 はスループットを 大化するためにオフラインコンパイラーが配列への 大同時アクセス数を小 16 までの範囲で選択することを示しますこれはメモリー属性を適用しないデフォルトの動作で

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

34

次の例は外側のループが 4 つのローカル配列を宣言しています

for (int i = 0 i lt N i++) int local_A[M] int local_B[M] int local_C[M] int local_D[M]

Step 1 for (int j = 0 j lt M j++) local_A[j ] = initA()

Step 2 for (int j = 0 j lt M j++) local_B[j] = initB(local_A[j])

Step 3 for (int j = 0 j lt M j++) local_C[j] = initC(local_B[j])

Step 4 for (int j = 0 j lt M j++) local_D[j] = initD(local_C[j])

この例において外側のループは 4 つのステップを含み各ステップは内側のループに対応していますステップ 1 では 初のローカル配列 local_A が初期化されますステップ 2 ではlocal_A の読み取りが行われますが書き込みはされませんこれは外側のループでの local_A の 後の使用になります同様に local_B はステップ 2 で 初に使用され初期化されますステップ 3 では local_B を読み取りますが書き込みはされませんそしてこれが 後の local_B の使用になります同様に local_Cはステップ 3 と 4 でのみで使用されます インテル FPGA SDK for OpenCL オフラインコンパイラーは16 個のコピーを作成し各配列をプライベート化しますこのコピーは外側のループでの 16 の並行処理をサポートするのに十分ですがこれらのローカル配列の実際の範囲は外側のループ全体に及ばないため外側のループのスループットを 大化するために 16 のコピーすべては必要ありませんこれはコピーを作成するために消費される領域が必要以上に大きいことを意味しますこの場合max_concurrency属性を適用しローカル配列のコピー数を制御すると外側のループのスループットを維持しながら使用される領域を減らすことができます

53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法

ローカルカーネルへのポインター引数を使用しローカルメモリーの割り当てを作成する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA に構築するローカルメモリーシステムのサイズをランタイムではなくコンパイル時に決定する必要があります clSetKernelArgでランタイムに要求するサイズを指定することでメモリーサイズを 適化できますこのサイズを指定することでオフラインコンパイラーはポインター引数に正しいサイズのローカルメモリーシステムを構築できるようになりますこのサイズを指定しない場合はオフラインコンパイラーはデフォルトのサイズを使用します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

35

bull デフォルトの 16 キロバイト (kB) 以外のサイズを指定するにはlocal_mem_size(N) 属性をカーネルソースコードのポインター宣言に含めます

N の値は要求するメモリーサイズをバイト単位で指定します効率を高めるためN は 2 のべき乗にしてください

__kernel void myLocalMemoryPointer( __local float A __attribute__((local_mem_size(1024))) __local float B __attribute__((local_mem_size(32768))) __local float C) statements

myLocalMemoryPointerカーネルにおいてローカルメモリーの 16 KB (デフォルト) はポインター Aに1 KB はポインター Bにそして 32 KB はポインター Cに割り当てられています

注意 ローカルカーネルへのポインター引数を使用する代わりにインテルではカーネルスコープにローカルメモリーシステムを定義することを推奨しています

54 インテル FPGA SDK for OpenCL チャネル拡張の実装

インテル FPGA SDK for OpenCL のチャネル拡張はカーネル間のデータの受け渡しおよびカーネルの同期を高効率かつ低レイテンシーで行うメカニズムを提供します

注意 チャネル機能の活用を求める一方で他の SDK を使用しカーネルプログラムを実行する機能がある場合はOpenCL パイプを代わりに使用しデザインを実装してください

関連情報OpenCL パイプの実装 (53 ページ)

541 インテル FPGA SDK for OpenCL チャネル拡張の概要

インテル FPGA SDK for OpenCL のチャネル拡張によりカーネルは FIFO バッファーを介し互いに直接通信できるようになります

チャネルの実装は並行して実行されているカーネル間のデータ移動をホストプロセッサーから切り離します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

36

図 -6 チャネル実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Channel

Host Processor

Initialize ( )

IO Channel

FIFO

542 チャネルにおけるデータの動作

チャネルに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りチャネルに残りますつまりチャネルに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり持続しますただしFPGA デバイスの再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたりデータが持続するわけではありません

OpenCL の実装においてデバイスの再プログラミング動作を回避するよう 適化を実行した場合でもチャネルのデータはコンテキストプログラムデバイスカーネルまたはプラットフォームのリリース間では持続しません例えば同じaocxファイルを使用しホストプログラムを 2 回実行する場合やホストプログラムがコンテキストをリリースし再取得した場合チャネルのデータは動作全体にわたって持続したりしなかったりする可能性がありますFPGA デバイスのリセット動作がチャネルのデータを消去するオブジェクトリリースの裏で発生する可能性があります

次のコードを例に示します

channel int c0

__kernel void producer() for (int i = 0 i lt 10 i++) write_channel_intel (c0 i)

__kernel void consumer (__global uint restrict dst) for (int i = 0 i lt 5 i++) dst[i] = read_channel_intel(c0)

図 -7 チャネルデータ FIFO の順序付け

9 012345678Producer Consumer

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

37

カーネルの producerは10 の要素 ([0 9]) をチャネルに書き込みますカーネルのコンシューマーにはワークアイテムの識別子の問い合わせが含まれていませんよって暗黙的なreqd_work_group_size属性 (111) を受け取りますこの暗黙的な属性reqd_work_group_size(111) は単一のワークアイテムカーネルとしてコンシューマーを起動させる必要があることを意味します上記例において consumerは1 回の呼び出しに 5 つの要素をチャネルから読み取ります 初の呼び出し中にカーネルの consumerは0 から 4 の値をチャネルより読み取りますデータは NDRange の呼び出し間で持続するため2 回目にカーネルconsumerを実行する際は5 から 9 の値が読み取られます

この例の場合デッドロックの発生を回避するためカーネル producerの呼び出しごとにカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとチャネルの容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回より多い場合はチャネルに十分なデータがないため consumerがストールします

543 チャネルに対する複数のワークアイテムの順序付け

OpenCL Specification はワークアイテムの順序を定義していません インテル FPGA SDK forOpenCL ではチャネルの読み書き動作の合理化を容易にするためワークアイテムの順序を強制します

複数のワークアイテムのチャネルへのアクセスはいくつかのシナリオにおいて有効です例えばチャネルのデータワードが独立している場合やチャネルがコントロールロジックに向けて実装されている場合などです複数のワークアイテムがチャネルにアクセスする際の主な注意事項はカーネルがチャネルにデータを書き込みチャネルからデータを読み取る順序ですSDK のチャネル拡張はチャネルへのワークアイテムの読み書き動作を可能な限り決定論的な順序で処理しますこれにより読み取りおよび書き込み動作はカーネル呼び出し間で一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK は以下の特性に基づきチャネルのアクセスがワークアイテムに対し不変であることを確認します

bull カーネルを通るすべてのパスが必ずチャネルアクセスを実行しているか

bull 上記要件が満たされない場合チャネル呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

bull カーネルが単一のワークアイテムカーネルとして推測されていないか

複数のワークアイテムのチャネルへのアクセスにおいて決定論的な順序付けを保証できない場合SDK はチャネルの順序付けが適切に定義されない可能性があり非決定論的な実行が行われる可能性があることを警告しますSDK は主にチャネル呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合決定論的な順序付けを提供することができません次に例を示します

__kernel void ordering (__global int restrict check __global int restrict data) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_channel_intel (req data[i]) else process(data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

38

5431 チャネルのワークアイテムのシリアル実行

ワークアイテムのシリアル実行とは順序付けられた実行動作のことでワークアイテムのシーケンシャル ID が計算ユニットでの実行順序を決定します

カーネルにチャネルを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は計算ユニットに同時に 大 1 つのインフライトのワークグループを持っているのと同等であるということを適用しますコンパイラーもまたカーネルがチャネルをシリアル実行することを保証しますよってカーネルはID の小さいワークアイテムから実行しますワークアイテムは識別子 (xyzgroup) を持ちますこの xyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

ワークアイテム ID (x0y0z0group0) は次の条件のいずれかが当てはまる場合ID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1 z0 lt z1の場合

bull group0 = group1 z0 = z1 y0 lt y1の場合

bull group0 = group1 z0 = z1 y0 = y1 x0 lt x1の場合

インクリメンタル ID をともなうワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) をともなうワークアイテムはチャネル書き込み呼び出しをまず実行しますその後ID (x1y0z0group0) をともなうワークアイテムが呼び出しを実行しますこの順序を定義することでシステムが外部モデルと検証可能になるよう保証しています

複数のワークアイテムをともなうループのチャネル実行

次のように複数のワークアイテムがあるループの本体にチャネルが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data int X) int n = 0 while (n lt X) write_channel_intel (req data[get_global_id(0)]) n++

544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約

OpenCL アプリケーションへのチャネル実装には一定のデザイン上の制約があります

複数のチャネル呼び出しサイト

カーネルは同じチャネルを複数回読み取ることが可能ですが複数のカーネルが同じチャネルから読み取ることはできません同様にカーネルは同じチャネルに複数回書き込むことはできますが複数のカーネルが同じチャネルに書き込むことはできません

__kernel void k1() read_channel_intel (channel1) read_channel_intel (channel1) read_channel_intel (channel1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

39

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコードをコンパイルすることができずエラーが発生します

__kernel void k1() write_channel_intel (channel1 1)

__kernel void k2() write_channel_intel (channel1 2)

フィードバックチャネルとフィードフォワードチャネル

カーネルのチャネルはread_onlyまたは write_onlyのどちらかになります同じチャネルに対して読み書きを行うカーネルのパフォーマンスは低下する可能性があります

静的なインデックス化

インテル FPGA SDK for OpenCL のチャネル拡張はチャネル ID の配列へのインデックス化をサポートしますが非効率なハードウェアにつながります

次に例を示します

channel int ch[WORKGROUP_SIZE]

__kernel void consumer()

int gid = get_global_id(0) int value = read_channel_intel(ch[gid])

statements

この例をコンパイルすると次の警告メッセージが表示されます

Compiler Warning Dynamic access into channel array ch was expanded into predicated static accesses on every channel of the array

アクセスが動的で配列のチャネルのサブセットのみにアクセスできることが明確な場合はswitch ステートメントを使用しわずかに効率的なハードウェアを生成することができます

channel int ch[WORKGROUP_SIZE] __kernel void consumer() int gid = get_global_id(0) int value

switch(gid) case 0 value = read_channel_intel(ch[0]) break

case 2 value = read_channel_intel(ch[2]) break case 3 value = read_channel_intel(ch[3]) break statements case WORKGROUP_SIZE-1read_channel_intel(ch[WORKGROUP_SIZE-1]) break

statements

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

40

カーネルのベクトル化に対するサポート

チャネルを使用するカーネルをベクトル化することはできませんしたがってカーネルコードにnum_simd_work_itemsカーネル属性を含めないでくださいチャネルを使用するカーネルをベクトル化すると同じカーネルで複数のチャネルアクセスが発生し調停が必要になりますこれはベクトル化の利点を無効にしますよって SDK のチャネル拡張はカーネルのベクトル化をサポートしません

read_channel_intel および write_channel_intel 呼び出しにおける命令レベルの並列処理

データの依存性が read_channel_intelと write_channel_intel呼び出し間に存在しない場合オフラインコンパイラーはそれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこの read_channel_intelと write_channel_intel呼び出しをOpenCL カーネルコードに表現されているシーケンスとは異なる順序で実行する場合があります

次のコードのシーケンスを例に示します

in_data1 = read_channel_intel(channel1)in_data2 = read_channel_intel(channel2)in_data3 = read_channel_intel(channel3)

read_channel_intel呼び出し間にデータの依存性がないためオフラインコンパイラーはこれらを任意の順序で実行できます

545 OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化

インテル FPGA SDK for OpenCL のチャネル拡張を実装するにはチャネル固有のプラグマと API 呼び出しを含むように OpenCL カーネルを修正します

チャネル拡張を有効にするには次のプラグマを使用しますpragma OPENCL EXTENSION cl_intel_channels enable

チャネル宣言は特定の OpenCL カーネルプログラムに固有のものですチャネルのインスタンスもまた各 OpenCL カーネルプログラムのデバイスペアに固有ですランタイムに単一の OpenCL カーネルプログラムを複数のデバイスにロードする場合各デバイスはチャネルのコピーを 1 つ保有するようになりますただしこのチャネルのコピーは独立しておりデバイス間でデータを共有しません

5451 チャネルのハンドル宣言

チャネル変数を使用しカーネル間またはカーネルと IO 間の接続性を定義します

チャネルから読み書きするにはカーネルはチャネル変数を対応する各 API 呼び出しに渡す必要があります

bull 以下の規則を使用しカーネルのソースコードにファイルスコープ変数としてチャネルのハンドルを宣言しますchannel lttypegt ltvariable_namegt

例 channel int c

bull インテル FPGA SDK for OpenCL のチャネル拡張はデータ構造で宣言された複数の変数による同時チャネルアクセスをサポートします次の方法でstructデータ構造をチャネルに宣言します

typedef struct type_ int a int b type_t

channel type_t foo

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

41

5452 ブロッキングのチャネル書き込みの実装

write_channel_intel API 呼び出しはチャネルを介したデータ送信を可能にします

bull ブロッキングのチャネル書き込みの実装には次の write_channel_intel関数シグネチャーを使用します

void write_channel_intel (channel lttypegt channel_id constlttypegt data)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますまた対応する読み取りチャネル(read_channel_intel) の channel_idと一致しなければなりません

dataはチャネル書き込み動作がチャネルに書き込むデータです

ltTypegt はチャネルのデータ幅を定義しますOpenCL 変換規則に従いカーネルがチャネルに書き込むデータがlttypegt に変換できるようにしてください

以下にwrite_channel_intel API 呼び出しを実装するコード例を示します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from global memory and passes this data to the channel __kernel void kernel_write_channel( __global const long src ) for (int i = 0 i lt N i++) Writes the eight bytes to the channel write_channel_intel(chan src[i])

注意 write_channel_intel API 呼び出しを使用しチャネルを介してデータを送信する際はチャネルの容量がフルの場合 (FIFO バッファーがデータでフルの場合) カーネルがストールしFIFO バッファーのデータスロットが 低 1 つ利用可能になるまで待機することに注意してください インテル FPGADynamic Profiler for OpenCL を使用しチャネルのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

54521 ノンブロッキングのチャネル書き込みの実装

ノンブロッキングのチャネル書き込みを行うとフルの状態の FIFO バッファーに書き込みFIFO バッファーのスロットが利用可能になるまでカーネルがストールすることのないアプリケーションが容易にできるようになりますノンブロッキングのチャネル書き込みはデータがチャネルに正常に書き込まれた (チャネルがフルではなかった) ことを示すブール値を返します

アプリケーションにデータプロデューサーが 1 つと同一のワーカーが 2 つあるシナリオを例とします各ワーカーがメッセージの処理に要する時間はデータの内容によって異ると想定しますこの場合一方のワーカーはビジー状態でもう一方のワーカーはフリーの状態になる可能性がありますノンブロッキングの書き込みは両方のワーカーがビジー状態になるワークの分配を促進します

bull ノンブロッキングのチャネル書き込みを実装するには次の write_channel_nb_intel関数シグネチャーを含めます

bool write_channel_nb_intel(channel lttypegt channel_id constlttypegt data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

42

次に示すコードのカーネル producerはノンブロッキングのチャネル書き込み拡張を使用しワークの分配を促進しています

channel long worker0 worker1__kernel void producer( __global const long src ) for(int i = 0 i lt N i++) bool success = false do success = write_channel_nb_intel(worker0 src[i]) if(success) success = write_channel_nb_intel(worker1 src[i]) while(success)

5453 ブロッキングのチャネル読み取りの実装

read_channel_intel API 呼び出しはチャネルを介したデータの受信を可能にします

bull ブロッキングのチャネルの読み取りを実装するには次の read_channel_intel関数シグネチャーを含めます

lttypegt read_channel_intel(channel lttypegt channel_id)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますこれは対応する書き込みチャネル (write_channel_intel) の channel_idと一致している必要があります

lttypegt はチャネルのデータ幅を定義しますチャネルデータを読み取るためにカーネルが割り当てる変数がlttypegt から変換可能であることを確認してください

read_channel_intel API 呼び出しを実装するコード例を以下に表します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from the channel and writes it back to global memory__kernel void kernel_read_channel (__global long dst) for (int i = 0 i lt N i++) Reads the eight bytes from the channel dst[i] = read_channel_intel(chan)

注意 チャネルが空の場合 (FIFO バッファーが空の場合)read_channel_intel API 呼び出しで読み出しチャネルを介したデータの受信はできませんこれを行うと 低 1 つのデータ要素が FIFO バッファーで利用可能になるまでカーネルはストールします

54531 ノンブロッキングのチャネル読み取りの実装

ノンブロッキングの読み取りを行うとデータが必ずしも利用可能ではない場合でもデータが利用可能になるまで動作が待機することのないアプリケーションを容易にできるようになりますノンブロッキング読み取りシグネチャーはブロッキング読み取りと類似していますが読み取り動作がチャネルからデータを正常に読み取ったかどうかを示すブールポインター validが指定するアドレスを生成します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

43

読み取りが正常に行われた場合 (validが true に設定される)チャネルから読み取った値はread_channel_nb_intel関数により返されます読み取りが失敗した場合 (validが false に設定される)read_channel_nb_intel関数の戻り値は定義されません

bull ブロッキングのチャネル読み取りを実装するには次の read_channel_nb_intel関数シグネチャーを使用します

lttypegt read_channel_nb_intel(channel lttypegt channel_id bool valid)

次のコードはノンブロッキングのチャネル読み取り拡張機能の使用方法を表しています

channel long chan

__kernel void kernel_read_channel (__global long dst) int i = 0 while (i lt N) bool valid0 valid1 long data0 = read_channel_nb_intel(chan ampvalid0) long data1 = read_channel_nb_intel(chan ampvalid1) if (valid0) process(data0) if (valid1) process(data1)

5454 io チャネル属性を使用した IO チャネルの実装

io属性をチャネル宣言に含めFPGA ボードの入力または出力フィーチャーと接続する特別な IO チャネルを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますこの chan_id はカスタムプラットフォームの board_specxmlにリストされている IO インターフェイス名です

ペリフェラルインターフェイスの使用方法はデバイスの種類によって異なるためIO チャネルをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいご自身の OpenCL カーネルコードはペリフェラルインターフェイスが生成するデータと互換性がある必要があります

注意 bull ボードに直接接続しIO チャネルを介してペリフェラルデバイスと通信するチャネルには暗黙的なデータの依存関係が存在する可能性があります インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらの依存関係に対する可視性を持たないためこの暗黙的なデータの依存関係は予期しない動作を引き起こす可能性があります

bull 同じペリフェラルと通信する外部 IO チャネルはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを参照しご自身の FPGA ボードで使用可能な入力および出力フィーチャーを特定してください

例えばboard_specxmlファイルには次のような IO フィーチャー情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

44

chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256 chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのチャネルで使用されるデータタイプの幅をビットで指定します上の例の場合uintと floatのデータタイプはどちらも 32 ビット幅です他のより大きいデータタイプやベクトル化されたデータタイプはboard_specxmlファイルで指定されている適切なビット幅と一致している必要があります

2 次のコード例で示されているように ioチャネル属性を実装しますioチャネル属性の名前はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) と一致していなければなりません

channel QUDPWord udp_in_IO __attribute__((depth(0))) __attribute__((io(eth0_in))) channel QUDPWord udp_out_IO __attribute__((depth(0))) __attribute__((io(eth0_out)))

__kernel void io_in_kernel (__global ulong4 mem_read uchar read_from int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) if (read_from amp 0x01) data = read_channel_intel(udp_in_IO) else data = mem_read[index] write_channel_intel(udp_in data) index++

__kernel void io_out_kernel (__global ulong2 mem_write uchar write_to int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) ulong4 data = read_channel_intel(udp_out) if (write_to amp 0x01) write_channel_intel(udp_out_IO data) else only write data portion ulong2 udp_data udp_datas0 = datas0 udp_datas1 = datas1 mem_write[index] = udp_data index++

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

45

注意 board_specxmlファイルのXML (eXtensible Markup Language) チャネル要素で指定されている各 IO チャネルに固有の io(chan_id) ハンドルを宣言してください

5455 IO チャネルのエミュレーション

io属性で宣言されたチャネルをともなうカーネルをエミュレーションするとIO チャネル入力はファイルからの読み取りによってエミュレーションされチャネル出力はファイルへの書き込みによってエミュレーションされます

エミュレーションを実行する際読み取りまたは書き込みに使用されるファイル名は io属性名と一致します例えば次のようなチャネル宣言をする場合エミュレーションは myIOChannelというファイルに対し読み取りまたは書き込みを行います (どちらか一方のみ)

channel uint chanA __attribute__((io(myIOChannel)))

IO チャネルの方向性は単方向ですチャネルへは読み取りもしくは書き込みのどちらかが可能で両方を行うことはできませんただし同じ io属性値を持つ読み取りチャネルと書き込みチャネルをそれぞれ持つことは可能です

channel uint readChannel __attribute__((io(myIOChannel)))channel uint writeChannel __attribute__((io(myIOChannel)))

IO チャネル読み取りのエミュレーション

読み取りが io属性を持つ myfileというチャネルから発行される場合ディスクの myfileというファイルに読み取りの試みは行われますmyfileが存在しない場合やファイルから読み取るデータが不十分な場合呼び出しタイプによって以下のように動作を行います

Non-blockingread

ファイルが存在しない場合やデータが不十分な場合読み取りの試みが失敗したことを示すメッセージを返します

Blockingread

ファイルが存在しない場合やデータが不十分な場合ディスクにファイルが作成されるかファイルに十分なデータが含まれるまでプログラムをブロックします

IO チャネル書き込みのエミュレーション

書き込みが io属性を持つ myfileというチャネルへ発行される場合ディスクの myfileというファイルに書き込みの試みが行われますmyfileファイルが存在しない場合通常ファイルが作成されそのファイルに書き込みが行われますmyfileが存在する場合はそれに上書きします書き込みが失敗した場合呼び出しタイプによって以下のように動作を行います

Non-blocking write 書き込みの試みが失敗した場合エラーが返されます

Blocking write 書き込みの試みが失敗した場合書き込みの試みがさらに行われます

5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例

カーネルの同時実行はFPGA のチャネルの効率を向上させることができます同時実行を実現するためホストはカーネルを並列して起動します該当する場合カーネルはチャネルを介して互いに通信できます

次に示すモデルは安全かつ効率的な同時実行の活用方法の概要を示しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

46

フィードフォワードのデザインモデル

フィードフォワードのデザインモデルを実装しサイクルを作成せずに 1 つのカーネルから次のカーネルにデータを送信します次のコードを参照ください

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i] = read_channel_intel(c0) dst[2i+1] = read_channel_intel(c1)

producerカーネルはデータをチャネル c0と c1に書き込みますconsumerカーネルはc0とc1からデータを読み取ります下の図は2 つのカーネル間のフィードフォワードのデータフローを表しています

図 -8 フィードフォワードのデータフロー

Producer Consumer

バッファー管理

フィードフォワードのデザインモデルではデータは producerと consumerのカーネル間を一度に1 ワードずつ移動します複数のワードから構成される大きなデータメッセージの転送を容易にするため通信用アプリケーションで一般的に見られるデザインパターンであるピンポンバッファーを実装することができます次の図はカーネルとピンポンバッファー間の通信を表しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

47

図 -9 バッファー管理をともなうフィードフォワードのデザインモデル

Producer Consumer

Manager

Buffer

managerカーネルはproducerカーネルと consumerカーネル間における循環バッファーの割り当ておよび割り当て解除を管理しますconsumerカーネルがデータを処理した後managerはconsumerが解放したメモリー領域を受け取り再度使用するために producerに送信しますmanagerはまた使用されていない位置の初期セット (トークンの初期セット) を producerカーネルに送信しそこに producerがデータを書き込めるようにします

次の図はバッファー管理の際に発生するイベントのシーケンスを表しています

図 -10 バッファー管理時のカーネルの通信

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

(1) (4)(3)(2)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

48

1 Managerカーネルはトークンのセットを producerカーネルに送信しメモリー内のどの領域が現在使用されておらずproducerが利用できるかを示します

2 managerがメモリー領域を割り当てた後producerはピンポンバッファーのその領域にデータを書き込みます

3 producerは書き込み動作完了後consumerカーネルに同期トークンを送信し処理するデータが含まれるメモリー領域を示します次に consumerカーネルはピンポンバッファーの該当領域からデータを読み取ります

注意

producerconsumermanagerカーネルは並行して実行されるためconsumerが読み取り動作を実行している間producerは他の使用されていないメモリー位置へ処理を行うデータを書き込むことができます

4 consumerは読み出し動作が完了後メモリー領域を解放しトークンを managerに送り返します次に managerカーネルはその領域をリサイクルしproducerが使用できるようにします

OpenCL カーネルへのバッファー管理の実装

SDK が適切なバッファー管理を実行するためにはチャネルの読み取りおよび書き込みの順序が重要です次のカーネル例を参照ください

__kernel void producer (__global const uint restrict src __global volatile uint restrict shared_mem const uint iterations) int base_offset for (uint gID = 0 gID lt iterations gID++) Assume each block of memory is 256 words uint lID = 0x0ff amp gID

if (lID == 0) base_offset = read_channel_intel(req)

shared_mem[base_offset + lID] = src[gID]

Make sure all memory operations are committed before sending token to the consumer mem_fence(CLK_GLOBAL_MEM_FENCE | CLK_CHANNEL_MEM_FENCE)

if (lID == 255) write_channel_intel(c base_offset)

このカーネルにおいて以下のコード行は独立しているため インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらを同時に実行するようスケジュールすることができます

shared_mem[base_offset + lID] = src[gID]

および

write_channel_intel(c base_offset)

base_offsetにデータを書き込みbase_offsetをチャネルへ書き込むことはグローバルメモリーへデータを書き込むよりもはるかに早い可能性がありますconsumerカーネルは次にチャネルから base_offsetを読み取りそれをグローバルメモリーから読み取るためのインデックスとして使

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

49

用します同期がなければshared_mem[base_offset + lID] = src[gID]の実行が終了する前にconsumerが producerからデータを読み取る可能性がありますその結果consumerは無効なデータを読み取ることになりますこのシナリオを回避するにはproducerカーネルがデータをメモリーに収納した後に同期トークンが発生しなければなりませんつまりconsumerカーネルはproducerがグローバルメモリーにデータを正常に格納するまでproducerカーネルからデータを消費することはできません

この順序を維持するにはOpenCL mem_fenceトークンをカーネルに含めますmem_fence構造はCLK_GLOBAL_MEM_FENCEと CLK_CHANNEL_MEM_FENCEの 2 つのフラグを持ちますmem_fenceはmem_fence呼び出し前後に発生する動作間に制御フローの依存性を効率的に作成しますCLK_GLOBAL_MEM_FENCEフラグはグローバルメモリー動作が制御フローに従う必要があることを示しますCLK_CHANNEL_MEM_FENCEはチャネル動作が制御フローに従う必要があることを示しますそのためこの例にある write_channel_intel呼び出しはグローバルメモリー動作が共有メモリーバッファーに格納されるまで開始できません

5457 depth 属性を使用するバッファーされたチャネルの実装

カーネルプログラムはバッファーされたチャネルとバッファーされていないチャネルを含むことが可能です チャネルの読み取り動作と書き込み動作が不均衡な場合チャネル宣言に depth属性を含めバッファーされたチャネルを作成しカーネルがストールするのを防ぎますバッファーされたチャネルは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたチャネルはスループットの制限や共有メモリーへのアクセスの同期化といったデータトラフィックの制御に使用することが可能ですバッファーされていないチャネルでは読み取り動作がデータの値を読み取るまで書き込み動作を開始できませんバッファーされたチャネルではデータの値がバッファーにコピーされるまで書き込み動作を開始できませんバッファーがフルの場合は読み取り動作がデータの一部を読み取りそれをチャネルから削除するまで動作を開始することができません

bull チャネルに対する消費率と生産率の一時的な不一致が予想される場合depthチャネル属性を使用しバッファーサイズを設定します

次の例は インテル FPGA SDK for OpenCL のチャネル拡張を実装するカーネルコードでのdepthチャネル属性の使用方法を示していますdepth(N) 属性はバッファーされたチャネルの 小深度を指定しますこの N はデータ値の数を表します

channel int c __attribute__((depth(10)))

__kernel void producer (__global int in_data) for (int i = 0 i lt N i++) if (in_data[i]) write_channel_intel(c in_data[i])

__kernel void consumer (__global int restrict check_data __global int restrict out_data) int last_val = 0

for (int i = 0 i lt N i++) if (check_data[i]) last_val = read_channel_intel(c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

50

out_data[i] = last_val

この例において書き込み動作はブロッキングをすることなく 10 個のデータ値をチャネルに書き込むことができますチャネルがフルになると関連する読み取り動作がチャネルに発生するまで書き込み動作を進めることはできません

チャネルの読み取りと書き込みの呼び出しは条件付きステートメントのためチャネルの読み取りと書き込みの呼び出しが不均衡になる可能性がありますチャネルにバッファー容量を追加することでproducerカーネルと consumerカーネルを確実に分離することができますこの手順はconsumerカーネルがチャネルからデータを読み取っていないときにproducerカーネルがデータを書き込んでいる場合に特に重要です

5458 チャネルの呼び出し順序の強制

チャネルの呼び出し順序を強制するにはカーネルプログラムにメモリーフェンスもしくはバリアー機能を導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンスの前後におけるチャネルアクセスに制御フローの依存性を作るために必要です

計算ユニットを生成する際 インテル FPGA SDK for OpenCL オフラインコンパイラーはそれぞれが独立している命令のすべてに命令レベルの並列性を必ず作成するわけではありませんそのためチャネル読み取りと書き込み動作の間に制御やデータの依存性がない場合でもそれぞれが独立して実行されない場合がありますチャネル呼び出しが相互に通信する際またはチャネルが外部デバイスにデータを書き込む際にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますチャネル c0とc1はバッファーされていないチャネルですc0と c1からのチャネル読み出し動作のスケジュールはc0と c1へのチャネル書き込み動作とは逆の順序で発生する可能性がありますつまりproducerカーネルはまず c0に書き込みますがconsumerカーネルは c1を 初に読み取る場合がありますこのチャネル呼び出しのスケジューリングの変更はconsumerカーネルが空のチャネルから読み取っているためデッドロックを引き起こす可能性があります

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) During compilation the AOC might reorder the way the consumer kernel writes to memory to optimize memory access Therefore c1 might be read before c0 which is the reverse of what appears in code

dst[2i+1] = read_channel_intel(c0) dst[2i] = read_channel_intel(c1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

51

bull デッドロックの発生を防ぐにはカーネルにメモリーフェンス関数 (mem_fence) を含めチャネル呼び出しの順序を強制します

各カーネルのチャネルフラグとともに mem_fence呼び出しを挿入すると書き込みと読み取りのチャネル呼び出しにシーケンシャルな順序付けが適用されます次は変更された producerとconsumerカーネルのコードです

channel uint c0 __attribute__((depth(0)))channel uint c1 __attribute__((depth(0)))

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i+1] = read_channel_intel(c0) mem_fence(CLK_CHANNEL_MEM_FENCE) dst[2i] = read_channel_intel(c1)

この例で producerカーネルの mem_fenceはc0へのチャネル書き込み動作が c1よりも前に発生するようにしています同様に consumerカーネルの mem_fenceはc0のチャネル読み取り動作が c1よりも前に発生するようにしています

54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義

OpenCL Specification version 10 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしチャネルを使用するカーネルは共通グローバルメモリーバッファーおよび同期されたメモリーアクセスを介しデータを共有することができます チャネルに書き込まれたデータがメモリーフェンスが渡された後に読み取りチャネルから確実に見えるようにするためメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull チャネルの同期呼び出しとメモリー動作間の制御フローの依存性を作成するにはCLK_GLOBAL_MEM_FENCEフラグを mem_fenceコールに追加します

__kernel void producer( __global const uint src const uint iterations ) for(int i=0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

52

write_channel_intel(c1 src[2i+1])

このカーネルにおいて mem_fence関数はc0への書き込み動作と src[2i]へのメモリーアクセスがc1への書き込み動作と src[2i+1]へのメモリーアクセスよりも先に実行されるようにしていますこれによりデータが c1に書き込まれる前にc0に書き込まれたデータが読み取りチャネルから見えるようになります

55 OpenCL パイプの実装

インテル FPGA SDK for OpenCL はOpenCL パイプ機能に対する暫定サポートを提供しますOpenCL パイプは OpenCL Specification version 20 の一部であり高効率かつ低レイテンシーなカーネルへのデータの受け渡しおよびカーネルの同期を可能にするメカニズムを提供します

OpenCL カーネルが他の SDK と互換性があることが重要な場合にパイプを実装してください

OpenCL C プログラミング言語の仕様およびパイプに関する概要についてはOpenCLSpecification version 20 を参照ください

インテル FPGA SDK for OpenCL のパイプの実装はパイプの仕様全体を網羅するものではありませんそのためOpenCL Specification version 20 に完全には準拠していませんSDK のパイプ実装の目的はOpenCL 20 に準拠する異なるデバイスにおいて一貫して機能するソリューションを提供することです インテル FPGA 製品に向けてパイプを有効にするにはご自身のデザインが特定の追加要件を満たしている必要があります

関連情報OpenCL Specification version 20 (API)

551 OpenCL パイプ機能の概要

OpenCL パイプはカーネルが FIFO バッファーを介し互いに直接通信できるようにします

図 -11 パイプネットワーク実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Pipe

Host Processor

Initialize ( )

IO Pipe

FIFO

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

53

パイプを実装するとカーネルの実行がホストプロセッサーから切り離されます インテル FPGA SDKfor OpenCL パイプサポートの基本はSDK のチャネル拡張ですただしパイプの関数の構文はチャネルの構文とは異なります

重要 チャネルとは異なりパイプのデフォルトの動作はノンブロッキングです

ブロッキングおよびノンブロッキング機能に関してはチャネルに関する次の章をそれぞれ参照ください

関連情報bull ブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ)

bull ブロッキングのチャネル読み取りの実装 (43 ページ)

552 パイプデータの動作

パイプに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りパイプに残りますつまりパイプに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり維持されますただしFPGA の再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたってデータが維持されることはありません

次のコードを例に示します

__kernel void producer (write_only pipe uint __attribute__((blocking)) c0) for (uint i = 0 i lt 10 i++) write_pipe (c0 ampi)

__kernel void consumer (__global uint restrict dst read_only pipe uint __attribute__((blocking)) __attribute__((depth(10))) c0) for (int i = 0 i lt 5 i++) read_pipe (c0 ampdst[i])

パイプへの読み取り操作では 初 にパイプに書き込まれたデータがまず読み出されますパイプデータはパイプ内の FIFO の順序を維持します

図 -12 パイプにおけるデータ FIFO の順序

9 012345678Producer Consumer

カーネル producerは10 個の要素 ([0 9]) をパイプに書き込みますカーネル consumerはNDRange の呼び出しごとにパイプから 5 個の要素を読み出します 初の呼び出しにおいてカーネル consumerは0 から 4 の値をパイプから読み出しますデータは NDRange 呼び出しにわたり維持されるため2 回目のカーネル consumer実行時には5 から 9 の値が読み出されます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

54

この例の場合デッドロックの発生を防ぐためカーネル producerの 1 回の呼び出しに対しカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとパイプ容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回を超えるとパイプ内のデータが不足するため consumerがストールします

553 パイプにおける複数のワークアイテムの順序付け

OpenCL Secification はワークアイテムの順序付けを定義していません インテル FPGA SDK forOpenCL はパイプの読み取りおよび書き込み動作の一貫性を維持するためワークアイテムの順序を強制します

複数のワークアイテムによるパイプへのアクセスはいくつかのシナリオでは有効です例えばパイプのデータワードが独立している場合やパイプが制御ロジックに向け実装されている場合に効果があります複数のワークアイテムがパイプにアクセスにする際に も注意しなければならないのはカーネルがデータをパイプへ書き込みパイプからデータを読み出す順序ですOpenCL パイプは可能な限りワークアイテムのパイプへの読み書き動作を決定論的な順序で処理しますそのため読み出し動作と書き込み動作はカーネル呼び出し間において一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK はパイプ呼び出しがワークアイテムに対し不変であることを次の点に基づき確認します

bull カーネルを通るすべてのパスがパイプ呼び出しを実行しているか

bull 上の要件が満たされない場合パイプ呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

SDK は複数のワークアイテムのパイプへのアクセスにおいて決定論的な順序を保証できない場合パイプが非決定論的な実行をともない適切な順序に定義されない可能性があることを警告しますSDKは通常パイプ呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合に決定的な順序付けを行うことができません

__kernel voidordering (__global int check global int data write_only pipe int __attribute__((blocking)) req) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_pipe (req ampdata[i]) else process(data)

5531 パイプにおけるワークアイテムのシリアル実行

ワークアイテムのシリアル実行とはワークアイテムのシーケンシャル ID が計算ユニットにおける実行順序を決定する順序付けられた実行動作のことです

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

55

カーネルにパイプを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は 大 1 つのインフライトのワークグループを保有しているのと同等であるということを強制しますオフラインコンパイラーはまたカーネルがワークアイテムのシリアル実行でパイプを実行するよう保証しますここでカーネルは小さな ID を有するワークアイテムをまず実行しますワークアイテムは(xyzgroup)の識別子を持ちxyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

次のいずれかの条件が当てはまる場合ワークアイテム ID (x0y0z0group0) はID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1z0 lt z1の場合

bull group0 = group1z0 = z1y0 lt y1の場合

bull group0 = group1z0 = z1y0 = y1x0 lt x1の場合

インクリメンタル ID を持つワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) を持つワークアイテムは書き込みチャネル呼び出しを 初に実行します次にID(x1y0z0group0) を持つワークアイテムが呼び出しを実行しますこの順序を定義することでシステムを外部モデルと検証することが可能になります

複数のワークアイテムを持つループでのパイプの実行

次に示すように複数のワークアイテムを持つループの本体にパイプが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data write_only pipe int __attribute__((blocking)) req) write_pipe (req ampdata[get_global_id(0)])

554 OpenCL のパイプ実装における制約

OpenCL アプリケーションへのパイプの実装においては一定のデザイン上の制約があります

デフォルト動作

デフォルトではパイプはノンブロッキング動作を行いますカーネルのパイプにブロッキング動作をさせる場合は読み取りパイプおよび書き込みパイプを宣言する際にブロッキング属性(__attribute__((blocking))) を指定してください

エミュレーションのサポート

インテル FPGA SDK for OpenCL Emulator はパイプを含むカーネルのエミュレーションをサポートしていますエミュレーターのサポート範囲はFPGA ハードウェアに実装される OpenCL パイプサポートのサブセットと一致します

パイプ API のサポート

現在 SDK のパイプの実装はOpenCL Specification version 20 の組み込みパイプ関数のすべてをサポートしているわけではありませんパイプ API におけるサポートの有無についてはOpenCL 20C プログラミング言語のパイプにおける制約の一覧を参照ください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

56

シングルコールサイト

パイプの読み取りおよび書き込み動作は決定論的に機能しないためカーネルにはパイプ ID ごとに 1つの呼び出しサイトしか割り当ることができません例えば インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコード例をコンパイルすることができません

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe1 ampin_data3)

pipe1への 2 回目の read_pipe呼び出しはpipe1への 2 つ目の呼び出しサイトを作成するためコンパイルは失敗します

特定のパイプから複数のデータを収集するには以下に示すようにパイプを複数のパイプに分割します

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe3 ampin_data3)

1 つのパイプ ID に対し 1 つの呼び出しサイトしか割り当てることができないためパイプを含むループを展開することはできません次のコードを参照ください

pragma unroll 4for (int i = 0 i lt 4 i++) read_pipe (pipe1 ampin_data1)

オフラインコンパイラーはコンパイル中に次の警告メッセージを発行します

Compiler Warning Unroll is required but the loop cannot beunrolled

フィードバックパイプとフィードフォワードパイプ

カーネルのパイプはread_onlyまたは write_onlyのどちらかです同じパイプを読み書きするカーネルのパフォーマンスは低下します

カーネルのベクトル化に対するサポート

パイプを使用するカーネルをベクトル化することはできませんつまりカーネルコードにnum_simd_work_itemsのカーネル属性を含めることはできませんパイプを使用するカーネルをベクトル化すると複数のパイプマスターが作成され調停が必要になりますこれは OpenCL パイプの仕様ではサポートされていません

read_pipe と write_pipe 呼び出しにおける命令レベルの並列性

read_pipeと write_pipe呼び出し間にデータの依存性がない場合オフラインコンパイラーはこれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこのread_pipeと write_pipe呼び出しをOpenCL のカーネルコードで表現されているシーケンスに従わない順序で実行する可能性があります

次のコードのシーケンスを例に示します

in_data1 = read_pipe(pipe1)in_data2 = read_pipe(pipe2)in_data3 = read_pipe(pipe3)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

57

read_pipe呼び出し間にデータの依存性がないためオフラインコンパイラーは任意の順序でそれらを実行することができます

関連情報OpenCL 20 C プログラミング言語のパイプにおける制約 (188 ページ)

555 カーネルに向けた OpenCL パイプの有効化

パイプを実装するにはご自身の OpenCL カーネルを変更しパイプ固有の API 呼び出しを含めてください

パイプ宣言は特定の OpenCL カーネルプログラムに固有のものですまたパイプのインスタンスはOpenCL カーネルのプログラムとデバイスのペアごとに一意のものですランタイムに単一の OpenCLカーネルプログラムを複数のデバイスにロードすると各デバイスは各パイプのコピーを 1 つ持つようになりますただしこれらのパイプのコピーは独立しておりデバイス間でデータを共有しません

5551 他の OpenCL SDK との互換性の確保

インテルによる OpenCL パイプの実装は現在OpenCL Specification version 20 に部分的に準拠しています 他の OpenCL SDK からのパイプを実装するカーネルを インテル FPGA SDK forOpenCL にポートする場合はホストコードとカーネルコードを変更する必要がありますこの変更はこのアプリケーションの他の OpenCL SDK に対する移植性に影響しません

ホストコードの変更

以下は変更されたホストアプリケーションの例です

include ltstdiohgtinclude ltstdlibhgtinclude ltstringhgtinclude CLopenclhdefine SIZE 1000

const char kernel_source = __kernel void pipe_writer(__global int in write_only pipe int p_in)n n int gid = get_global_id(0)n write_pipe(p_in ampin[gid])n n __kernel void pipe_reader(__global int out read_only pipe int p_out)n n int gid = get_global_id(0)n read_pipe(p_out ampout[gid])n n

int main() int input = (int )malloc(sizeof(int) SIZE) int output = (int )malloc(sizeof(int) SIZE) memset(output 0 sizeof(int) SIZE) for (int i = 0 i = SIZE ++i) input[i] = rand()

cl_int status cl_platform_id platform cl_uint num_platforms status = clGetPlatformIDs(1 ampplatform ampnum_platforms)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

58

cl_device_id device cl_uint num_devices status = clGetDeviceIDs(platform CL_DEVICE_TYPE_ALL 1 ampdevice ampnum_devices)

cl_context context = clCreateContext(0 1 ampdevice NULL NULL ampstatus)

cl_command_queue queue = clCreateCommandQueue(context device 0 ampstatus)

size_t len = strlen(kernel_source) cl_program program = clCreateProgramWithSource(context 1 (const char )ampkernel_source amplen ampstatus)

status = clBuildProgram(program num_devices ampdevice NULL NULL)

cl_kernel pipe_writer = clCreateKernel(program pipe_writer ampstatus) cl_kernel pipe_reader = clCreateKernel(program pipe_reader ampstatus)

cl_mem in_buffer = clCreateBuffer(context CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR sizeof(int) SIZE input ampstatus) cl_mem out_buffer = clCreateBuffer(context CL_MEM_WRITE_ONLY sizeof(int) SIZE NULL ampstatus)

cl_mem pipe = clCreatePipe(context 0 sizeof(cl_int) SIZE NULL ampstatus)

status = clSetKernelArg(pipe_writer 0 sizeof(cl_mem) ampin_buffer) status = clSetKernelArg(pipe_writer 1 sizeof(cl_mem) amppipe) status = clSetKernelArg(pipe_reader 0 sizeof(cl_mem) ampout_buffer) status = clSetKernelArg(pipe_reader 1 sizeof(cl_mem) amppipe)

size_t size = SIZE cl_event sync status = clEnqueueNDRangeKernel(queue pipe_writer 1 NULL ampsize ampsize 0 NULL ampsync) status = clEnqueueNDRangeKernel(queue pipe_reader 1 NULL ampsize ampsize 1 ampsync NULL) status = clFinish(queue)

status = clEnqueueReadBuffer(queue out_buffer CL_TRUE 0 sizeof(int) SIZE

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

59

output 0 NULL NULL)

int golden = 0 result = 0 for (int i = 0 i = SIZE ++i) golden += input[i] result += output[i]

int ret = 0 if (golden = result) printf(FAILED) ret = 1 else printf(PASSED) printf(n)

return ret

カーネルコードの変更

カーネルコードがOpenCL Specification version 20 に準拠する OpenCL SDK で実行される場合 インテル FPGA SDK for OpenCL で実行する前にこのコードを変更する必要があります次のようにカーネルコードを変更してください

bull パイプ引数の名前が両方のカーネルにおいて同一になるように変更します例えばp_inとp_outを pに変更します

bull パイプ引数に depth属性を指定しますホストで保持するためにパイプが作成する 大パケット数に等しい値をdepth属性に割り当てます

bull インテル FPGA SDK for OpenCL にはオフラインコンパイラーがあるためオフラインコンパイルモードでカーネルプログラムを実行します

変更後のカーネルコードは次のようになります

define SIZE 1000

__kernel void pipe_writer(__global int in write_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) write_pipe(p ampin[gid])

__kernel void pipe_reader(__global int out read_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) read_pipe(p ampout[gid])

5552 パイプハンドルの宣言

pipe変数を使用しカーネル間またはカーネルと IO 間の静的なパイプ接続を定義します

パイプの読み書きを行うにあたりカーネルはパイプ変数を対応する各 API 呼び出しに渡す必要があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

60

bull 以下の規則に従いパイプハンドルをファイルスコープ変数としてカーネルのソースコードに宣言します ltaccess qualifiergt pipe lttypegt ltvariable_namegt

パイプの lttypegt はスカラーサイズが 1024 ビット以下の任意の OpenCL 組み込みスカラーまたはベクトルデータ型にすることができますまたスカラーサイズで 1024 ビット以下のスカラーまたはベクトルデータ型で構成される任意のユーザー定義の型にすることも可能です

次のパイプハンドル宣言を参照ください

__kernel void first (pipe int c)

__kernel void second (write_only pipe int c)

初の例ではint型の読み出し専用パイプハンドルをカーネル firstで宣言しています2 番目の例では書き込み専用パイプをカーネル secondで宣言していますカーネル firstはパイプ cからの読み取りのみを行うことができカーネル secondはパイプ cへの書き込みのみを行うことができます

重要

インテル FPGA SDK for OpenCL オフラインコンパイラーではパイプ引数の名前を一致させることでシステム内のパイプの接続性を静的に推測します上記例においてカーネルfirstはカーネル secondにパイプ cで接続しています

インテル OpenCL システムでは1 つのカーネルのみがパイプを読み取ることができます同様に1 つのカーネルのみがパイプに書き込むことができますIO 以外のパイプに対応する読み取り動作と書き込み動作が少なくとも 1 つずつない場合オフラインコンパイラーはエラーを発行します

インテル FPGA SDK for OpenCL IO パイプの実装についてはio 属性を使用した IO パイプの実装を参照してください

関連情報io 属性を使用した IO パイプの実装 (64 ページ)

5553 パイプ書き込みの実装

write_pipe API 呼び出しはパイプを介したデータ送信を可能にします

インテルではwrite_pipe関数の簡易版のみをサポートしていますデフォルトで write_pipe呼び出しはノンブロッキングです受信するパケットを収容する容量がパイプにある場合にのみパイプ書き込み動作は成功します

bull パイプ書き込みを実装するには次の write_pipe関数シグネチャーを含めます

int write_pipe (write_only pipe lttypegt pipe_id const lttypegtdata)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応する読み出しパイプ(read_pipe) の pipe_idと一致する必要があります

dataはパイプ書き込み動作がパイプに書き込むデータですこれはパイプのパケットタイプへのポインターになりますパイプへの書き込みはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はパイプのデータ幅を定義します戻り値はパイプ書き込み動作が成功したかどうかを示します成功した場合の戻り値は 0 となりパイプの書き込みが失敗した場合の戻り値は-1 です

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

61

以下はwrite_pipe API 呼び出しの実装を表すコード例です

Declares the writable nonblocking pipe p which contains packets of type int__kernel void kernel_write_pipe (__global const long src write_only pipe int p) for (int i = 0 i lt N i++) Performs the actual writing Emulates blocking behavior via the use of a while loop while (write_pipe(p ampsrc[i]) lt 0)

blocking 属性を指定する場合whileループは不要ですより良いハードウェアの実装を実現するためにインテルではカーネルのパイプ引数宣言にブロッキング属性(__attribute__((blocking))) を指定することでブロッキングの write_pipe呼び出し機能を提供しますブロッキングの write_pipe呼び出しは必ず成功を返します

注意 write_pipe API 呼び出しを使用しブロッキングの書き込みパイプを介しデータを送信する際はパイプがフル (FIFO バッファーがデータでフル) の場合はカーネルがストールすることに注意してください インテル FPGA Dynamic Profiler for OpenCL を使用しパイプのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

5554 パイプ読み出しの実装

read_pipe API 呼び出しはパイプを介したデータ受信を可能にします

インテルではread_pipe関数の簡易版のみをサポートしていますread_pipe呼び出しはデフォルトではノンブロッキングです

bull パイプ読み出しを実装するには次の read_pipe関数シグネチャーを含めます

int read_pipe (read_only_pipe lttypegt pipe_id lttypegt data)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応するパイプ書き込み動作(write_pipe) の pipe_idと一致する必要があります

dataはパイプ読み出し動作がパイプから読み取るデータですこれはデータ位置へのポインターになりますread_pipe呼び出しはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はデータのパケットサイズを定義します

以下はread_pipe API 呼び出しの実装を表すコード例です

Declares the read_only_pipe that contains packetsof type longDeclares that read_pipe calls within the kernel will exhibitblocking behavior__kernel void kernel_read_pipe(__global long dst read_only pipe long __attribute__((blocking)) p) for (int i = 0 i lt N i++) Reads from a long from the pipe and stores it

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

62

into global memory at the specified location read_pipe(p ampdst[i])

より良いハードウェア実装を実現するためにインテルではカーネルのパイプ引数宣言にプロッキング属性 (__attribute__((blocking))) を指定することでブロッキングの read_pipe呼び出し機能を提供しますブロッキングの read_pipe呼び出しは必ず成功が返されます

注意 パイプが空 (FIFO バッファーが空) の場合read_pipe API 呼び出しでブロッキングの読み出しパイプを介したデータ受信はできませんこれを行うとカーネルがストールします

5555 depth 属性を使用するバッファーされたパイプの実装

カーネルプログラムにはバッファーされたパイプとバッファーされていないパイプを含むことができます パイプの読み出し動作と書き込み動作が不均衡な場合はパイプ宣言に depth属性を含めることでバッファーされたパイプを作成しカーネルのストールを防ぎますバッファーされたパイプは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたパイプを使用しスループットの制限や共有メモリーのアクセスの同期化といったデータのトラフィックを制御できますバッファーされていないパイプにおいて書き込み動作は読み出し動作がデータの読み取りをしようとしている場合にのみ開始できますバッファーされていないパイプは並行して実行されるカーネルでのブロッキングの読み書き動作と組み合わせて使用してくださいバッファーされていないパイプは自己同期型のデータ転送を効率的に提供します

バッファーされたパイプにおいて書き込み動作は受信するパケットを収容する容量がパイプにある場合にのみ進めることが可能です読み出し動作は少なくとも 1 つのパケットがパイプになければ実行することができません

パイプ呼び出しが書き込みカーネルと読み出しカーネルで異なって表されている場合にバッファーされたパイプを使用するとカーネルは並行して実行されません

bull パイプに対する消費率と生産率の一時的な不一致が予想される場合はdepth属性を使用しバッファーサイズを設定します

次の例はOpenCL パイプを実装するカーネルコードにおける depth属性の使用方法を示していますdepth(N)属性はバッファーされたパイプの 小深度を指定しますこの N はデータ値の数です読み出しカーネルと書き込みカーネルが特定のバッファーされたパイプに異なる深度を指定する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーは 2 つの深度のうち大きい深度を使用します

__kernel voidproducer (__global int in_data write_only pipe int __attribute__((blocking)) __attribute__((depth(10))) c) for (i = 0 i lt N i++) if (in_data[i]) write_pipe( c ampin_data[i] )

__kernel voidconsumer (__global int check_data __global int out_data read_only pipe int __attribute__((blocking)) c ) int last_val = 0

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

63

for (i = 0 i lt N i++) if (check_data[i]) read_pipe( c amplast_val ) out_data[i] = last_val

この例において書き込み動作は10 個のデータ値をパイプに正常に書き込むことができますパイプがフルの状態になると書き込みカーネルは読み出しカーネルがパイプのデータの一部を消費するまで失敗を返します

パイプの読み出しと書き込みの呼び出しは条件付きステートメントのためパイプの読み出しおよび書き込みの呼び出しには不均衡が発生する可能性がありますパイプにバッファー容量を追加するとproducerと consumerカーネルを切り離すことができますこの方法はconsumerカーネルがパイプからデータを読み取っていない際にproducerカーネルがパイプにデータを書き込んでいる場合に特に重要です 

5556 io 属性を使用した IO パイプの実装

OpenCL パイプ宣言に io属性を含めFPGA ボードの入力または出力フィーチャーと接続する特別なIO パイプを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

インテル FPGA SDK for OpenCL チャネル拡張の io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますchan_id 引数はカスタムプラットフォームの board_specxmlファイルにある IO インターフェイスの名前です同じ IO フィーチャーを使用しIO パイプを識別することができます

ペリフェラルインターフェイスの使用法は各デバイスのタイプによって異なる可能性があるためIO パイプをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいOpenCL カーネルのコードはペリフェラルインターフェイスが生成するデータの型と互換性がなければなりません外部 IO パイプとカーネルのバイトの順序が異なる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはバイトの順序を入出時にシームレスに変換します

注意 bull ボードに直接接続しておりIO パイプを介してペリフェラルデバイスと通信するパイプには暗黙的なデータの依存性が存在する可能性がありますオフラインコンパイラーはそれらの依存関係を認識できないためこの暗黙的なデータの依存性はコンパイルの問題を引き起こす可能性があります

bull 同一のペリフェラルと通信する外部 IO パイプはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを確認しFPGA ボードで使用可能な入力および出力フィーチャーを特定ください

例えばboard_specxmlファイルにはIO フィーチャーに関する次のような情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256 chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

64

chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのパイプで使用されるデータの型の幅をビット単位で指定します上記例の場合uintと floatのデータ型はどちらも 32 ビット幅ですその他のより大きなデータ型やベクトル化されたデータ型はboard_specxmlファイルで指定されている適切なビット幅に一致している必要があります

2 次のコード例で示されているように io属性を実装しますio属性名はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) に一致しなければなりません

__kernel void test (pipe uint pkt __attribute__((io(ldquoenetrdquo))) pipe float data __attribute__((io(ldquopcierdquo))))

注意 board_specxmlファイル内のチャネルの XML 要素で指定されている各 IO パイプに固有の io(chan_id) ハンドルを宣言してください

5557 パイプ呼び出し順序の強制

パイプの呼び出し順序を強制するにはメモリーフェンスもしくはバリアー機能をカーネルプログラムに導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンス前後におけるパイプの同期呼び出し間に制御フローの依存性を作成するために必要です

インテル FPGA SDK for OpenCL オフラインコンパイラーが計算ユニットを生成する際それぞれが独立している命令のすべてに対し命令レベルの並列性を構築するわけではありませんそのためパイプの読み出しおよび書き込み動作はそれらに制御やデータの依存性がない場合でも互いに独立して実行されない可能性がありますパイプ呼び出しが相互に通信する場合やパイプが外部デバイスにデータを書き込む場合にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますパイプ c0と c1はバッファーされていないパイプですc0と c1からのパイプ読み出し動作のスケジュールはc0とc1へのパイプ書き込み動作と逆の順序になる可能性がありますつまりproducerカーネルが 初に c0に書き込む一方でconsumerカーネルは c1から読み出す可能性があるということですconsumerカーネルが空のパイプから読み出しているためこのパイプ呼び出しにおけるスケジューリングの変更はデッドロックを発生させる可能性があります

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe (c0 ampsrc[2i ]) write_pipe (c1 ampsrc[2i+1])

__kernel void consumer (__global uint restrict dst const uint iterations read_only pipe uint __attribute__((blocking)) c0 read_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) read_pipe (c0 ampdst[2i+1]) read_pipe( c1 ampdst[2i])

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

65

bull パイプ呼び出しの順序を強制しデッドロックが発生しないようにするにはメモリーフェンス関数(mem_fence) をカーネルに含めます

各カーネルのパイプフラグとともに mem_fence呼び出しを挿入すると書き込みおよび読み出しのパイプ呼び出しにシーケンシャルな順序付けが適用されます次に変更後の producerとconsumerカーネルコードを示します

__kernel void producer (__global const uint src const uint iterations write_only_pipe uint __attribute__((blocking)) c0 write_only_pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_pipe(c1 ampsrc[2i+1])

__kernel void consumer (__global uint dst const uint iterations read_only_pipe uint __attribute__((blocking)) c0 read_only_pipe uint __attribute__((blocking)) c1) for(int i = 0 i lt iterations i++) read_pipe(c0 ampdst[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) read_pipe(c1 ampdst[2i+1])

この例ではproducerカーネルの mem_fenceはc0へのパイプ書き込み動作が c1より先に発生するようにしています同様に consumerカーネルの mem_fenceはc0からの読み取り動作が c1より先に行われるようにしています 

55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義

OpenCL Specification version 20 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしパイプを使用するカーネルは共通のグローバルメモリーバッファーと同期化されたメモリーアクセスを介しデータを共有できます メモリーフェンスが渡された後にパイプに書き込まれたデータが読み出しパイプから確実に見えるようにするにはメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull パイプの同期呼び出しとメモリー動作における制御フローの依存性を作成するにはmem_fence呼び出しに CLK_GLOBAL_MEM_FENCEフラグを追加します

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

66

write_pipe(c1 ampsrc[2i+1])

このカーネルで mem_fence関数はc0への書き込み動作と src[2i] へのメモリーアクセスがc1への書き込み動作と src[2i+1] へのメモリーアクセスの前に必ず実行されるようにしていますこれによりc0に書き込まれたデータはc1にデータが書き込まれる前に読み出しパイプから見えるようになります 

556 ホストパイプを介したカーネルとの直接通信

cl_intel_fpga_host_pipe拡張機能はカーネルとホストプログラムにおいてポイントとポイントのパイプ通信を可能にしますこの拡張を行わない場合OpenCL 内のパイプはカーネル間の通信にのみ使用することができホストプログラムとの直接通信に使用することはできません

この拡張機能はclCreatePipeの flags引数に 2 つの新しい値を認証しパイプホストをアクセス可能にしますまた4 つの新しい API 関数を追加し (clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGA)ホストのアクセスを有効にすることで作成したパイプをホストが読み書きできるようにします新しいカーネル引数属性のオプションが追加されカーネル言語においてパイプカーネル引数の反対側の端をホストプログラムに指定することでパイプが別のカーネルに接続されなくなりますカーネルの定義においてパイプカーネル引数はホストパイプまたは他のカーネルのどちらかへの接続に限定されておりランタイムにこの 2 つを動的に切り替えることはできません

パイプカーネル引数にホストアクセス可能のマークが付けられている場合カーネル言語のパイプアクセサーは2x 関数のサブセットに制限され (予約はサポートされていません)メモリーの一貫性または可視性の保証はOpenCL 同期ポイントを超えて行われます

ホストがアクセス可能なパイプのサポートはcl_intel_fpga_host_pipeと公示されているデバイスプロパティーです

注意 bull このホストパイプの実装における制限はプラットフォームが 2 つのホストパイプしかサポートしていないことです1 つは読み出し用もう一つは書き出し用ですさらにコパイラーは 32 ビット幅のパイプのみを許容しますよって cl_intel_fpga_host_pipe拡張機能の使用例の章でulong4が使用されています

bull cl_intel_fpga_host_pipe拡張を使用しているホストプログラムはOpenCL 20 の機能のサポート状況 (187 ページ) に記されているようにCLcl_ext_intelfpgahヘッダーファイルを含みOpenCL 20 のサポートを有効にする必要があります

関連情報cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

5561 intel_host_accessible カーネル引数属性オプション

cl_intel_fpga_host_pipe拡張機能によりオプションの intel_host_accessibleカーネル引数属性が追加されますこの属性をカーネルパイプ引数に適用することでホストはカーネルパイプ引数をホストがアクセス可能なパイプに接続し他のカーネルパイプ引数に接続しないことを指定します

__attribute__((intel_host_accessible))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

67

5562 ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数

clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGAのホスト API 関数を追加するとホストプログラムはホストがアクセス可能なパイプカーネル引数に (clSetKernelArg引数を使用し) バインドされたcl_memパイプオブジェクトに読み書きできるようになります

bull clReadPipeIntelFPGAおよび clWritePipeIntelFPGA関数はパイプ幅のシングルワードで動作します

bull clMapHostPipeIntelFPGA関数はホストパイプで多数のワードの読み取りまたは書き込みを実行する際のレイテンシーとオーバーヘッドを低減する高度なメカニズムです

bull clUnmapHostPipeIntelFPGA関数を使用するとホストプログラムは先にclMapHostPipeIntelFPGA関数呼び出しが作成したマップ領域の一部または全体に書き込みもしくは読み出しを行ったことを OpenCL ランタイムに通知することができるようになります

表 1 バインドされた cl_mem オブジェクトの API 関数

関数 説明

cl_int clReadPipeIntelFPGA (cl_mem pipe gentype ptr)

以下の特性を持つパイプからデータパケットを読み取ります1 CL_MEM_HOST_READ_ONLYフラグで作成されている2 write_only定義と intel_host_accessibleカーネル

引数属性を持つカーネル引数にバインドされている各 clReadPipeIntelFPGA関数呼び出しは1 パケットをパイプから読み取ります動作はノンブロッキングでありデータがパイプ内で正常に読み取れるようになるまで待機しません

cl_int clWritePipeIntelFPGA (cl_mem pipe gentype ptr)

次の特性を持つパイプにデータパケットを書き込みます1 CL_MEM_HOST_WRITE_ONLYフラグを使用し作成されている2 read_only定義と intel_host_accessible引数属性を

持つカーネル引数にバインドされている各 clWritePipeIntelFPGA関数呼び出しは1 パケットをパイプに書き込みます動作はノンブロッキングであり正常に書き込める容量がパイプにできるまで待機しません返されるステータスのCL_SUCCESSはカーネルの読み取りにデータが利用可能なことを意味するわけではありませんホストパイプに以前にマップされたバッファーのマップが解除されるとデータは 終的にカーネルの読み取りに利用可能になります

void clMapHostPipeIntelFPGA (cl_mem pipe cl_map_flags map_flags size_t requested_size size_t mapped_size cl_int errcode_ret)

ホストアドレス空間にvoid を返しますCL_MEM_HOST_WRITE_ONLYフラグで作成されている場合パイプはこのアドレス空間にデータを書き込むことができますまたCL_MEM_HOST_READ_ONLYフラグで作成されている場合パイプはこのアドレス空間からデータを読み取ることができますmapped_size引数はメモリーのランタイムによって決定するホストがアクセス可能な 大バイト数を指定しますmapped_size で指定される値は呼び出し側が指定する requested_size引数以下の値になります返された void に対する読み出しまたは書き込み後ホストは 1 回以上の clUnmapHostPipeIntelFPGA関数呼び出しを実行しデバイスに転送するデータが準備できていること (書き込み時) およびメモリーを再利用できること (読み込みおよび書き込みに時) をランタイムに通知する必要があります前回のclMapHostPipeIntelFPGA関数呼び出しでマッピングされたメモリーをclUnmapHostPipeIntelFPGA関数が解除する前に新

continued

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

68

関数 説明

たに clMapHostPipeIntelFPGA関数が呼び出された場合2 回目の clMapHostPipeIntelFPGA関数呼び出しで返されるバッファーは 初の呼び出しで返されたバッファーと重複しません

cl_int clUnmapHostPipeIntelFPGA ( cl_mem pipe void mapped_ptr size_t size_to_unmap size_t unmapped_size )

clMapHostPipeIntelFPGA関数によって返されたホストがアドレス指定可能なバッファーの size_to_unmapバイトをホストがすでに使用していないことをランライムに通知します書き込み可能なホストパイプの場合clUnmapHostPipeIntelFPGAを呼び出すとマッピングが解除されたデータをカーネルが利用できるようになりますsize_to_unmapの値が clMapHostPipeIntelFPGA関数で指定された mapped_sizeの値より小さい場合clUnmapHostPipeIntelFPGA関数を複数回呼び出しバッファー全容量のマッピングを解除する必要がありますclUnmapHostPipeIntelFPGA関数呼び出しを複数回含めclMapHostPipeIntelFPGA関数呼び出しで返されたバッファーの一連のバイトのマッピングをclMapHostPipeIntelFPGA呼び出しで定義された mapped_sizeの値まで解除することができます

5563 ホストがアクセス可能なパイプの作成

OpenCL 22 API Specification の Section 541 で定義されている clCreatePipe関数はflagsパラメーターを含んでいますclCreatePipe関数の flagsの有効値はCL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSです flagsへ渡された値が 0 の場合このフラグはどちらも暗黙的にデフォルトとして渡されると Specification は定義しています

ホストのパイプへのアクセス (読み取りまたは書き込み) を有効にするためcl_intel_fpga_host_pipe拡張機能は次の 2 つの flags値を clCreatePipeに対し正当なものにします

bull CL_MEM_HOST_READ_ONLY

bull CL_MEM_HOST_WRITE_ONLY

この flagsのうち 1 つが clCreatePipe関数に渡されると対応する cl_memオブジェクトは初の引数として clReadPipeIntelFPGAと clWritePipeIntelFPGA関数に渡されます

cl_intel_fpga_host_pipe拡張の残りの部分においてこのようなパイプはホストパイプとして表されます

警告 CL_MEM_HOST_READ_ONLYと CL_MEM_HOST_WRITE_ONLYを同じパイプに指定することまたはこのどちらかの値を CL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSのどちらかもしくは両方と混在させることは不当です無効な flagsの組み合わせは OpenCL ランタイムに検出されclCreatePipeがCL_INVALID_VALUEエラーを返す原因になります

5564 cl_intel_fpga_host_pipe 拡張機能の使用例

以下はcl_intel_fpga_host_pipe拡張のカーネルとホストコードの例です

カーネルコード

pragma OPENCL EXTENSION cl_intel_fpga_host_pipe enable

kernel void reader(__attribute__((intel_host_accessible)) __read_only pipe ulong4 host_in) ulong4 val if (read_pipe(host_in ampval))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

69

kernel void writer(__attribute__((intel_host_accessible)) __write_only pipe ulong4 device_out) ulong4 val if (write_pipe(device_out ampval))

ホストコード

cl_kernel read_kern = clCreateKernel(program reader NULL)

cl_kernel write_kern = clCreateKernel(program writer NULL)

cl_mem read_pipe = clCreatePipe(context CL_MEM_HOST_READ_ONLY sizeof( cl_ulong4 ) 128 Number of packets that can be buffered NULL amperror)

cl_mem write_pipe = clCreatePipe(context CL_MEM_HOST_WRITE_ONLY sizeof( cl_ulong4 ) 64 Number of packets that can be buffered NULL amperror)

Bind pipes to kernelsclSetKernelArg(read_kern 0 sizeof(cl_mem) (void )ampwrite_pipe)clSetKernelArg(write_kern 0 sizeof(cl_mem) (void )ampread_pipe)

Enqueue kernels

cl_ulong4 valif (clReadPipeIntelFPGA (read_pipe ampval)) cl_int result = clWritePipeIntelFPGA (write_pipe ampval) Check write successfailure and handle

56 任意精度での整数の実装

インテル FPGA SDK for OpenCL の任意精度での整数拡張を使用しカスタムビット幅で整数を定義します整数のカスタムビット幅は 大 64 ビットまで定義できます

任意精度の整数拡張機能を使用するにはカーネルコードのヘッダーファイルのリストに次の行を含めます

include ihc_apinth

ihc_apinthヘッダーファイルを含むカーネルをコンパイルする際は-I$INTELFPGAOCLSDKROOTincludekernel_headersオプションを aocコマンドとともに含める必要があります以下に例を示します

aoc ltother command optionsgt -I $INTELFPGAOCLSDKROOTincludekernel_headers ltmy_kernel_filegt

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

70

ヘッダーは任意精度の整数拡張を有効にし符号付きおよび符号なしの任意精度の整数に対する C スタイル宣言を定義するマクロを次のように備えています

define ap_intltdgt intd_tdefine ap_uintltdgt uintd_t

例えば 10 ビットの符号付きおよび符号なしの任意精度の整数は次のように宣言できます

int10_t x_signeduint10_t x_unsigned

任意精度の整数は 大 64 ビット幅まで宣言することが可能です

ヘッダーファイルを使用せずに整数を任意の精度で利用するには次のプラグマディレクティブで拡張を有効にします

pragma OPENCL EXTENSION cl_intel_arbitrary_precision_integers enable

プラグマ宣言の後次のように任意の精度で整数を宣言することができます

ap_intltdgt intd_t my_signed_integerap_uintltdgt uintd_t my_unsigned_integer

結果のビット幅が引数のビット幅より大きい演算を行う場合は引数の 1 つを結果のビット幅に明示的にキャストする必要があります

例えば次の演算を行った場合結果は宣言された整数のサイズをオーバーフローします

int10_t aint10_t bint20_t res

res = a b

この例においてコンパイラーは2 つの 10 ビットの整数を乗算する乗数をインスタンス化し結果を別の 10 ビットの整数に納めようと試みます結果は符号拡張されるか20 ビットまでゼロ拡張されます

オーバーフローを防ぐには次のように引数の 1 つを結果のビット幅に明示的にキャストします

res = ((int20_t)a) b

注意 x86-64 のプラットフォームに向けてプログラムをコンパイルすると任意の精度での整数のビット幅は32 ビットまたは 64 ビットに切り上げられますFPGA プラットフォームにカーネルをコンパイルするとビット幅は切り上げられず任意の精度の整数は宣言されたビット幅のまま維持されます

その結果x86-64 のプログラムで正しく動作するように見える演算を FPGA カーネルにコンパイルするとオーバーフローし精度を失う可能性がありますx86-64 プラットフォームにおいてビット幅を切り上げることで与えられる追加精度はFPGA カーネルのコンパイル時に発生する可能性があるオーバーフローと精度損失の問題をマスクします

57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用

定義済みプリプロセッサーマクロを活用するとカーネルコードの一部を条件付きでコンパイルできるようになります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

71

bull デバイス固有のコード (例えば FPGA_board_1) をカーネルプログラムに含めるにはカーネルプログラムを次のように構成します

if defined(AOCL_BOARD_FPGA_board_1) FPGA_board_1-specific statementselse FPGA_board_2-specific statementsendif

カーネルのコンパイルを特定のボードに対して行うと定義済みプリプロセッサーマクロAOCL_BOARD_ltboard_namegt が 1 に設定されますltboard_namegt がFPGA_board_1 の場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA_board_1 に固有のパラメーターとフィーチャーをコンパイルします

bull インテル FPGA SDK for OpenCL オフラインコンパイラー固有のコンパイラーフィーチャーと適化を導入するにはカーネルプログラムを次のように構成します

if defined(INTELFPGA_CL) statementselse statementsendif

この INTELFPGA_CLは インテル にて定義済みのオフラインコンパイラー用のプリプロセッサーマクロです

関連情報カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)(111 ページ)

58 __constant アドレス空間修飾子の宣言

__constantアドレス空間修飾子をカーネルに含める際にはいくつかの考慮すべき制限と回避策があります

関数スコープ__constant 変数

インテル FPGA SDK for OpenCL オフラインコンパイラーは関数スコープの__constant変数をサポートしません関数スコープの__constant変数はファイルスコープの constant 変数に置き換えてくださいまた関数スコープの__constant変数をホストがカーネルに渡す__constantバッファーに置き換えることも可能です

ファイルスコープ__constant 変数

ホストが常に同じ定数データをカーネルに渡す場合そのデータを初期化された constant ファイルスコープ配列としてカーネルファイルで宣言することを検討ください初期化された constant ファイルスコープ配列宣言はデータを格納するための ROM をハードウェアに直接作成しますこの ROM はNDRange のすべてのワークアイテムが利用可能です

以下に例を示します

__constant int my_array[8] = 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7

__kernel void my_kernel (__global int my_buffer) size_t gid = get_global_id(0) my_buffer[gid] += my_array[gid 8]

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

72

この場合ファイルスコープの定数データはカーネルの呼び出しにわたって変化しないためオフラインコンパイラーは my_arrayの値を ROM に設定します

ホストから__constant パラメーターへのポインター

カーネルの呼び出しにわたってデータが固定されていない場合ファイルスコープの定数データをカーネルコードの__constantパラメーターへのポインターに置き換えることが可能ですその後次の方法でホストアプリケーションを修正する必要があります

1 グローバルメモリーのポインターに関連付けられた cl_memメモリーオブジェクトを作成します

2 カーネルを実行する前にclEnqueueWriteBufferで定数データを cl_memオブジェクトにロードします

3 clSetKernelArg関数でcl_memオブジェクトをカーネルに引数として渡します

constant 変数が複合型の場合は次の表で示されているように typedef引数を使用し簡潔にします

表 2 ファイルスコープ__constant 変数と__constant パラメーターへのポインターの置き換え

元のソースコードの構成 以下のような構文に書き換え

__constant int Payoff[2][2] = 1 3 5 3__kernel void original(__global int A) A = Payoff[1][2] and so on

__kernel void modified(__global int A__constant Payoff_type PayoffPtr ) A = (PayoffPtr)[1][2] and so on

注意 ホストアプリケーションとカーネルでは同じ型定義を使用してください

59 構造体データ型を OpenCL カーネルに引数として含める

OpenCL カーネルの構造体パラメーター (struct) は値もしくは構造体へのポインターとして渡します

注意 __global struct引数は構造体を格納するためにホストプログラムに作成する必要があるバッファーを指定しますポインターのエイリアシングを防ぐため構造体へのポインター宣言にrestrict修飾子を含めます

591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致

OpenCL カーネルで構造体データ型 (struct) を引数として使用する場合ホストアプリケーションとカーネルコードにおいてメンバーのデータ型を一致させデータメンバーのアライメントを揃えてください

メンバーのデータ型を一致させるにはカーネルコードのデータ型に対応するデータ型の cl_バージョンをホストアプリケーションで使用しますデータ型の cl_バージョンはopenclhヘッダーファイルにあります例えばカーネルコードに float4型のデータメンバーがある場合ホストアプリケーションにおいて宣言する対応するデータメンバーはcl_float4です

ホストとカーネルアプリケーションにおける構造とstructデータメンバーのアライメントを揃えます異なるホストコンパイラー間においては変動性があるためアライメントは慎重に管理してください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

73

例えば構造体にfloat4の OpenCL データ型がある場合これらのデータアイテムのアライメントはOpenCL Specification を満たす必要があります (float4に対しては 16 バイトのアライメント)

インテル FPGA SDK for OpenCL オフラインコンパイラーが OpenCL カーネルをコンパイルする際は次の規則が適用されます

1 組み込みのスカラー型とベクトル型のアラインメントはOpenCL Specification version 10 のSection 615 で説明されている規則に従います

オフラインコンパイラーは通常サイズに基づいてデータ型のアライメントを行いますただしコンパイラーは 3 要素ベクトルの値を4 要素ベクトルと同じ方法でアライメントします

2 配列はその要素の 1 つと同じアラインメントを有します

3 struct (または union) はそのデータメンバーのいずれかに必要な 大アライメントと同じアライメントを有します

以下に例を示します

struct my_struct char data[3] float4 f4 int index

データ型が float4であるためオフラインコンパイラーは上記の struct要素を 16 バイトの境界でアライメントしますその結果dataと indexもまた 16 バイトのアライメント境界を有します

4 オフラインコンパイラーは structのデータメンバーを並び替えません

5 オフラインコンパイラーは通常各データメンバーのアライメント要件を満たすためstructのデータメンバー間に 小限のデータ構造パディングを挿入します

a OpenCL カーネルコードではpacked属性を struct宣言に適用することでデータのパッキングを指定することができます (すなわちデータ構造パディングを挿入しない)データのパッキングを課す場合はデータメンバーのアラインメントが OpenCL のアラインメント要件を満たしていることを確認してください インテル FPGA SDK for OpenCL はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

b OpenCL カーネルコードではaligned(N) 属性をデータメンバーに適用しデータ構造パディングの量を指定することができますここで N はパディングの量を表しますSDK はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

Windows システムにおいてMicrosoft Visual Studio コンパイラーの一部のバージョンではデフォルトで構造体データ型をパッキングしますデータのパッキングが不要な場合はデータ構造パディングの量を次のように指定してください

struct my_struct __declspec(align(16)) char data[3]

Note that cl_float4 is the only known float4 definition on the host __declspec(align(16)) cl_float4 f4 __declspec(align(16)) int index

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

74

ヒント データ構造パディングを追加することに代わりchar型または char配列のダミーの structメンバーを挿入する方法もあります

関連情報bull 構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

bull OpenCL Specification version 10

592 データ構造パディング挿入の無効化

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造体のメンバー間への自動的なパディング挿入を無効にする指示を出すことができます

bull 自動パディング挿入を無効にするにはカーネルソースコードの structデータ構造の前にpacked属性を挿入します

例えば次のようになります

struct __attribute__((packed)) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float restrict A __global struct Context restrict c) if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

593 構造体のアライメントの指定

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造に特定のアライメントを設定するよう指示を出すことができます

bull 構造のアライメントを指定するにはカーネルソースコードの structデータ構造の前にaligned(N) 属性を挿入します

次に例を示します

struct __attribute__((aligned(2))) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float A __global struct Context restrict c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

75

if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

510 レジスターの推論

インテル FPGA SDK for OpenCL オフラインコンパイラーではプライベートアドレス空間のデータをレジスターまたはブロック RAM に実装することが可能です 変数へのアクセスが固定されており動的インデックスを必要としない場合オフラインコンパイラーは通常レジスターを選択します可変インデックスで配列にアクセスすると配列は通常ブロック RAM に実装されますプライベートデータをレジスターとして実装することは単一のサイクルで発生する必要があるデータのアクセス (例えば単一ワークアイテムのループでのフィードバックなど) に有効です

オフラインコンパイラーはプライベート配列を単一の値のレジスターまたは区分的なレジスターとして推論します区分的な実装は非常に効率的なハードウェアをもたらしますがオフラインコンパイラーがデータのアクセスを静的に決定できなければなりません区分的な実装を容易にするためにアクセスポイントを配列にハードコードしますまた配列にアクセスするループを展開することでレジスターの推論を容易にすることもできます

配列のアクセスを静的に推論できない場合オフラインコンパイラーは配列をレジスターとして推論する場合がありますただしオフラインコンパイラーは単一のワークアイテムカーネルに対しそれらの配列のサイズを 64 バイトに制限します複数のワークアイテムを有するカーネルには実質的にサイズ制限はありません

次のコードを例に示します

int array[SIZE]for (int j = 0 j lt N ++j) for (int i = 0 i lt SIZE - 1 ++i) array[i] = array[i + 1]

array[i]へのインデックスはループが展開されていないため静的に推論することができませんarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイト以下である場合オフラインコンパイラーは array[SIZE]を単一の値としてレジスターに実装しますarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイトより大きい場合オフラインコンパイラーは配列全体をブロック RAM に実装します複数のワークアイテムカーネルの場合サイズが 1 キロバイト (KB) 未満である限りオフラインコンパイラーは単一の値として array[SIZE]をレジスターに実装します

5101 シフトレジスターの推論

シフトレジスターのデザインパターンは多くのアプリケーションを効率的に FPGA へ実装するために非常に重要なデザインパターンですしかしシフトレジスターのデザインパターンを実装することに対し 初は違和感を抱くかもしれません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

76

次のコードを例に示します

channel int in out

define SIZE 512Shift register size must be statically determinable

__kernel void foo() int shift_reg[SIZE] The key is that the array size is a compile time constant

Initialization loop pragma unroll for (int i=0 i lt SIZE i++) All elements of the array should be initialized to the same value shift_reg[i] = 0 while(1) Fully unrolling the shifting loop produces constant accesses pragma unroll for (int j=0 j lt SIZEndash1 j++) shift_reg[j] = shift_reg[j + 1] shift_reg[SIZE ndash 1] = read_channel_intel(in)

Using fixed access points of the shift register int res = (shift_reg[0] + shift_reg[1]) 2

lsquooutrsquo channel will have running average of the input channel write_channel_intel(out res)

各クロックサイクルでカーネルは新しい値を配列にシフトしますこのシフトレジスターをブロックRAM に配置することにより インテル FPGA SDK for OpenCL オフラインコンパイラーは配列への複数のアクセスポイントを効率的に処理できますシフトレジスターのデザインパターンはフィルター (例えばSobel フィルターなどのイメージフィルターや有限インパルス応答 (FIR) フィルターなどの時間遅延フィルター) を実装する際に理想的な方法です

カーネルコードにシフトレジスターを実装する際は次の点に注意してください

1 シフトループを展開し配列のすべての要素にアクセスできるようにします

2 すべてのアクセスポイントは一定のデータアクセスを持つ必要があります例えば複数のアクセスポイントを使用しネスト化されたループに計算を書き込む場合はこれらのループを展開し一定のアクセスポイントを確立します

3 配列の要素すべてを同じ値に初期化します特定の初期値が不要な場合は要素を初期化せずに維持することも可能です

4 大規模な配列へのアクセスが静的に推論できない場合オフラインコンパイラーは非効率なハードウェアを作成することになりますそれらのアクセスが必要な場合は__privateメモリーの代わりに__localメモリーを使用してください

5 大規模なシフトレジスターを条件付きでシフトしないでください非効率なハードウェアの作成を防ぐためシフトはシフトコードを含むループの反復で必ず行わなければなりません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

77

511 倍精度浮動小数点演算の有効化

インテル FPGA SDK for OpenCL ではすべての倍精度浮動小数点関数に対し暫定的なサポートを提供します

OpenCL カーネルで倍精度浮動小数点のデータ型を宣言する前に次の OPENCL EXTENSIONプラグマをカーネルコードに含めます

pragma OPENCL EXTENSION cl_khr_fp64 enable

512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター

ループ内で累算を実行する単一ワークアイテムカーネルは インテル FPGA SDK for OpenCL オフラインコンパイラーの単一サイクル浮動小数点アキュムレーターの機能を活用することができますオフラインコンパイラーはそれらのカーネルのインスタンスを探索しループで実行される累積をアキュムレーター構造へマッピングしようと試みます

オフラインコンパイラーは値を加算または減算するアキュムレーターをサポートしますこの機能を活用するにはオフラインコンパイラーがアキュムレーターを推論できるように累算を記述します

注意 bull アキュムレーターはArria 10 デバイスでのみ利用可能です

bull アキュムレーターはループの一部である必要があります

bull アキュムレーターは初期値の 0 を持つ必要があります

bull アキュムレーターを条件付きにすることはできません

次はオフラインコンパイラーによる正しいアキュムレーターの推論をもたらす記述例です

channel float4 RANDOM_STREAM

__kernel void acc_test(__global float a int k) Simplest example of an accumulator In this loop the accumulator acc is incremented by 5 int i float acc = 00f for (i = 0 i lt k i++) acc+=5 a[0] = acc

__kernel void acc_test2(__global float a int k) Extended example showing that an accumulator can be conditionally incremented The key here is to describe the increment as conditional not the accumulation itself int i float acc = 00f for (i = 0 i lt k i++) acc += ((i lt 30) 5 0) a[0] = acc

__kernel void acc_test3(__global float a int k) A more complex case where the accumulator is fed by a dot product int i float acc = 00f for (i = 0 i lt k i++ ) float4 v = read_channel_intel(RANDOM_STREAM) float x1 = vx float x2 = vy

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

78

float y1 = vz float y2 = vw acc += (x1y1+x2y2) a[0] = acc

__kernel void loader(__global float a int k) int i float4 my_val = 0 for(i = 0 i lt k i++) if ((i4) == 0) write_channel_intel(RANDOM_STREAM my_val) if ((i4) == 0) my_valx = a[i] if ((i4) == 1) my_valy = a[i] if ((i4) == 2) my_valz = a[i] if ((i4) == 3) my_valw = a[i]

5121 アキュムレーターを推論するためのプログラミング手法

単一サイクル浮動小数点アキュムレーター機能の活用はカーネルコードのアキュムレーターの記述を変更し効率を改善したりプログラミングの制約を回避したりすることで行うことができます

複数のループを使用するアキュムレーターの記述

複数のループを使用し一部のループを展開した状態でアキュムレーターを記述する場合を以下に示します

float acc = 00ffor (i = 0 i lt k i++) pragma unroll for(j=0j lt 16 j++) acc += (x[i+j]y[i+j])

この場合-fp-relaxedの インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションでカーネルをコンパイルし累積が公開されるようにオフラインコンパイラーが操作を再配置できるようにすることが重要です-fp-relaxedでカーネルをコンパイルしない場合アキュムレーターの構成は高いイニシエーションインターバル (II) をともなうことになりますイニシエーションインターバルは連続するループ反復の開始から開始までのサイクル数ですイニシエーションインターバルの値が大きいほどアキュムレーター構造体が次のループ反復を処理するまでの時間が長くなります

複数ループのアキュムレーターの記述変更

-fp-relaxedオフラインコンパイラーのコマンドオプションでアキュムレーターの記述をコンパイルできない場合はコードを書き換え累積を公開します

上記コード例の場合は次のように書き換えます

float acc = 00ffor (i = 0 i lt k i++) float my_dot = 00f pragma unroll for(j=0j lt 16 j++) my_dot += (x[i+j]y[i+j]) acc += my_dot

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

79

変数またはゼロ以外の初期値を含むアキュムレーターの記述変更

ゼロ以外の値で始まるアキュムレーターの記述にオフセットを適用する場合を下に示します

float acc = array[0]for (i = 0 i lt k i++) acc += x[i]

アキュムレーターハードウェアは記述に変数またはゼロ以外の初期値をサポートしないため記述を書き換える必要があります

float acc = 00ffor (i = 0 i lt k i++) acc += x[i]acc += array[0]

上記のように記述を書き換えるとカーネルはループでアキュムレーターを使用できるようになりますその後のループ構造にはarray[0]のインクリメントが続きます

513 整数のプロモーション規則

intX_tのデータ型を使用する際に適用される整数のプロモーション規則はCC++の標準規則とは異なります以下の異なる規則を考慮しカーネルをデザインしてください

bull 両方のオペランドが標準の整数型 (charや shortなど) の場合整数は CC++標準に従ってプロモートされますつまり演算は32 ビット以上の 大オペランドのデータ型とサイズで実行されますこの式はより大きい方のデータ型で結果を返します

bull オペランドがどちらも intX_tデータ型の場合データ型が 32 ビットより小さい場合でも 大の intX_tデータ型で演算は実行されますこの式はそのデータ型で結果を返します

bull 式に標準データ型 1 つと intX_tデータ型 1 つが含まれる場合intX_tデータ型のプロモーション規則が適用されますこの式の型は常に intX_tデータ型になります例えば 大のデータ型が標準整数型の shortの場合結果で返されるデータ型は int16_tです

bull リテラルは CC++のデフォルトにおいて intデータ型のためキャストなしでリテラルを使用すると式の型は常に少なくとも 32 ビットになります例えば次のようなコードの場合比較は 32 ビットで行われます

int5_t apif (ap lt 4)

bull オペランドの符号が異なり符号なしの型が少なくとももう一方の型と同じサイズである場合演算は符号なしで実行されますそれ以外の場合は符号なしオペランドは符号付きの値に変換されます

例えば次のようなコードの場合-1 は 32 ビットの負の値 (0xffffffff) に拡張されuint3_tは 32 ビットの正の値 7 (0x00000007) となり等しくなりません

uint3_t x = 7if (x = -1) FAIL

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

80

6 ホストアプリケーションの設計

インテルではホストに対する要件についてのガイドラインおよびホストアプリケーション構築における手順を提供しています該当する場合はOpenCL カーネルのホストアプリケーションを作成または変更する際にこれらのデザイン戦略を実行してください

ホストのプログラミング要件 (81 ページ)

グローバルメモリーの手動分割における OpenCL バッファーの割り当て (82 ページ)

カーネル実行中におけるプロファイルデータの収集 (86 ページ)

カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

ホストアプリケーションの管理 (92 ページ)

SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て (102 ページ)

徐々に速度低下する OpenCL システムのデバッグ (104 ページ)

61 ホストのプログラミング要件

インテル FPGA SDK for OpenCL で使用するために OpenCL ホストアプリケーションをデザインする際はアプリケーションが次のホストプログラミング要件を満たしていることを確認ください

611 ホストマシンのメモリー要件

ホストアプリケーションを実行するマシンは複数のコンポーネントを同時にサポートするための十分なホストメモリーが必要です

ホストマシンは次のコンポーネントをサポートする必要があります

bull ホストアプリケーションおよびオペレーティングシステム

bull ホストアプリケーションのワーキングセット

bull 一度に割り当てることのできる OpenCL メモリーバッファーの 大量デバイス側の cl_memバッファーはすべてホストプロセスの対応するストレージエリアに関連付けられますしたがってホストメモリーに必要な容量はFPGA がサポートしている外部メモリーの量と同等になる可能性があります

612 ホストバイナリーの要件

ホストアプリケーションをコンパイルする際はx86-64 (64 ビット) または ARMreg 32-bit ARMV7-A for SoC のいずれかのアーキテクチャーをターゲットにしてください インテル FPGA SDK forOpenCL のホストランタイムはx86-32 (32 ビット) バイナリーをサポートしません

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

613 複数のホストスレッド

インテル FPGA SDK for OpenCL のホストライブラリーはスレッドセーフです

clSetKernelArg関数を除く OpenCL API はすべてスレッドセーフです

clSetKernelArgの同時呼び出しが異なる cl_kernelオブジェクトで実行される限り任意のホストスレッドから clSetKernelArgを呼び出しても再入可能な方法で呼び出しても安全です

関連情報マルチスレッドホストアプリケーション

614 順不同のコマンドキュー

OpenCL ホストランタイムのコマンドキューは順不同なコマンドの実行をサポートしません

615 カーネルを同時に実行するための複数のコマンドキューにおける要件

同じ OpenCL プログラムオブジェクトにあるカーネルを同時実行するには同時に実行する各カーネルに個別のコマンドをインスタンス化します

62 グローバルメモリーの手動分割における OpenCL バッファーの割り当て

グローバルメモリーバッファーを手動で分割するとバッファー間のメモリーアクセスを制御しメモリー帯域幅を 大化することができますバッファーの分割は同じメモリータイプのインターフェイス間または異なるメモリータイプのインターフェイス間で行うことが可能です

621 同じメモリータイプの複数のインターフェイスでのバッファーの分割

同じメモリータイプの複数のインターフェイスにおいてメモリーを分割する際はOpenCL カーネルコンパイル中のバーストインターリーブを 初に無効にする必要があります次にOpenCL バッファーを割り当てるメモリーバンクをホストアプリケーションに指定する必要があります

デフォルトで インテル FPGA SDK for OpenCL オフラインコンパイラーは各グローバルメモリータイプをバーストインターリーブ方式でコンフィグレーションしますバーストインターリーブ方式のコンフィグレーションは通常メモリーバンク間に 良のロードバランスをもたらしますただしインターリーブ領域以外へのメモリー分割がより効率的な場合もあります

次の図はバーストインターリーブでのメモリー分割とインターリーブ以外のメモリー分割における違いを表しています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

82

0x7FFF_FFFFAddress

0x7FFF_FC000x7FFF_FBFF

0x7FFF_F800

0x0000_0FFF

0x0000_0C000x0000_0BFF

0x0000_08000x0000_07FF

0x0000_04000x0000_03FF

0x0000_0000

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Address0x7FFF_FFFF

0x4000_00000x3FFF_FFFF

0x0000_0000

Burst-Interleaved Separate Partitions

使用可能なグローバルメモリータイプの一部またはすべてを手動で分割するには次の作業を実行します

1 OpenCL カーネルを -no-interleaving=ltglobal_memory_typegt フラグでコンパイルし指定されたメモリータイプのメモリーバンクを個別のアドレスでコンフィグレーションします

-no-interleaving=ltglobal_memory_typegt フラグの使用方法に関してはグローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) の章を参照ください

2 ホストアプリケーションに OpenCL バッファーを作成しCL_CHANNELフラグでバッファーをいずれかのバンクへ割り当てます

mdash CL_CHANNEL_1_INTELFPGAを指定しバッファーを使用可能な 下位メモリー領域に割り当てます

mdash CL_CHANNEL_2_INTELFPGAを指定しメモリーを 2 番目のバンクに割り当てます (利用可能な場合)

注意

それぞれのバッファーは単一メモリーバンクにのみ割り当ててくださいランタイムに 2 番目のバンクが利用できない場合メモリーは 1 番目のバンクに割り当てられますグローバルメモリーが利用できない場合はclCreateBuffer呼び出しは失敗しエラーメッセージCL_MEM_OBJECT_ALLOCATION_FAILUREが表示されます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

83

関連情報グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) (115 ページ)

622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割

FPGA ボードのボードサポートパッケージでは異なるメモリーテクノロジー (DRAM や SRAM など) で構成されるグローバルメモリースペースを組み立てることが可能ですボードサポートパッケージは複数のインターフェイスで構成されるそのようなメモリーの 1 つをデフォルトのメモリーとして指定しますバッファーはすべてそこにあります

異種メモリーを使用するにはclファイルのコードを次のように変更します

1 次のいずれかの方法でFPGA ボードで使用可能なグローバルメモリータイプの名前を確認してください

mdash ボードメーカーの資料を参照する

mdash ボードのカスタムプラットフォームの board_specxmlファイルで名前を検索する各グローバルメモリータイプの名前はglobal_mem要素の name属性に割り当てられた一意の文字列です

2 特定のグローバルメモリータイプにバッファーを割り当てるようにホストに指示するにはbuffer_location(ltmemory_typegt) 属性を挿入しますここで ltmemory_typegtはボードメーカーより提供されているグローバルメモリータイプの名前です

__kernel void foo(__global __attribute__((buffer_location(DDR))) int x __global __attribute__((buffer_location(QDR))) int y)

buffer_location属性を指定しない場合ホストはバッファーをデフォルトのメモリータイプに自動的に割り当てますデフォルトのメモリータイプを確認するにはボードメーカーから提供されている資料を参照してくださいまたはカスタムプラットフォームの board_specxmlファイルで 初に定義されているメモリータイプもしくは属性 default=1が割り当てられたメモリータイプを検索します

インテルでは次のように buffer_location属性をプリプロセッサーマクロに定義し再利用を容易にすることを推奨しています

define QDR__global __attribute__((buffer_location(QDR))) define DDR__global __attribute__((buffer_location(DDR)))__kernel void foo (QDR uint data DDR uint lup) statements

注意

カーネル引数をデフォルト以外のメモリーに割り当てる場合 (上記コードであれば QDRuint dataおよび DDR uint lup)その引数を constantキーワードで宣言することはできませんさらにその引数から派生するポインターでアトミック操作を実行することはできません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

84

clCreateProgramWithBinary関数を使用し OpenCL ランタイムにカーネルをロードするとデフォルトでホストはバッファーをメインメモリーに割り当てますカーネルの呼び出し中にホストはカーネル引数にバインドされている異種メモリーバッファーをメインメモリーに自動的に再配置します

3 異種メモリーバッファーが 初にメインメモリーに割り当てられるのを防ぐにはclCreateBuffer関数を呼び出す際にCL_MEM_HETEROGENEOUS_INTELFPGAフラグを含めますまた clSetKernelArgを使用し cl_memバッファーを buffer_location属性を使用した引数にまずバインドした後にそのバッファーに対する読み取りまたは書き込みを実行してください次に例を示します

mem = clCreateBuffer(context flags|CL_MEM_HETEROGENEOUS_INTELFPGA memSize NULL amperrNum)

clSetKernelArg(kernel 0 sizeof(cl_mem) ampmem)clEnqueueWriteBuffer(queue mem CL_FALSE 0 N 0 NULL ampwrite_event)clEnqueueNDRangeKernel(queue kernel 1 NULL global_work_size NULL 0 NULL ampkernel_event)

例えば次の clCreateBuffer呼び出しはデフォルト以外のメモリーバンクの使用可能な下位メモリー領域にメモリーを割り当てます

mem = clCreateBuffer(context (CL_MEM_HETEROGENEOUS_INTELFPGA|CL_CHANNEL_1_INTELFPGA) memSize NULL amperrNum)

clCreateBuffer呼び出しはカーネル引数で指定した内容に基づきメモリーを特定のグローバルメモリータイプに割り当てますメモリータイプにあるメモリーオブジェクト (cl_mem)が異なるメモリーテクノロジーに対応するカーネル引数として設定されている場合ホストはカーネルをキューする際にそのメモリーオブジェクトを自動的に移動しますバッファーは複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

異種グローバルメモリーアクセスの 適化に関する詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの異種メモリーバッファーとグローバルメモリーの手動分割の章を参照ください

関連情報bull グローバルメモリーの手動分割

bull 異種メモリーバッファー

623 ホストアプリケーションでのパイプオブジェクトの作成

カーネルに OpenCL パイプを実装するには インテル FPGA SDK for OpenCL 固有のパイプオブジェクトをホストアプリケーションに作成する必要があります

SDK 固有のパイプオブジェクトはOpenCL Specification version 20 で説明されているように真の OpenCL パイプオブジェクトではありませんこの実装は準拠したソリューションによるインテルFPGA 製品からの移行を可能にしますSDK 固有のパイプオブジェクトはメモリーオブジェクト(cl_mem) ですがホストはパイプ自体にメモリーを割り当てません

次の clCreatePipeホスト API はパイプオブジェクトを作成します

cl_mem clCreatePipe(cl_context context cl_mem_flags flags cl_uint pipe_packet_size cl_uint pipe_max_packets const cl_pipe_properties properties cl_int errcode_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

85

clCreatePipeホスト API 関数についての詳細はOpenCL Specification version 20 のSection 541 を参照ください

以下はclCreatePipeホスト API 関数の構文例です

cl_int statuscl_mem c0_pipe = clCreatePipe(context 0 sizeof(int) 1 NULL ampstatus)status = clSetKernelArg(kernel 1 sizeof(cl_mem) ampc0_pipe)

注意 SDK はランタイムの動的なチャネル割り当てをサポートしません SDK は一致する名前に基づきコンパイル中にパイプを静的にリンクします

関連情報OpenCL Specification version 20 (API)

63 カーネル実行中におけるプロファイルデータの収集

カーネルの実行がホストアプリケーションの完了後に終了する場合カーネルの実行中にプロファイルデータを収集するようFPGA に対し明示的に要求することができますほとんどのアプリケーションではカーネルの実行完了時にプロファイルデータを自動的にリードバックするデフォルトの動作で十分です

コンパイル中に OpenCL カーネルをプロファイリングするとprofilemonファイルが自動的に生成されますその後プロファイルデータはFPGA でカーネルの実行が完了した後に profilemonに書き込まれますただしカーネルの実行がホストアプリケーション終了後に完了した場合そのカーネル呼び出しのプロファイル情報はprofilemonファイルに存在しなくなりますこの場合プロファイル情報をカーネルの実行中に取得するようホストコードを修正することができます

重要 カーネルの実行中にプロファイルデータを収集するとカーネルのレイテンシーが増加しカーネルの実行にかなりのオーバーヘッドが追加される可能性があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

86

bull カーネルの実行中にプロファイルデータを収集するよう FPGA に要求するには次のホストライブラリー呼び出しを呼び出します

extern CL_API_ENTRY cl_int CL_API_CALL

clGetProfileInfoIntelFPGA(cl_event)

上記 cl_eventはカーネルのイベントですこのホストライブラリー呼び出しに渡すカーネルイベントはclEnqueueNDRangeKernel呼び出しに渡すものと同じである必要があります

重要

mdash clGetProfileInfoIntelFPGAの呼び出し前にカーネルの実行が完了した場合この関数はイベントエラーメッセージを返します

mdash clGetProfileInfoIntelFPGAおよびclGetProfileDataDeviceIntelFPGA関数呼び出しを使用しているホストプログラムにはCLcl_ext_intelfpgahヘッダーファイルを含む必要があります

注意

カーネルの実行中に clGetProfileInfoIntelFPGA関数を呼び出すとプロファイルカウンターが一時的に無効になり インテル FPGA Dynamic Profiler for OpenCL がFPGA からデータを収集できるようになりますそのためいくつかのプロファイル情報がこの中断中に失われますこの関数を非常に短い間隔で呼び出すとプロファイルデータがカーネルの実際のパフォーマンス動作を正確に反映しない可能性があります

次のホストコードを例に説明します

int main() clEnqueueNDRangeKernel(queue kernel NULL) clEnqueueNDRangeKernel(queue kernel NULL)

このホストアプリケーションはカーネルが 2 回起動した後に完了するという前提で動作しますカーネルの呼び出しごとに 1 組のプロファイルデータが生成されるためprofilemonファイルには合計 2 組のプロファイルデータが生成されますカーネルの実行中にプロファイルデータを収集するにはホストコードを次のように変更します

int main() clEnqueueNDRangeKernel(queue kernel ampevent)

Get the profile data before the kernel completes clGetProfileInfoIntelFPGA(event)

Wait until the kernel completes clFinish(queue)

clEnqueueNDRangeKernel(queue kernel NULL)

clGetProfileInfoIntelFPGAへの呼び出しによりprofilemonファイルに新しいエントリーが追加されます インテル FPGA Dynamic Profiler for OpenCL GUI はその後レポートにこのエントリーを解析します

インテル FPGA Dynamic Profiler for OpenCL についての詳細は次の章を参照ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

87

bull インテル FPGA SDK for OpenCL ベストプラクティスガイドのパフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング

関連情報bull パフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング (140 ページ)

631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング

完了時にプロファイラーデータを自動的に生成するエンキューされたカーネルとは異なり (コンパイラーフラグが設定されている場合)自動実行カーネルは終了しませんしたがってclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しでカーネルをプロファイルするタイミングを明示的に指定する必要がありますプロファイラーデータはすべてprofilemonファイルへ出力されますホストライブラリー呼び出しで収集されるデータは自動実行のプロファイルデータのスナップショットになります

次はclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しのコード例です

cl_int clGetProfileDataDeviceIntelFPGA (cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret)

以下が詳細です

bull read_enqueue_kernelsパラメーターはエンキューされたカーネルをプロファイリングしますこのリリースにおいてこのパラメーターは無効です

bull read_auto_enqueuedパラメーターは自動実行カーネルをプロファイリングします

bull 以下は今後のリリースにおけるプレースホルダーパラメーターです

mdash clear_counters_after_readback

mdash param_value_size

mdash param_value

mdash param_value_size_ret

mdash errcode_ret

注意 このホストライブラリー呼び出しは自動実行カーネルのみをポートしていますread_enqueue_kernelsパラメーターに TRUEを入力できますがブール値は無視されますこれはエンキューされたカーネルがプロファイリングされないという意味ではありませんコンパイラーの profileフラグがエンキューされたカーネルを含むように設定されている場合通常通り実行の終わりにプロファイルデータはキャプチャーされます唯一の違いはclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しはエンキューされたカーネルに対し自動的に行われるプロファイリングとは別にエンキューされたカーネルをプロファイリングしないことです

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

88

clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは成功時にCL_SUCCESSを返しますそれ以外の場合は次のエラーのいずれかを返します

bull デバイスが有効なデバイスではない場合は CL_INVALID_DEVICE

bull プログラムが有効なプログラムではない場合は CL_INVALID_PROGRAM

注意 clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは与えられたデバイスで与えられたプログラムのプログラミング操作をトリガーしませんホストライブラリー呼び出し時にプログラムがまだデバイスにプログラミングされていない場合ホストライブラリー呼び出しはCL_INVALID_PROGRAMエラーを返します

表 3 clGetProfileDataDeviceIntelFPGA ホストライブラリー呼び出しパラメーターの組み合わせ

read_auto_enqueued

エンキューされたカーネルのみをプロファイリング注意 実行が完了すると自動的にプロファイル情報を出力します

False

自動実行カーネルのみをプロファイリング True

エンキューされたカーネルと自動実行カーネルの両方をプロファイリング

True

632 プロファイルデータの取得

実行中のカーネルからのプロファイルデータの取得はリードバック動作中に一時停止します

注意 データ取得が一時停止してもカーネル自体はまだ実行していますしたがってリードバック動作中にカーネルデータは記録されません

データ取得の一時停止はすべてのカーネル間において完全には同期されませんカーネル間におけるプロファイルデータの取得停止のスキューはデバイスとの通信リンクドライバーのオーバーヘッドおよび通信バス上の輻輳によって異なりますカーネル間におけるプロファイルデータの正確な同期スナップショットに依存するべきではありません

633 複数の自動実行プロファイリング呼び出し

自動実行カーネルは継続的に実行されるためホストアプリケーションは複数のclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを実行中の特定の時点または特定の時間範囲に含め自動実行カーネルをプロファイリングすることができますホストアプリケーションが clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを呼び出すたびにプロファイルカウンターが読み取られゼロにリセットされますclGetProfileDataDeviceIntelFPGAを複数回呼び出すことでホストアプリケーションは時間範囲にわたり自動実行カーネルをプロファイリングできます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

89

図 -13 複数の自動実行プロファイリングのキャプチャーフロー

main() clEnqueueNDRangeKernel() system startsclGetProfileDataDeviceIntelFPGA () Time AclGetProfileDataDeviceIntelFPGA () Time BclFinish()

AR0

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 0

Counter 1

AR2 AR8

AR9

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 18

Counter 19

Collect_Autorun_Profiling

CRA

profile_ctrl profile_data

Host

daisy_out

profile_shift

カウンター実行中

カウンターは無効

(~1000us)

カウンター読み取り(Time A) (Time B)

カウンターリセット

カーネルは実行中

カウンター実行中

カウンターは無効

(~1000us)

カウンター実行中

カーネルは実行中

カウンター読み取り カウンター

リセット

64 カスタムプラットフォーム固有の関数へのアクセス

カスタムプラットフォームで利用可能なユーザーがアクセスできる関数をオプションでアプリケーションに含めることができますただしホストアプリケーションを FPGA クライアントドライバー (FCD)にリンクするとそれらのカスタムプラットフォーム固有の関数を直接参照することはできません FCDとリンク中にカスタムプラットフォーム固有のユーザーがアクセス可能な関数を参照するにはホストアプリケーションに clGetBoardExtensionFunctionAddressIntelFPGA拡張を含めます

clGetBoardExtensionFunctionAddressIntelFPGA拡張はカスタムプラットフォームからユーザーがアクセス可能な関数へのポインターを取得する API を指定します

注意 Linux システムの場合clGetBoardExtensionFunctionAddressIntelFPGA関数はFCD の有無にかかわらず機能しますWindows システムの場合この関数は FCD と併用する場合にのみ機能しますカスタムプラットフォームにおいて FCD がサポートされているかはボードメーカーへお問い合わせください

拡張インターフェイスの定義は INTELFPGAOCLSDKROOThostincludeCLcl_exthファイルで確認できます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

90

bull カスタムプラットフォームでユーザーがアクセス可能な関数へのポインターを取得するにはホストアプリケーションで次の関数を呼び出します

void clGetBoardExtensionFunctionAddressIntelFPGA ( const char function_name cl_device_id device )

以下に詳細を説明します

function_name はカスタムプラットフォームのメーカーが提供するユーザーがアクセス可能な関数の名前を指します

また

device はclGetDeviceIDs関数によって返されるデバイス ID です

ユーザーがアクセス可能な関数を識別するとclGetBoardExtensionFunctionAddressIntelFPGA関数はユーザーがアクセス可能な関数へのポインターを返しますカスタムプラットフォームにその関数が存在しない場合clGetBoardExtensionFunctionAddressIntelFPGAは NULLを返します

注意

インストーラブルクライアントドライバー (ICD) を介しclGetBoardExtensionFunctionAddressIntelFPGA API にアクセスする際はICD 拡張 API の clGetExtensionFunctionAddressIntelFPGAが 初にclGetBoardExtensionFunctionAddressIntelFPGA API へのポインターを取得していることを確認してください

次のコード例はICD を介したカスタムプラットフォーム固有の関数へのアクセス方法を示しています

clGetBoardExtensionFunctionAddressIntelFPGA_fn clGetBoardExtensionFunctionAddressIntelFPGA = (clGetBoardExtensionFunctionAddressIntelFPGA_fn) clGetExtensionFunctionAddressForPlatform (platform clGetBoardExtensionFunctionAddressIntelFPGA) if (clGetBoardExtensionFunctionAddressIntelFPGA == NULL) printf (Failed to get clGetBoardExtensionFunctionAddressIntelFPGAn)

void board_extension_function_ptr = clGetBoardExtensionFunctionAddressIntelFPGA(function_namedevice_id)

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

65 構造パラメーター変換に向けたホストプログラムの変更

OpenCL カーネルにおいて構造パラメーターを定数へのポインター構造に変換する場合ホストアプリケーションを適宜変更する必要があります

ホストアプリケーションに次の変更を加えます

1 構造体のコンテンツを格納するための cl_memバッファーを割り当てます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

91

注意 異なる構造体の値を使用するカーネルごとに個別の cl_memバッファーが必要です

2 構造体のカーネル引数を構造体のコンテンツへのポインターではなく構造体のバッファーへのポインターで設定します

3 カーネルをキューする前に構造体のバッファーのコンテンツを設定します次のいずれかの手順を実行しカーネルが起動する前に構造体のバッファーが設定されるようにします

mdash カーネルキューと同じコマンドキューに構造体バッファーをキューします

mdash 個別のカーネルキューと構造体のバッファーキューをイベントと同期させます

4 アプリケーションが構造体バッファーを使用するカーネルを呼び出す必要がなくなった際にはcl_memバッファーを解放します

関連情報bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

bull ホストとカーネルにおける構造体データ型のデータレイアウトの一致 (73 ページ)

66 ホストアプリケーションの管理

インテル FPGA SDK for OpenCL にはホストアプリケーションのコンパイルとリンクに必要なフラグおよびライブラリーに関する情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

注意 ホストアプリケーションを SoC FPGA ボードにクロスコンパイルするにはユーティリティーコマンドに--armオプションを含めます

注意 Linux システムにおいてGNU Project Debugger (GDB) を使用しホストアプリケーションをデバッグする場合はホストアプリケーションを実行する前に次のコマンドを呼び出します

handle SIG44 nostop

このコマンドを呼び出していない場合GDB のデバッグプロセスは次のエラーメッセージとともに終了します

Program received signal SIG44 Real-time event 44

661 Makefile フラグメント例の表示 (example-makefile または makefile)

ホストランタイムライブラリーに対してホストアプリケーションをコンパイルおよびリンクするために インテル FPGA SDK for OpenCL で利用可能な Makefile フラグメント例を表示するにはexample-makefileまたは makefileユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

92

bull コマンドプロンプトで aocl example-makefile または aocl makefile ユーティリティーコマンドを呼び出しますソフトウェアは次のような出力を表示します

The following are example Makefile fragments for compiling and linkinga host program against the host runtime libraries included with the Intel FPGA SDK for OpenCL

Example GNU makefile on Linux with GCC toolchain

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_prog host_progo g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile on Windows with Microsoft Visual C++ command line compiler

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_progexe host_progobj link -nologo OUThost_progexe host_progobj $(AOCL_LINK_CONFIG)

host_progobj host_progcpp cl MD Fohost_progobj -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile cross-compiling to ARM SoC from Linux or Windows withLinaro GCC cross-compiler toolchain

CROSS-COMPILER=arm-linux-gnueabihf- AOCL_COMPILE_CONFIG=$(shell aocl compile-config --arm) AOCL_LINK_CONFIG=$(shell aocl link-config --arm)

host_prog host_progo $(CROSS-COMPILER)g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp $(CROSS-COMPILER)g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

662 ホストアプリケーションのコンパイルとリンク

OpenCL ホストアプリケーションは標準 OpenCL ラインタイム API を使用しデバイスのコンフィグレーションデータのバッファーカーネルの起動および同期を管理しますまたファイル IOアクセラレーターデバイスで実行しないソースコードの一部などの機能も含んでいます インテル FPGA SDKfor OpenCL にはOpenCL API を記述している C ヘッダーファイルホストアプリケーションとリンクする必要があるボード固有の MMD ライブラリーおよびホストランタイムライブラリーの情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

重要 Windows システムの場合MDフラグを追加しホストランタイムライブラリーを Microsoft CRuntime ライブラリーのマルチスレッド DLL (ダイナミックリンクライブラリー) バージョンにリンクする必要がありますまたホストアプリケーションをMDコンパイルフラグでコンパイルするかNODEFAULTLIBリンカーオプションでランタイムライブラリーの選択を上書きする必要があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

93

注意 ホストアプリケーションを実行する際は INTELFPGAOCLSDKROOThostltOS_platformgtbinフォルダーへのパスをライブラリー検索パスに含めます

ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config) (95 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示 (ldflags) (96ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs) (96 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-configまたは linkflags) (96 ページ)

6621 ホストアプリケーションと Khronos ICD Loader Library のリンク

インテル FPGA SDK for OpenCL はKhronos Group の OpenCL ICD 拡張をサポートしていますOpenCL ICD 拡張機能を使用するとシステムに複数の OpenCL 実装を行うことができますOpenCL ICD Loader Library ではインストールされているプラットフォームのリストを選択し選択した OpenCL の実装に特化した OpenCL API 呼び出しを実行できます

SDK のホストランタイムライブラリーに加えインテルはOpenCL Specification version 10 およびOpenCL Specification versions 111220 に実装されている API をサポートする ICDLoader Library のバージョンを提供します他のメーカーが提供する ICD ライブラリーを使用する場合該当メーカーが発行している資料を参照しICD ライブラリーのリンク方法を確認ください

OpenCL ホストアプリケーションを ICD Loader Library にリンクする前にボード MMD ライブラリーをロードするための FCD を設定する必要がありますFCD をまだ設定していない場合FPGA ボードの管理 (20 ページ) にて詳細を確認ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

94

ICD と FCD がどちらも正しくセットアップされていることを確認してくださいこれは aocldiagnose ndashicd-only ユーティリティーを使用し確認することができますこのユーティリティーは対応する ICD または FCD を作成しライブラリーがシステムにレジスターされているかどうかを確認します

bull aocl diagnoseユーティリティーの出力に ICD diagnostics PASSEDが表示されるとホストアプリケーションを作成する際にホストアプリケーションは自動的に ICD LoaderLibrary に接続します

bull aocl diagnoseユーティリティーが ICD を検出しなかった場合次の手順で ICD の設定を確認してください

mdash Windows システムにおいてはregeditを管理者権限で開きWindows レジストリーキーの HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors に移動しますName の値は altera_icddllになりますこの動的ライブラリーファイルは ltINTELFPGAOCLSDKROOTgthostwindows64binにありますType はDWORD でありData は 00000000 になりますレジストリーキーは次の例ようになります

HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]alteracl_icddll=dword00000000

mdash Linux システムにおいてはetcOpenCLvendorsAlteraicdファイルがシステム内に存在しlibalteraclsoのテキストが含まれていることを確認してください

bull aocl diagnoseユーティリティーが FCD を検出しなかった場合次の手順で FCD の設定を確認してください

mdash Windows システムにおいてはHKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards レジストリーキーのライブラリーですべてのユーザーのインストールが選択されていることを確認してくださいもしくは HKEY_CURRENT_USERSOFTWAREIntelOpenCLBoards レジストリーキーを確認してくださいNameの値は ltpath_to_the_mmd_librarygt になりData は 0 に設定された DWORDですレジストリーキーは次の例のようになります

[HKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards]cboard_vendor amy_board_mmddll=dword00000000

mdash Linux システムの場合はoptIntelOpenCLBoardsmy_boardfcdファイルがシステムに存在しメーカー固有のライブラリー名が含まれていることを確認してください(databoard_vendor_alibmy_board_mmdsoなど)

注意

bull ボードメーカーが複数のライブラリーを提供している場合それらが特定の順序になっているかを再度確認してくださいライブラリーをロードする正しい順序に関してはボードメーカーにお問い合わせくださいライブラリーはロードする順序通りにレジストリーに並べる必要があります

bull インテル Arria 10 SoC ボードにおいてカスタムプラットフォームに SD フラッシュカードイメージをビルドする際はlibalteraclsoのテキストを含むAlteraicdファイルを作成くださいAlteraicdファイルをカスタムプラットフォームのetcOpenCLvendorsディレクトリーに保存します詳細はBuilding the Software and SD Card Image for the Intel Arria 10 SoCDevelopment Kit Reference Platform を参照ください

6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)

ホストアプリケーションのコンパイルに必要なフラグのリストを表示するにはcompile-configユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

95

1 コマンドプロンプトで aocl compile-config ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL API ヘッダーファイルが存在するフォルダーまたはディレクトリーへのパスを表示します例えば

bull Windows システムの場合パスは-IINTELFPGAOCLSDKROOThostincludeになります

bull Linux システムの場合パスは-I$INTELFPGAOCLSDKROOThostincludeになります

この INTELFPGAOCLSDKROOT はソフトウェアのインストール位置を指します

2 このパスをC プリプロセッサーに追加します

注意 INTELFPGAOCLSDKROOThostincludeCLフォルダーまたはディレクトリーにあるopenclh OpenCL ヘッダーファイルをホストソースに含めます

6623 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示(ldflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なパスを表示するにはldflagsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldflags ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL プラットフォームとランタイム API を提供する OpenCL ホストランタイムライブラリーとホストアプリケーションをリンクするためのパスを表示しますOpenCL ホストランタイムライブラリーは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあります

6624 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs)

ホストアプリケーションをリンクするために必要な OpenCL ホストランタイムライブラリー名およびMMD ライブラリー名を表示するにはldlibsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldlibs ユーティリティーコマンドを呼び出します

ソフトウェアは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあるホストランタイムライブラリーのリストを表示しますまたカスタムプラットフォームのltboard_family_namegtltOS_platformgtlibディレクトリー にあるカスタムプラットフォーム固有の MMD ライブラリーのリストも表示します

注意

FCD が正しく設定されているとソフトウェアは MMD ライブラリーのリストを表示しません

mdash Windows システムの場合出力は OpenCLlibになります

mdash Linux システムの場合出力は-lOpenCLになります

6625 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示(link-config または linkflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なフラグの一覧を表示するにはlink-configまたは linkflagsユーティリティーコマンドを呼び出します

このユーティリティーコマンドはldflagsと ldlibsユーティリティーコマンドの機能を兼ね備えています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

96

bull コマンドプロンプトで aocl link-config または aocl linkflags コマンドを呼び出します

mdash Windows システムの場合出力はlibpathINTELFPGAOCLSDKROOThostwindows64lib OpenCLlibになります

mdash Linux システムの場合出力は-L$INTELFPGAOCLSDKROOThost[linux64|arm32]lib -lOpenCLになります

663 OpenCL ICD 拡張 API の使用

ICD を使用する際にOpenCL Specification に正式に記載されていない OpenCL ホスト API 関数を呼び出す場合はclGetExtensionFunctionAddress関数を 初に呼び出しそのホストAPI 関数への関数ポインターを取得後その関数ポインターを使用しホスト API 関数を呼び出す必要がありますこれは関数名に IntelFPGAを含む非標準の呼び出しすべてに適用されます

次のコード例を参照ください

extern CL_API_ENTRY cl_int CL_API_CALLclGetProfileDataDeviceIntelFPGA( cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret )

以下の関数呼び出しを

cl_int status = clGetProfileDataDeviceIntelFPGA (device program false true false 0 NULL NULL NULL)

以下の構文を使用するコードと置き換え関数ポインターの定義およびロードを行います

typedef cl_int (clGetProfileDataDevice_fn) (cl_device_id cl_program cl_bool cl_bool cl_bool size_t void size_t cl_int )clGetProfileDataDevice_fn get_profile_data_ptr = (clGetProfileDataDevice_fn) clGetExtensionFunctionAddressForPlatform (clGetProfileDataDeviceIntelFPGA)

その後関数呼び出しとして関数ポインターを使用します

cl_int status = (get_profile_data_ptr) (device program false true false 0 NULL NULL NULL)

664 ホストを経由した FPGA のプログラミング

インテル FPGA SDK for OpenCL オフラインコンパイラーはホストアプリケーションから独立してカーネルをコンパイルするオフラインコンパイラーです カーネルを OpenCL ランタイムにロードするにはclCreateProgramWithBinary関数をホストアプリケーションに含めます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

97

注意 ホストシステムが複数のプロセッサーで構成されている場合FPGA には一度に 1 つのプロセッサーしかアクセスできません例えば2 つのプロセッサーに対応する 2 つのホストアプリケーションが同じFPGA にカーネルを同時に起動しようとしているとします2 番目のホストアプリケーションはデバイスがビジーであることを示すエラーメッセージを受け取ります2 番目のホストアプリケーションは1番目のホストアプリケーションが OpenCL のコンテキストを解放するまで実行できません

1 オフラインコンパイラーで OpenCL カーネルをコンパイルしaocxファイルを作成します

2 ホストアプリケーションに clCreateProgramWithBinary関数を含めaocxファイルから cl_program OpenCL プログラムオブジェクトを作成します

3 ホストアプリケーションに clBuildProgram関数を含め指定したデバイスで実行可能なプログラムファイルを作成します

以下はclCreateProgramWithBinaryを使用し FPGA デバイスをプログラムするホストコード例です

size_t lengths[1]unsigned char binaries[1] =NULLcl_int status[1]cl_int errorcl_program programconst char options[] =

FILE fp = fopen(programaocxrb)fseek(fp0SEEK_END)lengths[0] = ftell(fp)binaries[0] = (unsigned char)malloc(sizeof(unsigned char)lengths[0])rewind(fp)fread(binaries[0]lengths[0]1fp)fclose(fp)

program = clCreateProgramWithBinary(context 1 device_list lengths (const unsigned char )binaries status amperror)clBuildProgram(program1device_listoptionsNULLNULL)

clBuildProgram関数が正常に実行されるとCL_SUCCESSが返されます

4 clCreateKernelsInProgramまたは clCreateKernel関数を使用しプログラム実行可能ファイルからカーネルオブジェクトを作成します

5 カーネルを実行するための関数を含めスケジュールされたカーネルを FPGA で実行するようホストランタイムに指示します

mdash NDRange カーネルを実行するためのコマンドをエンキューするにはclEnqueueNDRangeKernelを使用します

mdash 単一ワークアイテムのカーネルをエンキューするにはclEnqueueTaskを使用します

注意

インテルでは使用されていないイベントオブジェクトを解放することを推奨していますSDK は明示的な指示があるまでイベントオブジェクトを解放せずに保持し続けます使用していないイベントオブジェクトを保持し続けると不必要にメモリーが消費されます

イベントオブジェクトの解放にはclReleaseEvent関数を呼び出します

複数の FPGA のプログラムをメモリーにロードすることができますホストはそれらを使用し必要に応じて FPGA を再プログラムします

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

98

OpenCL ホストランタイムの API 呼び出しに関してはOpenCL Specification version 10 を参照ください

関連情報OpenCL Specification version 10

6641 複数の FPGA デバイスのプログラミング

システムに複数の FPGA デバイスをインストールする場合ホストコードを変更し特定の FPGA デバイスをプログラムするようホストランタイムに指示できます

重要 ホストアプリケーションを FCD にリンクすると異なるカスタムプラットフォームから複数の FPGA デバイスをターゲットにすることができますただし161 よりも前のバージョンの SDK と互換性のあるカスタムプラットフォームにおいてはこの機能に対するサポートが制限されています

次のように 大 128 の FPGA デバイスをシステムに提示できます

bull それぞれが単一の FPGA で構成されている複数の FPGA アクセラレーターボード

bull PCIe スイッチを介しホストシステムに接続する単一アクセラレーターボード上の複数の FPGA

bull 上記の組み合わせ

ホストランタイムはそれぞれの FPGA デバイスすべてにカーネルをロードすることができますまたFPGA デバイスは並列に動作できます

関連情報カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

66411 OpenCL FPGA デバイスの診断

ホストはシステムにインストールされている OpenCL FPGA のデバイス数を特定する必要があります

1 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出します

2 ホストアプリケーションに次のコード行を追加しホストに Open CL FPGA のデバイス数を特定させます

Get the platformciErrNum = clGetPlatformID(ampcpPlatform)

Get the devicesciErrNum = clGetDeviceIDs(cpPlatform CL_DEVICE_TYPE_ALL 0 NULL ampciDeviceCount)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) が含まれます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

99

関連情報FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

66412 デバイス情報の照会

OpenCL FPGA デバイスの情報を照会するようホストに指示することができます

bull システムにインストールされている OpenCL FPGA デバイスのリストを出力するようホストに指示するには次のコード行をホストアプリケーションに追加します

char buf[1024]for (unsigned i = 0 i lt ciDeviceCount i++) clGetDeviceInfo(cdDevices[i] CL_DEVICE_NAME 1023 buf 0) printf(Device d sn i buf)

デバイス情報を照会するとホストは次のように FPGA デバイスの一覧を表示します Device ltNgtltboard_namegt ltname_of_FPGA_boardgt

以下が詳細になります

bull ltNgt はデバイスの番号です

bull ltboard_namegt はaocコマンドを呼び出す際に FPGA デバイスをターゲットにするボードの指定です

bull ltname_of_FPGA_boardgt はFPGA ボードに公示されている名前です

例えばシステムに同一の FPGA ボードが 2 つある場合ホストは次のような出力を生成します

Device 0 board_1 Stratix V FPGA BoardDevice 1 board_1 Stratix V FPGA Board

注意 clGetDeviceInfo関数は aoc -list-boards コマンドの呼び出し時にインテルFPGA SDK for OpenCL オフラインコンパイラーが画面上に表示するボードタイプを返します(board_1など)アクセラレーターボードに FPGA が複数含まれている場合各デバイスは「ボード」として扱われ一意の名前が付けられます

関連情報利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

66413 複数の 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 Stringunsigned char load_file(const char filename size_t size_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

100

FILE fp = fopen(aocx_namerb) fseek(fp0SEEK_END) size_t len = ftell(fp) char result = (unsigned char)malloc(sizeof(unsigned char)len) rewind(fp) fread(resultlen1fp) fclose(fp) size_ret = len return result

Create a Program that is compiled for the devices in the device_listcl_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 devicesn aocx_name num_devices) const unsigned char binaries = (const unsigned char)malloc(num_devicessizeof(unsigned char)) size_t lengths=(size_t)malloc(num_devicessizeof(size_t)) cl_int err for(cl_uint i=0 iltnum_devices i++) binaries[i] = load_file(aocx_nameamplengths[i]) if (binaries[i]) printf(couldnt load sn aocx_name) exit(-1)

cl_program p = clCreateProgramWithBinary(context num_devices device_list lengths binaries NULL amperr) free(lengths) free(binaries) if (err = CL_SUCCESS) printf(Program Create Errorn) return p

main program

main () Normal OpenCL setup program = createMultiDeviceProgram(context device_list num_devices programaocx)clBuildProgram(programnum_devicesdevice_listoptionsNULLNULL)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

101

665 ランタイム環境の終了とエラー回復

ホストアプリケーションが予期せず終了した場合ランタイム環境を再起動しFPGA を再プログラムする必要があります

ランタイム環境はホストアプリケーションの一部としてコンパイルされるライブラリーですホストアプリケーションが終了するとランタイム環境もまた実行する追跡アクティビティーとともに終了しますホストアプリケーションを再起動すると新しいランタイム環境および関連する追跡アクティビティーが再度初期化されます初期化関数はカーネルのハードウェア状態をリセットします

同様にホストアプリケーションが予期せず終了した場合特定のハードウェア (PCIe ハード IP など)のコンフィグレーションが不完全に終わりますこれらのハードウェアのコンフィグレーションを復元するためにホストは FPGA を再プログラムする必要があります

カスタマイズされたハードウェアブロックを実装するカスタムプラットフォームを使用している場合ホストアプリケーションを再起動しそれらのブロックをリセットすることでデザインに影響を与える可能性があることに注意してください

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すと利用可能なすべてのデバイスに対してカーネルとチャネルはすべてリセットされます

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すとデバイスのリセット時にFIFO バッファーとチャネルがリセットされます

bull ホストアプリケーションはclCreateBufferおよび clEnqueueWriteBuffer関数呼び出しを介しメモリーバッファーを初期化します新しいホスト実行において前回のホスト実行時のバッファーの内容へはアクセスすることができません

67 SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て

インテルでは インテル SoC で動作する OpenCL カーネルはFPGA DDR メモリーではなく共有メモリーにアクセスすることを推奨していますFPGA DDR メモリーには非常に高い帯域幅でカーネルがアクセス可能ですただしARM CPU から FPGA DDR メモリーへの読み出しおよび書き込み動作はダイレクトメモリーアクセス (DMA) を使用していないため非常に低速ですFPGA DDR メモリーはテスト目的でカーネル間または単一のカーネル内で一時データを渡すためだけに予約ください

注意 bull カーネル間の共有バッファーは揮発性としてマークしあるカーネルによるバッファーの変更が他のカーネルも認識できるようにしてください

bull 共有メモリーにアクセスするにはホストコードの変更のみが必要ですカーネルコードの変更は必要ありません

bull ライブラリー関数 mallocまたは new演算子で物理的に共有されたメモリーを割り当てることはできませんまたCL_MEM_USE_HOST_PTRフラグは共有メモリーでは機能しません

DDR メモリーでは共有メモリーは物理的に連続している必要がありますFPGA はSG-DMA コントローラーコアなしでは実質的に連続したメモリーを消費することができませんmalloc関数および new演算子は実質的に連続したメモリーへアクセスするためのものです

bull 共有メモリーの CPU キャッシュは無効になっています

bull 共有メモリーを使用する際はデータのコピー 1 つがホストとカーネルの両方で使用されますこのメモリーを使用するとOpenCL メモリーの呼び出しはバッファー読み取りバッファー書き込みマッピングおよびアンマッピングに対しゼロコピー転送で実行されます

ARM CPU と FPGA は共有メモリーに同時にアクセスできますclEnqueueReadBufferおよびclEnqueueWriteBuffer呼び出しをホストコードに含めFPGA または CPU にデータを認識させる必要はありません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

102

bull 共有メモリーの割り当てとアクセスには次の例のようなホストコードを構築します

cl_mem src = clCreateBuffer(hellip CL_MEM_ALLOC_HOST_PTR size hellip)int src_ptr = (int)clEnqueueMapBuffer (hellip src size hellip)src_ptr = input_value host writes to ptr directlyclSetKernelArg (hellip src)clEnqueueNDRangeKernel(hellip)clFinish()printf (ldquoResult = dnrdquo dst_ptr) result is available immediatelyclEnqueueUnmapMemObject(hellip src src_ptr hellip)clReleaseMemObject(src) actually frees physical memory

CONFIG_CMA_SIZE_MBYTESカーネルコンフィグレーションオプションを含め割り当てに有効な共有メモリーの 大総量を制御することができます実際には割り当てられた共有メモリーの総量はCONFIG_CMA_SIZE_MBYTESの値よりも小さくなります

重要

1 ターゲットボードに複数の DDR メモリーバンクがある場合clCreateBuffer( CL_MEM_READ_WRITE )関数はメモリーを非共有 DDR メモリーバンクに割り当てますただしFPGA が共有メモリーである単一DDR バンクへアクセスできる場合clCreateBuffer(CL_MEM_READ_WRITE ) はCL_MEM_ALLOC_HOST_PTRフラグを使用するのと同様にメモリーを共有メモリーに割り当てます

2 clCreateBuffer( CL_MEM_ALLOC_HOST_PTR size )関数で要求する共有メモリーはLinux OpenCL カーネルドライバーに割り当てられLinuxカーネルの連続したメモリー割り当て (CMA) 機能に依存しますCMA を有効にしコンフィグレーションする方法に関してはIntel FPGA SDK for OpenCL Intel Arria 10SoC Development Kit Reference Platform Porting Guideの Recompiling theLinux Kernel for the Intel Arria 10 SoC Development Kit および Compilingand Installing the OpenCL Linux Kernel Driverの章を参照ください

bull 共有ハードプロセッサーシステム (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 に共有メモリーとして割り当てます

bull ホストがコンスタントメモリーを共有 HPS DDR システムに割り当てカーネル実行後にそれを変更すると変更が有効にならない可能性がありますその結果続くカーネル実行に古いデータが使用される可能性がありますカーネルの実行に古いコンスタントメモリーが使用されないようにするため次のいずれかを実行してください

a コンスタントメモリーの初期化後はそれを変更しない

b 複数の__constantデータセットが必要な場合複数のコンスタントメモリーバッファーを作成する

c 可能であればアクセラレーターボードの FPGA DDR にコンスタントメモリーを割り当てる

関連情報bull Recompiling the Linux Kernel for the Intel Arria 10 SoC Development Kit

bull Compiling and Installing the OpenCL Linux Kernel Driver

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

103

68 徐々に速度低下する OpenCL システムのデバッグ

ホストアプリケーションのループがイベントを解放しないまま作成を続けるとOpenCL システムが実行中に徐々に遅くなることがありますこの速度低下を緩和するにはホストアプリケーションがスケジューリングや時間のプロファイリングに不要になった cl_eventオブジェクトを解放する必要があります

OpenCL システムに多数の不要なイベントが存在するために速度低下が発生しているかどうかを確認するにはコンテキストのコールバック警告またはエラーを出力するコンテキストコールバック関数を次のコード例に示すように定義します

void oclContextCallback (const char errinfo const void size_t void ) printf (Context callback sn errinfo)int main() hellip Create the context context = clCreateContext (NULL num_devices device ampoclContextCallback NULL ampstatus) hellip

システムで発生しているイベント数がイベントオブジェクトのしきい値制限である 1000 を超えるとコールバック関数は次の警告メッセージを出力します

[Runtime Warning] Too many event objects in the host This causes deterioration in runtime performance

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

104

7 OpenCL カーネルのコンパイル

インテル FPGA SDK for OpenCL はカーネルのコンパイルプロセスのカスタマイズを可能にするコンパイラーのオプション一覧を提供します インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドはaocコマンドコンパイラーのオプションと設定カーネルファイル名から構成されますaocコマンドを呼び出し特定の FPGA ボードをターゲットにしたりレポートを生成したり 適化に向けた手法を実装したりするようコンパイラーに指示することができます

OpenCL カーネルをコンパイルする前に QUARTUS_ROOTDIR_OVERRIDE 環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアを指定していることを確認してください

この環境変数の設定が正しくない場合 インテル FPGA SDK for OpenCL スタートガイド の インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章に記載されている手順に基づき設定を変更してください

CompilingEncryptedSource

aocコマンドでは提供されている暗号化されたclファイルをコンパイルする際にその暗号化されたファイルのみをコンパイルすることが可能です暗号化された複数のclファイルを aocコマンドで同時にコンパイルすることはできませんご自身で暗号化したカーネルソースファイルをコンパイルすることはできません

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル

OpenCL カーネルのコンパイルおよびハードウェアのコンフィグレーションファイル (aocxファイル) の作成は1 ステップで行うことができます

インテルでは次のような状況においてこの 1 ステップコンパイル手法を使用することを推奨しています

bull インテル FPGA SDK for OpenCL デザインフローでカーネルを 適化しFPGA に展開するaocxファイルの作成準備が整っている場合

bull 適化を必要としない単純なカーネルが 1 つ以上ある場合

カーネルのコンパイルおよびaocxファイルの生成を 1 ステップで行うには aocltyour_kernel_filename1gtcl [ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

インテル FPGA SDK for OpenCL オフラインコンパイラーはclファイルを一時ファイルにグループ化しますその後このファイルを使用しaocxファイルを生成します

注意 aocコマンドを実行しaocoファイル ( aoc ltyour_kernel_filenamegtaoco) をコンパイルする場合オフラインコンパイラーはaocrファイルとaocxファイルをどちらも生成します

72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネルのコンパイルおよび OpenCL パーサーの出力の生成を行うには-cオプションを aocコマンドに含めます

注意 -cフラグはインクリメンタルコンパイルフローではサポートされていません

bull コマンドプロンプトで aoc -c ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

aocコマンドを-cフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを生成します

mdash 各clカーネルソースファイルのaocoファイルオフラインコンパイラーはaocoファイルを数秒から数分で作成します

73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネル (cl) をコンパイルし各カーネルに向けたaocoオブジェクトファイルを生成後それらをリンクしaocrファイルを作成するには-rtlオプションをaocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

106

bull 1 つもしくは複数のカーネルソースファイルをコンパイルするにはコマンドプロンプトで aoc-rtl ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtclに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを作成します

mdash 各clカーネルソースファイルのaocoファイルその後オフラインコンパイラーはそれらをリンクしaocrファイルを生成しますaocoファイルまたはaocrファイルの生成は数秒から数分で行われます

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

bull 1 つ以上のaocoオブジェクトファイルをコンパイルするには aoc -rtlltyour_kernel_filenamegtaoco [ltyour_kernel_filename2gtaoco ]コマンドをコマンドプロンプトで呼び出します

この [ ltyour_kernel_filename2gtaoco ] はオブジェクトファイルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtaocoに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーは次のファイルとディレクトリーを作成します

mdash オフラインコンパイラーはすべてのaocoファイルをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)

インテル FPGA SDK for OpenCL オフラインコンパイラーがカーネルのコンパイル中にヘッダーファイルを検索するディレクトリーリストにディレクトリーを追加するには -I=ltdirectorygt オプションを aocコマンドに含めます

ヘッダーファイルがカーネルと同じディレクトリーにある場合は -I=ltdirectorygt オプションをaocコマンドに含める必要はありませんオフラインコンパイラーは現在のフォルダーまたはディレクトリーでヘッダーファイルを自動的に検索します

bull コマンドプロンプトで aoc -I=ltdirectorygt ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

107

注意 Windows システムの場合インクルードパスの末尾にスラッシュが含まれていないことを確認してくださいオフラインコンパイラーは末尾のスラッシュ () またはバックスラッシュ () を不正と認識します

次のような方法で aocコマンドを呼び出すとオフラインコンパイラーはエラーメッセージを生成します

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

インクルードパスの正しい指定方法は以下のようになります

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

75 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)

aocrファイル名またはaocxファイル名を指定するには -o ltfilenamegt オプションをaocコマンドに含めます

bull 複数ステップでのコンパイルフローを実行する場合は出力ファイル名を次のように指定します

a 中間コンパイルの段階でオフラインコンパイラーが作成するaocoファイルの名前を指定するには aoc -rtl -o ltyour_object_filenamegtaocr ltyourkernel_filenamegtclコマンドを呼び出します

b 終コンパイルの段階でオフラインコンパイラーが作成するaocxファイルの名前を指定するには aoc -o ltyour_executable_filenamegtaocxltyour_object_filenamegtaocrコマンドを呼び出します

bull 1 ステップでのコンパイルフローを実行する場合は aoc -oltyour_executable_filenamegtaocx ltyour_kernel_filenamegtclコマンドを呼び出しaocxファイル名を指定します

76 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)

特定の FPGA ボードに対し OpenCL カーネルをコンパイルするには -board=ltboard_namegtオプションを aocコマンドに含めます

警告 -rtlフラグをともなう中間コンパイル中にkernel1clファイルをボード X (-board=X) にkernel2clファイルをボード Y (-board=Y) にコンパイルすると インテル FPGA SDK forOpenCL オフラインコンパイラーは aoc -rtl kernel1aoco kernel2aocoコマンドを実行した際にエラーメッセージを発行し終了します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

108

-board=ltboard_namegt オプションを aocコマンドに含めてカーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはプリプロセッサーマクロAOCL_BOARD_ltboard_namegt を 1 に定義しますこれによりデバイスに 適化されたコードをカーネルにコンパイルすることができます

bull カスタムプラットフォームで利用可能な FPGA ボードの名前を取得するには aoc -list-boards コマンドを呼び出します

オフラインコンパイラーは以下のような出力を生成します

Board ListFPGA_board_1

この FPGA_board_1はltboard_namegt です

特定のカスタムプラットフォームの利用可能な FPGA ボードをすべて一覧表示することも可能です-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc ndashboard-package=ltcustom_platform_pathgt -list-boards=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーは特定のカスタムプラットフォームで利用可能なボードの一覧を表示します

bull OpenCL カーネルを FPGA_board_1 にコンパイルするには aoc-board=FPGA_board_1 ltyour_kernel_filenamegtclコマンドを呼び出しますオフラインコンパイラーはプリプロセッサーマクロ AOCL_BOARD_FPGA_board_1を 1 に定義しFPGA_board_1 をターゲットとするカーネルコードをコンパイルします

bull 複数のカスタムプラットフォーム (ボードパッケージ) がインストールされている場合特定のカスタムプラットフォームのボードバリアントでカーネルをコンパイルできます-board-package=ltcustom_platform_pathgt オプションを -board=ltboard_namegt とともに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -board=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーはltcustom_platform_pathgt で指定されているボードでカーネルをコンパイルします

bull システムで利用可能なカスタムプラットフォームのリストを表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します インテル FPGA SDK for OpenCL オフラインコンパイラーは次の例のような出力を生成します

Installed board packagesltboard_package_1gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_2gt

この ltboard_package_Ngt はシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

109

ヒント 特定の FPGA ボードをターゲットとするコンパイル済みのカーネルファイルを容易に識別するためインテルでは-oオプションを aocコマンドに含めカーネルバイナリーの名前を変更することを推奨しています

bull 1 ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次のコマンドを呼び出します

aoc -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 複数ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次の作業を実行します

1 以下のコマンドを呼び出しaocoファイルを生成します

aoc -rtl -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltmy_object_filenamegt_FPGA_board_1aocr

2 以下のコマンドを呼び出しaocxファイルを生成します

aoc -board=FPGA_board_1 ltyour_object_filenamegt_FPGA_board_1aocr -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 2 つの FPGA で構成されるアクセラレーターボードの場合各 FPGA デバイスには同等の「ボード」名が付けられます (例えば board_fpga_1board_fpga_2 など)kernel_1clのターゲットを board_fpga_1kernel_2clのターゲットを board_fpga_2 にするには次のコマンドを呼び出します

aoc -board=board_fpga1 kernel_1claoc -board=board_fpga2 kernel_2cl

関連情報インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-oltfilenamegt) (108 ページ)

77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)

デザインがフィッティング制約を満たしていないためにOpenCL カーネルのコンパイルがハードウェアの生成段階で失敗することがありますこの場合aocコマンドの -high-effortオプションを使用しカーネルを再コンパイルしてください

フィッティング制約の問題によってカーネルのコンパイルが失敗すると インテル FPGA SDK forOpenCL オフラインコンパイラーは次のエラーメッセージを表示します

Error Kernel fit error recommend using -high-effortError Cannot fit kernel(s) on device

bull この問題を解決するには次のコマンドを実行しカーネルを再コンパイルします

aoc -high-effort ltyour_kernel_filenamegtcl

コマンドを呼び出すとオフラインコンパイラーは次のメッセージを表示します

High-effort hardware generation selected compile time may increase significantly

オフラインコンパイラーはカーネルの再コンパイルとハードウェアの生成を 3 回試みます-high-effortを試みた後もコンパイルが失敗する場合はカーネルを変更してください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

110

78 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt)

fmax ターゲットのスケジュールはスケジューリングプロセス中にスケジューラーが試みるパイプライン化の努力目標を決定します

次のオプションの一方または両方を使用しカーネル固有の fmax ターゲットを指定できます

bull __attribute__((scheduler_target_fmax_mhz(__x))) ソースレベル属性を使用する

bull aocコマンドの-fmax=ltfmax target in Mhzgt ですべてのカーネルをグローバルにコンパイルするようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示する

コマンドラインオプションとソースレベル属性をどちらも使用する場合カーネル属性が優先されます次のコードを例にします

kernel void k1() __attribute__((scheduler_target_fmax_mhz(200))) kernel void k2()

オフラインコンパイラーに aocコマンドの-fmax=300をコンパイルするよう指示するとコンパイラーはカーネル k1を 300 MHzカーネル k2を 200 MHz でスケジュールします

重要 スケジュールされたターゲット fmax はコンパイル中のパイプライン化の努力目標を決定します インテル Quartus Prime 開発ソフトウェアプロエディションコンパイラーを実行し実際の fmax の値を取得してください

79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーはマクロの定義を渡し条件付きでのコードのコンパイルを可能にするプリプロセッサーマクロをサポートします

bull プリプロセッサーマクロの定義をオフラインコンパイラーに渡すには aoc -Dltmacro_namegt ltkernel_filenamegtclコマンドを呼び出します

bull 定義済みのプリプロセッサーマクロの既存値を上書きするには aoc -Dltmacro_namegt=ltvaluegt ltkernel_filenamegtclコマンドを呼び出します

次のカーネル sumのコードを例にします

ifndef UNROLL_FACTOR define UNROLL_FACTOR 1endif

__kernel void sum (__global const int restrict x __global int restrict sum) int accum = 0

pragma unroll UNROLL_FACTOR for(size_t i = 0 i lt 4 i++) accum += x[i + get_global_id(0) 4]

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

111

sum[get_global_id(0)] = accum

UNROLL_FACTORの 1 を 4 に上書きし設定するには aoc -DUNROLL_FACTOR=4sumclコマンドを呼び出しますこのコマンドを呼び出すことはsumカーネルソースコードのdefine UNROLL_FACTOR 1の行をdefine UNROLL_FACTOR 4に置き換えることと同等です

bull プリプロセッサーマクロを使用しカーネルのソースコードを変更することなくオフラインコンパイラーによるカーネルの 適化を制御するには aoc -olthardware_filenamegtaocx -D ltmacro_namegt=ltvaluegtltkernel_filenamegtclを呼び出します

以下に詳細を説明します

-oはオフラインコンパイラーが生成するaocxファイル名を指定するために使用するオフラインコンパイラーのオプションです

lthardware_filenamegt は指定したプリプロセッサーマクロの値を使用しオフラインコンパイラーが生成するaocxファイルの名前です

ヒント

コンパイル結果をどちらもファイルシステムに保存するにはaocコマンドの-oフラグを使用しカーネルを個別のバイナリーとしてコンパイルします

例えば同じカーネルを必要なワークグループサイズの 64 および 128 で複数回コンパイルする場合次のように WORK_GROUP_SIZEプリプロセッサーマクロをカーネル属性reqd_work_group_sizeに定義できます

__attribute__((reqd_work_group_size(WORK_GROUP_SIZE11)))__kernel void myKernel()for (size_t i = 0 i lt 1024 i++) statements

次のコマンドを入力しカーネルを複数回コンパイルします

aoc ndasho myKernel_64aocx ndashDWORK_GROUP_SIZE=64 myKernelcl

aoc ndasho myKernel_128aocx ndashDWORK_GROUP_SIZE=128 myKernelcl

710 コンパイル進捗レポートの生成 (-v)

インテル FPGA SDK for OpenCL オフラインコンパイラーにコンパイルの進捗を報告させるには-vオプションを aocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

112

bull フルコンパイルの進捗をオフラインコンパイラーに報告させるには aoc -vltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc Setting up project for CvP revision flowaoc Hardware generation completed successfully

bull ハードウェアを構築しない中間コンパイルの進捗をオフラインコンパイラーに報告させるにはaoc -rtl -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc To compile this project run aoc ltyour_kernel_filenamegtaoco

bull エミュレーションに向けたコンパイルの進捗を報告するようオフラインコンパイラーに指示するには aoc -march=emulator -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parserexaoc OpenCL parser completed successfullyaoc Compiling for Emulation aoc Emulator Compilation completed successfullyEmulator flow is successful

関連情報bull ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-

rtl) (106 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

711 リソース推定使用率要約の画面表示 (-report)

デフォルトにおいてインテル FPGA SDK for OpenCL オフラインコンパイラーはハードウェアのリソース使用率をコンパイル中に見積もりますオフラインコンパイラーはPCIeメモリーコントローラーDMA エンジンなどの外部インターフェイスの使用率も計算に含めますカーネルのコンパイル中にオフラインコンパイラーは推定されるリソース使用率の要約を ltyour_kernel_filenamegtディレクトリーの ltyour_kernel_filenamegtlogファイルに生成します 推定されるリソース使用率の要約を画面上で確認するには-reportオプションを aocコマンドに含めてください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

113

推定リソース使用率の要約はフルコンパイルを実行しなくても確認することができますハードウェアのコンフィグレーションファイルを生成する前に画面上で使用率の要約を確認するには-rtlオプションを aocコマンドに含めてください

bull コマンドプロンプトで aoc -rtl ltyour_kernel_filenamegtcl -report コマンドを呼び出しますオフラインコンパイラーは次のような出力を生成します

+--------------------------------------------------------------------+ Estimated Resource Usage Summary +----------------------------------------+---------------------------+ Resource + Usage +----------------------------------------+---------------------------+ Logic utilization 35 ALUTs 22 Dedicated logic registers 15 Memory blocks 29 DSP blocks 0 +----------------------------------------+---------------------------

関連情報ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)(106 ページ)

712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)

すべての警告メッセージを抑制するには-Wオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -W ltyour_kernel_filenamegtclコマンドを呼び出します

713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)

警告メッセージをすべてエラーメッセージに変換するには-Werrorオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -Werror ltyour_kernel_filenamegtclコマンドを呼び出します

714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0)

clまたはaocoファイルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはデフォルトでソース情報をコンパイラーレポートに含めソースコードをaocxバイナリーに組み込みます -g0オプションを aocコマンドに含めソース情報をコンパイラーレポートから削除しソースコードとカスタマー IP 情報をaocxファイルから削除します

bull レポートのソース情報とaocxファイルのソースコードおよびカスタマー IP の情報を削除するには aoc -g0 ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

114

715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーでは異なるメモリータイプにわたりグローバルメモリーをバーストインターリーブすることはできません -no-interleaving=ltglobal_memory_typegt オプションを aocコマンドに含め同じタイプのグローバルメモリーバンクすべてのバーストインターリーブを無効にしそれらを手動で管理することができますメモリーバッファーの手動分割はグローバルメモリーにデフォルトで設定されているバーストインターリーブ方式でのコンフィグレーションを上書きします

注意 -no-interleaving オプションはグローバルメモリータイプのパラメーターを必要としますメモリータイプが指定されていない場合オフラインコンパイラーはエラーメッセージを発行します

bull デフォルトのグローバルメモリーのバーストインターリーブを無効にするようオフラインコンパイラーに指示するにはaoc ltyour_kernel_filenamegtcl -no-interleaving=default コマンドを呼び出します

アクセラレーターボードには複数のグローバルメモリータイプが含まれる場合がありますデフォルトのグローバルメモリータイプを特定するにはご利用のカスタムプラットフォームのボードメーカーより提供されている資料を確認ください

bull 異種メモリーのシステムにおいて特定のグローバルメモリータイプのバーストインターリーブを無効にするようオフラインコンパイラーに指示するには次の作業を実行します

a カスタムプラットフォームの Board_specxmlファイルで利用可能なグローバルメモリータイプ名を確認します (DDRクアッドデータレート (QDR) など)

b 例えばDDR のメモリータイプのバーストインターリーブを無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDRコマンドを呼び出しますオフラインコンパイラーはDDR メモリーバンクの手動分割を有効にし他のメモリーバンクをバーストインターリーブ方式でコンフィグレーションします

c 複数のタイプのグローバルメモリーバッファーのバーストインターリーブを無効にするには-no-interleaving=ltglobal_memory_typegt オプションを各グローバルメモリータイプに含めます

例えばDDR と QDR のバーストインターリーブをどちらとも無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDR -no-interleaving=QDRコマンドを呼び出します

注意 バッファーを複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

716 グローバルメモリーのリング型相互接続の強制 (-global-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーはデザインのさまざまな特性を考慮しグローバルメモリーの 適な相互接続トポロジーの選択を試みます

コンパイラーの選択を無効にしリング型トポロジーを強制するには -global-ring オプションを aocコマンドで使用しますこのオプションはツリー型トポロジーの使用によって fmax が制限されている場合などにカーネルの fmax を向上させることができます特に4 バンク以上のグローバルメモリーをともなうボードサポートパッケージをターゲットとするデザインの fmax にこのオプションは有効に働きます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

115

例 aoc -global-ring ltyour_kernel_filenamegtcl

717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製(-duplicate-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーが (自動選択または-global-ringでリングを強制し) グローバルメモリーの相互接続のためのリング型トポロジーを実行する際のグローバルメモリーへのカーネル書き込みスループットを向上させるには -duplicate-ring オプションを aocコマンドで使用します

このオプションは相互接続の幅を広げるためより多くの書き込みが並行して発生するようになりますしたがってより多くの領域を消費します

例 aoc -duplicate-ring ltyour_kernel_filenamegtcl

関連情報グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ)

718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)

-const-cache-bytes=ltNgt フラグを aocコマンドに含めインテル FPGA SDK forOpenCL オフラインコンパイラーにコンスタントメモリーキャッシュサイズをコンフィグレーションするよう指示します ( も近い 2 の乗数に切り上げられます)

デフォルトのコンスタントキャッシュサイズは 16 kB です

bull コンスタントメモリーキャッシュサイズのコンフィグレーションには aoc -const-cache-bytes=ltNgt ltyour_kernel_filenamegtclコマンドを呼び出しますこのltNgt はバイト単位のキャッシュサイズを表します

例えばOpenCL カーネル myKernelclのコンパイル時に 32 kB のキャッシュをコンフィグレーションするには aoc -const-cache-bytes=32768 myKernelclコマンドを呼び出します

注意 __constantアドレス空間をいずれのカーネルも使用していない場合この引数の効果はありません

719 浮動小数点演算処理順序の緩和 (-fp-relaxed)

-fp-relaxedオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーがバランスの取れたツリー構造のハードウェアを実装し浮動小数点演算の処理順序を緩和するようにします

バランスの取れたツリー構造の実装は結果における数値の変動性と引き換えにより効率的なハードウェアをもたらします

注意 この 適化のための制御を実装するには浮動小数点演算の結果における小さな変動を許容できるプログラムでなければなりません

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

116

bull オフラインコンパイラーに対しバランスの取れた木構造のハードウェア実装を実行するよう指示するには aoc -fp-relaxed ltyour_kernel_filenamegtclコマンドを呼び出します

720 浮動小数点演算における丸め処理の削減 (-fpc)

-fpcオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーに中間で行われる浮動小数点演算の丸め処理および変換を可能な限り削除し精度を維持するための追加ビットを持つよう指示します

この 適化に向けた制御を実装すると丸め処理のモードも変更されますこのモードでは一連の浮動小数点演算処理 (乗算加算減算) の 後でのみゼロに丸める処理が行われます

bull オフラインコンパイラーに丸め処理の回数を削減するよう指示するには aoc -fpcltyour_kernel_filenamegtclコマンドを呼び出します

721 OpenCL コンパイルの高速化 (-fast-compile)

コンパイル時間を 40から 90削減しカーネルのaocxファイルを短時間で作成するには-fast-compile インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

-fast-compileフィーチャーは 適化の作業を減らすことによりコンパイル時間を大幅に削減します

コマンドプロンプトで aoc -rtl ltyour_kernel_filename1gtcl-fast-compile コマンドを呼び出します

警告 -fast-compileフィーチャーを有効にすると次のようなパフォーマンス上の問題が発生する可能性があります

bull リソース使用率の増加

bull fmax の低下およびそれにより発生するアプリケーションパフォーマンスの低下

bull 電力効率の低下

インテルでは-fast-compileオプションを内部での開発目的にのみ使用することを推奨しています

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

117

注意 bull -fast-compileコンパイラーオプションは インテル Arria 10 以降のデバイスをターゲットにする OpenCL デザインをコンパイルする場合にのみ使用することができます

bull デザインの完成後 OpenCL カーネルを-fast-compileオプションを指定せずに複数のシードでコンパイルし 高のパフォーマンスを確立します

bull -fast-compileフィーチャーが有効になっているか否かにかかわらずOpenCL システムの初期コンパイルを新しいボードおよび新しいバージョンのインテル FPGA SDK for OpenCL プロエディションで行う場合45 分から 60 分の時間が追加で必要ですこの追加される時間では今後のコンパイルに備えコンパイルの一部をキャッシュしています (この動作はカーネルのパフォーマンスに影響しません)このキャッシュを作成するには環境変数$AOCL_TMP_DIR を共有できる書き込み可能なディレクトリーに定義しますデフォルトでこのキャッシュはLinux の場合vartmpaocl$USERにWindows の場合USERPROFILEAppDataLocalaoclに格納されますこの書き込み可能なディレクトリーは共有ネットワーク位置に設定することで共有できます

キャッシュを作成後は現在のバージョンのインテル FPGA SDK for OpenCL および現在のターゲットボードに対し再度キャッシュを作成する必要はありません

722 カーネルのインクリメンタルコンパイル (-incremental)

OpenCL デザインに加える変更をインクリメンタルにコンパイルするには-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

複数のカーネルを持つ大規模なシステムにおいて単一のカーネルのみ変更する場合 インテル FPGASDK for OpenCL オフラインコンパイラーでは前回のコンパイル結果を再利用し変更したカーネルのみを合成配置ルーティングすることができますこのインクリメンタルコンパイルフィーチャーはコンパイル時間の大幅な短縮につながります

注意 インクリメンタルコンパイルフィーチャーは内部での OpenCL デザインの開発目的に限り有効にしてください 高の回路パフォーマンスを確立するため 終デザインではフルコンパイルを実行してください

インクリメンタルコンパイルフロー例

aoc-incrementalltyour_kernel_filenamegtcl

Update kernels in your OpenCL design

aoc-incremental-fast-compileltyour_kernel_filenamegtcl

1 aoc -incremental ltyour_kernel_filenamegtclコマンドを呼び出しインクリメンタルモードが有効になっている状態で初期セットアップのコンパイルをクリーンなディレクトリーに行います

注意 セットアップをコンパイルする際は-incrementalフラグを必ず有効にしてください

このセットアップのコンパイルは以前のコンパイル結果を再利用しませんセットアップをコンパイルする際は-fast-compileオフラインコンパイラーコマンドオプションを aocコマンドに含めないでくださいこのオプションを含めると今後のインクリメンタルコンパイル時にエラーが発生する可能性が高くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

118

ヒント

インテルではコンパイルの時間が問題にならない場合は必ずセットアップのコンパイルを新しく実行し今後のインクリメンタルコンパイル時にコンパイルが失敗する可能性を低下させることを推奨しています連続して多くのインクリメンタルコンパイルを実行するとコンパイルが失敗する可能性が高くなりますまたハードウェアのパフォーマンスおよび生成されたaocxファイルの効率も低下します

2 ご自身の OpenCL デザインのカーネルを修正します

デザインには複数のclファイルを含めることが可能です

3 デザインのインクリメンタルコンパイルを実行します 適なコンパイル速度を得るために-fast-compileフラグも aocコマンドに含めます

aoc -incremental -fast-compile ltyour_kernel_filenamegtcl

4 reporthtmlファイルの Incremental compile セクションでオフラインコンパイラーが検出した変更を確認してください

reporthtmlファイルは ltyour_kernel_filenamegtreportsディレクトリーにあります

7221 インクリメンタルコンパイルレポート

-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションで OpenCL のデザインをコンパイルするとオフラインコンパイラーはIncremental compile セクションを ltyour_kernel_filenamegt プロジェクトディレクトリーの reporthtmlファイルに含めます

インクリメンタルコンパイルレポートはOpenCL のデザインに関する次のようなメトリクスを提供します

bull レポートの下部にある ltgt of design not preservedメトリクスはデザインの全体的な変更の簡単な概要を示しますこれはコンパイル時間を予測する も良い判断材料です

注意

インクリメンタルコンパイルレポートに表示される FPGA リソースは インテル FPGASDK for OpenCL オフラインコンパイラーが作成する推定エリアモデルに基づき計算されますエリアの数字は標準コンパイル (インクリメンタルではないコンパイル) 時の推定エリア使用量を表しますこの数字をもとに標準コンパイル時にデザインが消費するエリアを見積もることが可能です

FPGA のリソース情報は インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアコンパイルレポートの 終的なエリアと完全に一致しない場合があります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

119

図 -14 セットアップコンパイル時のインクリメンタルコンパイルレポート

図 -15 インクリメンタルコンパイル時のコンパイルレポート

7222 インクリメンタルコンパイルのその他のコマンドオプション

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーに含まれているオプションの機能を有効にしOpenCL デザインのコンパイルをカスタマイズすることができます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

120

複数のカーネルのパーティションへのグループ化 (-incremental-grouping=ltfilenamegt)

デフォルトにおいて インテル FPGA SDK for OpenCL オフラインコンパイラーはインクリメンタルコンパイル時にデザイン内の各カーネルを個別のパーティションに配置します -incremental-grouping=ltpartition_filenamegt コマンドオプションを aocコマンドに含め複数のカーネルを単一のパーティションにまとめることができます通常デザインに含まれるパーティションが少ないほどコンパイル速度は早くなります

例 aoc -incremental-grouping=ltpartition_filenamegtltyour_kernel_filenamegtcl

注意 1 つのカーネルのみを変更した場合でもオフラインコンパイラーはグループ内のすべてのカーネルを再コンパイルしますインテルでは通常同時に変更するカーネルをグループ化することを推奨しています

グループ化されたカーネルが多数のロードおよびストア動作を実行する場合-incremental=aggressiveオプションも aocコマンドに含めコンパイルスピードをさらに加速させることが可能です

-Incremental-groupingオプションに渡すパーティションファイルはプレーンテキストファイルですファイル内の各行は新しいパーティションを指定しておりカーネル名をセミコロン () で区切ったリストを含んでいます例えばパーティションファイルの以下の行は3 つのパーティションを指定しそれぞれに 4 つのカーネルを含んでいます

reader0reader1reader2reader3accum0accum1accum2accum3writer0writer1writer2writer3

アグレッシブモードによるデザインのコンパイル (-incremental=aggressive)

エリア使用量とスループットを引き換えにインクリメンタルコンパイルを加速するには -incremental=aggressiveコマンドオプションを aocコマンドに含めます

このフィーチャーはデザイン内のカーネルが多数のバッファーに対してロードおよびストア動作を行う場合や-incremental-groupingコマンドオプションで複数のカーネルをグループ化した場合に特に有効です

例 aoc -incremental=aggressive -incremental-grouping=ltpartition_filenamegt ltyour_kernel_filenamegtcl

注意 bull アグレッシブモードを有効にするとFmax の低下が示すよりも大きいスループットの低下が生じる可能性があります

bull 各 OpenCL デザインのインクリメンタルコンパイルを行っている間はコンパイルモードを変更しないでくださいデザインをアグレッシブモードでコンパイルする場合そのデザインに対して続けて実行するインクリメンタルコンパイルではすべてアグレッシブモードを有効にしますインクリメンタルコンパイルのモードを切り替えるたびにコンパイルが完了するまでの時間が長くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

121

カスタム入力ディレクトリーの指定 (-incremental-input-dir=ltpath_to_directorygt)

オフラインコンパイラーはインクリメンタルコンパイル中にデフォルトのltyour_kernel_filenamegt プロジェクトディレクトリーを現在の作業ディレクトリーに作成し中間コンパイルファイルを保存しますインクリメンタルコンパイルをデフォルトのプロジェクトディレクトリー以外に配置するには -incremental-input-dir=ltpath_to_directorygtコマンドオプションを aocコマンドに含めます

次のいずれかまたは両方のシナリオでデザインをコンパイルする場合-incremental-input-dirオプションを含める必要があります

bull aocコマンドを前回のコンパイルとは違う作業ディレクトリーから実行する場合

bull -o ltfilenamegt コマンドオプションを前回のコンパイルに含めた場合

mykernelclファイルが初期の作業ディレクトリーにあり同じ mykernelclファイルの別のリビジョンが new_revサブディレクトリーにある以下のシナリオを例にします

aoc -incremental mykernelclcd new_revaoc -incremental -fast-compile mykernelcl -incremental-input-dir=mykernel

このシナリオにおいてオフラインコンパイラーはmykernelプロジェクトディレクトリーにある初期コンパイル時のファイルを再利用しそれをもとに 2 回目のコンパイルを行いますオフラインコンパイラーは元の mykernelディレクトリー内のファイルを変更することなくnew_revmykernelプロジェクトディレクトリーを 2 回目のコンパイルに作成します

-incremental-input-dirコマンドオプションは複数のデベロッパーが同じインクリメンタルセットアップコンパイルを共有する場合に有効です各デベロッパーはその後のインクリメンタルコンパイルを他のデベロッパーのコンパイル結果を上書きすることなく自分の作業スペースで実行できます

自動再試行の無効化 (-incremental-flow=no-retry)

インクリメンタルコンパイルが失敗した場合デフォルトでオフラインコンパイラーはコンパイルの再試行を自動的に行いますその場合パーティションは保存されずに 2 回目のコンパイルが実行されますこの 2 回目のコンパイルはデザイン全体を再コンパイルするため完了までに時間がかかります

オフラインコンパイラーの自動再試行メカニズムを無効にするには-incremental-flow=no-retryコマンドオプションを aocコマンドに含めますこのフィーチャーを有効にすると 初の試みが失敗に終わった際にオフラインコンパイラーは 2 回目のインクリメンタルコンパイルを実行しませんまたオフラインコンパイラーはaocxファイルを生成しません

このフィーチャーを有効にすることにより次のような独自の失敗軽減ストラテジーを実行することが可能になります

bull 複数のシードを並行してコンパイルすることにより 低 1 つのコンパイルが再試行なしで成功する可能性を高める

bull インクリメンタル高速コンパイルに代わり非インクリメンタル高速コンパイル ( aoc -fast-compile ltyour_kernel_filenamegtcl) を実行する

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

122

7223 インクリメンタルコンパイルフィーチャーの制限

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーは インテル Arria10 FPGA をターゲットとする OpenCL デザインにのみ利用可能です

デバイスのサポートのほかにインクリメンタルコンパイルには次の制限があります

bull インクリメンタルコンパイルフィーチャー (-incremental) または高速コンパイルフィーチャー (-fast-compile)もしくはその両方を有効にするとエリアFmax電力の低下が発生します

bull 輻輳したデザインのインクリメンタルコンパイルでは初期セットアップのコンパイルと比較しFmax が大幅に低下することがあります (25以上)Fmax の低下を許容できない場合非インクリメンタル高速コンパイルを実行し一定のコンパイル時間の短縮を維持しながら Fmax の低下量を軽減します

bull オフラインコンパイラーは -l ltlibrary_namegtaoclibオフラインコンパイラーコマンドオプションを呼び出すことで行った RTL ライブラリーの変更を検出しませんRTL ライブラリーを変更した後はセットアップコンパイルを再度行う必要があります

オフラインコンパイラーはセットアップコンパイルを再度実行するよう警告メッセージを表示し注意喚起します

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)

注意 ECC (誤り訂正符号) は初期のインテル FPGA SDK for OpenCL のフィーチャーでプレビューの段階にあります訂正されたエラーおよび検出されたものの訂正されなかったエラーを報告するこのフィーチャーを 大限に活用するにはECC に対応するカスタムプラットフォームをボードメーカーより入手する必要があります

-eccオプションを aocコマンドに含み インテル FPGA SDK for OpenCL オフラインコンパイラーが誤り訂正符号をカーネルのメモリー (M20k および MLAB) で有効にするようにします

ECC の実装には各 32 ビットワードに対しシングルエラー訂正機能とダブルエラー検出機能があります

注意 ECC フィーチャーを有効にするとRAM と ALM の両方でエリアオーバーヘッドが発生しシステムのFmax が低下します

bull オフラインコンパイラーで誤り訂正符号のハードウェア実装を有効にするには aoc -eccltyour_kernel_filenamegtclコマンドを呼び出します

724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)

インテル FPGA SDK for OpenCL オフラインコンパイラーでOpenCL カーネルの呼び出しキューを削除しカーネルのエリア使用量を低減するには -no-hardware-kernel-invocation-queue オプションを aocコマンドに含めます

例 aoc -no-hardware-kernel-invocation-queueltyour_kernel_filenamegtcl

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

123

このオプションを使用することでカーネルの実行時間が長くなる場合がありますカーネルの呼び出しキューはOpenCL ランタイム環境においてカーネルの起動をアクセラレーターにキューすることを可能にしますそのためアクセラレーターはカーネルの呼び出し終了後すぐに同じカーネルの次の実行をスタートできます

注意 -No-hardware-kernel-invocation-queue オプションはカーネルの実行時間がカーネルの呼び出しキュー (20-100us) に隠れているシステムや OpenCL ランタイム環境のオーバーヘッドより長い場合または インテル FPGA SDK for OpenCL オフラインコンパイラーでカーネルのフィットが難しい場合にのみ使用します

カーネル呼び出しキューの使用方法に関してはIntel FPGA SDK for OpenCL Pro Edition BestPractices Guide のトピックUtilizing Hardware Kernel Invocation Queue を参照ください

関連情報Utilizing Hardware Kernel Invocation Queue

725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)

デザインの特定の領域で使用されているハンドシェイクプロトコルを変更するにはaocコマンドの-hyper-optimized-handshaking=ltauto|offgt オプションを使用します

-hyper-optimized-handshaking オプションには次のいずれかの値を設定できます

auto オプションを指定しないデフォルトの動作です可能な場合コンパイラーは 適化を有効にしますそうでない場合は offに設定されます

より高い fmax を要求する場合にこの値を使用しますこのオプションを有効にすると インテル FPGA SDK for OpenCL オフラインコンパイラーはストールを許容するノードのハンドシェイクパスにパイプラインレジスターを追加しますこれによりエリアとレイテンシーが増加する代わりに fmax が高くなります

例 aoc -hyper-optimized-handshakingltyour_kernel_filenamegtcl

off コンパイラーはfmax が低下する潜在的な可能性と引き換えに低レイテンシーに向けた 適化を試みますこのハンドシェイクの高度な 適化を無効にするとエリアの縮小につながる可能性もありますこれはfmax をあまり必要としない小規模なデザインにおいてレイテンシーとエリアを低減できるため効果的です

例 aoc -hyper-optimized-handshaking=offltyour_kernel_filenamegtcl

注意 -hyper-optimized-handshaking オプションは インテル Stratixreg 10 をターゲットにするデザインにのみ適用されます インテル Stratix 10 デバイス以外のターゲットデバイスにこのオプションを使用するとコンパイルが失敗しエラーが発生します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

124

8 OpenCL カーネルのエミュレーションとデバッグ

インテル FPGA SDK for OpenCL Emulator はカーネルの機能性を評価します

インテル FPGA SDK for OpenCL Emulator はx86-64 Windows または Linux ホストで実行するaocxファイルを生成しますこの機能によりカーネルの機能性をエミュレーションし毎回実際のFPGA で実行することなくデザインを反復することが可能になりますLinux のプラットフォームではエミュレーターを使用し機能のデバッグを実行することも可能です

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインのエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインを SoC ボードへターゲットにすることが可能です

エミュレーターは64 ビットの Windows および Linux のオペレーティングシステムをサポートしていますLinux システムではGNU C Library (glibc) version 215 以降のバージョンが必要ですお使いの Linux システムがこの要件を満たさない場合レガシーエミュレーターを利用できる可能性があります詳細はレガシーエミュレーターの使用 (135 ページ) を確認ください

1 高速エミュレーターの設定 (125 ページ)

2 エミュレーションに向けたチャネルカーネルコードの変更 (126 ページ)

3 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128ページ)

4 OpenCL カーネルのエミュレーション (129 ページ)

5 Linux における OpenCL カーネルのデバッグ (130 ページ)

6 インテル FPGA SDK for OpenCL Emulator の制限 (131 ページ)

7 ハードウェアとエミュレーターの結果の不一致 (131 ページ)

8 高速エミュレーターの環境変数 (133 ページ)

9 高速エミュレーターでサポートされている拡張機能 (133 ページ)

10 高速エミュレーターの既知の問題 (134 ページ)

11 レガシーエミュレーターの使用 (135 ページ)

81 高速エミュレーターの設定

インテル FPGA SDK for OpenCL プロエディションを管理者権限でインストールしている場合次の手順を実行する必要はありません インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合は高速エミュレーターを有効にするための作業を行う必要があります

インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合高速エミュレーターを使用する前に次の手順を実行してください

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

1 高速エミュレーターをインストール可能なクライアントドライバー (ICD) エントリーを手動で設定します

bull Linux の場合etcOpenCLvendorsIntel_FPGA_SSG_Emulatoricdファイルが環境変数 INTELFPGAOCLSDKROOT が指定するディレクトリーにあるファイルと一致することを確認しますINTELFPGAOCLSDKROOT 環境変数はSDK をインストールする位置を指しています

ファイルが一致しない場合やetcOpenCLvendorsにファイルが存在しない場合はIntel_FPGA_SSG_Emulatoricdファイルを INTELFPGAOCLSDKROOT 環境変数で指定されている位置からetcOpenCLvendorsディレクトリーへコピーします

bull Windows の場合レジストリーキー HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendorsが次の値を含んでいることを確認してください[HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]intelocl64_emudll=dword00000000

2 インテル FPGA サポートプレビューで インテル FPGA SDK for OpenCL を手動でインストール (または再インストール) します

この手順により64 ビットの インテル SDK for OpenCL オフラインコンパイラーコマンドラインインターフェイス (ioc64) がシステムにインストールされます

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

bull OpenCL Vector Addition Design Example

82 エミュレーションに向けたチャネルカーネルコードの変更

エミュレーターはカーネル間のチャネルをエミュレーションしますFPGA ボードの入出力フィーチャーに接続する IO チャネルのエミュレーションはサポートしていません IO チャネルの読み書きを行うチャネルを持つアプリケーションをエミュレーションするにはカーネルを変更しIO チャネルに代わる読み取りまたは書き込みチャネルを追加しますまたそのチャネルを使用するソースコードを条件付きにします

インテル FPGA SDK for OpenCL はEMULATORのマクロの定義を設定しませんコマンドラインまたはソースコードで手動にて設定する必要があります

次のカーネルを例に説明します

channel unlong4 inchannel __attribute__((io(eth0_in)))

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ulong4 data = read_channel_intel(inchannel) statements

IO チャネルに接続するチャネルを持つカーネルをエミュレーションするエミュレーターを有効にするには次の手順を実行します

1 次のいずれかの方法でカーネルコードを変更します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

126

mdash 次のように一致する write_channel_intel呼び出しを追加する

ifdef EMULATOR

__kernel void io_in (__global char restrict arr int size) for (unsigned i = 0 i lt size i++) ulong4 data = arr[i] arr[i] being an alternate data source write_channel_intel(inchannel data) endif

mdash IO チャネルアクセスを次のようにメモリーアクセスに置き換える

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ifndef EMULATOR

ulong4 data = read_channel_intel(inchannel)

else ulong4 data = arr[i] arr[i] being an alternate data source

endif statements

2 エミュレーション中にこの条件付きカーネルを作成および起動するようホストアプリケーションを変更します

関連情報io チャネル属性を使用した IO チャネルの実装 (44 ページ)

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション

インテル FPGA SDK for OpenCL Emulator は値によってパイプやチャネルを渡すカーネルをサポートします

値によってチャネルまたはパイプを渡すカーネルは次のようにエミュレーションできます

channel uint my_ch

void my_function (channel uint ch __global uint dst int i) dst[i] = read_channel_intel(ch)

__kernel voidconsumer (__global uint restrict dst) for (int i=0ilt5i++) my_function(my_ch dst i )

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

127

822 チャネル深度のエミュレーション

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE環境変数を使用しエミュレーションに向けてカーネルをコンパイルすることで変更できます

この CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数は次の値を取ることができます

ignoredepth カーネルのエミュレーション実行時間が 短になるよう選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性は無視されます

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数が設定されていない場合はこの値がデフォルトで使用されます

default 明示的に深度属性が指定されているチャネルはその深度を持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるよう選択されたデフォルトのチャネル深度が与えられます

strict エミュレーションのチャネル深度はすべてFPGA のコンパイルに指定されている深度に一致するように与えられます

重要 チャネルに対する CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数はカーネルをコンパイルする前に設定する必要がありますパイプの場合はホストプログラムを実行する前に設定する必要があります

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)

エミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorおよび-fast-emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に次の作業を実行します

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認してください

bull LD_LIBRARY_PATH 環境変数の設定に インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認します

bull x86-64 のホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator -fast-emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向けてインテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートではカーネルソースコードの機能的なエラーの原因を特定できます

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

128

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

84 OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行しますOpenCL 高速エミュレーターはFPGA ハードウェアをターゲットとする際とは異なる OpenCL プラットフォームを使用します

カーネルをエミュレーションするには次のステップを実行します

1 ホストプログラムを変更しエミュレーターの OpenCL プラットフォームを選択します

次のプラットフォーム名を選択しホストプログラムのエミュレーション用 OpenCL プラットフォームを選択します

Intel(R) FPGA Emulation Platform for OpenCL(TM)

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細についてはホストアプリケーションと Khronos ICD Loader Library のリンクを確認ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置へ動かします現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを次のように実行します

mdash Windows の場合

a set CL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を定義します

b ホストアプリケーションを実行します

c set CL_CONFIG_CPU_EMULATE_DEVICES=を呼び出し変数の設定を解除します

mdash Linux の場合は envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要のある同一のエミュレーションデバイス数を指定します

注意

エミュレーション用 OpenCL プラットフォーム (Intel(R) FPGA EmulationPlatform for OpenCL(TM)) は物理的なボードへのアクセスを提供しませんエミュレーションされたデバイスのみ利用可能です

ヒント

エミュレーターデバイスを 1 つだけ使用する場合はCL_CONFIG_CPU_EMULATE_DEVICES環境変数を設定する必要はありません

5 ホストまたはカーネルプログラムの変更後にテストを行う場合変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

129

85 Linux における OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL Emulator にデバッガーで OpenCL カーネルを実行しホストアプリケーションの一部として機能的にデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証と設定を行うことができます

注意 カーネルのデバッグはホストのデバッグから独立していますWindows の Microsoft Visual StudioDebugger や Linux の GDB など既存のツールでホストコードをデバッグしてください

デバッグに向けて OpenCL カーネルをコンパイルするには次のステップを実行します

1 特定のアクセラレーターボードをターゲットとするデバッグのaocxファイルを生成するためaoc -march=emulator -fast-emulator -gltyour_kernel_filenamegtclコマンドを呼び出します

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94ページ) を確認ください

3 ltyour_kernel_filenamegtaocxファイルがホストが容易に検索できる位置にあることを確認してください現在の作業ディレクトリーが推奨されます

4 アプリケーションの実行には envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt gdb --argsltyour_host_program_namegt [lthost_program_argumentsgt] コマンドを呼び出しますこの ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムの変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行します

カーネルをデバッガーで実行するには次の作業を実行します

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルを呼び出す前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグを開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yと返答します 初のプログラム実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 エミュレーターはOpenCL ランタイムでいくつかのエラーの詳細をレポートしますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

130

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

86 インテル FPGA SDK for OpenCL Emulator の制限

インテル FPGA SDK for OpenCL Emulator のフィーチャーにはいくつかの制限があります

bull 実行モデル

エミュレーターはFPGA バリアントと同じコンパイルモードをサポートしますそのためclCreateProgramBinary関数を呼び出しエミュレーションのための cl_programオブジェクトを作成する必要があります

bull 並列実行

並行するカーネルの実行のモデリングには制限があります実行中にエミュレーターは通信しているワークアイテムを実際には並行して実行しませんよって異なるカーネルが同期化のためにバリアーなしでグローバルメモリーにアクセスしている場合など並行して実行されている動作によっては実行ごとに一貫性のないエミュレーション結果が生成される可能性があります

bull エミュレーターはホストランタイムとカーネルを同じアドレス空間で実行しますホストアプリケーションで特定のポインターや配列を使用することによりカーネルプログラムが失敗する場合がありますまたその逆も同じです使用例としては外部に割り当てられたメモリーのインデックス化やランダムなポインターへの書き込みなどがありますValgrind などのメモリーリーク検出ツールを使用しプログラムを分析することができますただしカーネルでの範囲を超える書き込み動作によってホストに致命的なエラーが発生する可能性がありますまたその逆も同様です

bull チャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合エミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

87 ハードウェアとエミュレーターの結果の不一致

カーネルをエミュレーションするとOpenCL システムはハードウェアにコンパイルされたカーネルとは異なる結果を生成することがありますシミュレーションでカーネルを実行することでハードウェアにカーネルをコンパイルする前にさらにカーネルをデバッグすることが可能です

警告 この結果における不一致はインテル FPGA SDK for OpenCL Emulator がハードウェアの計算の一部を正確にモデル化できない場合またはプログラムが未定義の動作に依存している場合に通常発生します

エミュレーターとハードウェアの結果の不一致を引き起こす も一般的な理由は次のとおりです

bull OpenCL カーネルコードがpragma ivdepディレクティブを使用しているエミュレーターは真の依存関係が pragma ivdepディレクティブによって壊されている場合OpenCL システムをモデル化しませんハードウェアをフルコンパイルする際にこれは誤った結果として考えられます

bull OpenCL カーネルコードが初期化されていないデータに依存している初期化されていないデータとは初期化されていない変数初期化されていないまたは部分的に初期化されたグローバルバッファーローカル配列プライベート配列などです

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

131

bull OpenCL カーネルコードの動作が正確な浮動小数点演算の結果に依存しているエミュレーターが CPU の浮動小数点計算ハードウェアを使用する一方でハードウェアの実行には FPGA コアとして実装されている浮動小数点コアが使用されます-fp-relaxedの aoc オプションをOpenCL カーネルコードに使用すると演算の順序が変わり浮動小数点の計算結果がさらに変動する可能性があります

注意 OpenCL の標準は各プラットフォームの浮動小数点計算の 下位ビットが 1 つ以上異なることを許容します一方でそれはどのプラットフォームでも正しいと見なされます

bull OpenCL カーネルコードの動作が異なるカーネルのチャネルアクセスの順序に依存しているチャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合にエミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

bull OpenCL カーネルまたはホストコードが範囲外のグローバルメモリーにアクセスしている

注意

mdash 初期化されていないメモリーの読み取りおよび書き込み動作はプラットフォームに依存しますカーネル内のすべてのアドレスを使用している場合clCreateBuffer関数呼び出しを割り当てている場合clEnqueueReadBufferとclEnqueueWriteBuffer関数呼び出しを転送している場合はグローバルメモリーのバッファーサイズを確認してください

mdash Valgrind などのソフトウェアメモリーリーク検出ツールをエミュレーションされたバージョンの OpenCL システムで使用するとメモリーに関する問題を分析できますこれらのツールからの警告がないということは問題がないということを意味するわけではありませんこれは単にツールが問題を検出できなかったことを意味するだけですインテルではこのような状況においてOpenCL カーネルまたはホストコードの手動検証を推奨しています

bull OpenCL カーネルコードが範囲外のローカルまたはプライベート変数にアクセスしている例えば範囲外のローカルまたはプライベート配列にアクセスしている場合やスコープ外になったプライベート変数にアクセスしている場合です

注意

範囲外の変数へのアクセスは通常ソフトウェアのスタックにおいてアクセスされている変数付近の無関係な変数に影響を及ぼすためこれらの問題はソフトウェア用語でスタックの破損問題と呼ばれていますエミュレーションされた OpenCL カーネルは通常の CPU 機能として実装されており破損する可能性のあるスタックを実際に持っていますハードウェアをターゲットにしている場合はスタックが存在しないためスタックの破損問題は必ず別の形で現れますスタックの破損が疑われる場合はValgrind などのメモリーリーク検証ツールを使用することが可能ですがスタック関連の問題の特定は通常困難ですインテルではスタック関連の問題をデバッグするためOpenCL カーネルコードを手動で検証することを推奨しています

bull OpenCL カーネルコードがシフトされる型よりも大きいシフトを使用している例えば 64 ビットの整数を 65 ビットでシフトしている場合などですOpenCL specification version 10 によるとこのようなシフトの動作は未定義です

bull エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度がカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なるこのチャネル深度の相違はカーネルのエミュレーションは問題なく機能する一方でハードウェアでの実行はハングアップするという状況を引き起こす可能性がありますチャネル深度の相違を修正する方法についてはチャネル深度のエミュレーション (128 ページ) を参照してください

bull 出力されるラインの順序に関してはprintf関数で出力される順序がエミュレーターとハードウェアで異なる場合がありますこれはハードウェアにおいて printfデータはグローバルメモリーバッファーに格納されカーネルの実行が完了した際またはバッファーがフルになった際にのみバッファーからフラッシュされるためですエミュレーターの printf関数はx86 stdoutを使用しています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

132

bull 型のアップキャストでアライメントされていないロードやストアを実行するとFPGA とエミュレーターでは異なる結果が生じる可能性がありますこの型のロードおよびストアはC99 の仕様では定義されていません

次例のような演算では予期しない結果になる可能性があります

int tmp = ((int ) (my_ptr + 5))

関連情報シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

88 高速エミュレーターの環境変数

高速エミュレーターの動作を変更する環境変数をいくつか利用することが可能です

OCL_TBB_NUM_WORKERS

エミュレーターが使用できる 大スレッド数を示しますデフォルト値は 32 大値は 255 です各スレッドは単一のカーネルを実行できます

アプリケーションで複数のカーネルを同時に実行する必要がある場合OCL_TBB_NUM_WORKERSを適切に設定する必要があります (使用されているカーネルの数またはそれ以上の値に設定してください)

CL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE

利用可能な OpenCL ローカルメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE

利用可能な OpenCL プライベートメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE

エミュレーションに向けて OpenCL カーネルをコンパイルするとカーネルをハードウェアに向けてコンパイルする際に生成されるチャネル深度とは異なるチャネル深度になりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数で変更できます詳細はチャネル深度のエミュレーション (128 ページ) を参照ください

関連情報チャネル深度のエミュレーション (128 ページ)

89 高速エミュレーターでサポートされている拡張機能

高速エミュレーターはさまざまな OpenCL 拡張機能に対しさまざまなレベルのサポートを提供しています

次の OpenCL の拡張機能は高速エミュレーターで完全にサポートされています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

133

bull cl_intel_fpga_host_pipe

bull cl_khr_byte_addressable_store

bull cl_khr_icd

bull cles_khr_int64

また次の OpenCL 拡張機能をレガシーエミュレーターと同様のレベルでサポートしています

bull cl_intel_channels

bull cl_khr_local_int32_base_atomics

bull cl_khr_local_int32_extended_atomics

bull cl_khr_global_int32_base_atomics

bull cl_khr_global_int32_extended_atomics

bull cl_khr_fp64

bull cl_khr_fp16

810 高速エミュレーターの既知の問題

高速エミュレーターの使用はいくつかの既知の問題に影響を受ける可能性があります起こりうる問題を回避するため高速エミュレーターを使用する際はこれらの問題を考慮ください

自動実行カーネル

自動実行カーネルはclReleaseProgram() 呼び出しの後ではなくホストプログラムの終了後にのみシャットダウンします

コンパイラー診断

一部のコンパイラー診断は高速エミュレーターに未実装です

clEnqueueNDRangeKernel() が返す CL_OUT_OF_RESOURCES エラー

高速エミュレーターがデフォルトでサポートしているよりも多くの__privateまたは__localメモリーをカーネルが使用している場合に発生する可能性があります

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE またはCL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE 環境変数を設定してください詳細は高速エミュレーターの環境変数 (133 ページ) を参照ください

clCreateKernel() が返す CL_INVALID_VALUE エラー

clBuildProgram() の呼び出しが行われていない可能性があります

プログラムがバイナリーから作成されている場合でもこの呼び出しは OpenCL 仕様に必要です詳細はOpenCL Specification version 10 の Section 542 を参照してください

uses_global_work_offsetカーネル属性は認識されない属性であるという警告

OpenCL 高速エミュレーターはuses_global_work_offsetカーネル属性をサポートしていません属性が無視されることを通知する警告がコンパイル時に出されることがありますがこの警告は高速エミュレーターにおけるカーネルの実行には影響しないため無視しても問題ありません

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

134

関連情報bull 高速エミュレーターの環境変数 (133 ページ)

bull The OpenCL Specification Version 10

811 レガシーエミュレーターの使用

インテル FPGA SDK for OpenCL バージョン 181 およびそれ以前のバージョンにおけるデフォルトのエミュレーターは現在も入手可能であり利用することができます ただしインテル FPGAOpenCL システムのエミュレーションには高速エミュレーターの利用を推奨しています

OpenCL カーネルのエミュレーションとデバッグ (125 ページ) で紹介されている推奨事項の多くはどちらのエミュレーターにも適用されますただしレガシーエミュレーターには次の章以降で説明されている違いがいくつかあります

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインでエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインのターゲットを SoC にすることが可能です

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)

レガシーエミュレーターでのエミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に以下の作業を実行してください

mdash FPGA アクセラレーターボードに対しボードメーカーから提供されているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認します

bull Windows システムでカーネルをエミュレーションするにはMicrosoft のリンカーおよびコンパイル用のライブラリーが別途必要になりますPATH 環境変数設定に インテル FPGA SDK forOpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設が インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

135

bull x86-64 ホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull 特定のボードをターゲットとするエミュレーションに向けてカーネルをコンパイルするには aoc-march=emulator -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向け インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードの機能的なエラーの原因を特定できるようになります

関連情報bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

81111 レガシーエミュレーターでのチャネル深度のエミュレーション

レガシーエミュレーターをターゲットにしている場合はエミュレーターのチャネル深度モデル作成における制御が異なります

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルをハードウェアに向けてコンパイルする際に生成されるデフォルトのチャネル深度とは異なりますこの動作はカーネルをエミュレーションに向けてコンパイルする際に-emulator-channel-depth-modelオプションを使用し変更することが可能です

-emulator-channel-depth-modelコンパイラーオプションは次の値を取ることができます

default 明示的な深度属性を持つチャネルは指定された深度持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるように選択されたデフォルトのチャネル深度が与えられます

strict FPGA のコンパイルに指定されている深度と一致するチャネル深度がエミュレーションのすべてのチャネル深度に与えられます

ignore-depth

カーネルのエミュレーション実行時間が 短になるように選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性はいずれも無視されます

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはご自身のカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行します

以下の手順でカーネルをエミュレーションしてください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

136

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションを構築するために必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーをどちらも表示します

2 ホストアプリケーションを構築し手順 1 で検索したライブラリーにリンクします

注意

複数のデバイスを他の OpenCL SDK と共にエミュレーションするにはホストアプリケーションをホストランタイムのライブラリーに接続する前 にKhronos ICD Loader Libraryに接続しますホストアプリケーションと ICD Loader Library の接続はホストアプリケーションの Makefileを変更して行います詳細は ホストアプリケーションと KhronosICD Loader Library のリンク (94 ページ) を参照ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置に移動します現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを実行するには

mdash Windows の場合 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を 初に定義しその後ホストアプリケーションを実行します

ホストアプリケーションを実行した後 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=を呼び出し変数の設定を解除します

mdash Linux の場合 envCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要がある同一のエミュレーションデバイス数を指定します

注意

環境変数 CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA を設定するとエミュレーションされたデバイスのみが利用可能になりますつまり物理的なボードへのアクセスはすべて無効になります

5 ホストまたはカーネルプログラムを変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行してください

エミュレーションされたカーネルを呼び出すたびに共有ライブラリーのコピーであるltprocess_IDgt-libkernelsoがデフォルトの一時ディレクトリーに作成されますこのltprocess_IDgt は各エミュレーションの実行に割り当てられた固有の数値ですWindows ではTMP または TEMP 環境変数を設定しデフォルトのディレクトリーを変更することができますLinux では TMPDIR の設定です

関連情報bull OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-

config または linkflags) (96 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL レガシーエミュレーターにOpenCL カーネルをデバッガーで実行しホストアプリケーションの一部としてデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証および設定を行うことが可能です

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

137

注意 カーネルのデバッグはホストのデバッグから独立していますWindows では Microsoft VisualStudio DebuggerLinux では GDB など既存のツールでホストコードをデバッグしてください

レガシーエミュレーションでのデバッグに向けて OpenCL カーネルをコンパイルするには以下を行います

1 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) (135 ページ) の説明に従いカーネルをコンパイルしてください

2 ホストアプリケーションを構築しKhronos ICD Loader Library に接続します詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ) を参照ください

3 ltyour_kernel_filenamegtaocxファイルがホストが特定できる位置にあることを確認します現在の作業ディレクトリーが推奨されます

4 env CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtgdb --args ltyour_host_program_namegt [lthost_program_argumentsgt]コマンドを呼び出しアプリケーションを実行しますここで ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムを変更した後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行してください

デバッガーでカーネルを実行するには以下を行います

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルが呼び出される前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグをまだ開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行の前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yを返答します 初のプログラムの実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 レガシーエミュレーターはOpenCL ランタイムにいくつかのエラーの詳細を報告しますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

138

9 カーネルの reporthtml ファイルのレビュー

注意 analyze-area インテル FPGA SDK for OpenCL ユーティリティーオプションは廃止されましたカーネルの推定エリア使用率を確認するにはreporthtmlファイルを参照してください

廃止されたエリアレポートに関する参考情報はAltera SDK for OpenCL Best Practices Guideversion 160 の Review Your Kernels Area Report to Identify Inefficiencies in ResourceUsage の章を参照ください

OpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーは面積ループ構造メモリーの使用率カーネルのパイプラインなどカーネルのさまざまな側面を分析する HTML レポートを自動的に生成しますHTML レポートを起動するには ltyour_kernel_filenamegtreportsディレクトリーのreporthtmlファイルを開きます

HTML レポートについての詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

関連情報bull カーネルの reporthtml ファイルのレビュー

bull Altera SDK for OpenCL Best Practices Guide version 160

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

10 OpenCL カーネルのプロファイリング

インテル FPGA Dynamic Profiler for OpenCL はFPGA での OpenCL カーネル実行中に収集したパフォーマンスデータを測定し報告します インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスカウンターに依存しパフォーマンスデータを収集しますパフォーマンスデータはその後Profiler GUI で確認することができます

1 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) (140 ページ)

2 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report) (141 ページ)

3 自動実行カーネルのプロファイリング (142 ページ)

101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

パフォーマンスカウンターで OpenCL カーネルのパイプラインを測定するにはaocコマンドの-profile=(all|autorun|enqueued)オプションをカーネルをコンパイルする際に含めます

注意 パフォーマンスカウンターで Verilog コードを測定するとハードウェアのリソース使用率が増加 (つまり FPGA のエリア使用率が増加) し通常パフォーマンスが低下します

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ltyour_kernel_filenamegtaocxファイルの Verilog コードをパフォーマンスカウンターで測定するには aoc -profile=(all|autorun|enqueued)ltyour_kernel_filenamegtclコマンドを呼び出します以下に詳細を説明します

mdash all引数は ltyour_kernel_filenamegtclファイルのすべてのカーネルをパフォーマンスカウンターで測定しますこれは引数が指定されていない場合のデフォルトのオプションです

mdash autorun引数は自動実行のカーネルのみをパフォーマンスカウンターで測定します

mdash enqueued引数は自動実行以外のカーネルのみをパフォーマンスカウンターで測定します

注意

mdash 複数の異なるカーネルをプロファイリングする際は異なるaocxファイルに同じカーネル名を使用しないでください同じカーネル名が付けられている場合それらのカーネルのプロファイルデータは正確なものになりません

mdash clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しへの入力にかかわらず インテル FPGA Dynamic Profiler for OpenCL はコンパイル中に示したカーネルタイプのみをプロファイルします

mdash すべてのカーネルまたはエンキューされたカーネルの OpenCL カーネルパイプラインをパフォーマンスカウンターで測定するとOpenCL ランタイム環境でのハードウェアのカーネル呼び出しキューの使用が無効になりますそのためプロファイルの時間が異なる場合があります

注意

自動実行カーネルをプロファイルするとカウンターに対するハードウェアのオーバーヘッドが発生します大規模なデザインの場合オーバーヘッドによって fmax およびデザイン周波数が低下する可能性がありますまた インテル FPGA Dynamic Profiler for OpenCL がすべてのカーネルをプロファイルするとデザインがチップに収まらなくなる可能性もあります

bull ローカルディスクからホストアプリケーションを実行しltyour_kernel_filenamegtaocxファイルを FPGA で実行しますカーネルの実行中カーネルパイプライン全体のパフォーマンスカウンターはプロファイル情報を収集しますホストは現在の作業ディレクトリーの profilemonモニター記述ファイルにその情報を保存します

注意

ネットワークディスクのアクセスが遅いためネットワークのディレクトリーからホストアプリケーションを実行すると各カーネルの実行に遅れをもたらす可能性がありますこの遅れによりホストアプリケーションの全体的な実行時間が長くなる可能性がありますさらにランタイムがプロファイル出力データをディスクに格納している間にカーネルの起動に遅れが発生する可能性もあります

102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report)

インテル FPGA Dynamic Profiler for OpenCL の reportユーティリティーコマンドを使用しプロファイラー GUI を起動することができますプロファイラー GUI ではカーネルの実行中にインテルFPGA Dynamic Profiler for OpenCL が収集するカーネルのパフォーマンスデータの統計情報を確認できます

インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスデータを現在の作業ディレクトリーの profilemonファイルに格納します

bull インテル FPGA Dynamic Profiler for OpenCL GUI を起動するには aocl reportltyour_kernel_filenamegtaocx profilemon[ltyour_kernel_filenamegtsource]ユーティリティーコマンドを呼び出します

重要 コマンドにsourceファイルを指定しない場合 インテル FPGA Dynamic Profiler forOpenCL GUI はソースコードタブを持たなくなります

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

141

103 自動実行カーネルのプロファイリング

自動実行カーネルのプロファイル機能は自動実行カーネルのプロファイルを可能にします

autorun属性でマークされたカーネルは自動実行カーネルと呼ばれますしたがって自動実行カーネルはホストが明示的に他のカーネルを起動する前に自動的に開始され完了すると自動的に再起動しますautorun属性についての詳細はホストとカーネル間の通信ハードウェアの省略を参照ください

自動実行カーネルは終了することがないためホストライブラリー呼び出しのclGetProfileDataDeviceIntelFPGAを呼び出し自動実行のプロファイルデータをキャプチャーする必要がありますホストアプリケーションに指示することでこの呼び出しは実行中の任意のタイミングで行うことができます

注意 自動実行カーネルのプロファイリング機能はグローバルメモリーを使用する自動実行カーネルをサポートしておらずカーネルの個別プロファイリングも行うことができません

関連情報bull ホストとカーネル間の通信ハードウェアの省略 (175 ページ)

bull エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ページ)

bull プロファイルデータの取得 (89 ページ)

bull 複数の自動実行プロファイリング呼び出し (89 ページ)

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発

インテル Code Builder for OpenCL は インテル FPGA SDK for OpenCL の一部として提供されているソフトウェア開発ツールですこのツールは インテル FPGA をターゲットとする一般的に広く利用されている統合開発環境での OpenCL アプリケーションの開発を可能にします

インテル Code Builder for OpenCL はOpenCL によって加速された Windows および Linux アプリケーションの作成構築デバッグ分析を可能にする一連の Microsoft Visual Studio およびEclipse のプラグインを提供します

111 Microsoft Visual Studio に向けた インテル Code Builder forOpenCL オフラインコンパイラープラグインのコンフィグレーション

Microsoft Visual Studio に向けてインテル Code Builder for OpenCL プラグインを有効にするには次の手順を実行します

1 Visual Studio ソフトウェアでProject gt Properties を選択します

2 Project gt Properties gt Code Builder のページでDevice を目的の FPGA デバイスに変更します

3 CC++ gt General プロパティーページの Additional Include Directories にOpenCL コードのヘッダーファイルが配置されているディレクトリーへのフルパスを入力します($(INTELFPGAOCLSDKROOT)include)

4 Linker gt General プロパティーページの Additional Library Directories にOpenCL コードのランタイムインポートライブラリーファイルが配置されているディレクトリーへのフルパスを入力します例えば 64 ビットのアプリケーションには$(INTELFPGAOCLSDKROOT)libx64を追加します

5 Linker gt Input プロパティーページAdditional Dependencies の OpenCL ICD のインポートライブラリーファイル名に OpenCLlibを入力します

112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション

Eclipse IDE に向けてインテル Code Builder for OpenCL オフラインコンパイラープラグインを有効にするには次の手順を実行します

1 CodeBuilder_ltversiongtjarプラグインファイルを$INTELFPGAOCLSDKROOTeclipse-plug-inから ltECLIPSE_ROOT_FOLDERgtdropinsへコピーします

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

注意 Linux では$INTELFPGAOCLSDKROOTbinを LD_LIBRARY_PATH環境変数に追加する必要があります

2 Eclipse IDE を実行します

3 Windows gt Preferences を選択します

4 インテル OpenCL ダイアログに切り替えます

5 OpenCL バイナリーのディレクトリーを$INTELFPGAOCLSDKROOTbinに設定します

オフラインコンパイラーのコンフィグレーションが完了するとCode-Builder メニューを使用し次の基本的な操作を実行できます

bull 新しいセッションの作成

bull 既存のセッションを開く

bull セッションの保存

bull セッションの構築

bull セッションのコンパイル

bull セッションのコンフィグレーション

インテル Code Builder for OpenCL に関する詳細はDeveloper Guide for Intel SDK forOpenCL Applications を参照くださいMicrosoft Visual Studio に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Microsoft Visual Studio を参照くださいEclipse に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Eclipse を参照ください

関連情報bull Developer Guide for Intel SDK for OpenCL Applications

bull Intel Code Builder for OpenCL API for Microsoft Visual Studio

bull Intel Code Builder for OpenCL API for Eclipse

113 インテル Code Builder for OpenCL でのセッションの作成

インテル Code Builder for OpenCL でセッションを作成するには次の手順を実行します

1 Code-Builder gt OpenCL Kernel Development gt New Session を選択します

2 セッション名セッションファイルを格納するフォルダーへのパスおよびセッションのコンテンツを指定します (空のセッションまたは事前に定義された OpenCL コードを持つセッションのどちらか)

3 Done をクリックします

セッションが作成されると新しいセッションが Code Builder Sessions Explorer ビューに表示されます

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

144

図 -16 Code Builder Session Explorer

注意 Code Builder Session Explorer ビューが表示されない場合はCode-builder gt OpenCLKernel Development gt Windows gt Code Builder Session Explorer を選択します

114 セッションのコンフィグレーション

コンフィグレーションとは割り当てられた変数反復回数特定のカーネルのグローバルサイズとローカルサイズなどの一連の分析の入力です分析が必要な入力のセットごとに個別のコンフィグレーションを作成することができます

Code Builder Session Explorer のセッションを右クリックし Session Options を選択するとセッションをコンフィグレーションできますあるいはCode-Builder gt OpenCL KernelDevelopment gt Session Options を選択するとSession Settings ダイアログボックスを開くことができます

Session Settings ダイアログボックスでは次の内容をコンフィグレーションすることができます

bull ターゲットマシンOpenCL プラットフォームOpenCL デバイスなどのデバイスオプション

bull オフラインコンパイラーフラグやビルドアーキテクチャーなどのビルドオプション

bull aocxおよびaocoファイルなどのビルドアーティファクトや静的レポート

bull ジョブアーキテクチャーやネットワーク設定などの一般的なオプション

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

145

Device Options タブの OpenCL platform ドロップダウンリストから インテル FPGA SDKfor OpenCL を選択していることを確認してください

Build Options タブの OpenCL Build Options セクションに インテル FPGA SDK forOpenCL オフラインコンパイラーフラグを手動で入力します

注意 カーネルにチャネルがある場合ワークフローをコンフィグレーションする必要がありますワークフローは一連のカーネルであり連続して実行することができますワークフローはあるカーネルの入力が前のカーネルの出力と接続しているチャネルでワークロードを実行するために使用できます (両方のカーネルに同じ変数を割り当てる必要があります)

セッションのコンフィグレーションと変数管理についてはDeveloper Guide for Intel SDK forOpenCL Applications を参照ください

関連情報bull Configuring a Session in Microsoft Visual Studio

bull Configurations and Settings in Eclipse

bull Variable Management in Microsoft Visual Studio

bull Variable Management in Eclipse

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

146

12 インテル FPGA SDK for OpenCL のアドバンスト機能

インテル FPGA SDK for OpenCL が提供するアドバンスト機能を使用しデザインアーキテクチャーの以下の側面および インテル FPGA SDK for OpenCL オフラインコンパイラーの動作を制御することができます

121 OpenCL ライブラリー

OpenCL ライブラリーは複数の機能を含む単一のファイルです各機能は任意のクロック周波数で動作するデータ処理ロジックで構成されています OpenCL ライブラリーはOpenCL あるいはレジスター転送レベル (RTL) で作成できますこのライブラリーファイルをインクルードしOpenCL カーネル内の関数を使用することができます

図 -17 インテル FPGA SDK for OpenCL のライブラリーサポートの概要

OpenCL

Verilog

VHDL OpenCL Kernel

OpenCL LibraryIntel FPGA SDK for OpenCL

Offline CompilerOffline Compiler

Executable File (aocx)

以前に作成したライブラリーを使用することも独自のライブラリーを作成することも可能ですOpenCL ライブラリーの使用にあたりハードウェアデザインやライブラリーコンポーネントの実装に関する詳細な知識は必要ありませんOpenCL ライブラリーを作成するには次のファイルとコンポーネントを作成する必要があります

表 4 OpenCL ライブラリーの作成に必要なファイルとコンポーネント

ファイルまたはコンポーネント 説明

RTL コンポーネント

RTL ソースファイル RTL コンポーネントを定義する VerilogSystem VerilogまたはVHDL ファイルですインテル Quartus Prime IP ファイル (qip)SDC ファイル(sdc)Tcl Script ファイル (tcl) などの付加的なファイルは使用することができません

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ファイルまたはコンポーネント 説明

eXtensible Markup Language ファイル (xml) RTL コンポーネントのプロパティーを記述します インテル FPGASDK for OpenCL オフラインコンパイラーはこれらのプロパティーを使用し RTL コンポーネントを OpenCL パイプラインに統合します

ヘッダーファイル (h) RTL コンポーネントにより実装される関数のシグニチャーを宣言するCスタイルのヘッダーファイルです

OpenCL エミュレーションモデルファイル (cl) エミュレーションでのみ使用される RTL コンポーネントの C モデルを提供しますハードウェアのフルコンパイルには RTL ソースファイルを使用します

OpenCL の機能

OpenCL ソースファイル (cl) OpenCL 関数の定義を含んでいますこれらの関数はエミュレーションおよびハードウェアのフルコンパイルの際に使用されます

ヘッダーファイル (h) OpenCL ソースファイルで定義される関数のシグネチャーを宣言する Cスタイルのヘッダーファイルです

注意 RTL と OpenCL ライブラリー関数に使用されるヘッダーファイルに違いはありません単一のヘッダーファイルで両方の関数の型を宣言することができます単一のライブラリーにRTL と OpenCL のライブラリーの関数をどちらも含めることができます

RTL モジュールと OpenCL パイプラインの理解 (148 ページ)

OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 (161 ページ)

OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化 (162 ページ)

RTL モジュールの検証 (164 ページ)

複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ)

OpenCL ライブラリーのコマンドラインオプション (170 ページ)

関連情報OpenCL ライブラリーのコマンドラインオプション (170 ページ)

1211 RTL モジュールと OpenCL パイプラインの理解

OpenCL のライブラリー機能によりVerilogSystemVerilogVHDL で記述された RTL モジュールを OpenCL カーネルで使用することができます この章では インテル FPGA SDK for OpenCL オフラインコンパイラーがRTL モジュールをインテル FPGA SDK for OpenCL パイプラインアーキテクチャーに統合する方法の概要を説明します

次の状況において RTL モジュールを使用してください

bull 適化および検証がされた RTL モジュールをOpenCL 関数として書き直すことなく OpenCL カーネルで使用する場合

bull OpenCL で効果的に表現できない OpenCL カーネル機能を実装する必要がある場合

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

148

12111 インテル FPGA SDK for OpenCL パイプラインのアプローチの概要

次の図はインテル FPGA SDK for OpenCL パイプラインのアーキテクチャーを表しています

図 -18 インテル FPGA SDK for OpenCL パイプラインステージの並列実行モデル右側の動作は左側の OpenCL カーネルコードにおける SDK のパイプライン実装を表しています黄色の各ボックスはパイプラインにある動作またはデータの値です各動作に付けられている数字はパイプラインのスレッド数を表します

Load A Load B

Add

Store C

global ID (gid)

gid

gid

2

1

0

2 2

3

1

void kernel pe (global int A global int B global int C) int gid = get_global_id(0)

int a = A[gid] int b = B[gid]

C[gid] = a + b

各レベルの動作がパイプラインの 1 ステージであると仮定します各ステージにおいてインテル FPGASDK for OpenCL はそのステージに存在するスレッドに基づきすべての動作を並列で実行します例えばスレッド 2 では Load ALoad B を実行し現在のグローバル ID を (gidを介し) 次のパイプラインステージにコピーしますRISC (縮小命令セットコンピューター) プロセッサーでのパイプライン化された命令の実行と同様SDK のパイプラインステージもまた並列して実行を行いますステージの実行がすべて完了しなければスレッドは次のパイプラインステージに進みません

Add

oready

iready

ivalid

ovalid

一部の動作ではインテル FPGA SDK for OpenCL パイプラインをストールさせることができます例えばメモリーのロードやストア動作のような可変レイテンシー動作などがそれにあたりますストールをサポートするにはready 信号と valid 信号をパイプライン全体に伝播しオフラインコンパイラーがパイプラインステージをスケジュールできるようにしますただしすべての動作のレイテンシーが固定されている場合ready 信号は必要ありませんこのような場合オフラインコンパイラーはパイプラインを 適化し静的に動作をスケジュールするためパイプラインの実装に必要なロジックが大幅に削減されます

12112 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合

カーネルのコンパイル中に OpenCL ライブラリーを指定するとオフラインコンパイラーはライブラリーの RTL モジュールをパイプライン全体に統合します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

149

図 -19 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合この図はRTL モジュール myModを図 18 (149 ページ) のパイプラインへ統合しているものです

Load A Load B

myMod

Store C

gid

gid

gid

4

3

0

4 4

5

3

myMod

oready

iready

ivalid

ovalid

extern int myMod(int int)void kernel pe(global int A global int B global int C)

int gid = get_global_id(0) int a = A[gid] int b = B[gid] C[gid] = myMod(a b)

2

1

gid2

gid1

3 cycles

示されている RTL モジュールはバランスの取れたレイテンシーを有しRTL モジュールのスレッドはパイプラインのステージ数と一致していますレイテンシーのバランスが取れているためRTL モジュールのスレッドは SDK のパイプラインをストールさせることなく実行することができます

RTL の仕様ファイルで RTL モジュールのレイテンシーを設定するとオフラインコンパイラーはパイプラインのレイテンシーのバランスを取ることができるようになります RTL は Avalontrade Streaming(Avalontrade -ST) インターフェイスをサポートしているためRTL モジュールのレイテンシシーは可変です (つまり固定ではありません)ただし性能を 大限に上げるためにはレイテンシーの変動は小さくなければなりませんさらにレイテンシーを ltRTL module description filenamegtxml仕様ファイルで指定するとRTL モジュールは安定状態で実際のレイテンシーの適切な概算を得られるようになります

関連情報bull Avalon Interface Specifications

bull Pipelined Read Transfer with Variable Latency

bull Pipelined Read Transfers with Fixed Latency

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ)

bull RTL モジュールの XML 構文 (154 ページ)

12113 ストールのない RTL

インテル FPGA SDK for OpenCL オフラインコンパイラーではレイテンシーを固定し RTL モジュール周辺のストールロジックを削除することによりハードウェアのリソース使用率とパフォーマンスを適化できます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

150

可変レイテンシーを持ちAvalon-ST の入出力信号を使用する RTL モジュールは入力データの準備が整うまで待機します一方インテル FPGA SDK for OpenCL パイプラインはRTL モジュールからの有効な出力データを受け取るまでストールします固定レイテンシーを有する RTL モジュールではltRTL module description file namegtxml仕様ファイルを次の記述のように変更することでRTL のストールを削除することができます

1 可能な場合に RTL モジュール周囲のストールロジックを削除するようオフラインコンパイラーに指示するにはFUNCTION要素の IS_STALL_FREE属性をyesに設定します

この変更はRTL モジュールが EXPECTED_LATENCYサイクルごとに有効なデータを生成することをオフラインコンパイラーに通知します

注意 EXPECTED_LATENCYはFUNCTION要素のxmlファイルで指定する属性です

2 レイテンシーがモジュールのパイプラインステージ数に等しくなるよう EXPECTED_LATENCYの値を指定します

注意 不正確な EXPECTED_LATENCYの値を指定するとRTL モジュールがパイプラインの他の部分と同期しなくなります

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを通して無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールではivalid=0入力の処理に注意する必要があります

12114 RTL モジュールインターフェイス

RTL モジュールが他のコンパイラーによって生成された動作と適切に通信するにはRTL モジュールの入力および出力の両方において単純化された Avalon-ST インターフェイスをサポートする必要があります

次の図は図 19 (150 ページ) で示されている RTL モジュール myModの 終的なインターフェイスを表しています

Upstream module

Downstream module

oready ivalid A B

iready ovalid C

myMod

この図において myModはABのデータ信号や ivalid (入力) および oready (出力) のコントロール信号を介しアップストリームのモジュールと通信していますivalidコントロール信号はデータ信号 Aおよびデータ信号 Bが有効なデータを含む場合のみ1に等しくなります (ivalid =1)コントロール信号 oreadyが 1 に等しくなると (oready = 1)データ信号 Aと Bが有効であれば (ivalid = 1)myMod RTL モジュールはそれらの信号の処理を行うことができることを示しますivalid = 1で oready = 0の場合アップストリームのモジュールは次のクロックサイクルで ivalidAおよび Bの値を保持すると考えられます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

151

myModはデータ信号 Cおよびコントロール信号の ovalid (出力) と iready (入力) を介しダウンストリームのモジュールと通信しますovalidコントロール信号はデータ信号 Cが有効なデータを含む場合にのみ1に等しくなります (ovalid = 1)ireadyコントロール信号が 1に等しくなると (ivalid = 1)データ信号 Cが有効であればダウンストリームのモジュールは処理が可能なことを示しますovalid = 1で iready = 0の場合myMod RLT モジュールは次のクロックサイクルで ovalidと C信号の有効性を保持すると考えられます

myModモジュールはoreadyを 1 クロックサイクル間アサートしアクティブサイクルに向け準備が整っていることを示しますmyModモジュールのデータの準備ができているサイクルをレディーサイクルと呼びますレディーサイクル中myModモジュールの上にあるモジュールはivalidをアサートし myModにデータを送信することができます

バックプレッシャー下でのデータ転送に関する詳細な説明はAvalon Interface Specifications のData Transfer with Backpressureを参照くださいレディーレイテンシーに関する情報は参考にしないでください

関連情報Data Transfer with Backpressure

12115 Avalon Streaming (Avalon-ST) インターフェイス

オフラインコンパイラーは入力と出力の両方において RTL モジュールがreadyLatency = 0の Avalon-ST インターフェイスをサポートすることを想定しています

図 19 (150 ページ) で示されているようにRTL モジュールには 4 つのポートがなければなりません

bull Avalon-ST インターフェイス入力の ivalidと iready

bull Avalon-ST インターフェイス出力の ovalidと oready

次にバックプレッシャーでの入力データ転送のタイミング図を示していますAvalon-ST インターフェイスに関する詳細はAvalon Interface Specifications の Avalon Streaming Interfaces の章を参照ください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

152

固定レイテンシーを持つ RTL モジュールの場合出力信号 (ovalidと oready) は一定の高い値を持つことができ入力レディー信号 (iready) は無視することができます

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを介し無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールにおいてはivalid = 0入力の処理に注意する必要があります

12116 RTL リセットおよびクロック信号

RTL モジュールのリセットおよびクロックはOpenCL パイプラインの他の部分と同じクロックおよびリセットドライバーに接続されています

共通のクロックドライバーとリセットドライバーであるためRTL モジュールは OpenCL カーネルと同じクロックドメインで動作しますモジュールは インテル FPGA SDK for OpenCL の programユーティリティーまたは clCreateProgramwithBinaryホスト関数でOpenCL カーネルが 初に FPGA にロードされた際にのみリセットされますつまりホストがカーネルを連続するclEnqueueNDRangeKernelまたは clEnqueueTask呼び出しで再起動した場合関連するRTL モジュールはこの再起動時にリセットされません

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

153

カーネルのクロック周波数を設定する過程を次に説明します

1 インテル Quartus Prime ソフトウェアのフィッターはカーネルクロックに積極的な制約を適用します

2 インテル Quartus Prime ソフトウェアのタイミングアナライザーは静的なタイミング解析を実行しフィッターが実際に達成する周波数を決定します

3 カーネルのクロックを駆動するフェーズロックループ (PLL) は上記 2 で決定された周波数をカーネルのクロック周波数に設定します

オプションにより RTL モジュールはOpenCL カーネルクロックの 2 倍の周波数で動作するシステム全体のクロックにアクセスできますこのシステム全体のクロックを RTL モジュールの入力信号に接続するにはAVALON要素のタイプ clock2xを含めますこの 2 つのクロックは定義された位相関係を持ちません

121161 ストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテル Stratix10 デザイン固有のリセット要件

インテル Stratix 10 OpenCL デザインに RLT モジュールを作成する際は特定のロジックリセット要件を満たしていることを確認してください

ストールのない RTL モジュールのリセット要件

ストールのない RTL モジュールはレイテンシーが固定されたモジュールであり インテル FPGA SDKfor OpenCL オフラインコンパイラーはストールロジックを削除し 適化することができます

bull インテル Stratix 10 のデザインに向けストールのない RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールのない RTL モジュールに対するリセットシグナルのディアサート後モジュールは 15 クロックサイクル以内に動作可能でなければなりませんリセット信号がモジュール内でパイプライン化されている場合この要件はリセットのパイプライン化を 15 ステージ以下に制限します

ストールをサポートする RTL モジュールのリセット要件

ストールをサポートする RTL モジュールは可変レイテンシーを持ち正確に機能するためにバックプレッシャー入力および出力インターフェイスに依存します

bull インテル Stratix 10 デザインにストールをサポートする RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールをサポートする RTL モジュールにリセット信号をアサートした後モジュールは oreadyおよび ovalidインターフェイス信号を 40 クロックサイクル内にディアサートしなければなりません

bull ストールをサポートする RTL モジュールにリセット信号をディアサートした後モジュールは 40 クロックサイクル以内に完全に動作可能になる必要がありますモジュールは準備が完了したことを oreadyインターフェイス信号をアサートし知らせます

関連情報ストールのない RTL (150 ページ)

12117 RTL モジュールの XML 構文

この章では倍精度平方根関数を実装する RTL モジュールのシンプルな XML 仕様ファイルの構文を提供しますRTL モジュールはVerilog ラッパーで VHDL に実装されています

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

154

次の XML 仕様ファイルはOpenCL のヘルパー関数 my_sqrtfdを実装する RTL モジュールmy_fp_sqrt_doubleのものです (どちらの名前もライン 2 にあります)

1 ltRTL_SPECgt 2 ltFUNCTION name=my_sqrtfd module=my_fp_sqrt_doublegt 3 ltATTRIBUTESgt 4 ltIS_STALL_FREE value=yesgt 5 ltIS_FIXED_LATENCY value=yesgt 6 ltEXPECTED_LATENCY value=31gt 7 ltCAPACITY value=1gt 8 ltHAS_SIDE_EFFECTS value=nogt 9 ltALLOW_MERGING value=yesgt 10 ltATTRIBUTESgt 11 ltINTERFACEgt 12 ltAVALON port=clock type=clockgt 13 ltAVALON port=resetn type=resetngt 14 ltAVALON port=ivalid type=ivalidgt 15 ltAVALON port=iready type=ireadygt 16 ltAVALON port=ovalid type=ovalidgt 17 ltAVALON port=oready type=oreadygt 18 ltINPUT port=datain width=64gt 19 ltOUTPUT port=dataout width=64gt 20 ltINTERFACEgt 21 ltC_MODELgt 22 ltFILE name=c_modelcl gt 23 ltC_MODELgt 24 ltREQUIREMENTSgt 25 ltFILE name=my_fp_sqrt_double_s5v gt 26 ltFILE name=fp_sqrt_double_s5vhd gt 27 ltREQUIREMENTSgt 28 ltRESOURCESgt 29 ltALUTS value=2057gt 30 ltFFS value=3098gt 31 ltRAMS value=15gt 32 ltMLABS value=43gt 33 ltDSPS value=15gt 34 ltRESOURCESgt 35 ltFUNCTIONgt 36 ltRTL_SPECgt

表 5 XML 仕様ファイルにおける要素と属性

XML 要素 説明

RTL_SPEC XML 仕様ファイルにおける 上位の要素ですこのような 上位の要素はファイルに 1 つしか存在できません

FUNCTION RTL モジュールが実装する OpenCL 関数を定義する要素ですFUNCTION要素の name属性は関数の名前を指定しますOpenCL カーネルから呼び出すことのできる異なる関数を宣言する複数の FUNCTION要素を持つことが可能です異なるパラメーターを指定することで同じ RTL モジュールに複数の関数を実装できます

ATTRIBUTES RTL モジュールのさまざまな特性 (レイテンシーなど) を記述する他の XML 要素を含む要素です例にある RTL モジュールは32 の値を持つ WIDTHという PARAMETER設定を 1 つ取りますその他の ATTRIBUTES固有の要素に関しては表 6 (156 ページ) を参照ください

注意

異なるモジュールに複数の OpenCL ヘルパー関数を作成する場合や異なるPARAMETER設定で同じ RTL モジュールを使用する場合は関数ごとに個別のFUNCTION要素を作成する必要があります

INTERFACE RTL モジュールのインターフェイスを記述する他の XML 要素を含む要素です例にある XML仕様ファイルではすべての RTL モジュールが提供する必要のある Avalon-ST インターフェイス信号 (clockresetnivalidireadyovalidoready) を示していますこの信号名はxmlファイルで指定する名前と一致している必要があります信号名が一致しない場合ライブラリー作成時にエラーが発生します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

155

XML 要素 説明

C_MODEL 関数に OpenCL C モデルを実装する 1 つ以上のファイルを指定する要素ですモデルはエミュレーション時にのみ使用されますただしC_MODEL要素と関連するファイルはライブラリーファイル作成時に存在している必要があります

REQUIREMENTS 1 つ以上の RTL リソースファイル (vsvvhdhexmif) を指定する要素ですこれらのファイルに指定されたパスはXML 仕様ファイルの位置に対応します各 RTL リソースファイルはOpenCL システム全体に対応する関連するプラットフォームデザイナーコンポーネントの一部になります注意

インテル FPGA SDK for OpenCL ライブラリー機能はqipファイルをサポートしませんサポートされていないリソースファイルタイプを含むライブラリーを使用しOpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーのエラーが発生します

 

RESOURCES RTL モジュールが使用する FPGA リソースを指定するオプションの要素ですこの要素を指定しない場合RTL モジュールが使用する FPGA リソースはデフォルトのゼロになります

121171 ATTRIBUTES を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの特性を設定するために指定できる XML 要素が ATTRIBUTESにあります

表 6 RTL モジュールの XML 仕様ファイルにおける ATTRIBUTES 要素に関連する XML 要素

注意 IS_STALL_FREEおよび EXPECTED_LATENCYを除きすべての要素には安全な値があります属性に指定する値に確信がない場合は安全な値を設定してください安全な値を使用するライブラリーでカーネルをコンパイルすると機能的なハードウェアをもたらしますただしハードウェアは実際のサイズよりも大きい場合があります

XML 要素 説明

IS_STALL_FREE インテル FPGA SDK for OpenCL オフラインコンパイラーにRTL モジュール周囲のすべてのストールロジックを削除するように指示しますIS_STALL_FREEをyesに設定しモジュールでストールを生成しないことおよび受信ストールの適切な処理ができないことを示しますモジュールはストールの入力を単純に無視しますIS_STALL_FREEをnoに設定する場合モジュールはストールおよび有効な信号をすべて適切に処理する必要があります

注意 IS_STALL_FREEをyesに設定する際はIS_FIXED_LATENCYもyesに設定する必要がありますまたRTL モジュールが内部状態がを持つ場合ivalid=0入力を適切に処理する必要があります

不正な IS_STALL_FREEを設定するとハードウェに不正確な結果をもたらします

IS_FIXED_LATENCY RTL モジュールのレイテンシーが固定されているかどうかを示しますRTL モジュールが常に既知のクロックサイクル数で出力を計算する場合はIS_FIXED_LATENCYをyesrdquoに設定しますEXPECTED_LATENCY要素に指定する値はクロックサイクル数を指定しますIS_FIXED_LATENCYの安全な値はnordquoですIS_FIXED_LATENCY=noを設定する際にEXPECTED_LATENCYの値は少なくとも 1 でなければなりません

注意

特定のモジュールではIS_FIXED_LATENCYをyesにしIS_STALL_FREEをnoに設定することができますこのようなモジュールは固定のクロックサイクル数で出力を生成しストール信号を適切に処理します

EXPECTED_LATENCY RTL モジュールの予想されるレイテンシーを指定しますIS_FIXED_LATENCYをyesに設定するとEXPECTED_LATENCYの値はモジュールにあるパイプラインのステージ数を示しますこの場合この値はモジュールの正確なレイテンシーに設定する必要があります正確に設定されていない場合オフラインコンパイラーは不正確なハードウェアを生成しますレイテンシーが可変のモジュールにおいてはオフラインコンパイラーはこのモジュール周辺のパイプラインを指定した EXPECTED_LATENCYの値でバランスを取りますストールをサポートしireadyなどの信号を必要とするモジュールにおいてはEXPECTED_LATENCYの値は 低でも 1 に設定する必要があります指定した値と実際のレイテンシーは異なることがありパイプラインのストール数に影響を与える場合があります ただし生成されるハードウェアは正しいものです

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

156

XML 要素 説明

CAPACITY このモジュールが同時に処理できる複数の入力の数を指定しますIS_STALL_FREE=noおよびIS_FIXED_LATENCY=noも設定する場合はCAPACITYの値を指定する必要がありますそれ以外の場合は CAPACITYの値を指定する必要はありませんCAPACITYが EXPECTED_LATENCYよりもわずかでも小さい場合オフラインコンパイラーは必要に応じて容量のバランスをとる FIFO バッファーをこのモジュールの後に自動的に挿入しますCAPACITYの安全な値は 1です

HAS_SIDE_EFFECTS RTL モジュールに副作用があるかどうかを示します内部状態のあるモジュールや外部メモリーと通信するモジュールは副作用をともなうモジュールの例になりますHAS_SIDE_EFFECTSをyesに設定しモジュールに副作用があることを示しますHAS_SIDE_EFFECTSをyesに指定すると 適化を行う際に副作用のあるモジュールへの呼び出しは削除されません副作用がありストールのないモジュール (IS_STALL_FREE=yesでありHAS_SIDE_EFFECTS=yesのモジュール) は無効なデータを受け取る可能性があるためivalid=0の入力を適切に処理する必要がありますHAS_SIDE_EFFECTSの安全な値はyesです

ALLOW_MERGING オフラインコンパイラーにRTL モジュールの複数のインスタンスをマージするよう指示しますALLOW_MERGINGをyesに設定しモジュールの複数のインスタンスのマージを可能にしますインテルではALLOW_MERGINGをyesに設定することを推奨していますALLOW_MERGINGの安全な値はnoです

注意 HAS_SIDE_EFFECTS=yesでモジュールをマークしてもマージを防ぐことはできません

PARAMETER RTL モジュールのパラメーター値を指定しますPARAMETERの属性bull namemdashRTL モジュールのパラメーター名を指定しますbull valuemdashパラメーターに 10 進数の値を指定しますbull typemdashシステムパラメーターにRTL モジュールのパラメーター値として使用される値を指定します次

のシステムパラメーター名を type属性で使用できますmdash bspaddresswidthmdashボードサポートパッケージの OpenCL グローバルメモリーにコンフィグレ

ーションされたメモリー範囲のアドレスを指定するために必要なAvalon メモリーバス幅を指定します

注意 RTL モジュールのパラメーター値はvalue属性または type属性を使用し指定できます

121172 INTERFACE を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはRTL モジュールのインターフェイスの側面を指定するために定義できる XML 要素が INTERFACEにあります(Avalon-ST インターフェイスなど)

表 7 RTL モジュール XML 仕様ファイルの INTERFACE 要素に関連のある必須 XML 要素

XML 要素 説明

INPUT RTL モジュールの入力パラメーターを指定しますINPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

AOCL はOpenCL のデータ型に対応する幅のみをサポートしますつまり 8 (uchar)1632641282565121024 (long16) ビットのみをサポートします

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力パラメーターは連結されて入力ストリームを形成します構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

出力 RTL モジュールの出力パラメーターを指定します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

157

XML 要素 説明

OUTPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

SDK はOpenCL のデータ型に対応する幅のみをサポートしますつまり8 (uchar)1632641282565121024 (long16) ビットのみのサポートです

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力ストリームからの戻り値は出力ストリームの出力パラメーターを介し送信されます構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

RTL モジュールが外部メモリーと通信する場合はXML 要素を追加し含める必要があります

ltMEM_INPUT port=m_input_A access=readonlygtltMEM_INPUT port=m_input_sum access =readwritegtltAVALON_MEM port=avm_port0 width=512 burstwidth=5 optype=read buffer_location=gt

表 8 外部メモリーアクセスをサポートするために追加する XML 要素

XML 要素 説明

MEM_INPUT RTL モジュールへのポインター入力を記述しますMEM_INPUT属性bull portmdashポインター入力の名前を指定しますbull accessmdashRTL モジュールにおけるこのポインターの使用方法をインテル FPGA SDK

for OpenCL オフラインコンパイラーに指定します有効なアクセスの値はreadonlyと readwrite ですRTL モジュールがこのポインターでのみ書き込む場合はreadwriteを accessに割り当てます

外部メモリーへのポインターはすべて 64 ビットである必要があるためMEM_INPUTに関連付けられる width属性はありません

AVALON_MEM RTL モジュールの Avalon-MM インターフェイスを宣言しますAVALON_MEM属性bull portmdashRTL モジュールの対応するポート名のルートを指定します例えば port が

avm_port0_の値を持っている場合RTL モジュールの Avalon-MM インターフェイスのポート名はすべてavm_port0_で始まります

bull width mdash デ ー タ幅 を指定 し ま す こ の 値は ア ク セ ラ レ ー タ ー ボ ー ド のboard_specxml ファイルの対応する幅の値と一致している必要がありますboard_specxml ファイルでは幅の値は global_mem の interface要素で指定されています詳細は インテル FPGA SDK for OpenCL カスタムプラットフォームツールキットユーザーガイドの Board_specxml ファイル内の XML 要素属性およびパラメーターにある global_mem の章を参照ください

bull burstwidthmdashバーストサイズを表すために必要なビット数を指定します burstwidth = log(maxburst) +1 を使用しバーストサイズを計算しますこのmaxburstはboard_specxmlファイルで指定された対応する 大バーストサイズです例えば maxburst=16 の場合burstwidth=5 です

bull optypemdash Avalon-MM ポートが外部メモリーから読み取り (read) を行うか書き込み(write) を行うかを指定しますoptypeには readまたは writeのいずれかしか割り当てることができません

bull Buffer_locationmdash異種メモリーをサポートします異種メモリーコンパイルフローは現在検証されていないためこの属性は空白のままにしてください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

158

上のコード例で定義された AVALON_MEM要素に対応する RTL モジュールポートは次のようになります

output avm_port0_enableinput [5110] avm_port0_readdatainput avm_port0_readdatavalidinput avm_port0_waitrequestoutput [310] avm_port0_addressoutput avm_port0_readoutput avm_port0_writeinput avm_port0_writeackoutput [5110] avm_port0_writedataoutput [630] avm_port0_byteenableoutput [40] avm_port0_burstcount

MEM_INPUTで指定するポインターと AVALON_MEMで指定する Avalon-MM インターフェイス間に想定の関係はありませんRTL モジュールは 1 つのポインターを使用し0 から複数の Avalon-MMインターフェイスのアドレスを指定することができます

関連情報Board_specxml ファイル内の XML 要素属性およびパラメーター

121173 リソースを指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの FPGA リソース使用率を指定するために定義できるオプションの要素が RESOURCESにあります特定の要素を指定しない場合はデフォルト値のゼロになります

表 9 RTL モジュールの XML 仕様ファイルの RESOURCES 要素に関連する XML 要素

XML 要素 説明

ALUTS モジュールが使用する組み合わせ対応可能なルックアップテーブル (ALUT) の数を指定します

FFS モジュールが使用する専用のロジックレジスター数を指定します

RAMS モジュールが使用するブロック RAM の数を指定します

DSPS モジュールが使用するデジタル信号処理 (DSP) ブロックの数を指定します

MLABS モジュールが使用するメモリーロジックアレイ (MLAB) の数を指定します各 MLAB は 10の ALM を消費するためこの値はメモリーに使用される ALM (アダプティブロジックモード)の数を 10 で割った値に等しくなります

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

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

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

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

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

159

表 10 外部メモリーと通信する RTL モジュールのコード例

複雑な RTL モジュール 簡潔化された RTL モジュール

my_rtl_fn does out_ptr[idx] = fn(in_ptr[idx])my_rtl_fn (in_ptr out_ptridx)

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 forOpenCL オフラインコンパイラーにおいて非常に控えめなポインター分析が行われます

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

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

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

bull RTL モジュールがポインターへ書き込む場合OpenCL カーネルの他の部分はこのポインターに対する読み書きはできません

bull RTL モジュールがポインターから読み取る場合OpenCL カーネルの他の部分および他の RTL モジュールもまたこのポインターから読み取ることができます

bull MEM_INPUT属性の accessフィールドを設定することでRTL モジュールのメモリーポインターの使用方法を指定できます値を検証する方法がないためアクセスを行うための値が正しく設定されていることを確認してください

12119 RTL モジュールに入るスレッドの順序

RTL モジュールに入るスレッドが定義された順序に従うと想定しないでくださいさらにRTL モジュールはスレッドを並べ替えることができますよってスレッド 0 がスレッド 1 の前にモジュールに入るとは限りません

121110 RTL モジュールの OpenCL C モデル

OpenCL ライブラリーの各 RTL モジュールにはOpenCL C モデルが必要ですOpenCL C モデルはエミュレーション時に OpenCL システム全体を検証します

平方根関数の OpenCL C モデルファイル例

double my_sqrtfd (double a) return sqrt(a)

インテルではOpenCL システムをエミュレーションすることを推奨していますOpenCL システムをエミュレーションしない場合はXML 仕様ファイルで指定した関数名と一致する名前の空の関数を作成してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

160

関連情報RTL モジュールの XML 構文 (154 ページ)

121111 RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

RTL モジュールを使用し OpenCL ライブラリーを作成するとパーシャルリコンフィグレーションに関係する問題が発生する場合があります

パーシャルリコンフィグレーション (PR) をサポートしていないデバイスでライブラリーを作成し検証した後にライブラリーのユーザーがライブラリーの RTL モジュールを PR 領域で使用するとPR 後にモジュールが正しく機能しない可能性があります

PR を使用するデバイスで RTL モジュールを正しく機能させるため次の内容を確認してください

bull RTL モジュールは初期化されたコンテンツのメモリーロジックアレイブロック (MLAB) を使用していないこと

bull RTL モジュールはロジックのパワーアップ値に関していかなる仮定もしていないこと

PR コーディングの完全なガイドラインに関してはインテル Quartus Prime プロエディション ユーザーガイドパーシャルリコンフィグレーションのパーシャルリコンフィグレーションデザインの作成を参照ください

1212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

OpenCL ライブラリーファイルを作成する前にヘルパー関数を持つ各 OpenCL ソースファイルをaocoファイルにパッケージ化しますRTL モジュールとは異なりXML 仕様ファイルを作成する必要はありません

OpenCL で書かれたヘルパー関数を共有するためのライブラリーは通常作成する必要はありません例えば ltshared_filegtclなどのソース形式でヘルパー関数を配布しincludeltshared_filegtcl行を OpenCL カーネルのソースコードに挿入することができます

次のような状況においてライブラリーを作成することを検討ください

bull ヘルパー関数が複数のファイルにあり配布を簡素化する必要がある

bull ヘルパー関数のソースコードの公開を望まない

ヘルパー関数はアセンブリー言語のような LLVM IR として関連するライブラリーにコメントなしで格納されます

aocoファイルの作成にハードウェアの生成は必要ありません-cオフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

注意 ライブラリーには OpenCL ヘルパー関数のみを含むことができますライブラリーが OpenCL カーネルを含んでいる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはエラーメッセージを発行します

bull OpenCL ソースファイルをaocoファイルにパッケージ化するには次のコマンドを呼び出します aoc -c -shared ltOpenCL_source_file_namegtcl -oltOpenCL_object_file_namegtaoco

このオフラインコンパイラーコマンドオプション-sharedはOpenCL ライブラリーに含むために適したaocoファイルの作成をコンパイラーに指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

161

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

1213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化

OpenCL ライブラリーファイルを作成する前に各 RTL コンポーネントをaocoファイルにパッケージ化します

aocoファイルの作成においてハードウェアの生成は必要ありません-c インテル FPGA SDK forOpenCL オフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

bull RTL コンポーネントをaocoファイルにパッケージ化するには次のコマンドを呼び出しますaoc -c ltRTL component description file namegtxml -o ltRTLobject file namegtaoco

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull RTL モジュールの検証 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

12131 インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限

インテル FPGA SDK for OpenCL はOpenCL ライブラリーにおける RTL モジュールの使用をいくつかの制約と制限をともないサポートしています

RTL モジュールを作成する際は次の制約内で動作させることを確認してください

bull RTL モジュールは単一入力の Avalon-ST インターフェイスを使用する必要がありますつまりreadyと validロジックの単一ペアがすべての入力を制御しなければなりません

必要な Avalon-ST ポートを提供しRTL モジュールをストールのないモジュールとして宣言するオプションもありますこの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはモジュールに向けてラッパーを作成するため適切なストール動作を実装する必要はありません構文と使用法に関する詳細はRTL モジュールの XML 構文およびシンプルな関数で動作するOpenCL ライブラリーの使用 (例 1) を参照ください

注意 RTL モジュールが内部状態を持つ場合はivalid信号を適切に処理する必要があります詳しくはストールのない RTL を参照ください

bull RTL モジュールはカーネルのクロック周波数にかかわらず正確に動作する必要があります

bull データの入力および出力サイズはcharの 8 ビットから long16の 1024 ビットまでの有効なOpenCL データ型と一致する必要があります

例えば RTL モジュールで 24 ビットの値を使用する場合入力が 32 ビットになるよう宣言しSDK ライブラリーのヘッダーファイルで関数シグニチャーを宣言し uintデータ型を受け取るようにしますその後RTL モジュールで 32 ビットの入力を受け入れ上位 8 ビットを破棄します

bull RTL モジュールは外部 IO 信号に接続することができません入出力信号はすべてOpenCL カーネルから発行される必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

162

bull RTL モジュールにはclockポートresetnポートAvalon-ST 入力および出力ポート(ivalidovalidireadyoready) が必要ですここで指定されている通りに名前を付けてください

bull 外部メモリーと通信する RTL モジュールには対応するカスタムプラットフォームパラメーターに一致する Avalon メモリーマップド (Avalon-MM) ポートのパラメーターが必要ですオフラインコンパイラーは幅またはバーストの調整を行いません

bull 外部メモリーと通信する RTL モジュールは次のように動作する必要があります

mdash バースト境界を越えてバーストしないこと

mdash クロックサイクルごとに要求を行いアービトレーションロジックを独占しハードウェアをストールさせないことRTL モジュールは定期的に要求を一時停止し他のロードまたはストアユニットが動作を実行できるようにする必要があります

bull RTL モジュールは独立した OpenCL カーネルとして動作することはできませんRTL モジュールはヘルパー関数にしかなれずカーネルのコンパイル時に OpenCL カーネルに統合されます

bull RTL モジュールのインスタンス化に対応する関数呼び出しはすべて他のインスタンス化から完全に独立していますハードウェアの共有はありません

bull カーネルコード (kernelとしてマークされた関数) はaoclibライブラリーファイルに組み込まないでくださいカーネルコードをライブラリーファイルに組み込むとオフラインコンパイラーはエラーメッセージを発行しますヘルパー関数をライブラリーファイルに組み込むことは可能です

bull RTL コンポーネントはすべての入力を同時に受け取る必要があります単一の ivalid入力はすべての入力が有効なデータを含んでいることを意味します

bull SDK は IO RTL モジュールをサポートしません

bull RTL モジュールのパラメーターはOpenCL カーネルソースファイルではなく ltRTLmodule description file namegtxml仕様ファイルでのみ設定できます同じ RTLモジュールを複数のパラメーターで使用するには個別の FUNCTIONタグを各パラメーターの組み合わせに作成します

SDK の RTL モジュールのライブラリー機能に対するサポートには現在次の制限があります

bull RTL モジュールへのデータ入力はOpenCL カーネルコードを介した値でのみ渡すことができます参照渡し構造体またはチャネルを介し RTL モジュールにデータ入力を渡さないでくださいチャネルデータの場合はまずチャネルからデータを抽出し抽出したスカラーデータを RTL モジュールに渡します

注意 参照渡しまたは構造体によってデータ入力を RTL モジュールに渡すとオフラインコンパイラーで致命的なエラーが発生します

bull デバッガー (Linux の GDBなど) はエミュレーション中にライブラリー関数にステップインできませんさらに 適化レポートおよびエリアレポートはライブラリー関数の横にコード行番号を含みません

bull RTL モジュールのソースファイル名は インテル FPGA SDK for OpenCL オフラインコンパイラー IP ファイル名と競合することはできませんRTL モジュールのソースファイルとオフラインコンパイラーの IP ファイルはどちらも ltkernel file namegtsystemsynthesissubmodulesディレクトリーに格納されます名前が競合するとディレクトリーにある既存のオフラインコンパイラー IP ファイルがRTL モジュールのソースファイルに上書きされます

bull SDK はqipファイルをサポートしませんネスト化されたqipファイルを手動で解析しRTLファイルのフラットリストを作成する必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

163

bull 単独では正しく動作する一方でOpenCL カーネルの一部としては正しく動作しない RTL モジュールをデバッグすることは非常に困難です ltRTL module description filenamegtxmlファイルの ATTRIBUTES要素にあるパラメーターをすべて再度確認してください

bull オフラインコンパイラーのエリア見積りツールはすべてRTL モジュールのエリアが 0 であると仮定していますSDK は現在RTL モジュールのエリアモデルを指定する機能をサポートしていません

bull RTL モジュールはカーネルクロックと同位相でありカーネルクロック周波数の 2 倍の2x クロックにアクセスできません

関連情報bull RTL モジュールの XML 構文 (154 ページ)

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

bull ストールのない RTL (150 ページ)

1214 RTL モジュールの検証

OpenCL ライブラリーの作成者はライブラリーの RTL モジュールを独立したエンティティーとしてまた OpenCL システムの一部として検証する責任があります

1 各 RTL モジュールを標準のハードウェア検証方法にて検証します

2 インテル FPGA SDK for OpenCL ライブラリーデザイン例の 1 つを変更しOpenCL システム全体において RTL モジュールをテストします

この手順はライブラリーのユーザーがハードウェアの問題に直面しないようにするために重要です

XML 仕様ファイルの ATTRIBUTES要素の値を正しく設定していることが重要ですOpenCL システム全体をシミュレーションすることはできないためインターフェイスレベルのエラーによって発生する問題はハードウェアを動作させるまで検出されない可能性があります

3 注意 インテル FPGA SDK for OpenCL libraryユーティリティーはXML 仕様ファイルとソースファイルの整合性を確認しますがそれにはいくつかの制限があります

aocl library [ltcommand optiongt]コマンドを呼び出します

bull サポートされている ltcommand optionsgt リストは aocl library コマンドで呼び出します

bull libraryユーティリティーはXML 仕様ファイルの ATTRIBUTESMEM_INPUTAVALON_MEM要素内の要素に割り当てられている値のエラーを検出しません

bull library ユーティリティーはRTL 構文のエラーを検出しませんRTL 構文のエラーについては ltyour_kernel_filenamegtquartus_sh_compilelogファイルを確認する必要がありますただしエラーの解析には時間を要する可能性があります

1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化

OpenCL ライブラリーに含めるaocoファイルを作成後 インテル FPGA SDK for OpenCLlibraryユーティリティーコマンドオプションを呼び出しそれらをライブラリーファイルにパッケージ化します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

164

bull 複数のオブジェクトファイルを単一のライブラリーファイルにパッケージ化するには次のコマンドを呼び出します aocl library create -o ltlibrary filenamegtaoclib ltobject file 1gtaoco [ltobject file 2gtaoco ltobject file Ngtaoco]

aocl libraryユーティリティーコマンドは ltlibrary file namegtaoclibライブラリーファイルを作成しますこのファイルにはコマンドで指定したaocoオブジェクトファイルが含まれていますライブラリーファイルにはRTL ベースのオブジェクトファイルおよびOpenCL ベースのオブジェクトファイルをどちらも含むことができます

1216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定

OpenCL カーネルで OpenCL ライブラリーを使用するにはカーネルをコンパイルする際にライブラリーファイル名とディレクトリーを指定します

重要 ライブラリーを使用してもカーネルのコンパイル時間は短縮されません

bull OpenCL ライブラリーを インテル FPGA SDK for OpenCL オフラインコンパイラーに指定するには次のコマンドを呼び出します aoc -l ltlibrary_file_namegtaoclib [-Lltlibrary directorygt] ltkernel file namegtcl

この-l ltlibrary_file_namegtaoclibコマンドオプションはライブラリーファイル名を指定し-L ltlibrary directorygt コマンドオプションはライブラリーファイルを含むディレクトリーを指定します

-l ltlibrary file namegt および-L ltlibrary directorygt の複数のインスタンスをオフラインコンパイラーコマンドに含めることができます

例えば関数 my_div_fd()my_sqrtfd()myrsqrtfd()を含むライブラリーを作成する場合OpenCL のカーネルコードは次のようになります

include ldquolib_headerhrdquo

kernel void test_lib ( global double restrict in global double restrict out int N) int i = get_global_id(0) for (int k =0 k lt N k++) double x = in[iN + k] out[iN + k] = my_divfd (my_rsqrtfd(x) my_sqrtfd(my_rsqrtfd (x)))

注意 ライブラリー関連の行は太字で強調されています

対応する lib_headerhファイルは次のようになります

double my_sqrtfd (double x)double my_rsqrtfd(double x)double my_divfd(double a double b)

1217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー)

インテル FPGA SDK for OpenCL シミュレーターは OpenCL ライブラリーの機能性を評価します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

165

インテル FPGA SDK for OpenCL シミュレーターはx86-64 Windows または Linux ホストで動作するaocxファイルを生成しますこの機能により毎回ハードウェアにライブラリーをコンパイルしたり FPGA で動作させたりすることなくカーネルの機能性のシミュレーションやデザインのイタレーションができるようになります

OpenCL ライブラリーの動的なパフォーマンスをより深く理解することが必要な場合や OpenCL ライブラリー機能の正確性に関しエミュレーションや OpenCL のレポートツールが提供する内容以上の情報が必要な場合はシミュレーターを使用してください

シミュレーターはサイクル精度が高くハードウェアを生成するのと同じネットリストを持ちデバッグに向けた完全な波形を提供することが可能です波形は Mentor Graphics ModelSim ソフトウェアで確認してください

12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

シミュレーションに向け OpenCL ライブラリーをコンパイルするには-march=simulatorオプションを aocコマンドに含めますシミュレーション中の波形収集を有効にするには-ghdlオプションを aocコマンドに含めます

bull ライブラリーのシミュレーションを実行する前に次の作業を実行してください

mdash FPGA アクセラレーターボードにボードメーカーが提供しているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアのインストールフォルダーを指していることを確認します

bull Windows システムでライブラリーをシミュレーションするにはMicrosoft のリンカーおよびコンパイル時のライブラリーが追加で必要になりますPATH 環境変数設定に インテル FPGASDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設定が インテル FPGA SDK for OpenCL スタートガイドのインテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

bull 特定のボードをターゲットとするシミュレーションをコンパイルするには aoc-march=simulator -ghdl -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードにおける機能的なエラーの原因を特定できるようになります

12172 OpenCL ライブラリーのシミュレーション

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

166

シミュレーション中に生成された波形を確認するには Mentor Graphics ModelSim ソフトウェアをインストールしコンフィグレーションする必要があります

重要 エミュレーターとシミュレーターを同じ端末またはコマンドプロンプトセッションから実行する場合シミュレーターを実行する前にエミュレーターの環境変数設定(CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA) を解除しますエミュレーター環境変数の設定が解除されていないとシミュレーションはエラーにより失敗します

エミュレーターとシミュレーターは別々の端末セッションまたはコマンドプロンプトセッションから実行することもできます

OpenCL ライブラリーをシミュレーターで実行するには以下を行います

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションの構築に必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーの一覧を表示します

2 ホストアプリケーションを構築し手順 1 のライブラリーにリンクします

ヒント

他の OpenCL SDK とともに複数のデバイスをエミュレーションするにはホストランタイムのライブラリーに接続する前 にホストアプリケーションを Khronos ICD LoaderLibrary に接続しますホストアプリケーションを ICD Loader Library に接続するにはホストアプリケーションの Makefileを変更します詳細はホストアプリケーションとKhronos ICD Loader Library のリンクを確認ください

3 必要であればaocxファイルをホストが容易に見つけることのできる位置に動かします現在の作業ディレクトリーが推奨されます

4 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA環境変数を設定しシミュレーションデバイスを有効にします

mdash Windows の場合

set CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

mdash Linux の場合

env CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

注意

環境変数 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA を設定するとシミュレーションデバイスのみが利用可能になりますすなわち物理的なボードおよびエミュレーションデバイスへのアクセスは無効になります

ホストプログラムがシミュレーションデバイスを識別できない場合CL_CONTEXT_COMPILER_MODE_INTELFPGA=3を設定する必要があります

5 ホストプログラムを実行します

ホストコードとデバイスをデバッグするにはgdb または Eclipse でホストコードを実行します

ホストプログラムを実行すると波形ファイル vsimwifが作成されますこの波形ファイルはホストコードを実行時に ModelSim ソフトウェアで確認することができますvsimwifファイルはホストプログラムを実行しているディレクトリーと同じディレクトリーに書き込まれます

6 ホストまたはカーネルプログラムを変更しテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしシミュレーションを再度実行してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

167

12173 シミュレーターの制限

シミュレーターの制限を確認しシミュレーションを試みる際に発生する可能性がある問題をトラブルシューティングしてください

Windows のコンパイルが失敗しホストプログラムがaocxファイルの破損を報告している場合

deviceclファイルをコンパイルする際のディレクトリーパスが長すぎる可能性があります-oコンパイラーオプションを使用し短いパスでコンパイル結果を出力してください

socket=-11エラーが transcriptlogに記録される場合

次のエラーメッセージが表示される場合 ModelSim - Intelreg FPGA Edition と ModelSim SE のリソースを混同しています

Message srchls_cosim_ipc_socketcpp202 void IPCSocketMasterconnect()Assertion `sockfd = -1 ampamp IPCSocketMasterconnect() call to accept() failed failed

ModelSim リソースの混同例には ModelSim SE でデバイスをコンパイルしホストプログラムをModelSim - Intel FPGA Edition で実行している場合などがあります

ホストプログラムを実行するとセグメンテーション違反が発生する場合

ホストプログラムを実行した際にセグメンテーション違反が発生する場合は同じ端末またはコマンドプロンプトセッションからエミュレーターとシミュレーターを実行している可能性がありますシミュレーターを実行する前にエミュレーターの環境変数設定を必ず解除してください

同じ端末セッションまたはコマンドプロンプトセッションでデバイスとホストプログラムをコンパイルしないようにしてください別々のセッションを使用することで起こりうる環境変数の競合を回避できます

1218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)

インテルでは倍精度関数を 3 つ実装した (sqrtrsqrtdivide) RTL を含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example1tgzターボールにはライブラリーカーネルおよびホストシステムが含まれていますexample1clカーネルソースファイルには2 つのカーネルが含まれますカーネルのtest_libはライブラリー関数を使用しますすなわちカーネルの test_builtinは組み込み関数を使用しますホストは両方のカーネルを実行しそれらの出力とランタイムを比較しますインテルでは同じ方法でご自身がデザインしたライブラリー関数を検証することを推奨しています

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページからexample1tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example1aocx Create buffersGenerate random data for conversionEnqueuing both library and builtin in kernels 4 times with global size 65536Kernel computation using library function took 535333 secondsKernel computation using built-in function took 539949 secondsReading results to buffers

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

168

Checking resultsLibrary function throughput is within 5 of builtin throughputPASSED

関連情報OpenCL デザイン例のページ

1219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2)

インテルではグローバルメモリーと通信する 2 つの RTL モジュールを含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example2tgzターボールにはライブラリーカーネルそしてホストシステムが含まれていますこの例においてグローバルメモリーと通信する RTL コードはカスタムプラットフォームまたはリファレンスプラットフォームに依存しますコンパイルがStratix V Network Reference Platform に対応するボードをターゲットとしていることを確認してください

インテルではRTL モジュールの copyElement()および sumOfElements() を インテルFPGA SDK for OpenCL オフラインコンパイラーを使用し生成しました インテル FPGA SDK forOpenCL オフラインコンパイラーはコードの追加入力を示します

Example2clカーネルソースファイルは 2 つのカーネルを含みますカーネル test6はcopyElement() RTL 関数を呼び出す NDRange カーネルでありデータを B[]から A[]へコピーし global_id+100を C[]に格納しますカーネル test11はRTL 関数を使用する単一ワークアイテムのカーネルですsumOfElements() RTL 関数は範囲[i N]の A[]の要素の合計を確定し残りを C[i]に追加します

注意 sumOfElements(i=0)の 初の呼び出しの実行はその後の呼び出しよりも時間がかかります

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページから example2tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example2aocx Running test6Launching the kernel test6 with globalsize=128 localSize=16Loading example2aocx Running test11Launching the kernel test11 with globalsize=1 localSize=1PASSED

関連情報bull OpenCL デザイン例のページ

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull Intel FPGA SDK for OpenCL Stratix V Network Reference Platform Porting Guide

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

169

12110 OpenCL ライブラリーのコマンドラインオプション

インテル FPGA SDK for OpenCL オフラインコンパイラーの一連のコマンドおよびSDK ユーティリティーはOpenCL ライブラリーに関連するタスクを実行するために呼び出すことができるオプションを含んでいます

表 11 ライブラリーに関連する インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドオプション

コマンドオプション 説明

-shared -rtlコマンドオプションとともにOpenCL ソースファイルをオブジェクトファイル (aoco) へコンパイルしますその後それをライブラリーに含めることができますaoc -rtl -shared ltOpenCL source file namegtcl -oltOpenCL object file namegtaoco

-I=ltlibrary_directorygt ltlibrary directorygt をヘッダーファイルの検索パスに追加します

aocl -I ltlibrary_header_file_directorygt -lltlibrary_file_namegtaoclib ltkernel_file_namegtcl

-L=ltlibrary directorygt ltlibrary directorygt を OpenCL ライブラリーの検索パスに追加します「-L」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-l=ltlibrary_file_namegtaoclib OpenCL ライブラリーファイル ( ltlibrary_file_namegtaoclib) を指定します「 -l 」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-library-debug ライブラリーに関連のあるデバッグ出力を生成します追加の出力の一部はstdout に表示されその他の部分は ltkernel_file_namegtltkernel_file_namegtlog ファイルに表示されます

aoc -l=ltlibrary_file_namegtaoclib -library-debugltkernel_file_namegtcl

表 12 インテル FPGA SDK for OpenCL ライブラリーユーティリティー (aocl library) のコマンドオプション

コマンドオプション 説明

hdl-comp-pkg ltXML_specification_filegtxml

単一の HDL コンポーネントをaocoファイルにパッケージ化しますそれをその後ライブラリーに含みますこのコマンドの呼び出しは aoc -rtlltXML_specification_filegtxmlを呼び出すことに類似していますただしaoclは環境チェックを行わないため処理時間は短くなります

aocl library hdl-comp-pkg ltXML_specification_filegtxml -o ltoutput_filegtaoco

-rtl ltXML_specification_ filegtxml hdl-comp-pkg ltXML_specification_ filegtxmlと同じ機能ですaocl library -rtl ltXML_specification_ filegtxml

create hdl-comp-pkgユーティリティーオプションまたは aoc -shared コマンドを呼び出すことによって作成したaocoファイルからライブラリーファイルそしてその他のaoclibライブラリーを作成します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

170

コマンドオプション 説明

aocl library create [-name ltlibrary_namegt] [-vendor ltlibrary_vendorgt] [-versionltlibrary_versiongt] [-o ltoutput_filegtaoclib][aoco] [aoclib]

この-name-vendor-versionはオプションの情報文字列でそれらを指定しライブラリーに加えることができます

list ltlibrary_namegt ライブラリーの RTL コンポーネントをすべてリスト表示します現在このオプションはOpenCL 関数のリスト化には利用できません

aocl library list ltlibrary_namegt

help インテル FPGA SDK for OpenCL ライブラリーユーティリティーオプションのリストとその説明を画面上に表示しますaocl library help

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性

インテル FPGA SDK for OpenCL はデザインのコンスタントローカルおよびプライベート変数に適用できるカーネルメモリー属性を提供しますそれらを使用しローカルメモリーシステムおよびプライベートメモリーシステムのオンチップメモリーアーキテクチャーをカスタマイズすることが可能です

注意 これらのローカルメモリーカーネル属性はコンスタントローカルまたはプライベート変数にのみ適用してください

表 13 ローカルメモリーをコンフィグレーションするための OpenCL の属性

属性 説明

register ローカル変数がレジスターのパイプラインを介して伝達される必要があることを指定しますレジスター変数の実装はFF のみで行うこともFF と RAM ベースのFIFO を組み合わせて行うことも可能です

memory(impl_type) ローカル変数をメモリーシステムに実装する必要があることを指定しますメモリーカーネル属性を含めることはローカル変数を__local修飾子で宣言することと同等ですオプションで文字列引数を渡しメモリーの実装タイプを指定することが可能ですimpl_type に BLOCK_RAMまたは MLABを指定するとメモリーはそれぞれメモリーブロック (M20K など) またはメモリーロジックアレイブロック(MLAB) を使用し実装されます

numbanks(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

bankwidth(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN バイト幅のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

singlepump ローカル変数を実装しているメモリーシステムをシングルポンピングする必要があることを指定します

doublepump ローカル変数を実装しているメモリーシステムをダブルポンピングする必要があることを指定します

numreadports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の読み出しポートを有する必要があることを指定しますN は 0 より大きい整数値です

numwriteports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の書き込みポートを有する必要があることを指定しますN は 0 より大きい整数値です

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

171

属性 説明

merge(label direction) 2 つ以上の変数を同じメモリーシステムに実装するように強制しますlabel は任意の文字列です結合しようとしている変数に同じラベルを割り当てますdirection に widthもしくは depthを指定しメモリーをそれぞれ幅方向または深さ方向のどちらに結合するかを特定します

bank_bits(b 0 b 1 b n ) メモリーシステムを2n のバンクに分割するよう強制しますb 0 b 1 b nはバンク選択ビットを形成しています重要 b 0 b 1 hellipb n はかならず連続する正の整数にしてください

bank_bits属性なしで numbanks(n)属性を指定するとバンク選択ビットはデフォルトで 下位ビット (01helliplog2(numbanks)-1) になります

max_concurrency(N) メモリーが 大 N 個のプライベートコピーを保有しN 回のループの同時反復を常に実行することを指定しますここで N は2 の累乗に切り上げられます(宣言またはアクセスパターンによって) 変数の範囲がループに限定されている場合この属性を適用しますループがpragma max_concurrency M も持っている場合作成されるプライベートコピーの数はmin(MN)になります

表 14 メモリー属性のコード例

ユースケース例 構文

レジスターに変数を実装する int __attribute__((register)) a[12]

それぞれ 8 バイト幅の 8 つのバンクを持つメモリーシステムを実装する int __attribute__((memory numbanks(8) bankwidth(8)) b[16]

ダブルポンピングのメモリーシステムを128 バイト幅のバンク 1 つ書き込みポート 1 つ読み出しポート 4 つとともに実装する

int __attribute__((memory numbanks(1) bankwidth(128) doublepump numwriteports(1) numreadports(4)) c[32]

structのデータメンバーにメモリー属性を適用することも可能ですstruct 宣言の structデータメンバーに属性を指定してくださいstructのオブジェクトのインスタンス化に属性を適用するとこの属性は structデータメンバーの宣言で指定された属性を上書きします以下を例として示します

struct State int array[100] __attribute__((__memory__)) int reg[4] __attribute__((__register__)) __kernel void sum() struct State S1 struct State S2 __attribute__((__memory__)) some uses

オフラインコンパイラーは S1 をメモリーに実装される S1array[100]とレジスターに実装される S1reg[4]の 2 つの変数に分割しますただしS2には memory属性が適用されているためコンパイラーは struct宣言でオブジェクト S2に適用された属性を無視しそれを分割しません

関連情報bull ローカルメモリーのバンキングによるカーネルパフォーマンスの向上

bull メモリーレプリケーションファクタの制御によるローカルメモリーへのアクセスの 適化

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

172

1221 変数固有の属性を使用する際の制約

サポートされていない変数固有の属性の使用法または不正なメモリー構成を検出した場合 インテルFPGA SDK for OpenCL オフラインコンパイラーではエラーが発生するもしくは警告を発行します

コンパイルエラーの原因となる変数固有の属性のサポートされていない使い方

bull カーネル属性をコンスタントローカルまたはプライベート変数の宣言以外の宣言で使用している (例えば関数パラメーターの宣言グローバル変数宣言関数宣言など)

bull register属性を他の変数固有の属性と組み合わせて使用している

bull singlepumpと doublepump属性をどちらも同じ変数宣言に含んでいる

bull singlepumpおよび doublepump属性をnumreadportsまたは numwriteports属性を含まずに指定している

bull numreadports属性を指定する際に numwriteports属性を同じ変数宣言に含んでいないまたはその逆

bull 同じ変数宣言に numbanksと bankwidth属性を含まずに次の属性のいずれかを指定している

mdash numreadports

mdash numwriteports

mdash singlepump

mdash doublepump

コンパイル時にオフラインコンパイラーが警告を発行する原因となる不正なメモリー構成

bull 変数固有の属性で定義されているメモリー構成が利用可能なストレージサイズを超えている (例えば8 バンクのローカルメモリーを整数変数に指定するなど)

コンパイルエラーの原因となる不正なメモリー構成

bull バンク幅がデータのストレージサイズよりも小さい (例えば 4 バイト整数の配列の場合バンク幅は2 バイトです)

bull 変数にメモリーのコンフィグレーションを指定しているコンパイラーの制約またはコーディングスタイルのためオフラインコンパイラーはメモリーを分割するのではなく同じメモリーに変数を実装します

bull register属性を変数に指定しているコンパイラーの制約またはコーディングスタイルによりオフラインコンパイラーは変数をレジスターに実装できません

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性

インテル FPGA SDK for OpenCL にはロジック使用率を低減しカーネルのパフォーマンスを向上させるカーネル属性が含まれておりそれを単一のワークアイテムカーネルに含むことができますこれらのカーネル属性により インテル FPGA SDK for OpenCL オフラインコンパイラーは不要なハードウェアの生成を省略し効率を向上させることが可能になります

1231 カーネルインターフェイスに向けたハードウェア

インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルのパイプライン周辺にハードウェアを生成します一部の OpenCL アプリケーションではこれらのインターフェイスのハードウェアコンポーネントは不要です

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

173

カーネルパイプライン周辺のハードウェアは次のような機能において必要です

bull ワークアイテムおよびワークグループ ID の振り分け

bull カーネル引数とワークグループのサイズに関するホストとの通信

図 20 (174 ページ) はオフラインコンパイラーが次のカーネルをコンパイルする際に生成するハードウェアを表しています

__kernel void my_kernel(global int arg) hellip int sum = 0 for(unsigned i = 0 i lt n i++) if(sum lt m) sum += val arg = sum hellip

図 -20 カーネルパイプライン周辺に インテル FPGA SDK for OpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

12311 カーネル ID を生成し振り分けるハードウェアの省略

Max_global_work_dim(0)カーネル属性はグローバルローカルまたはグループ ID を生成しコンパイルされたカーネルに振り分けるロジックを省略するよう インテル FPGA SDK forOpenCL オフラインコンパイラーに指示します

意味的に max_global_work_dim(0)カーネル属性はカーネルのグローバルワークサイズがゼロであることを指定しますこのカーネル属性を設定するとカーネルがグローバルローカルまたはグループ ID を使用しないことを意味しますカーネルコード内のこの属性の存在はカーネルが単一のワークアイテムカーネルであるということをオフラインコンパイラーに対し保証しています

次のカーネルをコンパイルするとオフラインコンパイラーは図 21 (175 ページ) で表されているインターフェイスハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__kernel void plusK (int N int k) for (int i = 0 i lt N ++i) int data_in = read_channel_intel(chan_in)

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

174

write_channel_intel(chan_out data_in + k)

図 -21 max_global_work_dim(0) 属性をともなうカーネルに向けて インテル FPGA SDK forOpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

現在のカーネル実装に複数のワークアイテムがありグローバルローカルまたはグループ ID を使用していない場合次のようにカーネルコードを変更するとmax_global_work_dim(0)カーネル属性を使用することができます

1 ワークアイテムと同じ数だけ反復する forループのカーネル本体をラップする

2 変更したカーネルを 1 つのワークアイテムのみで起動する

12312 ホストとカーネル間の通信ハードウェアの省略

autorunカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーにホストとカーネルの通信に使用されるロジックを省略するよう指示します autorun属性を使用するカーネルはホストが明示的に起動するカーネルよりも前に自動的に実行を開始しますさらにこのカーネルは実行が終了するとすぐに自動的に再起動します

autorunカーネル属性はオフラインコンパイラーに対しカーネルが独立して実行されどのホストからもエンキューされないことを通知します

autorun属性を活用するにはカーネルが次の基準をすべて満たしている必要があります

1 IO チャネルを使用しないこと

注意 カーネルからカーネルへのチャネルはサポートされています

2 引数を持たないこと

3 max_global_work_dim(0)属性または reqd_work_group_size(XYZ) 属性のどちらかを持つこと

注意 reqd_work_group_size(XYZ) 属性のパラメーターは 232 の除数である必要があります

前述のようにautorun属性のあるカーネルは引数を持つことができずホストが明示的に起動することなく実行を開始しますそのためオフラインコンパイラーはホストとカーネルの通信のためのロジックを生成する必要がありませんこのロジックを省略するとロジック使用率が低下しオフラインコンパイラーがパフォーマンスの 適化をさらに適用することが可能になります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

175

autorun属性の一般的な使用例はカーネル間の 1 つ以上のチャネルからデータを読み取りデータを処理しその結果を 1 つ以上のチャネルに書き込むカーネルですカーネルをコンパイルするとオフラインコンパイラーは図 22 (176 ページ) で表されているようにハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__kernel void plusOne () while(1) int data_in = read_channel_intel(chan_in) write_channel_intel(chan_out data_in + 1)

図 -22 インターフェイスハードウェアのない単一ワークアイテムカーネル

Host Link Hardware

Kernel ID Generators

Kernel

12313 clEnqueueNDRangeKernel API の global_work_offset引数をサポートするハードウェアの省略

uses_global_work_offset(0) のカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーに対しNDRange カーネルの 0 以外または NULL 以外のglobal_work_offset引数をサポートするために必要なハードウェアを省略するよう指示します

このカーネル属性は0 もしくは NULL の global_work_offset引数で必ずエンキューされるカーネルすべてに推奨されますこのカーネル属性が設定されるとインテル FPGA ホストランタイムは0 以外もしくは NULL 以外の global_work_offset引数でカーネルがエンキューされた場合にCL_INVALID_GLOBAL_OFFSETエラーコードを返します

124 num_compute_units(XYZ) 属性を使用したカーネルの複製

num_compute_units(XYZ) カーネル属性を含めると単一ワークアイテムの OpenCL カーネルを複製することができます

計算ユニット数の指定 で示されているようにnum_compute_units(N) カーネル属性をカーネルに含めることで インテル FPGA SDK for OpenCL オフラインコンパイラーに対し複数の計算ユニットを生成しデータを処理するよう指示しますnum_compute_unit(N) 属性はオフラインコンパイラーにカーネルの同一のコピーを N 個ハードウェアに生成するよう指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

176

注意 データに依存するカーネルの処理を制御している特定の計算ユニットを識別するにはget_compute_id()組み込み関数を呼び出します

関連情報bull get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

bull 計算ユニット数の指定 (33 ページ)

1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ

それぞれの違いがわずかで共通するコードを多く持つ複数の計算ユニットを作成するにはnum_compute_units (XYZ) 属性を使用しているカーネルで get_compute_id() 組み込み関数を呼び出します

注意 get_compute_id() 関数はautorunおよび max_global_work_dim(0) カーネル属性を使用するカーネルにのみ使用することができます

計算 ID の取得はカーネルをソースコードに複写し各カーネルのコピーに特定のコードを追加することに代わる有用な方法ですカーネルが num_compute_units(XYZ) 属性を使用しget_compute_id() 関数を呼び出すと インテル FPGA SDK for OpenCL オフラインコンパイラーは固有の計算 ID を各計算ユニットに割り当てますその後 get_compute_id() 関数はそれらの固有の計算 ID を取得します計算 ID を使用することで関連付けられている計算ユニットの動作を指定し同じカーネルのソースコードから派生した他の計算ユニットと異なる動作をさせることが可能です例えばget_compute_id() の戻り値を使用しチャネルの配列にインデックスを付け各計算ユニットが読み書きするチャネルを指定することができます

num_compute_units属性は 大 3 つの引数を受け取ります(num_compute_units(XYZ))get_compute_id() 関数とともにこの属性を使用すると1 次元2 次元および 3 次元のロジック配列の計算ユニットを作成することが可能になります計算ユニットの 1D 配列の使用例には線形パイプラインのカーネル (カーネルのデイジーチェーンとも呼ばれる) があります計算ユニットの 2D 配列の使用例はカーネルのシストリックアレイです

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

177

図 -23 4x4 配列の計算ユニットの概略図次のコード例はnum_compute_units(44)を単一ワークアイテムカーネルで指定しておりこれは 4x4=16 の計算ユニットで構成される 4x4 配列になります

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__attribute__((num_compute_units(44)))__kernel void PE()

row = get_compute_id(0) col = get_compute_id(1)

hellip

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

0

3

2

1

3210col

row

3D 配列の計算ユニットにおいては論理計算ユニット配列の計算ユニットの XYZ 座標をget_compute_id(0)get_compute_id(1)get_compute_id(2)をそれぞれ使用することで取得できますこの場合の API はワークアイテムの組み込み関数 API(get_global_id()get_local_id()get_group_id()) と非常に類似しています

グローバル IDローカル IDおよびグループ ID はホストがカーネルを呼び出す方法によってランタイムで変化しますただし計算 ID はコンパイル時に認識されるためオフラインコンパイラーは各計算ユニットに 適化されたハードウェアを生成できます

1242 カーネルコピーでのチャネル使用

カーネルを複製コピーした計算ユニットにチャネルを実装するにはチャネルの配列を作成しget_compute_id() の戻り値を使用しその配列にインデックスを付けます

次のコード例は複数の計算ユニットにチャネルを実装しています

define N 4channel int chain_channels[N+1]

__attribute__((max_global_work_dim(0)))__kernel void reader(global int data_in int size) for (int i = 0 i lt size ++i) write_channel_intel(chain_channels[0] data_in[i])

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

178

__attribute__((max_global_work_dim(0)))__attribute__((autorun)) __attribute__((num_compute_units(N))) __kernel void plusOne() int compute_id = get_compute_id(0) int input = read_channel_intel(chain_channels[compute_id]) write_channel_intel(chain_channels[compute_id+1] input + 1)

__attribute__((max_global_work_dim(0)))__kernel void writer(global int data_out int size) for (int i = 0 i lt size ++i) data_out[i] = read_channel_intel(chain_channels[N])

図 -24 チャネルを実装するカーネルコピーのトポロジー例この図は上記 OpenCL アプリケーションコードが生成するカーネルグループのトポロジーを表しています

reader writer+1 +1 +1 +1

DDR4 DDR4kernel copies created using num_compute_units(N)

注意 このカーネルコピーの実装はソースコードに 4 つのカーネルを個別に定義しchain_channels[N]へアクセスするためのインデックスをそれぞれハードコーディングすることと機能的に同等です

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

インテル 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() 関数は次のような目的で使用します

bull 大規模なストリックアレイを処理する要素間など空間的に離れたデータパスの間のクリティカルパスの切断

bull 空間的に異なるカーネル実装によって発生する配置とルーティングエフォートの負荷の軽減

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

179

__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 つより多くのレジスターをパスに挿入する場合があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

180

A OpenCL 機能のサポート状況

インテル FPGA SDK for OpenCL のホストランタイムは明確にした内容と例外をともなうかたちでOpenCL プラットフォームレイヤーおよびアプリケーションプログラミングインターフェイス (API)に準拠しています

OpenCL10 の機能のサポート状況 (181 ページ)

OpenCL 12 の機能のサポート状況 (186 ページ)

OpenCL 20 の機能のサポート状況 (187 ページ)

インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ)

A1 OpenCL10 の機能のサポート状況

以降の章ではOpenCL Specification version 10 に記載されている OpenCL 機能のサポート状況の概要を説明します

A11 OpenCL10 C プログラミング言語の実装

OpenCL は一部制限をともなうかたちで C99 に基づいていますOpenCL Specification version10 の Section 6 はOpenCL C プログラミング言語について説明しています インテル FPGA SDKfor OpenCL は明確化された内容と例外をともない OpenCL C プログラミング言語に準拠しています次の表はOpenCL プログラミング言語の実装における機能に対するサポート状況の概要です内容を明確化することなくサポートしている OpenCL プログラミング言語の実装に関しては記載していません

サポート状況の表の見方

シンボル 説明

この機能はサポートされており備考欄にてサポートされている内容を明確にしています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

セクション

機能 サポート状況 備考

611 組み込みスカラーデータ型

倍精度浮動小数点 倍精度浮動小数点の組み込みスカラーデータ型すべてに対する暫定サポートですこの機能はOpenCL Specification version 10 に準拠していない可能性があります現在次の倍精度浮動小数点関数はOpenCL Specification version10 に準拠すると考えられています

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

セクション

機能 サポート状況 備考

add subtract multiply divide ceil floor rint trunc fabs fmax fmin sqrt rsqrt exp exp2 exp10 log log2 log10 sin cos asin acos sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

半精度浮動小数点 スカラーの加算減算乗算に対するサポートです単精度浮動小数点との変換をサポートしますこの機能はOpenCL Specification version 10 に準拠していない可能性がありますこの機能はエミュレーターでサポートされています

612 組み込みベクトルデータ型 3 要素のベクトルに対する暫定サポートです3 要素ベクトルのサポートはOpenCL Specification version 10 を補うものです

613 その他の組み込みデータ型 SDK はイメージをサポートしていないためイメージ型またはサンプラー型をサポートしていません

621 暗黙的な変換 スカラー型とベクトル型の暗黙的な変換に関する重要な説明についてはOpenCL Specification version 12 の Section 626UsualArithmetic Conversions を参照してください

622 明示的なキャスト SDK ではスカラーを異なる要素型のベクトルにキャストできます

65 アドレス空間修飾子 関数スコープ__constant変数はサポートされていません

66 イメージアクセス修飾子 X SDK はイメージをサポートしていません

67 関数修飾子

672 オプションの属性修飾子 カーネルのパフォーマンス向上に向けた reqd_work_group_sizeの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照くださいSDK は vec_type_hintと work_group_size_hint属性修飾子の解析は行いますがそれらを無視します

69 プリプロセッサーディレクティブとマクロ

pragmaディレクティブ (pragmaunroll)

インテル FPGA SDK for OpenCL オフラインコンパイラーはpragmaunrollのみサポートしています整数引数をアンロールディレクティブに割り当てループ展開の範囲を制御することができます例えばpragma unroll 4はループの 4 つの反復を展開します展開係数のないアンロールディレクティブの場合デフォルトでオフラインコンパイラーはループを完全に展開しようと試みますカーネルのパフォーマンス向上に向けたpragma unrollの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

値 1に定義された__ENDIAN_LITTLE__

ターゲット FPGA はリトルエンディアンです

__IMAGE_SUPPORT__ X __IMAGE_SUPPORT__は未定義ですSDK はイメージをサポートしていません

610 Attribute Qualifiersmdashオフラインコンパイラーは以下ように属性修飾子を解析します

6103 変数の属性を指定する (endian) X

6104 ブロック属性と制御フローステートメント属性の指定

X

6105 属性修飾子の拡張 オフラインコンパイラーはさまざまな構文構造の属性を解析することができますまた内部使用のためにいくつかの属性名を予約していますこれらのカーネル属性を使用しカーネルのパフォーマンスを 適化する方法については インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

182

セクション

機能 サポート状況 備考

6112 数学関数

組み込み数学関数 倍精度浮動小数点の組み込み数学関数に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

組み込み数学関数の half_とnative_

倍精度浮動小数点の組み込み数学関数 half_および native_に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

6115 ジオメトリック関数 倍精度浮動小数点の組み込みジオメトリック関数に対する暫定サポートですこの関数は OpenCL Specification version 10 に準拠していない可能性がありますSDK でサポートされる組み込みのジオメトリック関数のリストについては組み込みジオメトリック関数の引数型 を参照してください

6118 イメージ読み取りおよび書き込み機能 X SDK はイメージをサポートしていません

6119 Synchronization Functionsmdash バリアー同期機能

内容の明確化と例外bull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合バリアーは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合バリアーはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

ワークアイテムの制限はカーネルにサポートされているワークグループの大サイズでありこの制限はランタイムに強制されます

61111

グローバルメモリーからローカルメモリーローカルメモリーからグローバルメモリーの非同期コピーおよびプリフェッチ

実装は単純なものですワークアイテム (000) はコピーを実行しwait_group_eventsがバリアーとして実装されますbull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合wait_group_eventsは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合wait_group_eventsはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

関連情報bull Intel FPGA SDK for OpenCL ベストプラクティスガイド

bull 組み込みジオメトリック関数の引数型 (184 ページ)

A12 OpenCL C プログラミング言語の制約

インテル FPGA SDK for OpenCL は特定のプログラミング言語機能に関し OpenCLSpecification version 10 の Section 68 で示されている OpenCL Specification の制約に準拠します

重要 インテル FPGA SDK for OpenCL オフラインコンパイラーは許可されていない特定のプログラミング言語機能に対する制約を強制しません使用しているカーネルコードにOpenCL Specificationversion 10 がサポートしていない機能が含まれていないようにしてください

次の表は インテル FPGA SDK for OpenCL が強制する OpenCL C プログラミング言語の制約に関する補足説明のみを記載しています他の制約はすべてOpenCL Specification version 10 のSection 68 の内容と完全に一致します

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

183

機能 サポート状況 備考

構造体型のカーネル引数 X 構造体引数をグローバルメモリーの構造体へのポインターに変換します

既約の制御フロー X オフラインコンパイラーはこの制約に関しエラーは返しませんがこの機能はサポートされていません

32 ビット未満の組み込み型メモリーへの書き込み

サイズが 32 ビット未満のストア操作はメモリーの性能が低下する可能性がありますがサポートされています

異なるアドレス空間に属する structまたはunion要素

X オフラインコンパイラーはこの制約を強制しません警告 structまたは union要素を異なるアドレス空間に割り当てると致

命的なエラーが発生する可能性があります

サポート状況表の見方

シンボル 説明

この機能はサポートされています備考欄にてサポートされている内容を明確化しています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

A13 組み込みジオメトリック関数の引数型

インテル FPGA SDK for OpenCL はスカラーおよびベクトル引数の組み込みジオメトリック関数を特定の制限をともないサポートしています

関数 引数型

浮動 倍精度

cross

dot

distance

length

normalize

fast_distance mdash

fast_length mdash

fast_normalize mdash

サポート状況表の見方

記号 説明

この機能はサポートされています

mdash この機能は OpenCL Specification で定義されていません

A14 数値コンプライアンスの実装

OpenCL Specification version 10 の Sectoin 7 はOpenCL に準拠するデバイスがサポートする必要がある C99 と IEEE 754 標準の機能を説明しています インテル FPGA SDK for OpenCL はIEEE 標準 754-2008 形式の 32 ビットおよび 64 ビットの浮動小数点値で動作しますがすべての浮動小数点演算子が実装されているわけではありません 

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

184

以下の表は浮動小数点演算子の実装状況の概要です

セクション 機能 サポート状況 備考

71 丸めモード 整数と単精度または半精度の浮動小数点型の変換においてはすべての丸めモードをサポートしています整数と倍精度の浮動小数点型の変換については暫定的な形式ですべての丸めモードをサポートしていますがOpenCL Specification version10 に準拠していない可能性があります

72 INFNaN非正規化数 単精度の演算における無限大 (INF) および非数 (NaN) の結果はOpenCL Specification version 10 に準拠する形式で生成されます非正規化数を処理する演算のほとんどは浮動小数点演算の前後にフラッシュされます倍精度浮動小数点演算に対しては暫定的なサポートでありOpenCLSpecification version 10 に準拠していない可能性があります

73 浮動小数点の例外 X

74 ULP の相対誤差 単精度浮動小数点演算はOpenCL Specification version 10 の埋め込みプロファイルに対する数値精度要件に準拠しています倍精度浮動小数点演算については暫定サポートでありOpenCLSpecification version 10 に準拠していない可能性があります

75 エッジケースの動作

A15 イメージのアドレス指定とフィルタリングの実装

インテル FPGA SDK for OpenCL はイメージのアドレス指定とフィルタリングをサポートしませんSDK はイメージをサポートしていません

A16 アトミック関数

OpenCL Specification version 10 の Section 9 には一部の OpenCL 実装においてサポートされる場合があるオプションの機能が記載されています インテル FPGA SDK for OpenCL は条件付きでアトミック関数をサポートしますサポートされているこの関数の実装はOpenCL SpecificationVersion 10 に準拠していない可能性があります

bull Section 95 の Atomic Functions for 32-bit Integers に関しSDK は 32 ビットのグローバルおよびローカルメモリーのアトミック関数をすべてサポートしますSDK はまたOpenCLSpecification version 11 の Section 61111OpenCL Specification version 12 のSection 61211 に記載されている 32 ビットのアトミック関数もサポートしています

mdash SDK はOpenCL Specification version 10 の Section 97 に記載されている 64 ビットのアトミック関数をサポートしていません

注意 アトミック関数を使用するとデザインのパフォーマンスが低下する可能性がありますカーネルに複数の型のアトミック関数を実装する場合 (atomic_addと atomic_subなど)ハードウェアの動作周波数がさらに低下する可能性があります

A17 埋め込みプロファイルの実装

OpenCL Specification version 10 の Section 10 はOpenCL の埋め込みプロファイルについて説明しています インテル FPGA SDK for OpenCL は明確化した内容および例外をともないOpenCL の埋め込みプロファイルに準拠しています

次の表はOpenCL 埋め込みプロファイルの明確化した内容および例外の概要です

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

185

項目 機能 サポート状況 備考

1 64 ビット整数 64 ビット整数はOpenCL Specification version 10 の埋め込みプロファイルに対し補助的な形式でサポートされています

2 3D イメージ X SDK はイメージをサポートしていません

3 image_channel_data_typeの値による 2D および 3D イメージの作成

X SDK はイメージをサポートしていません

4 サンプラー X SDK はサンプラーをサポートしていません

5 丸めモード CL_DEVICE_SINGLE_FP_CONFIGのデフォルトの丸めモードはCL_FP_ROUND_TO_NEARESTです

6 単精度の基本的な浮動小数点演算に対し記載されている制約事項

X

7 半精度型 X OpenCL Specification version 10 のこの項目はSDK に適用されません

8 CL_UNORM_INT8CL_SNORM_INT8CL_UNORM_INT16CL_SNORM_INT16から float への変換に対して記載されているエラー範囲

A2 OpenCL 12 の機能のサポート状況

以降の章ではOpenCL Specification version 12 に記載されている OpenCL 機能のサポート状況の概要を説明します

A21 OpenCL 12 のランタイムの実装

インテル FPGA SDK for OpenCL はサブバッファーオブジェクトの実装をサポートしていますサブバッファーオブジェクトに関する詳細はOpenCL Specification version 12 の Section 52 を参照ください

SDK は次の API の実装もサポートしています

bull clSetMemObjectDestructorCallback

bull clGetKernelArgInfo

bull clSetEventCallback

これらの API についての詳細はOpenCL Specification 12 の Section 541573 および 59をそれぞれ参照ください

関連情報OpenCL Specification version 12

A22 OpenCL 12 C プログラミング言語の実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 12 の Section 6 で指定されている OpenCL C プログラミング言語機能の多くをサポートしています SDK は明確にした内容および例外をともないOpenCL C プログラミング言語に準拠しています

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

186

注意 サポート状況欄の「」はサポートされている機能であり備考欄においてサポートされている内容を明確にしていますサポート状況欄の「」は備考欄で特定されている内容を除きサポートされている機能です

表 15 OpenCL 12 C プログラミング言語機能のサポート状況

セクション 機能 サポート状況 備考

613 その他の組み込みデータ型 この機能は OpenCL Specification version 12 に準拠していない可能性があります

61212 各種ベクトル関数 SDK は次の組み込みベクトル関数を追加しサポートしていますbull vec_step

bull shuffle

bull shuffle2

61213 printf この機能は OpenCL Specification version 12 に準拠していない可能性があります詳細は下記を確認ください

OpenCL の printf関数は一部例外をともないC99 の printf関数に類似する構文と機能を持ちます詳細はOpenCL Specificationversion 12 を参照くださいprintf関数の使用においてコンパイル手順バッファーまたはフラグに対する特別な要件はありません通常の aocコマンドでprintf命令を含むカーネルをコンパイルすることができますカーネルの実行中に printfデータは インテル FPGA SDK for OpenCL オフラインコンパイラーが自動的に割り当てるグローバルprintfバッファーに格納されますこのバッファーのサイズは 64 kB でありprintf呼び出しのデータ引数の合計サイズがこのサイズを超えてはいけませんカーネルの実行が完了すると printfバッファーのコンテンツは標準出力されますprintfステートメントのフォーマット文字列は256 文字を超えることはできませんバッファーのオーバーフローはシームレスに処理されますつまりprintf命令は無制限に実行することができますただしprintfバッファーがオーバーフローするとカーネルのパイプラインの実行はホストがバッファーを読み取りバッファー内容を出力するまでストールしますprintf関数はデータをグローバルメモリーバッファーに格納するためそのような関数が含まれている場合カーネルのパフォーマンスは低下しますprintf関数の使用上の制限はありませんprintf命令はifと elseのステートメントやループなどで使用することができますカーネルは複数のワークアイテムで実行される複数の printf命令を含むことができますprintf呼び出しのフォーマット文字列引数と文字列リテラル引数は特別なメモリー領域を使用し FPGA からホストシステムに転送されますprintf文字列引数の合計サイズが大きい場合このメモリー領域はオーバーフローする可能性があります (一般的な OpenCL アプリケーションでは通常 3000 文字以下が安全です)オーバーフローした場合エラーメッセージ cannot parse auto-discovery string atbyte offset 4096がホストプログラムの実行中に出力されますprintfからの出力はワークアイテムが並行して printf関数を実行しても混在することはありませんただし並行して実行される printfの順序は保証されていませんつまり printf命令が並行するデータパスにある場合printf出力はプログラム順に表示されない可能性があります

関連情報OpenCL Specification version 12

A3 OpenCL 20 の機能のサポート状況

以降の章ではOpenCL Specification version 20 に記されている OpenCL の機能のサポート状況の概要を提供します

A31 OpenCL 20 のヘッダー

インテル FPGA SDK for OpenCL はすべての OpenCL バージョンをサポートする統一ヘッダーを提供します

OpenCL 20 の機能を使用するには次の 2 行をコードに含めてください

define CL_TARGET_OPENCL_VERSION 200include ltCLopenclhgt

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

187

注意 SDK は現在OpenCL 20 の API をすべてサポートしているわけではありませんサポートされていない API を呼び出すとその API が完全にはサポートされていないことを示すエラーコードが返されます

A32 OpenCL 20 ランタイムの実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 20 の Section 56 に記載されているように共有仮想メモリーの実装に対する暫定サポートを提供しています共有仮想メモリーに関する詳細は OpenCL Specification version 20 の Section 56 を参照ください

重要 ご利用のボード仕様を参照しボードが共有仮想メモリーをサポートしていることを確認してください

関連情報OpenCL Specification version 20 (API)

A33 OpenCL 20 C プログラミング言語のパイプにおける制約

インテル FPGA SDK for OpenCL はOpenCL のパイプに対する暫定サポートを提供します次の表はOpenCL Specification version 20 に記載されているパイプ固有の OpenCL C プログラミング言語の実装に対するサポート状況を示しています

注意 サポート状況欄の「」はサポートされている機能であり一部については備考欄においてサポートされている内容を明確化していますSDK がサポートしていない機能は「X」で識別されています

表 16 パイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数ついての詳細はOpenCL Specification version 20 の Section 613162 で提供されています

関数 サポート状況

int read_pipe (pipe gentype p gentype ptr)

int write_pipe (pipe gentype p const gentype ptr)

int read_pipe (pipe gentype p reserve_id_t reserve_id uint index gentypeptr)

X

int write_pipe (pipe gentype p reserve_id_t reserve_id uint index constgentype ptr)

X

reserve_id_t reserve_read_pipe (pipe gentype p uint num_packets)

reserve_id_t reserve_write_pipe (pipe gentype p uint num_packets)

X

void commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

bool is_valid_reserve_id (reserve_id_t reserve_id) X

表 17 ワークグループのパイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613163で提供されています

関数 サポート状況

reserve_id_t work_group_reserve_read_pipe (pipe gentype p uint num_packets) X

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

188

関数 サポート状況

reserve_id_t work_group_reserve_write_pipe (pipe gentype p uint num_packets)

void work_group_commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void work_group_commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

表 18 パイプクエリーの組み込み関数に対するサポート状況パイプクエリーの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613164 で提供されています

関数 サポート状況

uint get_pipe_num_packets (pipe gentype p) X

uint get_pipe_max_packets (pipe gentype p) X

関連情報OpenCL Specification version 20 (C Language)

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限

項目 制限

大コンテキスト数 ホストメモリーのサイズによってのみ制限されます

大デバイス数 128

ランタイムの 小グローバルメモリー割り当て ランタイムはコンテキストが作成されると 64 kB のデバイスメモリーを割り当てますこのメモリーはプログラム変数の場合はグローバルアドレス空間に静的変数の場合は関数内に予約されていますOpenCL カーネルが printf関数を使用する場合ランタイムは 64 kB のデバイスメモリーを追加し割り当てます

大キュー数 1024

注意 各コンテキストはシステム目的でキューを 2 つ使用します

コンテキストあたりの 大プログラムオブジェクト数 20

コンテキストあたりの 大イベントオブジェクト数 ホストメモリーのサイズによってのみ制限されます

コンテキスト内のイベント間における依存関係の 大数

1000

コマンドあたりのイベント依存関係の 大数 20

大同時実行カーネル数 キューの合計数

エンキューされるカーネルの 大数 1000

FPGA デバイスあたりの 大カーネル数 ハードウェアに静的な制限はありませんエミュレーターは 256 です

カーネルあたりの 大の引数の数 128

カーネル引数の 大合計サイズ カーネルあたり 256 バイト

各カーネルのローカルメモリーにおける宣言済み変数の 大数

128

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20190401 191 bull 以下のトピックを新しく追加しましたmdash ループの投機的実行 (speculated_iterations Pragma) (32 ページ)mdash メモリー属性の指定 (34 ページ)

bull ループの並列性 (max_concurrency Pragma) (31 ページ) に無制限の並行性に関する注意を加えました

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)においてIntelFPGAを関数名に含む非標準の呼び出しに ICD を使用する場合の手順を更新しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)(140 ページ) にパフォーマンスカウンターを使用した OpenCL カーネルのパイプライン計測に関する注記を追加しました

bull ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) (123 ページ) を追加し-no-hardware-kernel-invocation-queueオプションに関し説明しています

bull グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ) を追加し-global-ringオプションに関し説明しています

bull グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring) (116 ページ) を追加し-duplicate-ringオプションに関し説明しています

bull ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) (124 ページ) を追加し-hyper-optimized-handshakingオプションに関し説明しています

bull 整数のプロモーション規則 (80 ページ) を追加し整数のプロモーションに関し説明しています

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) およびカーネル実行中におけるプロファイルデータの収集 (86 ページ) にCLcl_ext_intelfpgahヘッダーファイルを含める際の注意を追加しました

bull uses_global_work_offset(0) カーネル属性に関する新しい項目clEnqueueNDRangeKernel API の global_work_offset 引数をサポートするハードウェアの省略 (176 ページ) を追加しました

bull OpenCL10 C プログラミング言語の実装 (181 ページ) の以下の内容を変更しましたmdash 613 に対するサポート状況の内容を変更し説明を追加mdash 614615 および 6102 を削除mdash 66 および 6118 の説明を追加mdash 6112 および 6115 に関する説明を更新mdash 6119 および 61111 のサポート状況を変更

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull OpenCL C プログラミング言語の制約 (183 ページ) において以下の内容を変更していますmdash 次の機能に関する注記を削除しました

bull 関数へのポインターbull ビットフィールドbull externstaticautoregisterのストレージクラス指定子bull 再帰bull event_t型の__kernel関数のへの引数宣言

mdash 特別な注意がない機能をすべて削除しましたmdash 以下の機能を削除しました

bull アドレススペース間のポインター割り当てbull イメージbull 定義済み識別子

mdash 「32 ビット未満の組み込み型メモリーへの書き込み」に関する説明を更新しました

bull 組み込みジオメトリック関数の引数型 (184 ページ) にサポート状況表の見方を追加しました

bull 数値コンプライアンスの実装 (184 ページ) の71 の説明を更新しましたbull 埋め込みプロファイルの実装 (185 ページ) の項目 4 に説明を追加しましたbull OpenCL 12 のランタイムの実装 (186 ページ) のイメージオブジェクトに対する

サポート情報を削除しましたbull OpenCL 12 C プログラミング言語の実装 (186 ページ) のprintfに対するサ

ポート情報と注記およびその他のデータ型の組み込み関数についての注記を更新しました

bull OpenCL 20 のヘッダー (187 ページ) の古い情報を削除し新しい情報を追加しました

bull 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages) (18 ページ) に-list-board-packagesオプションの詳細を追加しました

bull FPGA ボードのインストール (install) (21 ページ) において手順 6 の FCD に関する詳細および手順 5 の例を追記しました

bull FPGA ボードのアンインストール (uninstall) (22 ページ) にFCD に関する詳細を追記しました

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ) に-board-package=ltboard_package_pathgt に関する詳細を追記しました

bull 高速エミュレーターの既知の問題 (134 ページ) のAutoRun (自動実行) の表記をAutorun に変更しました (英語版のみ)

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) を追加し-fmax=ltfmax target in MHzgt に関し説明しています

bull Windows での ICD Loader Library への接続およびLinux での ICD LoaderLibrary への接続の項目を削除しWindows および Linux における ICD と FCD ドライバーに関する情報を次の項目に追加しましたmdash ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ペー

ジ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表

示 (ldflags) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示

(ldlibs) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情

報の表示 (link-config または linkflags) (96 ページ)bull OpenCL ICD 拡張 API の使用 (97 ページ) の項目を追加しOpenCL ICD 拡張

API の使用方法を説明しています

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

191

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull カーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ)において次の内容を変更しましたmdash タイトルの変更mdash 概要説明の変更mdash registerの説明を FF と FIFO の情報とともに更新mdash memory属性の名前と説明を更新しメモリーの実装型に関する詳細を追加mdash max_concurrency(N) 属性およびそれに関する説明の追加mdash 構造型データメンバーでのメモリー属性の指定に関する情報を追加

bull 変数固有の属性を使用する際の制約 (173 ページ) にconstant 変数に関する内容を記載しnumbanks属性に関する箇条書きの項目を削除しました

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) の項目を追加しfmax ターゲット属性と aoc コマンドオプションに関して説明しています

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ) を更新し高速エミュレーターが現在はデフォルトであり推奨されることを反映しました

20181224 1811 bull RTL リセットおよびクロック信号 (153 ページ) を更新しOpenCL カーネルクロックの2倍の周波数で動作するシステム全体のクロックに対する RTL モジュールのアクセスに関する内容を説明しています

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のEXPECTED_LATENCY要素に関する説明を更新しストールをサポートし ireadyなどの信号を必要とするモジュールに対する EXPECTED_LATENCY値の要件を含めました

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のIS_FIXED_LATENCYXML 要素の説明を更新しIS_FIXED_LATENCY=noが設定されている場合のEXPECTED_LATENCY値の要件を含めました

bull PARAMETER要素を ATTRIBUTES を指定する XML 要素 (156 ページ) に追加しました

bull unique_212unique_212_Connect_42_ul_rlt_5pj_w5 (162 ページ) の箇条書きの2番目の項目において「正確にクロック 1 つ」を削除しました

bull インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt) (108 ページ) を更新し-oオプションの構文から=を削除しましたaocコマンドで出力ファイル名を指定する正しい方法は-o ltfilenamegt ですこのオプションは-o=ltfilenamegt と誤って記載されていましたまたこのコマンドオプションを使用する本プログラミングガイドの構文例はすべて今回の更新において訂正されています

20180927 181 bull RTL モジュールインターフェイス (151 ページ) の重複していた内容を削除しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

192

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20180924 181 bull インテル FPGA SDK for OpenCL プロエディションのインテル FPGA SDK forOpenCL オフラインコンパイラーには新しいフロントエンドがありますこの新しいフロントエンドによって変更になった内容の概要は Intel FPGA SDK for OpenCLPro Edition Release Notes の Improved Intel FPGA SDK for OpenCLCompiler Front End を参照ください

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ) に新しい OpenCL シミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

(166 ページ)mdash OpenCL ライブラリーのシミュレーション (166 ページ)mdash シミュレーターの制限 (168 ページ)

bull 高速エミュレーターの設定 (125 ページ) に新しい OpenCL 高速エミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash 高速エミュレーターの環境変数 (133 ページ)mdash 高速エミュレーターでサポートされている拡張機能 (133 ページ)mdash 高速エミュレーターの既知の問題 (134 ページ)

bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ) を更新しstructカーネルパラメーターは値または structへのポインターとして渡さなければならないことを示しました

bull 参照でのチャネル渡しに対するサポートは終了したため参照でのチャネル渡しに関する参照内容を削除しました

20180803 180 bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ) の誤記を訂正しました正しいフラグは CL_MEM_HETEROGENEOUS_INTELFPGAですこれまでこのフラグは誤って CL_MEM_HETEROGENEOUS_INTELになっていました

20180614 180 bull ハードウェアを構築せずに行うカーネルのコンパイル (-c) (106 ページ) のaoc -cコマンドの動作についての説明を訂正しました-cコマンドオプションでフォルダーやサブディレクトリーは作成されません

20180523 180 bull カーネルコピーでのチャネル使用 (178 ページ) のコード例を訂正しデザイン例が正常にコンパイルされるようにしました

20180504 180 bull インテル Quartus Prime 開発ソフトウェアスタンダードエディションに関する情報を削除しました

bull 中間コンパイルでの aocコマンドおよび関連するすべての内容において-cを-rtlに変更しました インテル FPGA SDK for OpenCL プロエディションは-rtlフラグを中間コンパイルに提供します

bull 次の項目に記載されているデバイスの 大数を 128 に増加しましたmdash FPGA ボードのインストール (install) (21 ページ)mdash FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)mdash ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)mdash オフラインまたはホストなしでの FPGA のプログラミング (program

ltdevice_namegt) (24 ページ)mdash フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)mdash 複数の FPGA デバイスのプログラミング (99 ページ)

bull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) のワンステップでの OpenCL カーネルのコンパイルフローに記載されている図およびトピックの内容を更新しました

bull 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー (12 ページ) の複数のステップによる インテル FPGA SDK forOpenCL プロエディションデザインフローの図を更新し-rtl高速コンパイルおよびインクリメンタルコンパイルに関する情報を追記しました

bull データの処理効率を 適化するためのプログラミング手法 (27 ページ) にループの並列性 (max_concurrency Pragma) (31 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

193

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull 項目のタイトルをローカルメモリー効率の 適化に向けたプログラミング手法からローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35ページ) へ変更しました

bull IO チャネルのエミュレーション (46 ページ) の章においてカーネルとホストまたはカーネルと他のプロセス間における通信のエミュレーション (Linux 限定) を削除しました

bull 値によってチャネルまたはパイプを渡すカーネルのエミュレーション (127 ページ)を更新し値によるパイプまたはチャネル渡しに関する情報を追加しましたまた参照によるチャネル渡しに対するサポートは非推奨です

bull 項目のタイトルを「チャネルまたはパイプの複数のコマンドキュー実装に向けた要件」からカーネルを同時に実行するための複数のコマンドキューにおける要件 (82ページ) に変更し内容を更新しました

bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ) の項目を次のサブ項目とともに追加しましたmdash インクリメンタルコンパイルレポート (119 ページ)mdash インクリメンタルコンパイルのその他のコマンドオプション (120 ページ)mdash インクリメンタルコンパイルフィーチャーの制限 (123 ページ)

bull 早期の ECC 機能に関するメモリーの誤り訂正符号をともなうカーネルのコンパイル(-ecc) (123 ページ) の項目を追加しました

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) の次の内容を変更していますmdash 項目のタイトルを新しいカーネル引数属性オプションから

intel_host_accessible カーネル引数属性オプション (67 ページ) に変更mdash 項目のタイトルを新しい API 機能から ホストがアクセス可能なパイプカーネル

引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数(68 ページ) に変更

bull インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ) の次の内容を変更していますmdash ランタイムでのサポートが終了したことによる環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA の参照項目を削除

mdash キューの 大数を更新bull RTL モジュールの XML 構文 (154 ページ) にRESOURCES要素に関する内容を

追加しましたmdash リソースを指定する XML 要素 (159 ページ) の項目を追加

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテルStratix 10 デザイン固有のリセット要件 (154 ページ) の項目を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にカーネル内に登録される割り当ての組み込み関数 (179 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

194

日付 バージョン 変更内容

2017 年 12 月 20171208 bull 次の項目を新しく追加しましたmdash 自動実行カーネルのプロファイリング (142 ページ)mdash エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ペー

ジ)mdash プロファイルデータの取得 (89 ページ)mdash 複数の自動実行プロファイリング呼び出し (89 ページ)mdash インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの

開発 (143 ページ)mdash Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフ

ラインコンパイラープラグインのコンフィグレーション (143 ページ)mdash Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラ

ープラグインのコンフィグレーション (143 ページ)mdash インテル Code Builder for OpenCL でのセッションの作成 (144 ページ)mdash セッションのコンフィグレーション (145 ページ)

bull RTL モジュールの XML 構文 (154 ページ) のXML 仕様ファイルからltPARAMETER name=WIDTH value=32gt を削除しました

2017 年 11 月 20171106 bull トピックを各章へ移動しましたbull リファレンスの商標を次のように変更しました

mdash マクロ ALTERA_CLを INTELFPGA_CLへmdash 環境変数 ALTERAOCLSDKROOTを INTELFPGAOCLSDKROOTへmdash 環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_ALTERA をCL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA へ

mdash clGetExtensionFunctionAddressをclGetExtensionFunctionAddressIntelFPGAへ

mdash 環境変数 CL_CONTEXT_EMULATOR_DEVICE_ALTERA をCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA へ

mdash write_channel_alteraを write_channel_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash CL_MEM_BANKを CL_CHANNELへmdash CL_MEM_BANK_1_INTELを CL_CHANNEL_1_INTELFPGAへmdash CL_MEM_BANK_2_INTELを CL_CHANNEL_2_INTELFPGAへmdash Arria 10 を インテル Arria 10 へmdash Quartus Prime をインテル Quartus Prime へmdash インテル FPGA SDK for OpenCL Profiler を インテル FPGA Dynamic

Profiler for OpenCL へmdash TimeQuest タイミングアナライザーをタイミングアナライザーへmdash Qsys Pro をプラットフォームデザイナーへ

bull インテル FPGA SDK for OpenCL の FPGA プログラミングフロー (8 ページ) にFPGA データフローのアーキテクチャー図と関連する記述を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の項目にRTL モジュールインターフェイス (151 ページ) を追加しRTL モジュールインターフェイスの動作例を提供しています

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) のタイミング図を更新しました

bull ブロッキングのチャネル書き込みの実装 (42 ページ) とブロッキングのチャネル読み取りの実装 (43 ページ) においてlttypegt の定義から「一定にできない」という記述を削除しました

bull 徐々に速度低下する OpenCL システムのデバッグ (104 ページ) の項目を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

195

日付 バージョン 変更内容

bull PLDA ウェブサイトへのリンクを OpenCL カーネルのコンパイル (105 ページ) に追加しました

bull カーネルの命名ガイドライン (26 ページ) において箇条書きの 後のポイントを更新しキーワードとなる VHDL と Verilog を含めました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) に制御可能なデザインの側面を一覧にしました

bull OpenCL ライブラリー (147 ページ) に RTL の拡張を追加しましたbull RTL モジュールと OpenCL パイプラインの理解 (148 ページ) の項目をインテル

FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ) と RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149 ページ)に分割しました

bull インテル FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ)の左側のコード例を右側の図に合わせました図の下部を図を説明する段落の上に移動させました

bull RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149ページ) に Avalon -ST の関連リンクを追加しました

bull ストールのない RTL (150 ページ) のパラグラフを手順ごとに分割し関連リンクを追加しました

bull 複数のワークアイテムの決定論的な順序付けにおける要件 (38 ページ) にワークアイテムの順序付けにおける 3 番目の要件を追加しました

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) を更新しましたbull 新しいトピック OpenCL コンパイルの高速化 (-fast-compile) (117 ページ) を追

加し-option=ltvaluegt の規則を実装しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のlog ファイルへのリファレンスを HTML レポートに置き換え二重ダッシュのコマンドオプションを単一ダッシュに置き換えました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にStratix 10 に対するサポートを追加しました

bull ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得(16 ページ) に二重ダッシュおよび aoc コマンドの-option ltvaluegt の表記規則が非推奨となったことを強調する注記を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

196

日付 バージョン 変更内容

bull 次の項目に単一ダッシュと-option=ltvaluegt の表記規則を適用しましたmdash コンパイラーバージョンの表示 (-version) (17 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプショ

ンリストの表示 (引数なし-help-h) (17 ページ)mdash 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-

boards および-list-board-packages) (18 ページ)mdash 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)mdash ヘッダーファイル位置の指定 (-I=ltdirectorygt) (107 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の

指定 (-o ltfilenamegt) (108 ページ)mdash 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル

(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

mdash カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) (110 ページ)

mdash カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) (111 ページ)

mdash リソース推定使用率要約の画面表示 (-report) (113 ページ)mdash グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt) (115 ページ)mdash コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-

cache-bytes=ltNgt) (116 ページ)mdash 浮動小数点演算処理順序の緩和 (-fp-relaxed) (116 ページ)mdash 浮動小数点演算における丸め処理の削減 (-fpc) (117 ページ)mdash チャネル深度のエミュレーション (128 ページ)mdash エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-

emulator) (128 ページ)mdash OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

(161 ページ)mdash OpenCL ライブラリーのコマンドラインオプション (170 ページ)mdash パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

(140 ページ)bull カスタムプラットフォーム固有の関数へのアクセス (90 ページ) にICD Loader の

関連リンクを追加しましたbull 計算ユニット数の指定 (33 ページ)num_compute_units(XYZ) 属性を使用し

たカーネルの複製 (176 ページ)OpenCL カーネルのエミュレーション (129 ページ) に計算ユニットに関する注記を追加しました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にインテル Stratix 10 に対するサポートを追加しました

bull ハードウェアとエミュレーターの結果の不一致 (131 ページ) の項目を追加しましたbull OpenCL C プログラミング言語の制約 (183 ページ) にサポート状況表の見方を

追加しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のフローチャートを簡略化しそれにともなう記述を更新しました

bull AOCL_BOARD_PACKAGE_ROOT は廃止されているためリファレンスを本プログラミングガイドから削除しました

bull aocl installのインスタンスをaocl installltpath_to_customplatformgt に更新しました

bull aocl uninstallのインスタンスをaocl uninstallltpath_to_customplatformgt に更新しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

197

日付 バージョン 変更内容

bull ホストパイプに関する次の項目を新しく追加しましたmdash ホストパイプを介したカーネルとの直接通信 (67 ページ)mdash intel_host_accessible カーネル引数属性オプション (67 ページ)mdash ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプ

オブジェクトと通信するための API 関数 (68 ページ)mdash ホストがアクセス可能なパイプの作成 (69 ページ)mdash cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

bull OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化(41 ページ) にチャネル拡張を有効にするためのプラグマを追加しました

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ) および外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ) のデザイン例のコンパイル手順を更新しました

bull インテル FPGA SDK for OpenCL チャネル拡張の実装における制約 (39 ページ)の「単一のチャネル呼び出しサイト」の項目を「複数のチャネル呼び出しサイト」に置き換えました

2017 年 5 月 20170508 bull コード例の関数の商標を次のように変更しましたmdash read_channel_alteraを read_channel_intelへmdash write_channel_alteraを write_channel_intelへmdash read_channel_nb_alteraを read_channel_nb_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash clGetBoardExtensionFunctionAddressAlteraを

clGetBoardExtensionFunctionAddressIntelFPGAへbull IO チャネルのエミュレーション (46 ページ) を追加しましたbull 任意精度での整数の実装 (70 ページ) を追加しましたbull ネスト化されたループの結合 (28 ページ) を追加しましたbull ループ開始間隔の指定 (II) (30 ページ) を追加しましたbull チャネル深度のエミュレーション (128 ページ) を追加しましたbull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) を追加しまし

たbull pragma OPENCL EXTENSION cl_altera_channels enableへ

のリファレンスをすべて削除しましたチャネルの実装にこのプラグマは必要ありません

bull 異種メモリーに関する情報を次のように再編成しましたmdash メモリーにおけるポインターサイズの指定の内容をローカルメモリーサイズへ

のポインターの 適化に向けたプログラミング手法 (35 ページ) へ統合mdash 次の 3 項目に構成を変更

bull グローバルメモリーの手動分割における OpenCL バッファーの割り当て(82 ページ)

bull 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)

bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ)mdash グローバルメモリーにおけるバッファー位置の指定の内容を異なるメモリータイ

プ (異種メモリー) 間でのバッファーの分割 (84 ページ) に移動(これまではアクセス効率の 適化に向けたプログラミング手法にありました)

bull カーネル実行中におけるプロファイルデータの収集 (86 ページ) を更新しプロファイルデータの収集がカーネル起動時に与える影響についての警告を加えました

bull OpenCL カーネルのコンパイル (105 ページ) に暗号化されたclファイルをコンパイルする際の制約を加え更新しました

bull インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限 (162 ページ) を更新しRTL モジュールは入力を制御するために単一入力のAvalon-ST インターフェイスを使用する必要があることを明記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

198

日付 バージョン 変更内容

bull OpenCL Profiler の変更によって影響を受ける項目を以下のように更新しましたmdash インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) (141

ページ) に新しいコマンドオプションを含め更新mdash 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデ

ザインフロー (12 ページ) の図 5 (13 ページ) に新しいコマンドオプションを反映させて更新

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) のコード例を訂正しました

bull チャネルのワークアイテムのシリアル実行 (39 ページ) の複数のワークアイテムをともなうループのチャネル実行の章に記載されているコード例を訂正しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の章に以下の更新を行いましたmdash RTL モジュールと外部メモリーの通信 (159 ページ) を更新しRTL モジュール

と外部メモリーの通信において推奨される手法を明記mdash RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

(161 ページ) を更新しインテル Quartus Prime 開発ソフトウェアプロエディションユーザーガイドのパーシャルリコンフィグレーションへのリンクを追記

mdash bankbitsと mergeの内容をカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) に追加

mdash コード例の関数の商標を以下のように変更bull read_channel_alteraを read_channel_intelへbull write_channel_alteraを write_channel_intelへ

2016 年 10 月 20161031 bull Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更しました

bull Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコンパイラーに商標を変更しました

bull ビッグエンディアンシステムに対するサポートが廃止削除されたため次の内容が変更になっていますmdash ビッグエンディアンシステムのためのカーネルのコンパイル (--big-endian) の

項目を削除mdash ビッグエンディアン (64 ビット) をホストアプリケーションがターゲットにでき

るアーキテクチャーのリストから削除bull OpenCL バイナリーのコンパイル環境の表示の項目を追加しaoc envコマンドを

導入しましたbull 適化レポートへのソースの参照先追加 (-g) を削除しましたオフラインコンパイ

ラーは自動的にソース情報をコンパイラーレポートに含めx86 Linux マシンでのエミュレーション中のシンボリックデバッグを有効にします

bull コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) の項目を追加し-g0 aocコマンドオプションを導入しました

bull インテル FPGA SDK for OpenCL エミュレーターの制限事項から「エミュレーターはハーフデータ型をサポートしません」という記述を削除しました

bull ホストアプリケーションと Khronos ICD Loader Library のリンクにおいてサポート内容を更新しましたインテルが提供する ICD Loader Library はOpenCLSpecification version 10 およびOpenCL Specification version 111220 で実装されている API をサポートします

bull FPGA ボードの管理における以下内容を更新しましたmdash SDK が複数のカスタムプラットフォームのインストールをサポートすることを明

記複数のボードをインストレールする際に SDK ユーティリティーを各ボードに使用するにはAOCL_BOARD_PACKAGE_ROOT 環境変数設定が関連するボードのカスタムプラットフォームのサブディレクトリーに対応している必要があります

mdash カスタムプラットフォームが複数あるシステムではMMD ライブラリーに直接リンクするのではなくホストプログラムが ACD を使用しボードを検出する必要があることを明記

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

199

日付 バージョン 変更内容

bull カーネルの reporthtml ファイルのレビューの章を追加しanalyze-areaユーティリティーオプション廃止の通知を追加しましたHTML レポートの導入により以下の項目を削除しましたmdash エリアレポートでのカーネルのリソース使用率情報のレビューmdash エリアレポートへのアクセスmdash エリアレポートのレイアウト

bull 複数のステップによるデザインフローのデザイン手順および複数のステップによるインテル FPGA SDK for OpenCL デザインフローの図を更新しエリアレポートをHTML レポートに置き換えましたまた-gを有効化するための情報を削除しました

bull レジスターの推論のコード例に続く文章においてハードウェアでの配列の実装をオフラインコンパイラーが決定する方法の説明を訂正しました

bull Windows での ICD Loader Library のリンクの内容をより明確化しましたbull OpenCL 機能のサポートの章に次の更新を行いました

mdash Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更mdash Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコ

ンパイラーに商標を変更mdash インテル FPGA SDK for OpenCL 割り当ての制限の章の次の内容を修正

bull ランタイムの 小メモリー割り当てに関する情報を更新bull 大キュー数を 70 から 256 へ更新bull FPGA デバイスあたりの 大カーネル数の 64 を変更ハードウェアにコンパ

イルする場合の静的な制限はなくなりエミュレーターにコンパイルする場合は 256 になります

mdash OpenCL 10 C プログラミング言語の実装の半精度浮動小数点の備考欄にこの機能はエミュレーターでサポートされているという注記を追加さらに半精度浮動小数点のサポート状況を「X」から「」へ更新

mdash OpenCL 20 機能のサポート状況にOpenCL 20 のヘッダーを加えOpenCL20 のヘッダーを使用しサポートされていない API を呼び出すとエラーの原因になることを追記

2016 年 5 月 20160502 bull AOCL プログラミングモデルの回路図を Altera SDK for OpenCL FPGAProgramming Flow の章に追加しました

bull AOCL FPGA プログラミングフローの図をAltera Offline Compiler KernelCompilation Flows の章へ移動しました

bull 複数ステップでの AOCL デザインフローの図とそれに関連する内容をエリアレポートのレビュー手順を含めて更新しました

bull 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの機能に関する情報を追加しました詳細は単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの章を参照ください

bull OpenCL カーネルのエミュレーションの章にICD を使用する他の OpenCL SDK とともにエミュレーションを行うための複数のデバイスサポートに関する情報を追加しました

bull 強化されたエリアレポート機能に関する情報を追加しましたmdash analyze-area AOCL ユーティリティーコマンドを呼び出しHTML エリアレ

ポートを生成するオプションを追加mdash HTML エリアレポートのレイアウトを説明する項目を追加

bull Windows での ICD Loader Library のリンクにおいて変更後の Makefileのコード例から$(AOCL_LDLIBS) を削除しました

bull チャネルおよびパイプの複数のワークアイテムの順序付けの章においてチャネルまたはパイプ呼び出しがワークアイテムに対し不変であることを確認するために AOCLが使用する特性を変更しました

bull インテル FPGA SDK for OpenCL アドバンスト機能の章を追加しましたbull OpenCL 機能のサポート状況の章の OpenCL 12 のランタイムの実装にAOCL が

clSetEventCallbackclGetKernelArgInfoclSetMemObjectDestructorCallback の API をサポートすることを注記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

200

日付 バージョン 変更内容

2015 年 11 月 20151102 bull aocコマンドを引数なしで呼び出しAltera Offline Compiler のヘルプメニューにアクセスするオプションを追加しました

bull 複数のホストスレッドの章を更新しOpenCL ホストランタイムはスレッドセーフであることを明記しました

bull 複数のカーネルのソースファイルサポートを反映するため以下の図と章を更新しましたmdash AOCL FPGA プログラミングフローの章の AOCL FPGA プログラミングフロ

ーの図mdash ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコン

パイルの章mdash ハードウェアを構築せずに行うカーネルのコンパイル (-c) の章

bull チャネルに対する複数のワークアイテムの順序付けの誤解を招く文章を削除しましたbull チャネル実装の概要の図を更新しましたbull 次の章の OpenCL パイプに関する内容を更新しました

mdash OpenCL パイプ機能の概要のパイプネットワーク実装の概要の図mdash OpenCL のパイプ実装における制約の章のエミュレーションサポートmdash 誤ったコードを正しい構文に修正mdash パイプハンドルの宣言の io 属性を使用した IO パイプの実装にリンクを追加

bull ホストを経由した FPGA のプログラミングに注意事項を追記しましたイベントオブジェクトは使用後に解放し過剰なメモリー使用を防ぐ必要があります

bull OpenCL 機能のサポート状況の以下の内容を更新しましたmdash OpenCL Specification のバージョンに基づき各機能のサポート状況と制限事

項を分類mdash OpenCL に準拠する倍精度浮動小数点関数リストに次の関数を追加

sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

mdash OpenCL 12 のランタイムの実装にサブバッファーオブジェクトのサポートを追加

mdash OpenCL 12 のランタイムの実装に共有仮想メモリーに対する暫定サポートを追加

mdash Altera SDK for OpenCL 割り当ての制限にランタイムの 小グローバルメモリーの割り当て制限を追加

2015 年 5 月 1500 bull カーネルの命名ガイドラインにOpenCL カーネルを kernelclと命名することに反対する内容を追記しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) にローカルディスクからホストアプリケーションを実行し低速なネットワークディスクアクセスに起因する潜在的な遅延を回避する必要があることを明記しました

bull OpenCL カーネルのエミュレーションとデバッグの注記を変更しSoC をターゲットとするデザインのエミュレーションは SoC 以外のボードで行う必要があることを示しました

bull OpenCL カーネルのエミュレーションのホストアプリケーションを実行するコマンドを更新し ltprocess_IDgt-libkernelsoを含むデフォルトの一時ディレクトリーを上書きする命令を追加しました

bull カーネルコンパイル時のハードウェア生成フィッティングエラーの解決に--high-effort aocコマンドフラグを導入しました

bull 倍精度浮動小数点演算の有効化に倍精度浮動小数点演算を有効にするためのOPENCL EXTENSIONプラグマを導入しました

bull OpenCL パイプのサポートを導入しました詳しくはOpenCL パイプの実装 (またその章内の項目) およびホストアプリケーションでのパイプオブジェクトの作成を参照してください

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

201

日付 バージョン 変更内容

bull AOCL チャネル拡張の制約にチャネル ID の配列への静的なインデックス付けの方法を表すコード例を追加しました

bull 複数のホストスレッドにOpenCL ホスト関数の呼び出しを複数のスレッドを持つホストアプリケーションで同期するための推奨事項を追加しました

bull ICD と ACD のサポートを導入しました詳しくはホストアプリケーションとKhronos ICD Loader Library のリンクを参照してください

bull clGetBoardExtensionFunctionAddressAlteraを導入しユーザーが利用可能な関数をリファレンスできるようにしました詳細はカスタムプラットフォーム固有の関数へのアクセスを参照してください

bull OpenCL 機能のサポート状況の以下内容を更新しましたmdash Alterareg SDK for OpenCL が暫定的にサポートする倍精度浮動小数点関数の

一覧を表示mdash OpenCL C プログラミング言語のパイプにおける制約を追記

2014 年 12 月 1410 bull 情報フローを再編成しましたAltera reg SDK for OpenCL (AOCL) または AlteraRTE OpenCL を使用して実行する可能性のある作業に基づき情報を提供しています

bull --util ltNgt および-O3の AOC (Altera Offline Compiler) オプションに関連する情報を削除しました

bull OpenCL カーネルのコンパイルに以下の PLDA QuickUDP IP コアライセンスに関する情報を追加しました1 PLDA QuickUDP IP コアライセンスは Stratix V ネットワークリファレンスプ

ラットフォームまたは QuickUDP IP コアを使用するカスタムプラットフォームに必要です

2 QuickUDP IP コアライセンスを不適切にインストールするとQuickTCP IP コアに関するエラーメッセージが表示されコンパイルは失敗します

bull 大規模なシフトレジスターの条件付きシフトは推奨されないという注記を追加しました

bull 複数のデバイスでのシステムのエミュレーションの章を削除しました現在は新しいenvCL_CONTEXT_EMULATOR_DEVICE_ALTERA=ltnumber_of_devicesgtコマンドが複数のデバイスをエミュレーションするために利用可能です

bull 言語サポートの制限を AOCL エミュレーターの制限の章から削除しましたbull OpenCL 機能のサポートの章の AOCL の割り当て制限でFPGA あたりの 大カー

ネル数を 32 から 64 に更新しました

2014 年 6 月 1400 bull --estimate-throughputおよび--sw-dimm-partitionの AOC オプションを削除しました

bull -march=emulator-g--big-endian--profileの AOC オプションを追加しました

bull --no-interleavingはltglobal_memory_typegt 引数を必要としますbull -fp-relaxed=trueは現在--fp-relaxedですbull -fpc=trueは現在--fpcですbull SoC 以外のデバイスにおいて aocl diagnostic は現在 aocl

diagnose および aocl diagnose ltdevice_namegt ですbull programおよび flashはltdevice_namegt 引数を必要としますbull FPGA ボードのデバイス名の識別を追加しましたbull AOCL プロファイラーユーティリティーを追加しましたbull AOCL のチャネル拡張と関連する項目を追加しましたbull チャネルの属性を追加しましたbull ホストとカーネルにおける構造体データ型のデータレイアウトの一致を追加しましたbull レジスターインターフェイスおよびシフトレジスターインターフェイスを追加しまし

たbull Channels and Multiple Command Queues を追加しましたbull SoC で動作する OpenCL カーネルの共有メモリーアクセスを追加しましたbull カーネル実行中におけるプロファイルデータの収集を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

202

日付 バージョン 変更内容

bull OpenCL カーネルのエミュレーションとデバッグとそれに関連するサブ項目を追加しました

bull AOC カーネルのコンパイルフローを更新しましたbull -v を更新しましたbull ホストバイナリーの要件を更新しましたbull グローバルメモリーアクセスの分割と異種グローバルメモリーアクセスの分割を

グローバルメモリーアクセスの分割に統合しましたbull 付録 A の AOC 割り当ての制限を更新しましたbull max_unroll_loopsmax_share_resources

num_share_resourcestaskのカーネル属性を削除しましたbull packedと aligned(ltNgt) のカーネル属性を追加しましたbull OpenCL 機能のサポート状況の章の以下 AOCL 割り当て制限の内容を更新しまし

たmdash 大コンテキスト数mdash 大キュー数mdash コンテキストあたりの 大イベントオブジェクト数

2013 年 12 月 1311 bull 「-W と-Werror」の章を削除し「-W」と「-Werror」の 2 章に再編成しましたbull 複数のデバイスのサポートを反映するために次の内容を更新しました

mdash AOCL FPGA プログラミングフローの図mdash --list-boards の章mdash -board ltboard_namegt の章mdash 複数の FPGA デバイスのプログラミングの項目をFPGA のプログラミングに追

加bull 異種グローバルメモリーのサポートを反映するため以下の内容を追加しました

mdash --no-interleaving の章mdash カーネルのプラグマと属性に buffer_locationのカーネル属性mdash 異種グローバルメモリーアクセスの分割の章

bull 付録OpenCL 機能のサポート状況においてサポート状況の指定を更新しましたbull OpenCL プログラミング言語の実装の章からOpenCL プログラミング言語の制約

に関する情報を削除しましたまた新しく OpenCL プログラミング言語の制約の章を作成しその内容を記載しました

2013 年 11 月 1310 bull 情報フローを再編成しましたbull インテル FPGA SDK for OpenCL コンパイルフローを更新後AOCL FPGA プロ

グラミングフローにタイトルを変更しましたbull 1 ステップでの AOC コンパイルフローと 2 ステップでの AOC コンパイルフローの

図を追加しましたbull AOCL バージョン 131 の内容の章を更新しましたbull 以下の章を削除しました

mdash OpenCL カーネルソースファイルのコンパイルmdash Altera Offline Kernel Compiler の使用mdash FPGA ボードの設定mdash 特定の FPGA ボードのターゲットmdash OpenCL アプリケーションの実行mdash カーネルソースファイルの統合mdash アライメントされたメモリー割り当てmdash FPGA ハードウェアのプログラミングmdash FPGA のフラッシュメモリーのプログラミング

bull OpenCL カーネルソースファイルのコンパイルを更新後AOC コンパイルフローへ名称を変更しました

bull OpenCL カーネルへのファイルスコープ構造の受け渡しを OpenCL カーネルでの構造体引数の使用にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張を更新しカーネルのプラグマと属性へタイトルを変更しました

bull FPGA へのカーネルのロードを FPGA のプログラミングにタイトルを変更しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

203

日付 バージョン 変更内容

bull ホストプログラムのコンパイルおよびリンクホストプログラムのコンパイルの設定およびライブラリーパスとリンクを 1 つの章に統合しました

bull プリプロセッサーマクロの章を追加しましたbull グローバルメモリーアクセスの 適化のタイトルをグローバルメモリーアクセス

の分割に変更しました

2013 年 6 月 130 SP10 bull FPGA ボードの設定の章を追加しましたbull カーネルプログラミング時の考慮事項からターゲット FPGA ボードの指定の項目

を削除しましたbull 特定の FPGA ボードのターゲットとコンパイルレポートの生成の項目をOpenCL カ

ーネルソースファイルのコンパイルに追加しましたbull ファイルスコープ__constant アドレス空間修飾子のタイトルを__constant アドレ

ス空間修飾子に変更し次の項目を挿入しましたmdash 関数スコープ__constant 変数mdash ファイルスコープ__constant 変数mdash ホストからの__constant パラメーターの指定

bull OpenCL カーネルへのファイルスコープ構造の受け渡しの項目をカーネルプログラミング時の考慮事項に追記しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの変更をカーネル属性とプラグマの指定による OpenCL カーネルの拡張にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張の章の unrollプラグマディレクティブの内容を更新しました

bull 順不同のコマンドキューおよび構造パラメーター変換に向けたホストプログラムの変更の項目をホストプログラミング時の考慮事項に追加しました

bull clCreateProgramWithBinary を使用した FPGA へのカーネルのロード およびアライメントされたメモリー割り当ての章を更新しました

bull フラッシュプログラミング手順を更新しましたbull 付録 B のオプションの拡張の内容を更新しアトミック関数にタイトルを変更しまし

たbull 付録 B からプラットフォームレイヤーとランタイムの実装を削除しました

2013 年 5 月 1301 bull 明示的なメモリーフェンス機能がサポートされるようになったため関連する内容をOpenCL プログラミング言語の実装の表から削除しました

bull FPGA のフラッシュメモリーのプログラミングの章を更新しましたbull カーネル属性とプラグマの指定による OpenCL カーネルの変更の章を追加しカー

ネルのパフォーマンスを 適化するために実装可能なカーネル属性とプラグマを導入しました

bull グローバルメモリーアクセスの 適化の章を追加しデータの分割に関する説明を追加しました

bull 付録 A からaocl プラグムコマンドを使用した FPGA のプログラミングの章を削除しました

2013 年 5 月 1300 bull コンパイルフローを更新しましたbull カーネルのコンパイラーコマンドを更新しましたbull Altera SDK for OpenCL ユーティリティーコマンドを追加しましたbull OpenCL プログラミング時の考慮事項を追加しましたbull フラッシュプログラミング手順を更新しこれを付録 A に移動しましたbull 新しい clCreateProgramWithBinary FPGA ハードウェアプログラミング

フローを追加しましたbull ホストを必要としない clCreateProgramWithBinaryハードウェアプログラ

ミングフローを付録 A の aocl プラグマコマンドを使用した FPGA プログラミングに移動しました

bull 割り当て制限と OpenCL 言語サポートに関する 新情報を付録 B へ移動しました

2012 年 11 月 1210 初版

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

204

  • インテル FPGA SDK for OpenCLプロエディション プログラミングガイド
  • 目次
  • 1 インテルreg FPGA SDK for OpenCLtrade の概要
    • 11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件
    • 12 インテル FPGA SDK for OpenCLのFPGAプログラミングフロー
      • 2 インテル FPGA SDK for OpenCLオフラインコンパイラーのカーネルコンパイルフロー
        • 21 シンプルなカーネルに向けたワンステップコンパイル
        • 22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー
          • 3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得
            • 31 ソフトウェアバージョンの表示 (version)
            • 32 コンパイラーバージョンの表示 (-version)
            • 33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)
              • 331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)
                • 34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)
                • 35 利用可能なFPGAボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages)
                • 36 OpenCLバイナリーのコンパイル環境の表示 (env)
                  • 4 FPGAボードの管理
                    • 41 FPGAボードのインストール (install)
                    • 42 FPGAボードのアンインストール (uninstall)
                    • 43 FPGAボードのデバイス名の照会 (diagnose)
                    • 44 ボード診断テストの実行 (diagnose ltdevice_namegt)
                    • 45 オフラインまたはホストなしでのFPGAのプログラミング (program ltdevice_namegt)
                    • 46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)
                      • 5 OpenCLカーネルの構築
                        • 51 カーネルの命名ガイドライン
                        • 52 データの処理効率を最適化するためのプログラミング手法
                          • 521 ループ展開 (unroll Pragma)
                          • 522 ネスト化されたループの結合
                          • 523 ループ開始間隔の指定 (II)
                          • 524 ループの並列性 (max_concurrency Pragma)
                          • 525 ループの投機的実行 (speculated_iterations Pragma)
                          • 526 ワークグループサイズの指定
                          • 527 計算ユニット数の指定
                          • 528 SIMDワークアイテム数の指定
                          • 529 メモリー属性の指定
                            • 53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法
                            • 54 インテル FPGA SDK for OpenCL チャネル拡張の実装
                              • 541 インテル FPGA SDK for OpenCL チャネル拡張の概要
                              • 542 チャネルにおけるデータの動作
                              • 543 チャネルに対する複数のワークアイテムの順序付け
                                • 5431 チャネルのワークアイテムのシリアル実行
                                  • 544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約
                                  • 545 OpenCLカーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化
                                    • 5451 チャネルのハンドル宣言
                                    • 5452 ブロッキングのチャネル書き込みの実装
                                      • 54521 ノンブロッキングのチャネル書き込みの実装
                                        • 5453 ブロッキングのチャネル読み取りの実装
                                          • 54531 ノンブロッキングのチャネル読み取りの実装
                                            • 5454 ioチャネル属性を使用したIOチャネルの実装
                                            • 5455 IOチャネルのエミュレーション
                                            • 5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例
                                            • 5457 depth属性を使用するバッファーされたチャネルの実装
                                            • 5458 チャネルの呼び出し順序の強制
                                              • 54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義
                                                • 55 OpenCLパイプの実装
                                                  • 551 OpenCLパイプ機能の概要
                                                  • 552 パイプデータの動作
                                                  • 553 パイプにおける複数のワークアイテムの順序付け
                                                    • 5531 パイプにおけるワークアイテムのシリアル実行
                                                      • 554 OpenCLのパイプ実装における制約
                                                      • 555 カーネルに向けたOpenCLパイプの有効化
                                                        • 5551 他のOpenCL SDKとの互換性の確保
                                                        • 5552 パイプハンドルの宣言
                                                        • 5553 パイプ書き込みの実装
                                                        • 5554 パイプ読み出しの実装
                                                        • 5555 depth属性を使用するバッファーされたパイプの実装
                                                        • 5556 io属性を使用したIOパイプの実装
                                                        • 5557 パイプ呼び出し順序の強制
                                                          • 55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義
                                                              • 556 ホストパイプを介したカーネルとの直接通信
                                                                • 5561 intel_host_accessibleカーネル引数属性オプション
                                                                • 5562 ホストがアクセス可能なパイプカーネル引数にバインドされたcl_memパイプオブジェクトと通信するためのAPI関数
                                                                • 5563 ホストがアクセス可能なパイプの作成
                                                                • 5564 cl_intel_fpga_host_pipe拡張機能の使用例
                                                                    • 56 任意精度での整数の実装
                                                                    • 57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用
                                                                    • 58 __constantアドレス空間修飾子の宣言
                                                                    • 59 構造体データ型をOpenCLカーネルに引数として含める
                                                                      • 591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致
                                                                      • 592 データ構造パディング挿入の無効化
                                                                      • 593 構造体のアライメントの指定
                                                                        • 510 レジスターの推論
                                                                          • 5101 シフトレジスターの推論
                                                                            • 511 倍精度浮動小数点演算の有効化
                                                                            • 512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター
                                                                              • 5121 アキュムレーターを推論するためのプログラミング手法
                                                                                • 513 整数のプロモーション規則
                                                                                  • 6 ホストアプリケーションの設計
                                                                                    • 61 ホストのプログラミング要件
                                                                                      • 611 ホストマシンのメモリー要件
                                                                                      • 612 ホストバイナリーの要件
                                                                                      • 613 複数のホストスレッド
                                                                                      • 614 順不同のコマンドキュー
                                                                                      • 615 カーネルを同時に実行するための複数のコマンドキューにおける要件
                                                                                        • 62 グローバルメモリーの手動分割におけるOpenCLバッファーの割り当て
                                                                                          • 621 同じメモリータイプの複数のインターフェイスでのバッファーの分割
                                                                                          • 622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割
                                                                                          • 623 ホストアプリケーションでのパイプオブジェクトの作成
                                                                                            • 63 カーネル実行中におけるプロファイルデータの収集
                                                                                              • 631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング
                                                                                              • 632 プロファイルデータの取得
                                                                                              • 633 複数の自動実行プロファイリング呼び出し
                                                                                                • 64 カスタムプラットフォーム固有の関数へのアクセス
                                                                                                • 65 構造パラメーター変換に向けたホストプログラムの変更
                                                                                                • 66 ホストアプリケーションの管理
                                                                                                  • 661 Makefileフラグメント例の表示 (example-makefileまたはmakefile)
                                                                                                  • 662 ホストアプリケーションのコンパイルとリンク
                                                                                                    • 6621 ホストアプリケーションとKhronos ICD Loader Libraryのリンク
                                                                                                    • 6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)
                                                                                                    • 6623 OpenCLホストランタイムライブラリーおよびMMDライブラリーへのパスの表示 (ldflags)
                                                                                                    • 6624 OpenCLホストランタイムライブラリーおよびMMDライブラリーのリスト表示 (ldlibs)
                                                                                                    • 6625 OpenCLホストランタイムライブラリーおよびMMDライブラリーに関する情報の表示 (link-config または linkflags)
                                                                                                      • 663 OpenCL ICD拡張APIの使用
                                                                                                      • 664 ホストを経由したFPGAのプログラミング
                                                                                                        • 6641 複数のFPGAデバイスのプログラミング
                                                                                                          • 66411 OpenCL FPGAデバイスの診断
                                                                                                          • 66412 デバイス情報の照会
                                                                                                          • 66413 複数のFPGAデバイスへのカーネルのロード
                                                                                                              • 665 ランタイム環境の終了とエラー回復
                                                                                                                • 67 SoCをターゲットとするOpenCL カーネルへの共有メモリーの割り当て
                                                                                                                • 68 徐々に速度低下するOpenCLシステムのデバッグ
                                                                                                                  • 7 OpenCL カーネルのコンパイル
                                                                                                                    • 71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル
                                                                                                                    • 72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)
                                                                                                                    • 73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)
                                                                                                                    • 74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)
                                                                                                                    • 75 インテル FPGA SDK for OpenCLオフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)
                                                                                                                    • 76 特定のFPGAボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)
                                                                                                                    • 77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)
                                                                                                                    • 78 カーネルのFmaxターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt)
                                                                                                                    • 79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)
                                                                                                                    • 710 コンパイル進捗レポートの生成 (-v)
                                                                                                                    • 711 リソース推定使用率要約の画面表示 (-report)
                                                                                                                    • 712 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージの抑制 (-W)
                                                                                                                    • 713 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)
                                                                                                                    • 714 コンパイラーレポートのデバッグデータの削除およびaocxファイルのソースコードの削除 (-g0)
                                                                                                                    • 715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)
                                                                                                                    • 716 グローバルメモリーのリング型相互接続の強制 (-global-ring)
                                                                                                                    • 717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)
                                                                                                                    • 718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)
                                                                                                                    • 719 浮動小数点演算処理順序の緩和 (-fp-relaxed)
                                                                                                                    • 720 浮動小数点演算における丸め処理の削減 (-fpc)
                                                                                                                    • 721 OpenCLコンパイルの高速化 (-fast-compile)
                                                                                                                    • 722 カーネルのインクリメンタルコンパイル (-incremental)
                                                                                                                      • 7221 インクリメンタルコンパイルレポート
                                                                                                                      • 7222 インクリメンタルコンパイルのその他のコマンドオプション
                                                                                                                      • 7223 インクリメンタルコンパイルフィーチャーの制限
                                                                                                                        • 723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)
                                                                                                                        • 724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)
                                                                                                                        • 725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)
                                                                                                                          • 8 OpenCLカーネルのエミュレーションとデバッグ
                                                                                                                            • 81 高速エミュレーターの設定
                                                                                                                            • 82 エミュレーションに向けたチャネルカーネルコードの変更
                                                                                                                              • 821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション
                                                                                                                              • 822 チャネル深度のエミュレーション
                                                                                                                                • 83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)
                                                                                                                                • 84 OpenCLカーネルのエミュレーション
                                                                                                                                • 85 LinuxにおけるOpenCLカーネルのデバッグ
                                                                                                                                • 86 インテル FPGA SDK for OpenCL Emulatorの制限
                                                                                                                                • 87 ハードウェアとエミュレーターの結果の不一致
                                                                                                                                • 88 高速エミュレーターの環境変数
                                                                                                                                • 89 高速エミュレーターでサポートされている拡張機能
                                                                                                                                • 810 高速エミュレーターの既知の問題
                                                                                                                                • 811 レガシーエミュレーターの使用
                                                                                                                                  • 8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)
                                                                                                                                    • 81111 レガシーエミュレーターでのチャネル深度のエミュレーション
                                                                                                                                      • 8112 レガシーエミュレーターでのOpenCLカーネルのエミュレーション
                                                                                                                                      • 8113 LinuxにおけるレガシーエミュレーターでのOpenCLカーネルのデバッグ
                                                                                                                                          • 9 カーネルのreporthtmlファイルのレビュー
                                                                                                                                          • 10 OpenCLカーネルのプロファイリング
                                                                                                                                            • 101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)
                                                                                                                                            • 102 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report)
                                                                                                                                            • 103 自動実行カーネルのプロファイリング
                                                                                                                                              • 11 インテル Code Builder for OpenCL を使用するOpenCLアプリケーションの開発
                                                                                                                                                • 111 Microsoft Visual Studioに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 112 Eclipseに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 113 インテル Code Builder for OpenCL でのセッションの作成
                                                                                                                                                • 114 セッションのコンフィグレーション
                                                                                                                                                  • 12 インテル FPGA SDK for OpenCL のアドバンスト機能
                                                                                                                                                    • 121 OpenCLライブラリー
                                                                                                                                                      • 1211 RTLモジュールとOpenCLパイプラインの理解
                                                                                                                                                        • 12111 インテルFPGA SDK for OpenCLパイプラインのアプローチの概要
                                                                                                                                                        • 12112 RTLモジュールのインテル FPGA SDK for OpenCLパイプラインへの統合
                                                                                                                                                        • 12113 ストールのないRTL
                                                                                                                                                        • 12114 RTLモジュールインターフェイス
                                                                                                                                                        • 12115 Avalon Streaming (Avalon-ST) インターフェイス
                                                                                                                                                        • 12116 RTLリセットおよびクロック信号
                                                                                                                                                          • 121161 ストールのないRTLモジュールおよびストールをサポートするRTLモジュールの インテル Stratix 10デザイン固有のリセット要件
                                                                                                                                                            • 12117 RTLモジュールのXML構文
                                                                                                                                                              • 121171 ATTRIBUTESを指定するXML要素
                                                                                                                                                              • 121172 INTERFACEを指定するXML要素
                                                                                                                                                              • 121173 リソースを指定するXML要素
                                                                                                                                                                • 12118 RTLモジュールと外部メモリーの通信
                                                                                                                                                                • 12119 RTLモジュールに入るスレッドの順序
                                                                                                                                                                • 121110 RTLモジュールのOpenCL Cモデル
                                                                                                                                                                • 121111 RTLモジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性
                                                                                                                                                                  • 1212 OpenCLライブラリーに向けたOpenCLヘルパー関数ファイルのパッケージ化
                                                                                                                                                                  • 1213 OpenCLライブラリーに向けたRTLコンポーネントのパッケージ化
                                                                                                                                                                    • 12131 インテル FPGA SDK for OpenCL ライブラリー機能に対するRTLサポートの制約と制限
                                                                                                                                                                      • 1214 RTLモジュールの検証
                                                                                                                                                                      • 1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化
                                                                                                                                                                      • 1216 OpenCLカーネルコンパイル時のOpenCLライブラリーの指定
                                                                                                                                                                      • 1217 シミュレーションによるOpenCLライブラリーのデバッグ (プレビュー)
                                                                                                                                                                        • 12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)
                                                                                                                                                                        • 12172 OpenCL ライブラリーのシミュレーション
                                                                                                                                                                        • 12173 シミュレーターの制限
                                                                                                                                                                          • 1218 シンプルな関数で動作するOpenCLライブラリーの使用 (例1)
                                                                                                                                                                          • 1219 外部メモリーと動作するOpenCLライブラリーの使用 (例2)
                                                                                                                                                                          • 12110 OpenCLライブラリーのコマンドラインオプション
                                                                                                                                                                            • 122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性
                                                                                                                                                                              • 1221 変数固有の属性を使用する際の制約
                                                                                                                                                                                • 123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性
                                                                                                                                                                                  • 1231 カーネルインターフェイスに向けたハードウェア
                                                                                                                                                                                    • 12311 カーネルIDを生成し振り分けるハードウェアの省略
                                                                                                                                                                                    • 12312 ホストとカーネル間の通信ハードウェアの省略
                                                                                                                                                                                    • 12313 clEnqueueNDRangeKernel APIのglobal_work_offset引数をサポートするハードウェアの省略
                                                                                                                                                                                        • 124 num_compute_units(XYZ) 属性を使用したカーネルの複製
                                                                                                                                                                                          • 1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ
                                                                                                                                                                                          • 1242 カーネルコピーでのチャネル使用
                                                                                                                                                                                            • 125 カーネル内に登録される割り当ての組み込み関数
                                                                                                                                                                                              • A OpenCL機能のサポート状況
                                                                                                                                                                                                • A1 OpenCL10の機能のサポート状況
                                                                                                                                                                                                  • A11 OpenCL10 Cプログラミング言語の実装
                                                                                                                                                                                                  • A12 OpenCL Cプログラミング言語の制約
                                                                                                                                                                                                  • A13 組み込みジオメトリック関数の引数型
                                                                                                                                                                                                  • A14 数値コンプライアンスの実装
                                                                                                                                                                                                  • A15 イメージのアドレス指定とフィルタリングの実装
                                                                                                                                                                                                  • A16 アトミック関数
                                                                                                                                                                                                  • A17 埋め込みプロファイルの実装
                                                                                                                                                                                                    • A2 OpenCL 12の機能のサポート状況
                                                                                                                                                                                                      • A21 OpenCL 12のランタイムの実装
                                                                                                                                                                                                      • A22 OpenCL 12 Cプログラミング言語の実装
                                                                                                                                                                                                        • A3 OpenCL 20の機能のサポート状況
                                                                                                                                                                                                          • A31 OpenCL 20のヘッダー
                                                                                                                                                                                                          • A32 OpenCL 20ランタイムの実装
                                                                                                                                                                                                          • A33 OpenCL 20 Cプログラミング言語のパイプにおける制約
                                                                                                                                                                                                            • A4 インテル FPGA SDK for OpenCL の割り当てにおける制限
                                                                                                                                                                                                              • B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴
Page 4: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus

7 OpenCL カーネルのコンパイル10571 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル10572 ハードウェアを構築せずに行うカーネルのコンパイル (-c) 10673 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)10674 ヘッダーファイル位置の指定 (-I=ltdirectorygt) 10775 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o

ltfilenamegt)10876 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) 10877 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) 11078 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt) 11179 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) 111710 コンパイル進捗レポートの生成 (-v) 112711 リソース推定使用率要約の画面表示 (-report) 113712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)114713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセ

ージへの変換 (-Werror) 114714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) 114715 グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt)115716 グローバルメモリーのリング型相互接続の強制 (-global-ring) 115717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)116718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt) 116719 浮動小数点演算処理順序の緩和 (-fp-relaxed) 116720 浮動小数点演算における丸め処理の削減 (-fpc) 117721 OpenCL コンパイルの高速化 (-fast-compile)117722 カーネルのインクリメンタルコンパイル (-incremental) 118

7221 インクリメンタルコンパイルレポート 1197222 インクリメンタルコンパイルのその他のコマンドオプション1207223 インクリメンタルコンパイルフィーチャーの制限123

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)123724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) 123725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) 124

8 OpenCL カーネルのエミュレーションとデバッグ 12581 高速エミュレーターの設定12582 エミュレーションに向けたチャネルカーネルコードの変更 126

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション 127822 チャネル深度のエミュレーション128

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) 12884 OpenCL カーネルのエミュレーション 12985 Linux における OpenCL カーネルのデバッグ 13086 インテル FPGA SDK for OpenCL Emulator の制限 13187 ハードウェアとエミュレーターの結果の不一致13188 高速エミュレーターの環境変数 13389 高速エミュレーターでサポートされている拡張機能 133810 高速エミュレーターの既知の問題134811 レガシーエミュレーターの使用 135

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

4

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) 135

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション1368113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ 137

9 カーネルの reporthtml ファイルのレビュー 139

10 OpenCL カーネルのプロファイリング140101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) 140102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) 141103 自動実行カーネルのプロファイリング 142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発143111 Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフラインコンパイ

ラープラグインのコンフィグレーション143112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインの

コンフィグレーション 143113 インテル Code Builder for OpenCL でのセッションの作成144114 セッションのコンフィグレーション 145

12 インテル FPGA SDK for OpenCL のアドバンスト機能147121 OpenCL ライブラリー147

1211 RTL モジュールと OpenCL パイプラインの理解1481212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 1611213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化1621214 RTL モジュールの検証1641215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 1641216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 1651217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) 1651218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)1681219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) 16912110 OpenCL ライブラリーのコマンドラインオプション 170

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性 1711221 変数固有の属性を使用する際の制約173

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性1731231 カーネルインターフェイスに向けたハードウェア 173

124 num_compute_units(XYZ) 属性を使用したカーネルの複製 1761241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ 1771242 カーネルコピーでのチャネル使用 178

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

A OpenCL 機能のサポート状況 181A1 OpenCL10 の機能のサポート状況181

A11 OpenCL10 C プログラミング言語の実装 181A12 OpenCL C プログラミング言語の制約183A13 組み込みジオメトリック関数の引数型184A14 数値コンプライアンスの実装 184A15 イメージのアドレス指定とフィルタリングの実装 185A16 アトミック関数 185A17 埋め込みプロファイルの実装 185

目次

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

5

A2 OpenCL 12 の機能のサポート状況186A21 OpenCL 12 のランタイムの実装186A22 OpenCL 12 C プログラミング言語の実装 186

A3 OpenCL 20 の機能のサポート状況187A31 OpenCL 20 のヘッダー 187A32 OpenCL 20 ランタイムの実装 188A33 OpenCL 20 C プログラミング言語のパイプにおける制約 188

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限 189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴190

目次

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

6

1 インテルreg FPGA SDK for OpenCLtrade の概要

インテルreg FPGA SDK for OpenCLtrade プログラミングガイド は インテル SDK (ソフトウェア開発キット) for OpenCL のコンパイラーとツールに関する説明推奨事項ならびに使用方法を提供します インテル FPGA SDK for OpenCL (1) は インテル FPGA 製品に向けた OpenCL(2) ベースの異種並列プログラミング環境です

11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件

インテル FPGA SDK for OpenCL プロエディションプログラミングガイド はOpenCL の概念とアプリケーションプログラミングインターフェイス (API) について精通されている方がご利用になることを前提としていますまたOpenCL アプリケーションの作成経験がありOpenCL Specificationversion 10 を理解されていることも前提としています

インテル FPGA SDK for OpenCL またはOpenCL 向けのインテル FPGA ランタイム環境 (RTE)を使用しデバイスをプログラムする前にそれぞれのスタートガイドを十分に理解してから作業を開始してくださいなおこのプログラミングガイドは次の作業をすでに実行していることを前提としています

bull OpenCL カーネルを開発および展開するための tar ファイルのダウンロードまたインストーラーを実行し SDK インテル Quartusreg Prime 開発ソフトウェアプロエディションデバイスサポートのインストール

bull OpenCL カーネルを展開するための RTE のダウンロードおよびインストール

bull SDK もしくは RTE を使用しインテル SoC FPGA をプログラムする場合は インテル SoC FPGAエンベデッド開発スイート (EDS) プロエディションのダウンロードとインストール

bull FPGA ボードのインストールと設定

bull ボードのインストールが正常に終了し正確に機能するかの確認

上記作業を実行していない場合はSDK のスタートガイドを参照し詳細を確認ください

関連情報bull OpenCL References Pages

bull OpenCL Specification version 10

bull インテル FPGA SDK for OpenCL スタートガイド

bull Intel FPGA RTE for OpenCL Pro Edition Getting Started Guide

(1) インテル FPGA SDK for OpenCL は Khronos 社が公開している仕様に基づいておりKhronosConformance Testing Process に合格しています現在の規格適合状況については wwwkhronosorgconformance を参照してください

(2) OpenCL および OpenCL のロゴは Apple Incの商標でありKhronos Grouptradeの許可を得て使用しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

12 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

インテル FPGA SDK for OpenCL を使用しているアプリケーションには2 つのメインコンポーネントがあります1 つは FPGA プログラミングビットストリームでありもう 1 つはアプリケーションとFPGA アクセラレーターを管理するホストプログラムです インテル FPGA SDK for OpenCL オフラインコンパイラーはまずホストプログラムが FPGA のプログラミングに使用するイメージファイルにご自身の OpenCL カーネルをコンパイルしますホスト側の C コンパイラーはホストプログラムをコンパイルしそれをインテル FPGA SDK for OpenCL ランタイムライブラリーにリンクします

図 -1 インテル FPGA SDK for OpenCL プログラミングモデルの回路図

インテル FPGA for OpenCL

ランタイム環境

システムのホスト コンパイラー

 ホストソースコード

(cまたは cpp)

ホストバイナリー

SDKオフライン コンパイラー

カーネルソースコード

( cl)

FPGAイメージ(aocx)

ホストアプリケーションを

ホストで実行

Quartus Prime開発ソフトウェアデザインスイート

ボード固有のカスタムプラットフォーム  デザイン

ターゲットプラットフォームに向けたポーティングまたはカスタ

マイズ

バージョンに互換性のあるターゲットプラットフォームに向けたSDKのボードディレクトリー

最終的な計算結果

ランタイムの実行

ホストアプリケーションのコードパス OpenCL Kernelのコードパス カスタムプラットフォームのパス

(カスタムプラットフォームはOpenCLボードとともに提供されます)

ボード開発者が作成するアイテム

SDKユーザーが作成するアイテム

インテルが提供するツールまたはデザイン

ボード開発者が提供するアイテム

サードパーティーが提供するツールまたはオープンソースツール

ツールが生成するアイテム プロセスまたはアクション

Intel FPGA SDK for OpenCLリファレンスプラットフォーム    デザイン

次の SDK コンポーネントと連携しインテル FPGA のプログラムを作成します

bull ホストアプリケーションとホストコンパイラー

bull OpenCL カーネルとオフラインコンパイラー

bull カスタムプラットフォーム

カスタムプラットフォームはボードサポートパッケージを提供しますボードメーカーは通常特定の OpenCL ボードをサポートするカスタムプラットフォームを開発しますオフラインコンパイラーはOpenCL カーネルをコンパイルしハードウェアプログラミングイメージを生成する際にカスタムプラットフォームをターゲットにしますホストはその後ホストアプリケーションを実行し通常ハードウェアイメージを FPGA にプログラムし実行します

例えば従来のプロセッサーなどでのシーケンシャルなプログラムの実装ではプログラムカウンターがハードウェアで実行される命令のシーケンスとハードウェアで順次実行される命令を制御しますインテル FPGA SDK for OpenCL などでの空間的なプログラムの実装では前提条件となるデータが利用可能になるとすぐに命令が実行されますプログラムはデータの依存関係を表す連続した流れとして解釈されます

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

8

図 -2 FPGA データフローアーキテクチャー

ロード ロード

ストア

FPGA領域(空間的な計算)

42

1 インテルreg FPGA SDK for OpenCLtrade の概要UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

9

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフロー

インテル FPGA SDK for OpenCL オフラインコンパイラーではご自身の FPGA プログラミングイメージファイル (aocxファイル) を単一または複数のプロセスで作成可能ですご自身のカーネルの複雑さに応じて推奨されるコンパイル方法が決まります

図 -3 インテル FPGA SDK for OpenCL の FPGA プログラミングフロー

カーネルソースコード2 ( cl )

カーネルソースコード1 ( cl )

カーネルソースコード3 ( cl )

ホストバイナリー

標準Cコンパイラー

ホストコード

OpenCL Kernelのオフラインコンパイラー

カーネルバイナリーA(aocx )

FPGAのプログラミングに向けてaocxをメモリーにロード

PCIe

PCIe

ランタイムのプログラミング

統合されたカーネルバイナリー A(aoco aocx)

5 ( cl )4 (cl ) 6 (cl )

統合されたカーネルバイナリーB(aoco aocx )

カーネルバイナリーB(aocx )

OpenCLカーネルのオフラインコンパイラー

カーネルソースコード

カーネルソースコード

カーネルソースコード

ランタイムのプログラミング

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

OpenCL カーネルソースファイル (cl) はFPGA で動作する OpenCL カーネルのソースコードを含みますオフラインコンパイラーは1 つもしくは複数のカーネルを一時ファイルにグループ化した後この一時ファイルをコンパイルして以下のファイルとフォルダーを生成します

bull 中間オブジェクトファイルであるaoco オブジェクトファイルこのファイルにはコンパイルの後半段階に向けての情報が含まれます

bull ハードウェアコンフィグレーションファイルであるaocxイメージファイルこのファイルはランタイムに FPGA をプログラミングするために必要な情報を含みます

bull aocxファイルの作成に必要なデータを含む作業フォルダーまたはサブディレクトリーデフォルトの状態で作業ディレクトリーの名前はご自身のclファイル名です複数のカーネルソースファイルをコンパイルする場合作業ディレクトリーの名前は aocコマンドラインの 後にリストしたclファイル名です

aocxファイルはホストアプリケーションがターゲット FPGA のプログラムオブジェクトを作成するために使用するデータを含みますプログラムオブジェクトはOpenCL ランタイム API の概念ですホストアプリケーションはまずこれらのプログラムオブジェクトをメモリーにロードしますホストランタイムはその後これらのプログラムオブジェクトを使用しホストプログラムのカーネル起動動作の要求に基づきターゲット FPGA をプログラムします

21 シンプルなカーネルに向けたワンステップコンパイル

デフォルトでインテル FPGA SDK for OpenCL は1 つもしくは複数の OpenCL カーネルのコンパイルとハードウェアコンフィグレーションファイルの作成を一度の作業で行いますご自身のアプリケーションの OpenCL カーネルが 1 つの場合や複数のカーネルがアプリケーションにある場合でも 小のイタレーションのみを必要とする場合にこのコンパイルオプションを選択します

次の図はワンステップでコンパイルを行う OpenCL カーネルのデザインフローを表しています

図 -4 ワンステップでの OpenCL カーネルのコンパイルフロー

ltyour_kernel_filenamegtcl

aoc ltyour_kernel_filenamegtcl [-report]コンパイルの時間 (数時間)

説明

ファイル コマンド カーネルの実行

ltyour_kernel_filenamegtaocxltyour_kernel_filenamegtaoco ltyour_kernel_filenamegtaocr

FPGAにおける実行

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

11

コンパイルが正常に終了すると次のファイルとレポートが作成されます

bull aocoファイル

bull aocrファイル

bull aocxファイル

bull ltyour_kernel_filenamegtreportsreporthtmlファイルの概算リソース使用率の要約では暫定的に評価されたエリア使用率が提供されます単一ワークアイテムのカーネルの場合は 適化に向けたレポートでボトルネックが特定されます

注意 ワンステップのコンパイルフローでデザインのイタレーションを行うとイタレーションごとに FPGA のハードウェアをフルコンパイルしなければならないため非常に長い時間を費やしますその後 FPGA でカーネルを実行しパフォーマンスの測定をする必要があります

関連情報ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル (105 ページ)

22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

デザインの 適化に向けたイタレーションやその他の修正を繰り返し行う場合は複数のステップによるインテル FPGA SDK for OpenCL プロエディションのデザインフローを選択してください

次の図はSDK のデザインフローを段階で表していますデザインフローの各ステップは機能的なエラーとパフォーマンスのボトルネックを特定するためのチェックポイントとしての役割を果たしますこれによりイタレーションごとにフルコンパイルを実行することなくOpenCL のカーネルコードを修正することができるようになりますコンパイルステップは一部もしくはすべてを実行することのどちらも可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

12

図 -5 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー

ltyour_kernel_filenamegtaocx

ltyour_kernel_filenamegtcl

aoc -march=emulator ltyour_kernel_filenamegtclコンパイル時間 (数秒)

エミュレーションは成功したか

aoc ltyour_kernel_filenamegtclコンパイル時間 (数時間)

カーネルのパフォーマンスに満足しているか

エミュレーション

フルデプロイメント

カーネルをFPGAで実行

NO

YES

NO

説明

ファイルコマンドカーネルの実行

カーネルパフォーマンスの

概算データは許容可能か

NO

aoc -c ltyour_kernel_filenamegtcl [-report]コンパイル時間 (数秒から数分)

中間コンパイル (-c)

ltyour_kernel_filenamegtaocr

注)HTMLレポートとカーネルのプロファイリングについては「Intel FPGA SDK for OpenCL ベストプラクティスガイド」を参照ください

ltyour_kernel_filenamegtreportsreporthtml

HTMLレポートのレビュー

aoc -profile ltyour_kernel_filenamegtcl [-fast-compile] [-incremental]コンパイル時間 (数時間)

プロファイリング

aoc -fast-compile ltyour_kernel_filenamegt clコンパイル時間 (数分から数時間)

デザイン変更はわずかである

aoc -incremental ltyour_kernel_filenamegtcl [-fast-compile]

インクリメンタルコンパイル高速コンパイル

ltyour_kernel_filenamegtaoco

aoc -rtl ltyour_kernel_filenamegtcl [-report]

中間コンパイル (-rtl)

ハードウェアの実行は

成功したか

YES

NO

NO YES

YES

YES

シミュレーションは成功したか

YES

NO

aoc -march=simulator [-ghdl]ltyour_kernel_filenamegtcl コンパイル時間 (数分)

シミュレーション

ltyour_kernel_filenamegtaocx

コンパイル時間 (数秒から数分)

コンパイル時間 (数分から数時間)

SDK のデザインフローには次のステップがあります

1 エミュレーション

x86-64 ホストシステムの 1 つもしくは複数のエミュレーションデバイスで OpenCL カーネルを実行しその機能性を評価しますLinux システムではエミュレーターはシンボリックデバッグのサポートを提供しますシンボリックデバッグを使用するとカーネルコードの機能的なエラーの原因を特定できます

2 中間コンパイル

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

13

中間コンパイルを行う方法は 2 つありますデザインフローにはこの 2 つの方法のうち 1 つもしくは両方を含むことが可能です

bull -cフラグを使用し 1 つもしくは複数のclカーネルソースファイルをコンパイルする方法これによりOpenCL パーサーからの出力を含むaocoオブジェクトファイルを生成するようオフラインコンパイラーに命令が出されます

bull -rtlフラグを使用し 1 つもしくは複数のclカーネルソースファイルまたはaocoファイルをコンパイルする方法ただしコンパイルはどちらか一方のファイルになりますこれによりオフラインコンパイラーに以下のタスクを実行するよう命令が出されます

mdash 入力ファイルがclファイルの場合オフラインコンパイラーはaocoファイルを各カーネルソースファイルに生成しそれらをリンクしaocrファイルを生成します

mdash 入力ファイルがaocoファイルの場合オフラインコンパイラーはそれらをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt ディレクトリーを作成します

オフラインコパイラーはaocrファイルを使用し 終的なaocxハードウェアコンフィグレーションファイルを生成します

注意

デフォルトのボードが X の環境において-cフラグでカーネルをコンパイルしデフォルトのボードが Y の環境においてaocoファイルを-rtlフラグでコンパイルする場合オフラインコンパイラーはaocoファイルからボード X を読み出しそれを続くコンパイルの段階へ渡します

3 HTML レポートのレビュー

OpenCL アプリケーションの ltyour_kernel_filenamegtreportsreporthtmlファイルをレビューし概算のカーネルのパフォーマンスデータが許容できるかを判断しますHTML レポートではパフォーマンスを向上させるためのカーネルの修正案も提供されます

4 シミュレーション (プレビュー)

OpenCL カーネルをシミュレーションで実行しその機能性を評価しますシミュレーションではコンパイルに長時間を費やすことなくカーネルの機能の正確性および動的なパフォーマンスの評価を行うことができますカーネルのデバッグに向けカーネルの波形をキャプチャーし表示することが可能です

5 高速コンパイル

ハードウェアでの OpenCL カーネルの機能性を評価します高速コンパイルステップはフルコンパイルに比べわずかな時間でaocxファイルを生成します インテル FPGA SDK for OpenCLオフラインコンパイラーは簡単な 適化のみを実行しコンパイル時間を削減します

6 インクリメンタルコンパイル

ハードウェアでの OpenCL カーネルの機能性を評価しますインクリメンタルコンパイルでは修正したカーネルのみをコンパイルしaocxファイルを生成します インテル FPGA SDK forOpenCL オフラインコンパイラーはデザイン全体のサイズではなく変更したデザインのサイズによってコンパイル時間をスケーリングし生産性を向上させます

7 プロファイリング

FPGA プログラミングイメージにパフォーマンスカウンターを挿入するようインテル FPGASDK for OpenCL オフラインコンパイラーに命令します実行中カウンターは性能情報を集めますその情報は インテル FPGA Dynamic Profiler for OpenCL GUI で確認することが可能です

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

14

8 フルデプロイメント

デザインフロー全体における OpenCL カーネルのパフォーマンスに納得したらフルコンパイルを実行します実行後デプロイメントに適したaocxファイルが生成されます

HTML レポートとカーネルのプロファイリングについては インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

関連情報bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ)

bull OpenCL コンパイルの高速化 (-fast-compile) (117 ページ)

bull カーネルの reporthtml ファイルのレビュー (139 ページ)

bull OpenCL カーネルのコンパイル (105 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

bull OpenCL カーネルのプロファイリング (140 ページ)

2 インテル FPGA SDK for OpenCL オフラインコンパイラーのカーネルコンパイルフローUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

15

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得

インテル FPGA SDK for OpenCL には2 つのコマンドオプションのセットが含まれます1 つはSDK ユーティリティーコマンド ( aocl ltcommand_optiongt )もう 1 つがインテル FPGASDK for OpenCL オフラインコンパイラーコマンド ( aoc ltcommand_optiongt ) ですそれぞれのコマンドセットにはソフトウェアコンパイラーおよびカスタムプラットフォームに関する一般的な情報を入手するために呼び出すことができるオプションが含まれています

注意 bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプション ( aocltcommand_optiongt ) は現在二重ダッシュ (--) ではなく単一ダッシュ (-) を使用します二重ダッシュの規則は 171 のリリースにて非推奨となり今後のリリースで削除される予定です

bull インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションは現在ltcommand_optiongt=ltvaluegt の規則に従っていますこの規則において valueはユーザー入力値をコンマで区切ったリストとすることが可能です -option value1 -optionvalue2の使用は 171 リリースで非推奨となり今後のリリースでは削除される予定です

ソフトウェアバージョンの表示 (version) (16 ページ)

コンパイラーバージョンの表示 (-version) (17 ページ)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help) (17ページ)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h) (17 ページ)

利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

OpenCL バイナリーのコンパイル環境の表示 (env) (19 ページ)

31 ソフトウェアバージョンの表示 (version)

インテル FPGA SDK for OpenCL のバージョンを表示するにはversionユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl version コマンドを呼び出します出力例

aocl ltversiongtltbuildgt (Intel(R) FPGA SDK for OpenCL(TM)Version ltversiongt Build ltbuildgt Copyright (C) ltyeargt IntelCorporation)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

32 コンパイラーバージョンの表示 (-version)

インテル FPGA SDK for OpenCL オフラインコンパイラーのバージョンを表示するには-versionコンパイラーコマンドを呼び出します

bull コマンドプロンプトで aoc -version コマンドを呼び出します出力例

Intel(R) FPGA SDK for OpenCL(TM) 64-Bit Offline CompilerVersion ltversiongt Build ltbuildgtCopyright (C) ltyeargt Intel Corporation

33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)

インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションに関する情報を表示するにはhelpユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl help コマンドを呼び出しますSDK はユーティリティーコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)

インテル FPGA SDK for OpenCL の特定のユーティリティーコマンドオプションについての情報を表示するにはhelp ユーティリティーコマンドの引数としてコマンドオプションを含めます

bull コマンドプロンプトで aocl help ltcommand_optiongt コマンドを呼び出します

例えばinstallユーティリティーコマンドオプションについての詳細情報を取得するにはaocl help install コマンドを呼び出します

出力例

aocl install - Installs a board onto your host system

Usage aocl install

DescriptionThis command installs a boards drivers and other necessary software for the host operating system to communicate with the boardFor example this might install PCIe drivers

34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)

インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションに関する情報を表示するには引数なしでコンパイラーコマンドを呼び出すか-helpまたは -hコマンドオプションでコンパイラーコマンドを呼び出します

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

17

bull コマンドプロンプトで次のコマンドのいずれかを呼び出します

mdash aoc

mdash aoc -help

mdash aoc -h

SDK はオフラインコンパイラーのコマンドオプションを機能に基づき分類していますまた各オプションの説明も提供しています

35 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示(-list-boards および-list-board-packages)

カスタムプラットフォームで利用可能な FPGA ボードのリストを表示するには-list-boardsオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -list-boards コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは以下のような出力を生成します

Board list ltboard_name_1gt ltboard_name_2gt

この ltboard_name_Ngt は特定の FPGA ボードをターゲットにするために aocコマンドで使用するボード名です

bull 複数のカスタムプラットフォームがインストールされている場合に特定のカスタムプラットフォームで利用可能な FPGA ボードの一覧を表示するには-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めますコマンドプロンプトで次のようにコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -list-boards

インテル FPGA SDK for OpenCL オフラインコンパイラーはカスタムプラットフォームで利用可能なボードの一覧を表示します

bull システムで利用可能なカスタムプラットフォームを一覧表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のような出力を生成します

Installed board packagesltboard_package_1gtltboard_package_2gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_3gtltboard_package_4gt

この ltboard_package_Ngt はご自身のシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

18

36 OpenCL バイナリーのコンパイル環境の表示 (env)

インテル FPGA SDK for OpenCL オフラインコンパイラーの入力引数およびコンパイルされたOpenCL デザインの環境を表示するにはenvユーティリティーコマンドを呼び出します

bull コマンドプロンプトでaocl env ltobject_file_namegt または aocl envltexecutable_file_namegt コマンドを呼び出します

ここで ltobject_file_namegt はOpenCL カーネルのaocoファイル名でltexecutable_file_namegt はカーネルのaocxファイル名です

aocl env vector_addaocxコマンドの出力例

INPUT_ARGS=-march=emulator -v devicevector_addcl -o binvector_addaocxBUILD_NUMBER=90ACL_VERSION=1610OPERATING_SYSTEM=linuxPLATFORM_TYPE=s5_net

3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

19

4 FPGA ボードの管理

インテル FPGA SDK for OpenCL はご自身の FPGA ボードのインストールアンインストール診断およびプログラミングを行うために呼び出すことができるユーティリティーコマンドを含んでいます

aocl installユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストール可能ですカスタムプラットフォームのサブディレクトリーにはboard_envxmlファイルが含まれます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGAクライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFPGA クライアントドライバーの旧称はアルテラクライアントドライバー (ACD) です

aocl installユーティリティーを実行すると FCD が設定されますインストールされた BSP はシステムにレジスターされるためランタイムおよび SDK ユーティリティーは必要な BSP ファイルを見つけることができます

重要 インストール後は BSP を別のディレクトリーに移動させないでくださいBSP を移動する場合は以下を実行します

1 aocl uninstallユーティリティーを使用し現在の位置から BSP をアンインストールします

2 BSP ディレクトリーを変更します

3 aocl installユーティリティーを使用し新しい位置に BSP を再インストールします

FPGA ボードのインストール (install) (21 ページ)

FPGA ボードのアンインストール (uninstall) (22 ページ)

FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)

オフラインまたはホストなしでの FPGA のプログラミング (program ltdevice_namegt) (24 ページ)

フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)

関連情報bull FPGA ボードのインストール (install) (21 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

41 FPGA ボードのインストール (install)

FPGA アクセラレーターボードまたは SoC デバイスに向けた OpenCL アプリケーションを作成する前にボードメーカーが提供するカスタムプラットフォームをダウンロードおよびインストールする必要がありますほとんどのカスタムプラットフォームインストーラーには管理者権限が必要ですaocl install ltpath_to_customplatformgt ユーティリティーコマンドを呼び出しご自身のボードをホストシステムにインストールしてください

以下にボードのインストール手順を説明します一部のカスタムプラットフォームには下記以外のインストール手順が加わります詳細に関してはボードメーカーより提供されている資料を参照してください

注意 インテル Arriareg 10 SoC 開発キットを インテル Arria 10 SoC 開発キットリファレンスプラットフォーム (a10soc) とともに使用する場合のインストールについてはInstalling the Intel Arria 10Development Kit を参照ください

注意 インテル FPGA SDK for OpenCL を インテル Arria 10 GX FPGA 開発キットと使用する場合アプリケーションノートの AN 807 Configuring the Intel Arria 10 GX FPGA Development Kitfor the Intel FPGA SDK for OpenCLを参照ください

1 ボードメーカーが案内している手順に従いFPGA ボードをシステムに接続します

2 ボードメーカーの Web サイトからご自身の FPGA ボード用のカスタムプラットフォームをダウンロードします インテル FPGA SDK for OpenCL リファレンスプラットフォームのダウンロードついては インテル FPGA SDK for OpenCL プラットフォームのページを参照ください

ヒント

インテル FPGA SDK for OpenCL とともに提供されている BSP (a10_ref s10_refa10soc など) をインストールする場合はカスタムプラットフォームのインストールは不要ですBSP ファイルは INTELFPGAOCLSDKROOThldboardsにあります手順 4(21 ページ) に進んでください

3 システムフォルダー以外の任意のフォルダーにカスタムプラットフォームをインストールします

複数のカスタムプラットフォームでの aocl diagnoseなどSDK ユーティリティーを使用し同じシステムに複数のカスタムプラットフォームを同時にインストールできますカスタムプラットフォームのサブディレクトリーはboard_envxmlファイルを含みます

複数のカスタムプラットフォームがあるシステムではカスタムプラットフォームのメモリーマップドデバイス (MMD) ライブラリーディレクトリーに直接リンクするのではなくホストプログラムが FPGA クライアントドライバー (FCD) を使用しボードを検出するようにしてくださいFCDがカスタムプラットフォームに対し正しく設定されている限りFCD はインストールされているボードすべてをランタイムに検出します

4 QUARTUS_ROOTDIR_OVERRIDE ユーザー環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアのインストールディレクトリーを指定するように設定します

5 カスタムプラットフォームライブラリーへのパス (ボードサポートパッケージの MMD ライブリーへのパスであればltpath_to_customplatformgtwindows64binなど) をPATH(Windows) もしくは LD_LIBRARY_PATH (Linux) 環境変数設定に追加します

インテル FPGA SDK for OpenCL スタートガイドはinit_openclスクリプトに関するより詳細な情報を提供していますユーザー環境変数の設定および init_openclスクリプトの実行に関しては インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章を参照ください

6 コマンドプロンプトで aocl install ltpath_to_customplatformgt を呼び出します

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

21

aocl install ltpath_to_customplatformgt を呼び出すとFCD とボードドライバーがインストールされホストアプリケーションとハードウェアのカーネルプログラムの通信が可能になります

注意

bull ボードのインストールには管理者権限が必要ですWindows コマンドプロンプトを管理者として実行するにはStart gt All Programs gt Accessories をクリックしますAccessories の Command Prompt を右クリックし右クリックメニューにあるRun as Administrator をクリックします

Windows 81 または Windows 10 のシステムでは署名付きドライバーの検証を無効にしなければならない場合があります詳細については以下の内容を参照してください

mdash Windows 8 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-basesolutionsfb321729html

mdash Windows 10 httpswwwintelcomcontentaltera-wwwglobalen_usindexsupportsupport-resourcesknowledge-baseembedded2017Why-does-aocl-diagnose-fail-while-using-Windows-10html

bull システムにドライバーがすでにインストールされており管理者権限なしで FCD をインストールする必要がある場合以下のように aocl installコマンドを-fcd-onlyフラグとともに呼び出しFCD インストールのプロンプトに従ってください

aocl install ltpath_to_customplatformgt -fcd-only

7 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出しますソフトウェアはltdevice_namegt を含む出力を生成しますltdevice_namegt はacl0 からacl127 の acl 番号です

注意

aocl diagnoseユーティリティーを実装した後に発生する可能性があるエラーに関してはIntel Arria 10 GX FPGA Development Kit Reference Platform Porting GuideのPossible Errors After Running the diagnose Utility の章を参照くださいご自身のアクセラレーターボードの ltdevice_namegt の照会に関してはFPGA ボードのデバイス名の照会の章を参照ください

8 FPGA ボードが正常にインストールされていることを確認するには aocl diagnoseltdevice_namegt コマンドを呼び出しボードメーカーが推奨する診断テストを実行します

関連情報bull FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

bull インテル FPGA SDK for OpenCL FPGA プラットフォームページ

42 FPGA ボードのアンインストール (uninstall)

FPGA ボードをアンインストールするにはuninstallユーティリティーコマンドを呼び出しカスタムプラットフォームのアンインストール後に関連する環境変数の設定を解除します

FPGA ボードをアンインストールするには次の手順を行います

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

22

1 ボードメーカーから提供されている手順に従いマシンからボードを外します

2 aocl uninstall ltpath_to_customplatformgt ユーティリティーコマンドを呼び出し現在のホストコンピュータードライバーを削除します (PCIeregドライバーなど) インテルFPGA SDK for OpenCL はFPGA ボードと通信するためにそれらのドライバーを使用します

注意

bull カスタムプラットフォームのアンインストールにはroot権限が必要ですドライバーを維持しながらインストールされている FCD を削除するには以下のように aocluninstall コマンドを-fcd-onlyフラグとともに呼び出しFCD のアンインストールのプロンプトに従ってください

aocl uninstall ltpath_to_customplatformgt -fcd-only

bull Linux システムにおいてFCD をデフォルトディレクトリーである opt Intel OpenCL Boards 以外の特定のディレクトリーにインストールした場合アンインストールを実行する前に環境変数 ACL_BOARD_VENDOR_PATHがその特定の FCD のインストールディレクトリーを指すよう設定されていることを確認してください

3 カスタムプラットフォームをアンインストールします

4 LD_LIBRARY_PATH 環境変数 (Linux の場合) または PATH 環境変数 (Windows の場合) の設定を解除します

43 FPGA ボードのデバイス名の照会 (diagnose)

一部の OpenCL ソフトウェアユーティリティーコマンドにはデバイス名 (ltdevice_namegt) を指定する必要がありますltdevice_namegt はFPGA デバイスに対応する acl 番号を参照します (例えば acl0 から acl127) アクセラレーターボードのリストを照会するとOpenCL ソフトウェアは使用するマシンにインストールされているデバイスのリストをデバイス名の順に生成します

bull マシンにインストールされているデバイスのリストを照会するにはコマンドプロンプトに aocldiagnose と入力しますソフトウェアは以下の例のような出力を生成します

aocl diagnose Running diagnostic from ALTERAOCLSDKROOTboardltboard_namegtltplatformgtlibexec

Verified that the kernel mode driver is installed on the host machine

Using board package from vendor ltboard_vendor_namegtQuerying information for all supported devices that are installed on the host machine

device_name Status Information

acl0 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 020000 at Gen 2 with 8 lanes FPGA temperature=430 degrees C

acl1 Passed ltdescriptive_board_namegt PCIe dev_id = ltdevice_IDgt busslotfunc = 030000 at Gen 2 with 8 lanes FPGA temperature = 350 degrees C

Found 2 active device(s) installed on the host machine to perform a full diagnostic on a specific device please run aocl diagnose ltdevice_namegt

DIAGNOSTIC_PASSED

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

23

関連情報OpenCL FPGA デバイスの診断 (99 ページ)

44 ボード診断テストの実行 (diagnose ltdevice_namegt)

特定の FPGA ボードで詳細な診断を実行するにはdiagnose ユーティリティーコマンドの引数として ltdevice_namegt を含みます

bull コマンドプロンプトで aocl diagnose ltdevice_namegt コマンドを呼び出しますここで ltdevice_namegt はご自身の FPGA デバイスに対応する (acl0 から acl127 の) acl 番号です

システムにインストールされたボードのリストを照会するとltdevice_namegt を識別することができます

複数の FPGA ボードで diagnoseユーティリティーコマンドを使用し診断テストを実行する場合のボードに関する詳細はボードメーカーより提供されている資料を参照ください

45 オフラインまたはホストなしでの FPGA のプログラミング (programltdevice_namegt)

オフラインまたはホストなしで FPGA デバイスをプログラミングするにはprogramユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl program ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

注意 SoC をプログラミングするにはprogramユーティリティーコマンドを呼び出す際にデバイスのフルパスを次の例のように指定してください aocl program devltdevice_namegtltyour_kernel_filenamegtaocx

46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)

カスタムプラットフォームでサポートされている場合はflashユーティリティーコマンドを呼び出し指定されたスタートアップコンフィグレーションで FPGA を初期化します

注意 インテル Arria 10 SoC 開発キットなどのSoC ボードのマイクロ SD フラッシュカードのプログラミング例に関してはIntel FPGA SDK for OpenCL Intel Arria 10 SoC Development KitReference Platform Porting Guide のBuilding the SD Card Image の章を参照ください

4 FPGA ボードの管理UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

24

bull コマンドプロンプトで aocl flash ltdevice_namegtltyour_kernel_filenamegtaocxコマンドを呼び出します

以下が詳細です

ltdevice_namegt はFPGA デバイスに対応する acl 番号 (acl0 から acl127) を指します

ltyour_kernel_filenamegtaocxはハードウェアをプログラミングするために使用する実行可能ファイルです

関連情報Building the SD Card Image for the Intel Arria 10 SoC Development Kit

4 FPGA ボードの管理UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

25

5 OpenCL カーネルの構築

インテルではOpenCL カーネルコードの構築方法に関する推奨事項を提供していますカーネルを作成する際もしくは別のアーキテクチャーをターゲットとして書かれたカーネルを変更する際はこのプログラミングにおける推奨事項を実行することを検討ください

カーネルの命名ガイドライン (26 ページ)

データの処理効率を 適化するためのプログラミング手法 (27 ページ)

ローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35 ページ)

インテル FPGA SDK for OpenCL チャネル拡張の実装 (36 ページ)

OpenCL パイプの実装 (53 ページ)

任意精度での整数の実装 (70 ページ)

条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用 (71 ページ)

__constant アドレス空間修飾子の宣言 (72 ページ)

構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

レジスターの推論 (76 ページ)

倍精度浮動小数点演算の有効化 (78 ページ)

単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター (78 ページ)

整数のプロモーション規則 (80 ページ)

51 カーネルの命名ガイドライン

インテルではファイル名に英数字のみを含めることを推奨しています

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ファイル名は英数字で始めてください

OpenCL アプリケーションのファイル名が英数字以外で始まっている場合以下のコンパイルエラーが発生します

Error Quartus compilation FAILEDSee quartus_sh_compilelog for the output log

bull 英数字以外の文字を使用しファイル名を区別しないでください

インテル FPGA SDK for OpenCL オフラインコンパイラーは英数字以外の文字をアンダースコア ( _ ) に変換しますファイル名の末尾のみを英数字以外の異なる文字にし2 つのファイルを区別すると (例えばmyKernelclと myKernelclなど)オフラインコンパイラーはその 2 つのファイル名をどちらもltyour_kernel_filenamegt _cl (前述の例の場合myKernel_cl) に変換します

bull Windows システムの場合カーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えないようにしてください

64 ビットの Windows 7 および Windows 81 にはファイルパスの長さに 260 文字の制限がありますカーネルファイル名とそのファイルパスの合計文字数が 260 文字を超えるとオフラインコンパイラーは次のエラーメッセージを生成します

The filename or extension is too long The system cannot find the path specified

コンパイラーのエラーメッセージに加え次のメッセージが ltyour_kernel_filenamegtquartus_sh_compilelog ファイルに表示されます

Error Canrsquot copy ltfile_typegt files Canrsquot open ltyour_kernel_filenamegt for write No such file or directory

Windows 10 では260 文字の制限を除外することができます詳しくはWindows 10 の資料を参照してください

bull OpenCL のカーネルソースファイル (cl) に予約されているキーワードである「kernel」「Verilog」または「VHDL」の名前を付けないでください

ソースファイルに kernelclVerilogclまたは VHDLclの名前を付けるとオフラインコンラパイラーは特定の内部ファイルと同じ名前の中間デザインファイルを生成するためコンパイルエラーが発生します

52 データの処理効率を最適化するためのプログラミング手法

カーネルのデータ処理効率はループ展開ワークグループサイズの設定計算ユニットとワークアイテムの指定などの手法を実行し 適化してください

ループ展開 (unroll Pragma) (28 ページ)

ネスト化されたループの結合 (28 ページ)

ループ開始間隔の指定 (II) (30 ページ)

ループの並列性 (max_concurrency Pragma) (31 ページ)

ループの投機的実行 (speculated_iterations Pragma) (32 ページ)

ワークグループサイズの指定 (32 ページ)

計算ユニット数の指定 (33 ページ)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

27

SIMD ワークアイテム数の指定 (34 ページ)

メモリー属性の指定 (34 ページ)

521 ループ展開 (unroll Pragma)

ループ展開はループ本体を複数回複製しループのトリップカウントを減らすことで行われますループの展開はFPGA でのループ制御オーバーヘッドの削減または防止のために行いますループに依存関係がなくオフラインコンパイラーがループの反復処理を並列して実行できる場合はループを展開することで FPGA のレイテンシーとオーバーヘッドを低減させることもできますインテル FPGA SDK for OpenCL オフラインコンパイラーはプラグマでアノテートされていない場合でも単純なループを展開する場合がありますループを展開するようまたは明示的にループを展開しないようオフラインコンパイラーに指示するにはカーネルコードの展開するループの前にunrollカーネルプラグマを挿入します

注意

bull 可能な限り展開係数を指定してください展開係数 N を指定するにはpragma unrollltNgt ディレクティブをカーネルコードのループの前に挿入します

オフラインコンパイラーはループ展開を 大 ltNgt 回試みます

コードの一部を下記に示します展開係数に 2 の値を割り当てることによりループを 2 回展開するようオフラインコンパイラーに指示しています

pragma unroll 2for(size_t k = 0 k lt 4 k++) mac += data_in[(gid 4) + k] coeff[k]

bull ループを完全に展開する場合カーネルコードのループの前にpragma unrollディレクティブのみを挿入し展開係数を省略することができます

オフラインコンパイラーはトリップカウントを認識すると完全なループ展開を試みます展開要求が実行できない場合オフラインコンパイラーは警告を発行します

bull ループが展開されないようにするには展開係数に 1 を指定します (pragma unroll 1)

522 ネスト化されたループの結合

loop_coalesceプラグマを使用しループの機能に影響を与えずにネスト化されたループを 1 つのループに結合するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示しますループの結合はコンパイラーにループ制御に必要なオーバーヘッドを削減するよう指示することによりカーネルの使用領域を削減することができます

ネスト化されたループを結合するとコンポーネントのレイテンシーも低減されるためカーネルの使用領域をさらに削減することも可能ですただし場合によってはループを結合させることで重要なループを開始させるパスの間隔が長くなる場合があるためループの結合がカーネルすべてに適しているとは限りません

NDRange カーネルではloop_coalesceプラグマによりアノテートされていない場合でもコンパイラーは自動的にループ結合を試みますNDRange カーネルでループを結合することによりスループットが向上するとともにカーネルの使用領域が低減しますloop_coalesceプラグマを使用するとNDRange カーネルにおけるループの自動結合を防ぐことができます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

28

ネスト化されたループを結合するには次のようにプラグマを指定します

pragma loop_coalesce ltloop_nesting_levelgt

ltloop_nesting_levelgt パラメーターはコンパイラーが結合を試みるネスト化されたループのレベル数をオプションで指定する整数ですltloop_nesting_levelgt パラメーターを指定しない場合コンパイラーはネスト化されたループすべてを結合しようと試みます

ネスト化されたループの例を以下に示します

for (A) for (B) for (C) for (D) for (E)

ループ (A) の前にプラグマを配置するとこのループのネストレベルは次のように定義されます

bull ループ (A) のループネストレベルは 1

bull ループ (B) のループネストレベルは 2

bull ループ (C) のループネストレベルは 3

bull ループ (D) のループネストレベルは 4

bull ループ (E) のループネストレベルは 3

指定したループネストレベルによってコンパイラーは異なるループ結合を試みます

bull pragma loop_coalesce 1をループ (A) に指定した場合コンパイラーはこのネスト化されたループの結合を試みません

bull pragma loop_coalesce 2をループ (A) に指定した場合コンパイラーはループ (A) と(B) の結合を試みます

bull pragma loop_coalesce 3を (A) に指定した場合コンパイラーはループ (A)(B)(C)(E)の結合を試みます

bull pragma loop_coalesce 4をループ (A) に指定した場合コンパイラーはループ (A) からループ (E) すべてのループの結合を試みます

重要 pragma loop_coalesce 1を NDRange カーネルのループに指定するとそのループの自動ループ結合を防ぐことができます

以下はコンパイラーが 2 つのループを 1 つのループに結合する方法を簡単な例にて示しています

下記はネスト化された単純なループです

pragma loop_coalescefor (int i = 0 i lt N i++) for (int j = 0 j lt M j++) sum[i][j] += i+j

コンパイラーは 2 つのループを結合し次のような 1 つのループであるかのように実行します

int i = 0int j = 0while(i lt N) sum[i][j] += i+j j++

if (j == M)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

29

j = 0 i++

523 ループ開始間隔の指定 (II)

開始間隔 (II) は連続するループの反復が開始されるまでのクロックサイクル数です iiプラグマを使用しプラグマ宣言に続くループに II の設定を試みるよう インテル FPGA SDK for OpenCL オフラインコンパイラー に指示しますオフラインコンパイラーがそのループに対して指定された II を実現できない場合コンパイルエラーが発生します

iiプラグマはループがパイプライン化されている単一のワークアイテムカーネル (シングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルプロパティーについての詳細はインテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照してください

II の値が高いほど後続するループ反復の実行開始までの待機時間が長くなりますII および特定のループにおける II のパフォーマンスへの影響についての詳細を提供するコンパイラーレポートに関しては インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

カーネルのループによってはデフォルトでコンパイラーが選択する値よりも高い II の値を iiプラグマで指定するとスループットを低下させることなくカーネルの 大動作周波数 (fMAX) を向上させることができます

次の条件を満たすループはiiプラグマの使用に適しています

bull カーネルがシングルスレッドであるためループがパイプライン化されている

bull カーネルのスループットに重要ではないループである

bull ループの実行時間がそれに含まれる可能性のある他のループと比較して短い

ループの開始間隔を指定するには次のようにループの前にプラグマを指定します

pragma ii ltdesired_initiation_intervalgt

ltdesired_initiation_intervalgt パラメーターは後続のループ反復の開始を実行するまでに待機するクロックサイクル数を指定する整数であり必須です

カーネルにパイプライン化が可能な異なるループが 2 つある場合を考えます1 つはループに依存関係を持つ実行時間が短い初期化ループもう 1 つは処理の大部分を実行する実行時間が長いループですこの場合初期化ループがデザインの全体的なスループットに与える影響がもう一方のループに比べはるかに小さいことをコンパイラーは認識しません可能な場合コンパイラーは両方のループの IIを 1 でパイプライン化しようと試みます

初期化ループにはループに依存関係があるため生成されるハードウェアはフィードバックパスを持つようになりますこのようなフィードバックパスで II を実現するとクロック周波数の一部が犠牲になる可能性がありますメインループのフィードバックパスによっては残りのデザインがより高い動作周波数で動作できる場合があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

30

初期化ループにpragma ii 2を指定するとこのループに対する II の 適化をそれほど積極的に行う必要がないことをコンパイラーに通知します 適化をあまり積極的に行わないことでfmax を制限しているパスをコンパイラーがパイプライン化できるようになりカーネルのデザイン全体でより高いfmax を実現できるようになります

新しく指定される II により初期化ループの実行時間は長くなりますしかしfmax が高くなることでもう一方の長いループの実行時間が短縮されるため初期化ループの実行時間の増加は補償されます

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

524 ループの並列性 (max_concurrency Pragma)

max_concurrencyプラグマを使用しコンポーネントのループの並列性を制限できます

ループの並列性とはそのループの反復を同時に何回進行することができるかということですデフォルトにおいてインテル FPGA SDK for OpenCL はループの並列性を 大化しコンポーネントが 大のスループットで動作するように試みます

max_concurrencyプラグマはループがパイプライン化されている単一のワークアイテムカーネル (つまりシングルスレッドカーネル) に適用されますループのパイプライン化およびカーネルをシングルスレッドとして処理するかどうかのオフラインコンパイラーの決定を左右するカーネルのプロパティーについては インテル FPGA SDK for OpenCL ベストプラクティスガイドのシングルワークアイテムカーネル対 NDRange カーネルの章を参照ください

max_concurrencyプラグマを使用するとループのパイプライン化に必要なオンチップメモリーリソースを制御できるようになりますループ反復の同時実行を実現するためオフラインコンパイラーは単一の反復に専用のメモリーコピーを作成する必要がありますこのコピーはプライベートコピーと呼ばれます許可される並列性が高いほどより多くのプライベートコピーをコンパイラーは作成しなければなりません

カーネルの HTML レポート (reporthtml) はループの並列性に関する以下の情報を提供します

bull オフラインコンパイラーが選択した 大の並列性

この情報はループ解析レポートとカーネルメモリービューアーで確認できます

mdash ループ解析レポートの Details ペインのメッセージは同時実行の 大数は N に制限されていると報告します

注意 符号なしの N は0 以上の値になることが可能ですN = 0 は並列性が無制限であることを意味します

mdash カーネルメモリービューアーのローカルメモリーのバンクビューはプライベートコピーの数を図式化し表示します

bull メモリー使用量への影響

この情報はエリア解析レポートで確認可能ですDetails ペインのメッセージはオフラインコンパイラーが N 個のループ反復を同時実行するためN 個の独立したメモリーコピーを作成したことを報告します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

31

パフォーマンスよりも物理メモリーの低減を優先する場合以下のようにpragmamax_concurrency ltNgt をループに適用しますこのプラグマを適用するとオフラインコンパイラーは同時に実行するループの反復回数を N に制限しますループのメモリーのプライベートコピー数も N に減少します

pragma max_concurrency 1for (int i = 0 i lt N i++) int arr[M] Doing work on arr

ローカルメモリーに作成されループでアクセスされるプライベートコピーの数も__attribute__((max_concurrency(N))) を使用し制御することができます属性に関する詳細はカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) を参照ください__attribute__((max_concurrency(N))) を持つローカルメモリーにpragma max_concurency Mをともなうループでアクセスするとオフラインコンパイラーは同時に実行されるループの反復数を min(MN) に制限します

関連情報bull シングルワークアイテムカーネル対 NDRange カーネル

bull カーネルの reporthtml ファイルのレビュー

525 ループの投機的実行 (speculated_iterations Pragma)

speculated_iterationsプラグマを使用し インテル FPGA SDK for OpenCL オフラインコンパイラーにパイプライン化されたループのパフォーマンス向上を指示します

speculated_iterationsプラグマはループに適用されるため(他のループプラグマの位置と同様に) ループの直前に配置する必要があります以下に例を示します

pragma speculated_iterations k where k gt= 0

インテル FPGA SDK for OpenCL オフラインコンパイラーは他に影響を与えることなくk回の反復を追加し実行するハードウェアを生成しますこれによりループの II の短縮または fmax の増加どちらかが可能になります決定を左右するのはループの終了条件を計算する速度です計算に多くのサイクルを費やす場合はspeculated_iterationsを大きくすることを推奨します

注意 反復を追加することでループの次の呼び出しが開始されるまでの時間が長くなりますループの実際の反復回数が非常に少ない場合 (5 から 10 以下または同様の場合) はこれが要因の可能性がありますその場合pragma speculated_iterationsの値を 0 に指定すると後続のループの反復がすぐ開始されるようになります一方でこれはII を大きくし終了条件の算出に時間を与えることになりますHLD レポートのループ解析レポートを参照し終了条件が II のボトルネックであるかを確認してください

526 ワークグループサイズの指定

大のまたは必要なワークグループサイズを可能な限り指定してください インテル FPGA SDK forOpenCL オフラインコンパイラーはこの指定されたサイズに基づきOpenCL カーネルのハードウェア使用率を過剰なロジックをともなうことなく 適化します

max_work_group_sizeまたは reqd_work_group_size属性をカーネルで指定しない場合ワークグループサイズはコンパイル時間とランタイムの制約に応じたデフォルト値になります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

32

bull カーネルにバリアーが含まれる場合オフラインコンパイラーはデフォルトの 大ワークグループサイズである 256 ワークアイテムを設定します

bull カーネルが異なるスレッドの異なる動作を可能にする OpenCL 組み込み関数 (ローカルまたはグローバルスレッド IDワークグループ ID) の問い合わせを行わない場合オフラインコンパイラーはシングルスレッド実行モードを想定し 大ワークグループサイズを (111) に設定しますこの場合 OpenCL ランタイムもまたグローバルエンキューサイズを (111) に強制するためループのパイプライン化の 適化がオフラインコンパイラーで有効になります

ワークグループサイズを指定するには次のようにカーネルコードを修正します

bull カーネルのワークグループに向けてオフラインコンパイラーが規定するワークアイテムの 大数を指定するにはmax_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((max_work_group_size(51211)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

bull カーネルのワークグループにオフラインコンパイラーが規定するワークアイテムの必要数を指定するにはreqd_work_group_size(X Y Z) 属性をカーネルのソースコードに挿入します

__attribute__((reqd_work_group_size(6411)))__kernel void sum (__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

527 計算ユニット数の指定

OpenCL カーネルのデータ処理効率を向上させるためカーネルの計算ユニットを複数生成するようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示することができます各計算ユニットは複数のワークグループを同時に実行することができます

注意 カーネルの計算ユニット数を増加するとデータのスループットが向上する一方でFPGA リソースの消費率が増加しグローバルメモリーの帯域幅の競合が計算ユニット間で起こります

bull カーネルの計算ユニット数を指定するにはカーネルソースコードにnum_compute_units(N) 属性を挿入します

以下にコードの一部を例として示しますこのコードはカーネルに 2 つの計算ユニットをインスタンス化するようオフラインコンパイラーに指示しています

__attribute__((num_compute_units(2)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

33

size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは指定された数の計算ユニットにワークグループを動的に分配します

注意

ワークアイテムが実行されている特定の計算ユニットを識別するには組み込み関数のget_compute_id() を呼び出します詳細はget_compute_id() 関数を使用した複製カーネルのカスタマイズを参照ください

関連情報get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

528 SIMD ワークアイテム数の指定

手動でカーネルコードをベクトル化することなく複数のワークアイテムを SIMD (シングルインストラクションマルチプルワークアイテム) で実行しOpenCL カーネルのデータ処理効率を向上させることもできます インテル FPGA SDK for OpenCL オフラインコンパイラーにSIMD またはベクトル化された状態で実行するワークグループのワークアイテム数を指定してください

重要 reqd_work_group_size属性とともにnum_simd_work_items属性を導入します指定する num_simd_work_items属性はreqd_work_group_size属性に指定するワークグループサイズを均等に分割する必要があります

bull ワークグループの SIMD ワークアイテム数を指定するにはnum_simd_work_item(N) 属性をカーネルソースコードに挿入します

次のコード例は64 ワークアイテムの固定ワークグループサイズをカーネルに割り当てていますその後各ワークグループのワークアイテムを 4 つの SIMD ベクトルレーンに統合します

__attribute__((num_simd_work_items(4)))__attribute__((reqd_work_group_size(6411)))__kernel void test(__global const float restrict a __global const float restrict b __global float restrict answer) size_t gid = get_global_id(0) answer[gid] = a[gid] + b[gid]

オフラインコンパイラーは可能な限りnum_simd_work_itemsに指定された値に従いカーネルのデータパスをベクトル化します

529 メモリー属性の指定

OpenCL カーネルの配列宣言にメモリー属性を適用することができます

int __attribute__((max_concurrency(k)) local_A[M]

この k は符号なしであり0 以上の値を取ることができますk の値は配列への 大同時アクセス数です インテル FPGA SDK for OpenCL オフラインコンパイラーは配列のコピーを k 個作成しますk=0 はスループットを 大化するためにオフラインコンパイラーが配列への 大同時アクセス数を小 16 までの範囲で選択することを示しますこれはメモリー属性を適用しないデフォルトの動作で

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

34

次の例は外側のループが 4 つのローカル配列を宣言しています

for (int i = 0 i lt N i++) int local_A[M] int local_B[M] int local_C[M] int local_D[M]

Step 1 for (int j = 0 j lt M j++) local_A[j ] = initA()

Step 2 for (int j = 0 j lt M j++) local_B[j] = initB(local_A[j])

Step 3 for (int j = 0 j lt M j++) local_C[j] = initC(local_B[j])

Step 4 for (int j = 0 j lt M j++) local_D[j] = initD(local_C[j])

この例において外側のループは 4 つのステップを含み各ステップは内側のループに対応していますステップ 1 では 初のローカル配列 local_A が初期化されますステップ 2 ではlocal_A の読み取りが行われますが書き込みはされませんこれは外側のループでの local_A の 後の使用になります同様に local_B はステップ 2 で 初に使用され初期化されますステップ 3 では local_B を読み取りますが書き込みはされませんそしてこれが 後の local_B の使用になります同様に local_Cはステップ 3 と 4 でのみで使用されます インテル FPGA SDK for OpenCL オフラインコンパイラーは16 個のコピーを作成し各配列をプライベート化しますこのコピーは外側のループでの 16 の並行処理をサポートするのに十分ですがこれらのローカル配列の実際の範囲は外側のループ全体に及ばないため外側のループのスループットを 大化するために 16 のコピーすべては必要ありませんこれはコピーを作成するために消費される領域が必要以上に大きいことを意味しますこの場合max_concurrency属性を適用しローカル配列のコピー数を制御すると外側のループのスループットを維持しながら使用される領域を減らすことができます

53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法

ローカルカーネルへのポインター引数を使用しローカルメモリーの割り当てを作成する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA に構築するローカルメモリーシステムのサイズをランタイムではなくコンパイル時に決定する必要があります clSetKernelArgでランタイムに要求するサイズを指定することでメモリーサイズを 適化できますこのサイズを指定することでオフラインコンパイラーはポインター引数に正しいサイズのローカルメモリーシステムを構築できるようになりますこのサイズを指定しない場合はオフラインコンパイラーはデフォルトのサイズを使用します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

35

bull デフォルトの 16 キロバイト (kB) 以外のサイズを指定するにはlocal_mem_size(N) 属性をカーネルソースコードのポインター宣言に含めます

N の値は要求するメモリーサイズをバイト単位で指定します効率を高めるためN は 2 のべき乗にしてください

__kernel void myLocalMemoryPointer( __local float A __attribute__((local_mem_size(1024))) __local float B __attribute__((local_mem_size(32768))) __local float C) statements

myLocalMemoryPointerカーネルにおいてローカルメモリーの 16 KB (デフォルト) はポインター Aに1 KB はポインター Bにそして 32 KB はポインター Cに割り当てられています

注意 ローカルカーネルへのポインター引数を使用する代わりにインテルではカーネルスコープにローカルメモリーシステムを定義することを推奨しています

54 インテル FPGA SDK for OpenCL チャネル拡張の実装

インテル FPGA SDK for OpenCL のチャネル拡張はカーネル間のデータの受け渡しおよびカーネルの同期を高効率かつ低レイテンシーで行うメカニズムを提供します

注意 チャネル機能の活用を求める一方で他の SDK を使用しカーネルプログラムを実行する機能がある場合はOpenCL パイプを代わりに使用しデザインを実装してください

関連情報OpenCL パイプの実装 (53 ページ)

541 インテル FPGA SDK for OpenCL チャネル拡張の概要

インテル FPGA SDK for OpenCL のチャネル拡張によりカーネルは FIFO バッファーを介し互いに直接通信できるようになります

チャネルの実装は並行して実行されているカーネル間のデータ移動をホストプロセッサーから切り離します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

36

図 -6 チャネル実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Channel

Host Processor

Initialize ( )

IO Channel

FIFO

542 チャネルにおけるデータの動作

チャネルに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りチャネルに残りますつまりチャネルに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり持続しますただしFPGA デバイスの再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたりデータが持続するわけではありません

OpenCL の実装においてデバイスの再プログラミング動作を回避するよう 適化を実行した場合でもチャネルのデータはコンテキストプログラムデバイスカーネルまたはプラットフォームのリリース間では持続しません例えば同じaocxファイルを使用しホストプログラムを 2 回実行する場合やホストプログラムがコンテキストをリリースし再取得した場合チャネルのデータは動作全体にわたって持続したりしなかったりする可能性がありますFPGA デバイスのリセット動作がチャネルのデータを消去するオブジェクトリリースの裏で発生する可能性があります

次のコードを例に示します

channel int c0

__kernel void producer() for (int i = 0 i lt 10 i++) write_channel_intel (c0 i)

__kernel void consumer (__global uint restrict dst) for (int i = 0 i lt 5 i++) dst[i] = read_channel_intel(c0)

図 -7 チャネルデータ FIFO の順序付け

9 012345678Producer Consumer

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

37

カーネルの producerは10 の要素 ([0 9]) をチャネルに書き込みますカーネルのコンシューマーにはワークアイテムの識別子の問い合わせが含まれていませんよって暗黙的なreqd_work_group_size属性 (111) を受け取りますこの暗黙的な属性reqd_work_group_size(111) は単一のワークアイテムカーネルとしてコンシューマーを起動させる必要があることを意味します上記例において consumerは1 回の呼び出しに 5 つの要素をチャネルから読み取ります 初の呼び出し中にカーネルの consumerは0 から 4 の値をチャネルより読み取りますデータは NDRange の呼び出し間で持続するため2 回目にカーネルconsumerを実行する際は5 から 9 の値が読み取られます

この例の場合デッドロックの発生を回避するためカーネル producerの呼び出しごとにカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとチャネルの容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回より多い場合はチャネルに十分なデータがないため consumerがストールします

543 チャネルに対する複数のワークアイテムの順序付け

OpenCL Specification はワークアイテムの順序を定義していません インテル FPGA SDK forOpenCL ではチャネルの読み書き動作の合理化を容易にするためワークアイテムの順序を強制します

複数のワークアイテムのチャネルへのアクセスはいくつかのシナリオにおいて有効です例えばチャネルのデータワードが独立している場合やチャネルがコントロールロジックに向けて実装されている場合などです複数のワークアイテムがチャネルにアクセスする際の主な注意事項はカーネルがチャネルにデータを書き込みチャネルからデータを読み取る順序ですSDK のチャネル拡張はチャネルへのワークアイテムの読み書き動作を可能な限り決定論的な順序で処理しますこれにより読み取りおよび書き込み動作はカーネル呼び出し間で一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK は以下の特性に基づきチャネルのアクセスがワークアイテムに対し不変であることを確認します

bull カーネルを通るすべてのパスが必ずチャネルアクセスを実行しているか

bull 上記要件が満たされない場合チャネル呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

bull カーネルが単一のワークアイテムカーネルとして推測されていないか

複数のワークアイテムのチャネルへのアクセスにおいて決定論的な順序付けを保証できない場合SDK はチャネルの順序付けが適切に定義されない可能性があり非決定論的な実行が行われる可能性があることを警告しますSDK は主にチャネル呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合決定論的な順序付けを提供することができません次に例を示します

__kernel void ordering (__global int restrict check __global int restrict data) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_channel_intel (req data[i]) else process(data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

38

5431 チャネルのワークアイテムのシリアル実行

ワークアイテムのシリアル実行とは順序付けられた実行動作のことでワークアイテムのシーケンシャル ID が計算ユニットでの実行順序を決定します

カーネルにチャネルを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は計算ユニットに同時に 大 1 つのインフライトのワークグループを持っているのと同等であるということを適用しますコンパイラーもまたカーネルがチャネルをシリアル実行することを保証しますよってカーネルはID の小さいワークアイテムから実行しますワークアイテムは識別子 (xyzgroup) を持ちますこの xyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

ワークアイテム ID (x0y0z0group0) は次の条件のいずれかが当てはまる場合ID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1 z0 lt z1の場合

bull group0 = group1 z0 = z1 y0 lt y1の場合

bull group0 = group1 z0 = z1 y0 = y1 x0 lt x1の場合

インクリメンタル ID をともなうワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) をともなうワークアイテムはチャネル書き込み呼び出しをまず実行しますその後ID (x1y0z0group0) をともなうワークアイテムが呼び出しを実行しますこの順序を定義することでシステムが外部モデルと検証可能になるよう保証しています

複数のワークアイテムをともなうループのチャネル実行

次のように複数のワークアイテムがあるループの本体にチャネルが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data int X) int n = 0 while (n lt X) write_channel_intel (req data[get_global_id(0)]) n++

544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約

OpenCL アプリケーションへのチャネル実装には一定のデザイン上の制約があります

複数のチャネル呼び出しサイト

カーネルは同じチャネルを複数回読み取ることが可能ですが複数のカーネルが同じチャネルから読み取ることはできません同様にカーネルは同じチャネルに複数回書き込むことはできますが複数のカーネルが同じチャネルに書き込むことはできません

__kernel void k1() read_channel_intel (channel1) read_channel_intel (channel1) read_channel_intel (channel1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

39

インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコードをコンパイルすることができずエラーが発生します

__kernel void k1() write_channel_intel (channel1 1)

__kernel void k2() write_channel_intel (channel1 2)

フィードバックチャネルとフィードフォワードチャネル

カーネルのチャネルはread_onlyまたは write_onlyのどちらかになります同じチャネルに対して読み書きを行うカーネルのパフォーマンスは低下する可能性があります

静的なインデックス化

インテル FPGA SDK for OpenCL のチャネル拡張はチャネル ID の配列へのインデックス化をサポートしますが非効率なハードウェアにつながります

次に例を示します

channel int ch[WORKGROUP_SIZE]

__kernel void consumer()

int gid = get_global_id(0) int value = read_channel_intel(ch[gid])

statements

この例をコンパイルすると次の警告メッセージが表示されます

Compiler Warning Dynamic access into channel array ch was expanded into predicated static accesses on every channel of the array

アクセスが動的で配列のチャネルのサブセットのみにアクセスできることが明確な場合はswitch ステートメントを使用しわずかに効率的なハードウェアを生成することができます

channel int ch[WORKGROUP_SIZE] __kernel void consumer() int gid = get_global_id(0) int value

switch(gid) case 0 value = read_channel_intel(ch[0]) break

case 2 value = read_channel_intel(ch[2]) break case 3 value = read_channel_intel(ch[3]) break statements case WORKGROUP_SIZE-1read_channel_intel(ch[WORKGROUP_SIZE-1]) break

statements

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

40

カーネルのベクトル化に対するサポート

チャネルを使用するカーネルをベクトル化することはできませんしたがってカーネルコードにnum_simd_work_itemsカーネル属性を含めないでくださいチャネルを使用するカーネルをベクトル化すると同じカーネルで複数のチャネルアクセスが発生し調停が必要になりますこれはベクトル化の利点を無効にしますよって SDK のチャネル拡張はカーネルのベクトル化をサポートしません

read_channel_intel および write_channel_intel 呼び出しにおける命令レベルの並列処理

データの依存性が read_channel_intelと write_channel_intel呼び出し間に存在しない場合オフラインコンパイラーはそれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこの read_channel_intelと write_channel_intel呼び出しをOpenCL カーネルコードに表現されているシーケンスとは異なる順序で実行する場合があります

次のコードのシーケンスを例に示します

in_data1 = read_channel_intel(channel1)in_data2 = read_channel_intel(channel2)in_data3 = read_channel_intel(channel3)

read_channel_intel呼び出し間にデータの依存性がないためオフラインコンパイラーはこれらを任意の順序で実行できます

545 OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化

インテル FPGA SDK for OpenCL のチャネル拡張を実装するにはチャネル固有のプラグマと API 呼び出しを含むように OpenCL カーネルを修正します

チャネル拡張を有効にするには次のプラグマを使用しますpragma OPENCL EXTENSION cl_intel_channels enable

チャネル宣言は特定の OpenCL カーネルプログラムに固有のものですチャネルのインスタンスもまた各 OpenCL カーネルプログラムのデバイスペアに固有ですランタイムに単一の OpenCL カーネルプログラムを複数のデバイスにロードする場合各デバイスはチャネルのコピーを 1 つ保有するようになりますただしこのチャネルのコピーは独立しておりデバイス間でデータを共有しません

5451 チャネルのハンドル宣言

チャネル変数を使用しカーネル間またはカーネルと IO 間の接続性を定義します

チャネルから読み書きするにはカーネルはチャネル変数を対応する各 API 呼び出しに渡す必要があります

bull 以下の規則を使用しカーネルのソースコードにファイルスコープ変数としてチャネルのハンドルを宣言しますchannel lttypegt ltvariable_namegt

例 channel int c

bull インテル FPGA SDK for OpenCL のチャネル拡張はデータ構造で宣言された複数の変数による同時チャネルアクセスをサポートします次の方法でstructデータ構造をチャネルに宣言します

typedef struct type_ int a int b type_t

channel type_t foo

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

41

5452 ブロッキングのチャネル書き込みの実装

write_channel_intel API 呼び出しはチャネルを介したデータ送信を可能にします

bull ブロッキングのチャネル書き込みの実装には次の write_channel_intel関数シグネチャーを使用します

void write_channel_intel (channel lttypegt channel_id constlttypegt data)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますまた対応する読み取りチャネル(read_channel_intel) の channel_idと一致しなければなりません

dataはチャネル書き込み動作がチャネルに書き込むデータです

ltTypegt はチャネルのデータ幅を定義しますOpenCL 変換規則に従いカーネルがチャネルに書き込むデータがlttypegt に変換できるようにしてください

以下にwrite_channel_intel API 呼び出しを実装するコード例を示します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from global memory and passes this data to the channel __kernel void kernel_write_channel( __global const long src ) for (int i = 0 i lt N i++) Writes the eight bytes to the channel write_channel_intel(chan src[i])

注意 write_channel_intel API 呼び出しを使用しチャネルを介してデータを送信する際はチャネルの容量がフルの場合 (FIFO バッファーがデータでフルの場合) カーネルがストールしFIFO バッファーのデータスロットが 低 1 つ利用可能になるまで待機することに注意してください インテル FPGADynamic Profiler for OpenCL を使用しチャネルのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

54521 ノンブロッキングのチャネル書き込みの実装

ノンブロッキングのチャネル書き込みを行うとフルの状態の FIFO バッファーに書き込みFIFO バッファーのスロットが利用可能になるまでカーネルがストールすることのないアプリケーションが容易にできるようになりますノンブロッキングのチャネル書き込みはデータがチャネルに正常に書き込まれた (チャネルがフルではなかった) ことを示すブール値を返します

アプリケーションにデータプロデューサーが 1 つと同一のワーカーが 2 つあるシナリオを例とします各ワーカーがメッセージの処理に要する時間はデータの内容によって異ると想定しますこの場合一方のワーカーはビジー状態でもう一方のワーカーはフリーの状態になる可能性がありますノンブロッキングの書き込みは両方のワーカーがビジー状態になるワークの分配を促進します

bull ノンブロッキングのチャネル書き込みを実装するには次の write_channel_nb_intel関数シグネチャーを含めます

bool write_channel_nb_intel(channel lttypegt channel_id constlttypegt data)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

42

次に示すコードのカーネル producerはノンブロッキングのチャネル書き込み拡張を使用しワークの分配を促進しています

channel long worker0 worker1__kernel void producer( __global const long src ) for(int i = 0 i lt N i++) bool success = false do success = write_channel_nb_intel(worker0 src[i]) if(success) success = write_channel_nb_intel(worker1 src[i]) while(success)

5453 ブロッキングのチャネル読み取りの実装

read_channel_intel API 呼び出しはチャネルを介したデータの受信を可能にします

bull ブロッキングのチャネルの読み取りを実装するには次の read_channel_intel関数シグネチャーを含めます

lttypegt read_channel_intel(channel lttypegt channel_id)

以下に詳細を説明します

channel_idはチャネルが接続するバッファーを識別しますこれは対応する書き込みチャネル (write_channel_intel) の channel_idと一致している必要があります

lttypegt はチャネルのデータ幅を定義しますチャネルデータを読み取るためにカーネルが割り当てる変数がlttypegt から変換可能であることを確認してください

read_channel_intel API 呼び出しを実装するコード例を以下に表します

Defines chan a kernel file-scope channel variablechannel long chan

Defines the kernel which reads eight bytes (size of long) from the channel and writes it back to global memory__kernel void kernel_read_channel (__global long dst) for (int i = 0 i lt N i++) Reads the eight bytes from the channel dst[i] = read_channel_intel(chan)

注意 チャネルが空の場合 (FIFO バッファーが空の場合)read_channel_intel API 呼び出しで読み出しチャネルを介したデータの受信はできませんこれを行うと 低 1 つのデータ要素が FIFO バッファーで利用可能になるまでカーネルはストールします

54531 ノンブロッキングのチャネル読み取りの実装

ノンブロッキングの読み取りを行うとデータが必ずしも利用可能ではない場合でもデータが利用可能になるまで動作が待機することのないアプリケーションを容易にできるようになりますノンブロッキング読み取りシグネチャーはブロッキング読み取りと類似していますが読み取り動作がチャネルからデータを正常に読み取ったかどうかを示すブールポインター validが指定するアドレスを生成します

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

43

読み取りが正常に行われた場合 (validが true に設定される)チャネルから読み取った値はread_channel_nb_intel関数により返されます読み取りが失敗した場合 (validが false に設定される)read_channel_nb_intel関数の戻り値は定義されません

bull ブロッキングのチャネル読み取りを実装するには次の read_channel_nb_intel関数シグネチャーを使用します

lttypegt read_channel_nb_intel(channel lttypegt channel_id bool valid)

次のコードはノンブロッキングのチャネル読み取り拡張機能の使用方法を表しています

channel long chan

__kernel void kernel_read_channel (__global long dst) int i = 0 while (i lt N) bool valid0 valid1 long data0 = read_channel_nb_intel(chan ampvalid0) long data1 = read_channel_nb_intel(chan ampvalid1) if (valid0) process(data0) if (valid1) process(data1)

5454 io チャネル属性を使用した IO チャネルの実装

io属性をチャネル宣言に含めFPGA ボードの入力または出力フィーチャーと接続する特別な IO チャネルを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますこの chan_id はカスタムプラットフォームの board_specxmlにリストされている IO インターフェイス名です

ペリフェラルインターフェイスの使用方法はデバイスの種類によって異なるためIO チャネルをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいご自身の OpenCL カーネルコードはペリフェラルインターフェイスが生成するデータと互換性がある必要があります

注意 bull ボードに直接接続しIO チャネルを介してペリフェラルデバイスと通信するチャネルには暗黙的なデータの依存関係が存在する可能性があります インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらの依存関係に対する可視性を持たないためこの暗黙的なデータの依存関係は予期しない動作を引き起こす可能性があります

bull 同じペリフェラルと通信する外部 IO チャネルはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを参照しご自身の FPGA ボードで使用可能な入力および出力フィーチャーを特定してください

例えばboard_specxmlファイルには次のような IO フィーチャー情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

44

chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256 chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのチャネルで使用されるデータタイプの幅をビットで指定します上の例の場合uintと floatのデータタイプはどちらも 32 ビット幅です他のより大きいデータタイプやベクトル化されたデータタイプはboard_specxmlファイルで指定されている適切なビット幅と一致している必要があります

2 次のコード例で示されているように ioチャネル属性を実装しますioチャネル属性の名前はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) と一致していなければなりません

channel QUDPWord udp_in_IO __attribute__((depth(0))) __attribute__((io(eth0_in))) channel QUDPWord udp_out_IO __attribute__((depth(0))) __attribute__((io(eth0_out)))

__kernel void io_in_kernel (__global ulong4 mem_read uchar read_from int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) if (read_from amp 0x01) data = read_channel_intel(udp_in_IO) else data = mem_read[index] write_channel_intel(udp_in data) index++

__kernel void io_out_kernel (__global ulong2 mem_write uchar write_to int size) int index = 0 ulong4 data int half_size = size gtgt 1 while (index lt half_size) ulong4 data = read_channel_intel(udp_out) if (write_to amp 0x01) write_channel_intel(udp_out_IO data) else only write data portion ulong2 udp_data udp_datas0 = datas0 udp_datas1 = datas1 mem_write[index] = udp_data index++

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

45

注意 board_specxmlファイルのXML (eXtensible Markup Language) チャネル要素で指定されている各 IO チャネルに固有の io(chan_id) ハンドルを宣言してください

5455 IO チャネルのエミュレーション

io属性で宣言されたチャネルをともなうカーネルをエミュレーションするとIO チャネル入力はファイルからの読み取りによってエミュレーションされチャネル出力はファイルへの書き込みによってエミュレーションされます

エミュレーションを実行する際読み取りまたは書き込みに使用されるファイル名は io属性名と一致します例えば次のようなチャネル宣言をする場合エミュレーションは myIOChannelというファイルに対し読み取りまたは書き込みを行います (どちらか一方のみ)

channel uint chanA __attribute__((io(myIOChannel)))

IO チャネルの方向性は単方向ですチャネルへは読み取りもしくは書き込みのどちらかが可能で両方を行うことはできませんただし同じ io属性値を持つ読み取りチャネルと書き込みチャネルをそれぞれ持つことは可能です

channel uint readChannel __attribute__((io(myIOChannel)))channel uint writeChannel __attribute__((io(myIOChannel)))

IO チャネル読み取りのエミュレーション

読み取りが io属性を持つ myfileというチャネルから発行される場合ディスクの myfileというファイルに読み取りの試みは行われますmyfileが存在しない場合やファイルから読み取るデータが不十分な場合呼び出しタイプによって以下のように動作を行います

Non-blockingread

ファイルが存在しない場合やデータが不十分な場合読み取りの試みが失敗したことを示すメッセージを返します

Blockingread

ファイルが存在しない場合やデータが不十分な場合ディスクにファイルが作成されるかファイルに十分なデータが含まれるまでプログラムをブロックします

IO チャネル書き込みのエミュレーション

書き込みが io属性を持つ myfileというチャネルへ発行される場合ディスクの myfileというファイルに書き込みの試みが行われますmyfileファイルが存在しない場合通常ファイルが作成されそのファイルに書き込みが行われますmyfileが存在する場合はそれに上書きします書き込みが失敗した場合呼び出しタイプによって以下のように動作を行います

Non-blocking write 書き込みの試みが失敗した場合エラーが返されます

Blocking write 書き込みの試みが失敗した場合書き込みの試みがさらに行われます

5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例

カーネルの同時実行はFPGA のチャネルの効率を向上させることができます同時実行を実現するためホストはカーネルを並列して起動します該当する場合カーネルはチャネルを介して互いに通信できます

次に示すモデルは安全かつ効率的な同時実行の活用方法の概要を示しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

46

フィードフォワードのデザインモデル

フィードフォワードのデザインモデルを実装しサイクルを作成せずに 1 つのカーネルから次のカーネルにデータを送信します次のコードを参照ください

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i] = read_channel_intel(c0) dst[2i+1] = read_channel_intel(c1)

producerカーネルはデータをチャネル c0と c1に書き込みますconsumerカーネルはc0とc1からデータを読み取ります下の図は2 つのカーネル間のフィードフォワードのデータフローを表しています

図 -8 フィードフォワードのデータフロー

Producer Consumer

バッファー管理

フィードフォワードのデザインモデルではデータは producerと consumerのカーネル間を一度に1 ワードずつ移動します複数のワードから構成される大きなデータメッセージの転送を容易にするため通信用アプリケーションで一般的に見られるデザインパターンであるピンポンバッファーを実装することができます次の図はカーネルとピンポンバッファー間の通信を表しています

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

47

図 -9 バッファー管理をともなうフィードフォワードのデザインモデル

Producer Consumer

Manager

Buffer

managerカーネルはproducerカーネルと consumerカーネル間における循環バッファーの割り当ておよび割り当て解除を管理しますconsumerカーネルがデータを処理した後managerはconsumerが解放したメモリー領域を受け取り再度使用するために producerに送信しますmanagerはまた使用されていない位置の初期セット (トークンの初期セット) を producerカーネルに送信しそこに producerがデータを書き込めるようにします

次の図はバッファー管理の際に発生するイベントのシーケンスを表しています

図 -10 バッファー管理時のカーネルの通信

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

Producer Consumer

Manager

Buffer

(1) (4)(3)(2)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

48

1 Managerカーネルはトークンのセットを producerカーネルに送信しメモリー内のどの領域が現在使用されておらずproducerが利用できるかを示します

2 managerがメモリー領域を割り当てた後producerはピンポンバッファーのその領域にデータを書き込みます

3 producerは書き込み動作完了後consumerカーネルに同期トークンを送信し処理するデータが含まれるメモリー領域を示します次に consumerカーネルはピンポンバッファーの該当領域からデータを読み取ります

注意

producerconsumermanagerカーネルは並行して実行されるためconsumerが読み取り動作を実行している間producerは他の使用されていないメモリー位置へ処理を行うデータを書き込むことができます

4 consumerは読み出し動作が完了後メモリー領域を解放しトークンを managerに送り返します次に managerカーネルはその領域をリサイクルしproducerが使用できるようにします

OpenCL カーネルへのバッファー管理の実装

SDK が適切なバッファー管理を実行するためにはチャネルの読み取りおよび書き込みの順序が重要です次のカーネル例を参照ください

__kernel void producer (__global const uint restrict src __global volatile uint restrict shared_mem const uint iterations) int base_offset for (uint gID = 0 gID lt iterations gID++) Assume each block of memory is 256 words uint lID = 0x0ff amp gID

if (lID == 0) base_offset = read_channel_intel(req)

shared_mem[base_offset + lID] = src[gID]

Make sure all memory operations are committed before sending token to the consumer mem_fence(CLK_GLOBAL_MEM_FENCE | CLK_CHANNEL_MEM_FENCE)

if (lID == 255) write_channel_intel(c base_offset)

このカーネルにおいて以下のコード行は独立しているため インテル FPGA SDK for OpenCL オフラインコンパイラーはこれらを同時に実行するようスケジュールすることができます

shared_mem[base_offset + lID] = src[gID]

および

write_channel_intel(c base_offset)

base_offsetにデータを書き込みbase_offsetをチャネルへ書き込むことはグローバルメモリーへデータを書き込むよりもはるかに早い可能性がありますconsumerカーネルは次にチャネルから base_offsetを読み取りそれをグローバルメモリーから読み取るためのインデックスとして使

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

49

用します同期がなければshared_mem[base_offset + lID] = src[gID]の実行が終了する前にconsumerが producerからデータを読み取る可能性がありますその結果consumerは無効なデータを読み取ることになりますこのシナリオを回避するにはproducerカーネルがデータをメモリーに収納した後に同期トークンが発生しなければなりませんつまりconsumerカーネルはproducerがグローバルメモリーにデータを正常に格納するまでproducerカーネルからデータを消費することはできません

この順序を維持するにはOpenCL mem_fenceトークンをカーネルに含めますmem_fence構造はCLK_GLOBAL_MEM_FENCEと CLK_CHANNEL_MEM_FENCEの 2 つのフラグを持ちますmem_fenceはmem_fence呼び出し前後に発生する動作間に制御フローの依存性を効率的に作成しますCLK_GLOBAL_MEM_FENCEフラグはグローバルメモリー動作が制御フローに従う必要があることを示しますCLK_CHANNEL_MEM_FENCEはチャネル動作が制御フローに従う必要があることを示しますそのためこの例にある write_channel_intel呼び出しはグローバルメモリー動作が共有メモリーバッファーに格納されるまで開始できません

5457 depth 属性を使用するバッファーされたチャネルの実装

カーネルプログラムはバッファーされたチャネルとバッファーされていないチャネルを含むことが可能です チャネルの読み取り動作と書き込み動作が不均衡な場合チャネル宣言に depth属性を含めバッファーされたチャネルを作成しカーネルがストールするのを防ぎますバッファーされたチャネルは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたチャネルはスループットの制限や共有メモリーへのアクセスの同期化といったデータトラフィックの制御に使用することが可能ですバッファーされていないチャネルでは読み取り動作がデータの値を読み取るまで書き込み動作を開始できませんバッファーされたチャネルではデータの値がバッファーにコピーされるまで書き込み動作を開始できませんバッファーがフルの場合は読み取り動作がデータの一部を読み取りそれをチャネルから削除するまで動作を開始することができません

bull チャネルに対する消費率と生産率の一時的な不一致が予想される場合depthチャネル属性を使用しバッファーサイズを設定します

次の例は インテル FPGA SDK for OpenCL のチャネル拡張を実装するカーネルコードでのdepthチャネル属性の使用方法を示していますdepth(N) 属性はバッファーされたチャネルの 小深度を指定しますこの N はデータ値の数を表します

channel int c __attribute__((depth(10)))

__kernel void producer (__global int in_data) for (int i = 0 i lt N i++) if (in_data[i]) write_channel_intel(c in_data[i])

__kernel void consumer (__global int restrict check_data __global int restrict out_data) int last_val = 0

for (int i = 0 i lt N i++) if (check_data[i]) last_val = read_channel_intel(c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

50

out_data[i] = last_val

この例において書き込み動作はブロッキングをすることなく 10 個のデータ値をチャネルに書き込むことができますチャネルがフルになると関連する読み取り動作がチャネルに発生するまで書き込み動作を進めることはできません

チャネルの読み取りと書き込みの呼び出しは条件付きステートメントのためチャネルの読み取りと書き込みの呼び出しが不均衡になる可能性がありますチャネルにバッファー容量を追加することでproducerカーネルと consumerカーネルを確実に分離することができますこの手順はconsumerカーネルがチャネルからデータを読み取っていないときにproducerカーネルがデータを書き込んでいる場合に特に重要です

5458 チャネルの呼び出し順序の強制

チャネルの呼び出し順序を強制するにはカーネルプログラムにメモリーフェンスもしくはバリアー機能を導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンスの前後におけるチャネルアクセスに制御フローの依存性を作るために必要です

計算ユニットを生成する際 インテル FPGA SDK for OpenCL オフラインコンパイラーはそれぞれが独立している命令のすべてに命令レベルの並列性を必ず作成するわけではありませんそのためチャネル読み取りと書き込み動作の間に制御やデータの依存性がない場合でもそれぞれが独立して実行されない場合がありますチャネル呼び出しが相互に通信する際またはチャネルが外部デバイスにデータを書き込む際にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますチャネル c0とc1はバッファーされていないチャネルですc0と c1からのチャネル読み出し動作のスケジュールはc0と c1へのチャネル書き込み動作とは逆の順序で発生する可能性がありますつまりproducerカーネルはまず c0に書き込みますがconsumerカーネルは c1を 初に読み取る場合がありますこのチャネル呼び出しのスケジューリングの変更はconsumerカーネルが空のチャネルから読み取っているためデッドロックを引き起こす可能性があります

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) During compilation the AOC might reorder the way the consumer kernel writes to memory to optimize memory access Therefore c1 might be read before c0 which is the reverse of what appears in code

dst[2i+1] = read_channel_intel(c0) dst[2i] = read_channel_intel(c1)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

51

bull デッドロックの発生を防ぐにはカーネルにメモリーフェンス関数 (mem_fence) を含めチャネル呼び出しの順序を強制します

各カーネルのチャネルフラグとともに mem_fence呼び出しを挿入すると書き込みと読み取りのチャネル呼び出しにシーケンシャルな順序付けが適用されます次は変更された producerとconsumerカーネルのコードです

channel uint c0 __attribute__((depth(0)))channel uint c1 __attribute__((depth(0)))

__kernel void producer (__global const uint src const uint iterations) for (int i = 0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_channel_intel(c1 src[2i+1])

__kernel void consumer (__global uint dst const uint iterations) for (int i = 0 i lt iterations i++) dst[2i+1] = read_channel_intel(c0) mem_fence(CLK_CHANNEL_MEM_FENCE) dst[2i] = read_channel_intel(c1)

この例で producerカーネルの mem_fenceはc0へのチャネル書き込み動作が c1よりも前に発生するようにしています同様に consumerカーネルの mem_fenceはc0のチャネル読み取り動作が c1よりも前に発生するようにしています

54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義

OpenCL Specification version 10 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしチャネルを使用するカーネルは共通グローバルメモリーバッファーおよび同期されたメモリーアクセスを介しデータを共有することができます チャネルに書き込まれたデータがメモリーフェンスが渡された後に読み取りチャネルから確実に見えるようにするためメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull チャネルの同期呼び出しとメモリー動作間の制御フローの依存性を作成するにはCLK_GLOBAL_MEM_FENCEフラグを mem_fenceコールに追加します

__kernel void producer( __global const uint src const uint iterations ) for(int i=0 i lt iterations i++) write_channel_intel(c0 src[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

52

write_channel_intel(c1 src[2i+1])

このカーネルにおいて mem_fence関数はc0への書き込み動作と src[2i]へのメモリーアクセスがc1への書き込み動作と src[2i+1]へのメモリーアクセスよりも先に実行されるようにしていますこれによりデータが c1に書き込まれる前にc0に書き込まれたデータが読み取りチャネルから見えるようになります

55 OpenCL パイプの実装

インテル FPGA SDK for OpenCL はOpenCL パイプ機能に対する暫定サポートを提供しますOpenCL パイプは OpenCL Specification version 20 の一部であり高効率かつ低レイテンシーなカーネルへのデータの受け渡しおよびカーネルの同期を可能にするメカニズムを提供します

OpenCL カーネルが他の SDK と互換性があることが重要な場合にパイプを実装してください

OpenCL C プログラミング言語の仕様およびパイプに関する概要についてはOpenCLSpecification version 20 を参照ください

インテル FPGA SDK for OpenCL のパイプの実装はパイプの仕様全体を網羅するものではありませんそのためOpenCL Specification version 20 に完全には準拠していませんSDK のパイプ実装の目的はOpenCL 20 に準拠する異なるデバイスにおいて一貫して機能するソリューションを提供することです インテル FPGA 製品に向けてパイプを有効にするにはご自身のデザインが特定の追加要件を満たしている必要があります

関連情報OpenCL Specification version 20 (API)

551 OpenCL パイプ機能の概要

OpenCL パイプはカーネルが FIFO バッファーを介し互いに直接通信できるようにします

図 -11 パイプネットワーク実装の概要

FIFOFIFO

FIFOKernel 0

Kernel 1

Kernel 2

FIFOKernel N FIFO

RAM

IO Pipe

Host Processor

Initialize ( )

IO Pipe

FIFO

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

53

パイプを実装するとカーネルの実行がホストプロセッサーから切り離されます インテル FPGA SDKfor OpenCL パイプサポートの基本はSDK のチャネル拡張ですただしパイプの関数の構文はチャネルの構文とは異なります

重要 チャネルとは異なりパイプのデフォルトの動作はノンブロッキングです

ブロッキングおよびノンブロッキング機能に関してはチャネルに関する次の章をそれぞれ参照ください

関連情報bull ブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル書き込みの実装 (42 ページ)

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ)

bull ブロッキングのチャネル読み取りの実装 (43 ページ)

552 パイプデータの動作

パイプに書き込まれたデータはカーネルプログラムが FPGA デバイスにロードされている限りパイプに残りますつまりパイプに書き込まれたデータは複数のワークグループや NDRange の呼び出しにわたり維持されますただしFPGA の再プログラミングにつながるカーネルプログラムの複数の呼び出しまたは異なる呼び出しにわたってデータが維持されることはありません

次のコードを例に示します

__kernel void producer (write_only pipe uint __attribute__((blocking)) c0) for (uint i = 0 i lt 10 i++) write_pipe (c0 ampi)

__kernel void consumer (__global uint restrict dst read_only pipe uint __attribute__((blocking)) __attribute__((depth(10))) c0) for (int i = 0 i lt 5 i++) read_pipe (c0 ampdst[i])

パイプへの読み取り操作では 初 にパイプに書き込まれたデータがまず読み出されますパイプデータはパイプ内の FIFO の順序を維持します

図 -12 パイプにおけるデータ FIFO の順序

9 012345678Producer Consumer

カーネル producerは10 個の要素 ([0 9]) をパイプに書き込みますカーネル consumerはNDRange の呼び出しごとにパイプから 5 個の要素を読み出します 初の呼び出しにおいてカーネル consumerは0 から 4 の値をパイプから読み出しますデータは NDRange 呼び出しにわたり維持されるため2 回目のカーネル consumer実行時には5 から 9 の値が読み出されます

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

54

この例の場合デッドロックの発生を防ぐためカーネル producerの 1 回の呼び出しに対しカーネルconsumerを 2 回呼び出す必要がありますconsumerの呼び出しが 2 回未満になるとパイプ容量がフルになるため producerがストールしますconsumerの呼び出しが 2 回を超えるとパイプ内のデータが不足するため consumerがストールします

553 パイプにおける複数のワークアイテムの順序付け

OpenCL Secification はワークアイテムの順序付けを定義していません インテル FPGA SDK forOpenCL はパイプの読み取りおよび書き込み動作の一貫性を維持するためワークアイテムの順序を強制します

複数のワークアイテムによるパイプへのアクセスはいくつかのシナリオでは有効です例えばパイプのデータワードが独立している場合やパイプが制御ロジックに向け実装されている場合に効果があります複数のワークアイテムがパイプにアクセスにする際に も注意しなければならないのはカーネルがデータをパイプへ書き込みパイプからデータを読み出す順序ですOpenCL パイプは可能な限りワークアイテムのパイプへの読み書き動作を決定論的な順序で処理しますそのため読み出し動作と書き込み動作はカーネル呼び出し間において一貫します

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたりSDK はパイプ呼び出しがワークアイテムに対し不変であることを次の点に基づき確認します

bull カーネルを通るすべてのパスがパイプ呼び出しを実行しているか

bull 上の要件が満たされない場合パイプ呼び出しに到達する分岐条件はいずれもワークアイテムに依存しない方法で実行されているか

SDK は複数のワークアイテムのパイプへのアクセスにおいて決定論的な順序を保証できない場合パイプが非決定論的な実行をともない適切な順序に定義されない可能性があることを警告しますSDKは通常パイプ呼び出しをともなうループの実行にワークアイテムに依存するコードが存在する場合に決定的な順序付けを行うことができません

__kernel voidordering (__global int check global int data write_only pipe int __attribute__((blocking)) req) int condition = check[get_global_id(0)]

if (condition) for (int i = 0 i lt N i++) process(data) write_pipe (req ampdata[i]) else process(data)

5531 パイプにおけるワークアイテムのシリアル実行

ワークアイテムのシリアル実行とはワークアイテムのシーケンシャル ID が計算ユニットにおける実行順序を決定する順序付けられた実行動作のことです

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

55

カーネルにパイプを実装すると インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルの動作は 大 1 つのインフライトのワークグループを保有しているのと同等であるということを強制しますオフラインコンパイラーはまたカーネルがワークアイテムのシリアル実行でパイプを実行するよう保証しますここでカーネルは小さな ID を有するワークアイテムをまず実行しますワークアイテムは(xyzgroup)の識別子を持ちxyzはローカルの 3D 識別子でありgroupはワークグループの識別子です

次のいずれかの条件が当てはまる場合ワークアイテム ID (x0y0z0group0) はID (x1y1z1group1) よりも小さいとみなされます

bull group0 lt group1の場合

bull group0 = group1z0 lt z1の場合

bull group0 = group1z0 = z1y0 lt y1の場合

bull group0 = group1z0 = z1y0 = y1x0 lt x1の場合

インクリメンタル ID を持つワークアイテムはシーケンシャルに実行されます例えばID (x0y0z0group0) を持つワークアイテムは書き込みチャネル呼び出しを 初に実行します次にID(x1y0z0group0) を持つワークアイテムが呼び出しを実行しますこの順序を定義することでシステムを外部モデルと検証することが可能になります

複数のワークアイテムを持つループでのパイプの実行

次に示すように複数のワークアイテムを持つループの本体にパイプが存在する場合各ループの反復は後続の反復の前に実行されますこれはワークグループの各ワークアイテムのループ反復 0 がワークグループの各ワークアイテムの反復 1 の前に実行されることを意味します

__kernel void ordering (__global int data write_only pipe int __attribute__((blocking)) req) write_pipe (req ampdata[get_global_id(0)])

554 OpenCL のパイプ実装における制約

OpenCL アプリケーションへのパイプの実装においては一定のデザイン上の制約があります

デフォルト動作

デフォルトではパイプはノンブロッキング動作を行いますカーネルのパイプにブロッキング動作をさせる場合は読み取りパイプおよび書き込みパイプを宣言する際にブロッキング属性(__attribute__((blocking))) を指定してください

エミュレーションのサポート

インテル FPGA SDK for OpenCL Emulator はパイプを含むカーネルのエミュレーションをサポートしていますエミュレーターのサポート範囲はFPGA ハードウェアに実装される OpenCL パイプサポートのサブセットと一致します

パイプ API のサポート

現在 SDK のパイプの実装はOpenCL Specification version 20 の組み込みパイプ関数のすべてをサポートしているわけではありませんパイプ API におけるサポートの有無についてはOpenCL 20C プログラミング言語のパイプにおける制約の一覧を参照ください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

56

シングルコールサイト

パイプの読み取りおよび書き込み動作は決定論的に機能しないためカーネルにはパイプ ID ごとに 1つの呼び出しサイトしか割り当ることができません例えば インテル FPGA SDK for OpenCL オフラインコンパイラーは次のコード例をコンパイルすることができません

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe1 ampin_data3)

pipe1への 2 回目の read_pipe呼び出しはpipe1への 2 つ目の呼び出しサイトを作成するためコンパイルは失敗します

特定のパイプから複数のデータを収集するには以下に示すようにパイプを複数のパイプに分割します

read_pipe(pipe1 ampin_data1)read_pipe(pipe2 ampin_data2)read_pipe(pipe3 ampin_data3)

1 つのパイプ ID に対し 1 つの呼び出しサイトしか割り当てることができないためパイプを含むループを展開することはできません次のコードを参照ください

pragma unroll 4for (int i = 0 i lt 4 i++) read_pipe (pipe1 ampin_data1)

オフラインコンパイラーはコンパイル中に次の警告メッセージを発行します

Compiler Warning Unroll is required but the loop cannot beunrolled

フィードバックパイプとフィードフォワードパイプ

カーネルのパイプはread_onlyまたは write_onlyのどちらかです同じパイプを読み書きするカーネルのパフォーマンスは低下します

カーネルのベクトル化に対するサポート

パイプを使用するカーネルをベクトル化することはできませんつまりカーネルコードにnum_simd_work_itemsのカーネル属性を含めることはできませんパイプを使用するカーネルをベクトル化すると複数のパイプマスターが作成され調停が必要になりますこれは OpenCL パイプの仕様ではサポートされていません

read_pipe と write_pipe 呼び出しにおける命令レベルの並列性

read_pipeと write_pipe呼び出し間にデータの依存性がない場合オフラインコンパイラーはこれらの命令を並行して実行しようと試みますその結果オフラインコンパイラーはこのread_pipeと write_pipe呼び出しをOpenCL のカーネルコードで表現されているシーケンスに従わない順序で実行する可能性があります

次のコードのシーケンスを例に示します

in_data1 = read_pipe(pipe1)in_data2 = read_pipe(pipe2)in_data3 = read_pipe(pipe3)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

57

read_pipe呼び出し間にデータの依存性がないためオフラインコンパイラーは任意の順序でそれらを実行することができます

関連情報OpenCL 20 C プログラミング言語のパイプにおける制約 (188 ページ)

555 カーネルに向けた OpenCL パイプの有効化

パイプを実装するにはご自身の OpenCL カーネルを変更しパイプ固有の API 呼び出しを含めてください

パイプ宣言は特定の OpenCL カーネルプログラムに固有のものですまたパイプのインスタンスはOpenCL カーネルのプログラムとデバイスのペアごとに一意のものですランタイムに単一の OpenCLカーネルプログラムを複数のデバイスにロードすると各デバイスは各パイプのコピーを 1 つ持つようになりますただしこれらのパイプのコピーは独立しておりデバイス間でデータを共有しません

5551 他の OpenCL SDK との互換性の確保

インテルによる OpenCL パイプの実装は現在OpenCL Specification version 20 に部分的に準拠しています 他の OpenCL SDK からのパイプを実装するカーネルを インテル FPGA SDK forOpenCL にポートする場合はホストコードとカーネルコードを変更する必要がありますこの変更はこのアプリケーションの他の OpenCL SDK に対する移植性に影響しません

ホストコードの変更

以下は変更されたホストアプリケーションの例です

include ltstdiohgtinclude ltstdlibhgtinclude ltstringhgtinclude CLopenclhdefine SIZE 1000

const char kernel_source = __kernel void pipe_writer(__global int in write_only pipe int p_in)n n int gid = get_global_id(0)n write_pipe(p_in ampin[gid])n n __kernel void pipe_reader(__global int out read_only pipe int p_out)n n int gid = get_global_id(0)n read_pipe(p_out ampout[gid])n n

int main() int input = (int )malloc(sizeof(int) SIZE) int output = (int )malloc(sizeof(int) SIZE) memset(output 0 sizeof(int) SIZE) for (int i = 0 i = SIZE ++i) input[i] = rand()

cl_int status cl_platform_id platform cl_uint num_platforms status = clGetPlatformIDs(1 ampplatform ampnum_platforms)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

58

cl_device_id device cl_uint num_devices status = clGetDeviceIDs(platform CL_DEVICE_TYPE_ALL 1 ampdevice ampnum_devices)

cl_context context = clCreateContext(0 1 ampdevice NULL NULL ampstatus)

cl_command_queue queue = clCreateCommandQueue(context device 0 ampstatus)

size_t len = strlen(kernel_source) cl_program program = clCreateProgramWithSource(context 1 (const char )ampkernel_source amplen ampstatus)

status = clBuildProgram(program num_devices ampdevice NULL NULL)

cl_kernel pipe_writer = clCreateKernel(program pipe_writer ampstatus) cl_kernel pipe_reader = clCreateKernel(program pipe_reader ampstatus)

cl_mem in_buffer = clCreateBuffer(context CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR sizeof(int) SIZE input ampstatus) cl_mem out_buffer = clCreateBuffer(context CL_MEM_WRITE_ONLY sizeof(int) SIZE NULL ampstatus)

cl_mem pipe = clCreatePipe(context 0 sizeof(cl_int) SIZE NULL ampstatus)

status = clSetKernelArg(pipe_writer 0 sizeof(cl_mem) ampin_buffer) status = clSetKernelArg(pipe_writer 1 sizeof(cl_mem) amppipe) status = clSetKernelArg(pipe_reader 0 sizeof(cl_mem) ampout_buffer) status = clSetKernelArg(pipe_reader 1 sizeof(cl_mem) amppipe)

size_t size = SIZE cl_event sync status = clEnqueueNDRangeKernel(queue pipe_writer 1 NULL ampsize ampsize 0 NULL ampsync) status = clEnqueueNDRangeKernel(queue pipe_reader 1 NULL ampsize ampsize 1 ampsync NULL) status = clFinish(queue)

status = clEnqueueReadBuffer(queue out_buffer CL_TRUE 0 sizeof(int) SIZE

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

59

output 0 NULL NULL)

int golden = 0 result = 0 for (int i = 0 i = SIZE ++i) golden += input[i] result += output[i]

int ret = 0 if (golden = result) printf(FAILED) ret = 1 else printf(PASSED) printf(n)

return ret

カーネルコードの変更

カーネルコードがOpenCL Specification version 20 に準拠する OpenCL SDK で実行される場合 インテル FPGA SDK for OpenCL で実行する前にこのコードを変更する必要があります次のようにカーネルコードを変更してください

bull パイプ引数の名前が両方のカーネルにおいて同一になるように変更します例えばp_inとp_outを pに変更します

bull パイプ引数に depth属性を指定しますホストで保持するためにパイプが作成する 大パケット数に等しい値をdepth属性に割り当てます

bull インテル FPGA SDK for OpenCL にはオフラインコンパイラーがあるためオフラインコンパイルモードでカーネルプログラムを実行します

変更後のカーネルコードは次のようになります

define SIZE 1000

__kernel void pipe_writer(__global int in write_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) write_pipe(p ampin[gid])

__kernel void pipe_reader(__global int out read_only pipe int __attribute__((depth(SIZE))) p) int gid = get_global_id(0) read_pipe(p ampout[gid])

5552 パイプハンドルの宣言

pipe変数を使用しカーネル間またはカーネルと IO 間の静的なパイプ接続を定義します

パイプの読み書きを行うにあたりカーネルはパイプ変数を対応する各 API 呼び出しに渡す必要があります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

60

bull 以下の規則に従いパイプハンドルをファイルスコープ変数としてカーネルのソースコードに宣言します ltaccess qualifiergt pipe lttypegt ltvariable_namegt

パイプの lttypegt はスカラーサイズが 1024 ビット以下の任意の OpenCL 組み込みスカラーまたはベクトルデータ型にすることができますまたスカラーサイズで 1024 ビット以下のスカラーまたはベクトルデータ型で構成される任意のユーザー定義の型にすることも可能です

次のパイプハンドル宣言を参照ください

__kernel void first (pipe int c)

__kernel void second (write_only pipe int c)

初の例ではint型の読み出し専用パイプハンドルをカーネル firstで宣言しています2 番目の例では書き込み専用パイプをカーネル secondで宣言していますカーネル firstはパイプ cからの読み取りのみを行うことができカーネル secondはパイプ cへの書き込みのみを行うことができます

重要

インテル FPGA SDK for OpenCL オフラインコンパイラーではパイプ引数の名前を一致させることでシステム内のパイプの接続性を静的に推測します上記例においてカーネルfirstはカーネル secondにパイプ cで接続しています

インテル OpenCL システムでは1 つのカーネルのみがパイプを読み取ることができます同様に1 つのカーネルのみがパイプに書き込むことができますIO 以外のパイプに対応する読み取り動作と書き込み動作が少なくとも 1 つずつない場合オフラインコンパイラーはエラーを発行します

インテル FPGA SDK for OpenCL IO パイプの実装についてはio 属性を使用した IO パイプの実装を参照してください

関連情報io 属性を使用した IO パイプの実装 (64 ページ)

5553 パイプ書き込みの実装

write_pipe API 呼び出しはパイプを介したデータ送信を可能にします

インテルではwrite_pipe関数の簡易版のみをサポートしていますデフォルトで write_pipe呼び出しはノンブロッキングです受信するパケットを収容する容量がパイプにある場合にのみパイプ書き込み動作は成功します

bull パイプ書き込みを実装するには次の write_pipe関数シグネチャーを含めます

int write_pipe (write_only pipe lttypegt pipe_id const lttypegtdata)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応する読み出しパイプ(read_pipe) の pipe_idと一致する必要があります

dataはパイプ書き込み動作がパイプに書き込むデータですこれはパイプのパケットタイプへのポインターになりますパイプへの書き込みはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はパイプのデータ幅を定義します戻り値はパイプ書き込み動作が成功したかどうかを示します成功した場合の戻り値は 0 となりパイプの書き込みが失敗した場合の戻り値は-1 です

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

61

以下はwrite_pipe API 呼び出しの実装を表すコード例です

Declares the writable nonblocking pipe p which contains packets of type int__kernel void kernel_write_pipe (__global const long src write_only pipe int p) for (int i = 0 i lt N i++) Performs the actual writing Emulates blocking behavior via the use of a while loop while (write_pipe(p ampsrc[i]) lt 0)

blocking 属性を指定する場合whileループは不要ですより良いハードウェアの実装を実現するためにインテルではカーネルのパイプ引数宣言にブロッキング属性(__attribute__((blocking))) を指定することでブロッキングの write_pipe呼び出し機能を提供しますブロッキングの write_pipe呼び出しは必ず成功を返します

注意 write_pipe API 呼び出しを使用しブロッキングの書き込みパイプを介しデータを送信する際はパイプがフル (FIFO バッファーがデータでフル) の場合はカーネルがストールすることに注意してください インテル FPGA Dynamic Profiler for OpenCL を使用しパイプのストールを確認してください

関連情報OpenCL カーネルのプロファイリング (140 ページ)

5554 パイプ読み出しの実装

read_pipe API 呼び出しはパイプを介したデータ受信を可能にします

インテルではread_pipe関数の簡易版のみをサポートしていますread_pipe呼び出しはデフォルトではノンブロッキングです

bull パイプ読み出しを実装するには次の read_pipe関数シグネチャーを含めます

int read_pipe (read_only_pipe lttypegt pipe_id lttypegt data)

以下に詳細を説明します

pipe_idはパイプが接続するバッファーを識別しますこれは対応するパイプ書き込み動作(write_pipe) の pipe_idと一致する必要があります

dataはパイプ読み出し動作がパイプから読み取るデータですこれはデータ位置へのポインターになりますread_pipe呼び出しはデータポインターのソースアドレス空間によってはグローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください

lttypegt はデータのパケットサイズを定義します

以下はread_pipe API 呼び出しの実装を表すコード例です

Declares the read_only_pipe that contains packetsof type longDeclares that read_pipe calls within the kernel will exhibitblocking behavior__kernel void kernel_read_pipe(__global long dst read_only pipe long __attribute__((blocking)) p) for (int i = 0 i lt N i++) Reads from a long from the pipe and stores it

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

62

into global memory at the specified location read_pipe(p ampdst[i])

より良いハードウェア実装を実現するためにインテルではカーネルのパイプ引数宣言にプロッキング属性 (__attribute__((blocking))) を指定することでブロッキングの read_pipe呼び出し機能を提供しますブロッキングの read_pipe呼び出しは必ず成功が返されます

注意 パイプが空 (FIFO バッファーが空) の場合read_pipe API 呼び出しでブロッキングの読み出しパイプを介したデータ受信はできませんこれを行うとカーネルがストールします

5555 depth 属性を使用するバッファーされたパイプの実装

カーネルプログラムにはバッファーされたパイプとバッファーされていないパイプを含むことができます パイプの読み出し動作と書き込み動作が不均衡な場合はパイプ宣言に depth属性を含めることでバッファーされたパイプを作成しカーネルのストールを防ぎますバッファーされたパイプは異なるカーネルで並行して実行されているワークアイテムの動作を切り離します

バッファーされたパイプを使用しスループットの制限や共有メモリーのアクセスの同期化といったデータのトラフィックを制御できますバッファーされていないパイプにおいて書き込み動作は読み出し動作がデータの読み取りをしようとしている場合にのみ開始できますバッファーされていないパイプは並行して実行されるカーネルでのブロッキングの読み書き動作と組み合わせて使用してくださいバッファーされていないパイプは自己同期型のデータ転送を効率的に提供します

バッファーされたパイプにおいて書き込み動作は受信するパケットを収容する容量がパイプにある場合にのみ進めることが可能です読み出し動作は少なくとも 1 つのパケットがパイプになければ実行することができません

パイプ呼び出しが書き込みカーネルと読み出しカーネルで異なって表されている場合にバッファーされたパイプを使用するとカーネルは並行して実行されません

bull パイプに対する消費率と生産率の一時的な不一致が予想される場合はdepth属性を使用しバッファーサイズを設定します

次の例はOpenCL パイプを実装するカーネルコードにおける depth属性の使用方法を示していますdepth(N)属性はバッファーされたパイプの 小深度を指定しますこの N はデータ値の数です読み出しカーネルと書き込みカーネルが特定のバッファーされたパイプに異なる深度を指定する場合 インテル FPGA SDK for OpenCL オフラインコンパイラーは 2 つの深度のうち大きい深度を使用します

__kernel voidproducer (__global int in_data write_only pipe int __attribute__((blocking)) __attribute__((depth(10))) c) for (i = 0 i lt N i++) if (in_data[i]) write_pipe( c ampin_data[i] )

__kernel voidconsumer (__global int check_data __global int out_data read_only pipe int __attribute__((blocking)) c ) int last_val = 0

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

63

for (i = 0 i lt N i++) if (check_data[i]) read_pipe( c amplast_val ) out_data[i] = last_val

この例において書き込み動作は10 個のデータ値をパイプに正常に書き込むことができますパイプがフルの状態になると書き込みカーネルは読み出しカーネルがパイプのデータの一部を消費するまで失敗を返します

パイプの読み出しと書き込みの呼び出しは条件付きステートメントのためパイプの読み出しおよび書き込みの呼び出しには不均衡が発生する可能性がありますパイプにバッファー容量を追加するとproducerと consumerカーネルを切り離すことができますこの方法はconsumerカーネルがパイプからデータを読み取っていない際にproducerカーネルがパイプにデータを書き込んでいる場合に特に重要です 

5556 io 属性を使用した IO パイプの実装

OpenCL パイプ宣言に io属性を含めFPGA ボードの入力または出力フィーチャーと接続する特別なIO パイプを宣言しますこのフィーチャーにはネットワークインターフェイスPCIeカメラデータのキャプチャーや処理を行うその他デバイスプロトコルなどが含まれます

インテル FPGA SDK for OpenCL チャネル拡張の io(chan_id) 属性はチャネルが接続するアクセラレーターボードの IO フィーチャーを指定しますchan_id 引数はカスタムプラットフォームの board_specxmlファイルにある IO インターフェイスの名前です同じ IO フィーチャーを使用しIO パイプを識別することができます

ペリフェラルインターフェイスの使用法は各デバイスのタイプによって異なる可能性があるためIO パイプをカーネルプログラムに実装する際はボードメーカーの資料を参照してくださいOpenCL カーネルのコードはペリフェラルインターフェイスが生成するデータの型と互換性がなければなりません外部 IO パイプとカーネルのバイトの順序が異なる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはバイトの順序を入出時にシームレスに変換します

注意 bull ボードに直接接続しておりIO パイプを介してペリフェラルデバイスと通信するパイプには暗黙的なデータの依存性が存在する可能性がありますオフラインコンパイラーはそれらの依存関係を認識できないためこの暗黙的なデータの依存性はコンパイルの問題を引き起こす可能性があります

bull 同一のペリフェラルと通信する外部 IO パイプはシーケンシャルな順序に従いません予期しない動作が発生する可能性があるため外部デバイスがシーケンシャルな順序を必要としないようにしてください

1 カスタムプラットフォームの board_specxmlファイルを確認しFPGA ボードで使用可能な入力および出力フィーチャーを特定ください

例えばboard_specxmlファイルにはIO フィーチャーに関する次のような情報が含まれています

ltchannelsgt ltinterface name=udp_0 port=udp0_out type=streamsource width=256 chan_id=eth0_ingt ltinterface name=udp_0 port=udp0_in type=streamsink width=256 chan_id=eth0_outgt ltinterface name=udp_0 port=udp1_out type=streamsource width=256

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

64

chan_id=eth1_ingt ltinterface name=udp_0 port=udp1_in type=streamsink width=256 chan_id=eth1_outgtltchannelsgt

interface要素の width属性はそのパイプで使用されるデータの型の幅をビット単位で指定します上記例の場合uintと floatのデータ型はどちらも 32 ビット幅ですその他のより大きなデータ型やベクトル化されたデータ型はboard_specxmlファイルで指定されている適切なビット幅に一致している必要があります

2 次のコード例で示されているように io属性を実装しますio属性名はboard_specxmlファイルで指定されている IO チャネル名 (chan_id) に一致しなければなりません

__kernel void test (pipe uint pkt __attribute__((io(ldquoenetrdquo))) pipe float data __attribute__((io(ldquopcierdquo))))

注意 board_specxmlファイル内のチャネルの XML 要素で指定されている各 IO パイプに固有の io(chan_id) ハンドルを宣言してください

5557 パイプ呼び出し順序の強制

パイプの呼び出し順序を強制するにはメモリーフェンスもしくはバリアー機能をカーネルプログラムに導入しメモリーアクセスを制御しますメモリーフェンス機能はフェンス前後におけるパイプの同期呼び出し間に制御フローの依存性を作成するために必要です

インテル FPGA SDK for OpenCL オフラインコンパイラーが計算ユニットを生成する際それぞれが独立している命令のすべてに対し命令レベルの並列性を構築するわけではありませんそのためパイプの読み出しおよび書き込み動作はそれらに制御やデータの依存性がない場合でも互いに独立して実行されない可能性がありますパイプ呼び出しが相互に通信する場合やパイプが外部デバイスにデータを書き込む場合にデッドロックが発生する可能性があります

次のコード例はproducerカーネルと consumerカーネルで構成されていますパイプ c0と c1はバッファーされていないパイプですc0と c1からのパイプ読み出し動作のスケジュールはc0とc1へのパイプ書き込み動作と逆の順序になる可能性がありますつまりproducerカーネルが 初に c0に書き込む一方でconsumerカーネルは c1から読み出す可能性があるということですconsumerカーネルが空のパイプから読み出しているためこのパイプ呼び出しにおけるスケジューリングの変更はデッドロックを発生させる可能性があります

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe (c0 ampsrc[2i ]) write_pipe (c1 ampsrc[2i+1])

__kernel void consumer (__global uint restrict dst const uint iterations read_only pipe uint __attribute__((blocking)) c0 read_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) read_pipe (c0 ampdst[2i+1]) read_pipe( c1 ampdst[2i])

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

65

bull パイプ呼び出しの順序を強制しデッドロックが発生しないようにするにはメモリーフェンス関数(mem_fence) をカーネルに含めます

各カーネルのパイプフラグとともに mem_fence呼び出しを挿入すると書き込みおよび読み出しのパイプ呼び出しにシーケンシャルな順序付けが適用されます次に変更後の producerとconsumerカーネルコードを示します

__kernel void producer (__global const uint src const uint iterations write_only_pipe uint __attribute__((blocking)) c0 write_only_pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) write_pipe(c1 ampsrc[2i+1])

__kernel void consumer (__global uint dst const uint iterations read_only_pipe uint __attribute__((blocking)) c0 read_only_pipe uint __attribute__((blocking)) c1) for(int i = 0 i lt iterations i++) read_pipe(c0 ampdst[2i ]) mem_fence(CLK_CHANNEL_MEM_FENCE) read_pipe(c1 ampdst[2i+1])

この例ではproducerカーネルの mem_fenceはc0へのパイプ書き込み動作が c1より先に発生するようにしています同様に consumerカーネルの mem_fenceはc0からの読み取り動作が c1より先に行われるようにしています 

55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義

OpenCL Specification version 20 によるとカーネルの実行が完了しない限りメモリーの動作は定義されませんカーネルの実行はメモリー動作に発生した変更が他のカーネルから見えるようになる前に終了させる必要がありますただしパイプを使用するカーネルは共通のグローバルメモリーバッファーと同期化されたメモリーアクセスを介しデータを共有できます メモリーフェンスが渡された後にパイプに書き込まれたデータが読み出しパイプから確実に見えるようにするにはメモリーフェンスに関するメモリーの一貫性をカーネル間に定義します

bull パイプの同期呼び出しとメモリー動作における制御フローの依存性を作成するにはmem_fence呼び出しに CLK_GLOBAL_MEM_FENCEフラグを追加します

__kernel void producer (__global const uint restrict src const uint iterations write_only pipe uint __attribute__((blocking)) c0 write_only pipe uint __attribute__((blocking)) c1) for (int i = 0 i lt iterations i++) write_pipe(c0 ampsrc[2i]) mem_fence(CLK_CHANNEL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

66

write_pipe(c1 ampsrc[2i+1])

このカーネルで mem_fence関数はc0への書き込み動作と src[2i] へのメモリーアクセスがc1への書き込み動作と src[2i+1] へのメモリーアクセスの前に必ず実行されるようにしていますこれによりc0に書き込まれたデータはc1にデータが書き込まれる前に読み出しパイプから見えるようになります 

556 ホストパイプを介したカーネルとの直接通信

cl_intel_fpga_host_pipe拡張機能はカーネルとホストプログラムにおいてポイントとポイントのパイプ通信を可能にしますこの拡張を行わない場合OpenCL 内のパイプはカーネル間の通信にのみ使用することができホストプログラムとの直接通信に使用することはできません

この拡張機能はclCreatePipeの flags引数に 2 つの新しい値を認証しパイプホストをアクセス可能にしますまた4 つの新しい API 関数を追加し (clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGA)ホストのアクセスを有効にすることで作成したパイプをホストが読み書きできるようにします新しいカーネル引数属性のオプションが追加されカーネル言語においてパイプカーネル引数の反対側の端をホストプログラムに指定することでパイプが別のカーネルに接続されなくなりますカーネルの定義においてパイプカーネル引数はホストパイプまたは他のカーネルのどちらかへの接続に限定されておりランタイムにこの 2 つを動的に切り替えることはできません

パイプカーネル引数にホストアクセス可能のマークが付けられている場合カーネル言語のパイプアクセサーは2x 関数のサブセットに制限され (予約はサポートされていません)メモリーの一貫性または可視性の保証はOpenCL 同期ポイントを超えて行われます

ホストがアクセス可能なパイプのサポートはcl_intel_fpga_host_pipeと公示されているデバイスプロパティーです

注意 bull このホストパイプの実装における制限はプラットフォームが 2 つのホストパイプしかサポートしていないことです1 つは読み出し用もう一つは書き出し用ですさらにコパイラーは 32 ビット幅のパイプのみを許容しますよって cl_intel_fpga_host_pipe拡張機能の使用例の章でulong4が使用されています

bull cl_intel_fpga_host_pipe拡張を使用しているホストプログラムはOpenCL 20 の機能のサポート状況 (187 ページ) に記されているようにCLcl_ext_intelfpgahヘッダーファイルを含みOpenCL 20 のサポートを有効にする必要があります

関連情報cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

5561 intel_host_accessible カーネル引数属性オプション

cl_intel_fpga_host_pipe拡張機能によりオプションの intel_host_accessibleカーネル引数属性が追加されますこの属性をカーネルパイプ引数に適用することでホストはカーネルパイプ引数をホストがアクセス可能なパイプに接続し他のカーネルパイプ引数に接続しないことを指定します

__attribute__((intel_host_accessible))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

67

5562 ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数

clReadPipeIntelFPGAclWritePipeIntelFPGAclMapHostPipeIntelFPGAclUnmapHostPipeIntelFPGAのホスト API 関数を追加するとホストプログラムはホストがアクセス可能なパイプカーネル引数に (clSetKernelArg引数を使用し) バインドされたcl_memパイプオブジェクトに読み書きできるようになります

bull clReadPipeIntelFPGAおよび clWritePipeIntelFPGA関数はパイプ幅のシングルワードで動作します

bull clMapHostPipeIntelFPGA関数はホストパイプで多数のワードの読み取りまたは書き込みを実行する際のレイテンシーとオーバーヘッドを低減する高度なメカニズムです

bull clUnmapHostPipeIntelFPGA関数を使用するとホストプログラムは先にclMapHostPipeIntelFPGA関数呼び出しが作成したマップ領域の一部または全体に書き込みもしくは読み出しを行ったことを OpenCL ランタイムに通知することができるようになります

表 1 バインドされた cl_mem オブジェクトの API 関数

関数 説明

cl_int clReadPipeIntelFPGA (cl_mem pipe gentype ptr)

以下の特性を持つパイプからデータパケットを読み取ります1 CL_MEM_HOST_READ_ONLYフラグで作成されている2 write_only定義と intel_host_accessibleカーネル

引数属性を持つカーネル引数にバインドされている各 clReadPipeIntelFPGA関数呼び出しは1 パケットをパイプから読み取ります動作はノンブロッキングでありデータがパイプ内で正常に読み取れるようになるまで待機しません

cl_int clWritePipeIntelFPGA (cl_mem pipe gentype ptr)

次の特性を持つパイプにデータパケットを書き込みます1 CL_MEM_HOST_WRITE_ONLYフラグを使用し作成されている2 read_only定義と intel_host_accessible引数属性を

持つカーネル引数にバインドされている各 clWritePipeIntelFPGA関数呼び出しは1 パケットをパイプに書き込みます動作はノンブロッキングであり正常に書き込める容量がパイプにできるまで待機しません返されるステータスのCL_SUCCESSはカーネルの読み取りにデータが利用可能なことを意味するわけではありませんホストパイプに以前にマップされたバッファーのマップが解除されるとデータは 終的にカーネルの読み取りに利用可能になります

void clMapHostPipeIntelFPGA (cl_mem pipe cl_map_flags map_flags size_t requested_size size_t mapped_size cl_int errcode_ret)

ホストアドレス空間にvoid を返しますCL_MEM_HOST_WRITE_ONLYフラグで作成されている場合パイプはこのアドレス空間にデータを書き込むことができますまたCL_MEM_HOST_READ_ONLYフラグで作成されている場合パイプはこのアドレス空間からデータを読み取ることができますmapped_size引数はメモリーのランタイムによって決定するホストがアクセス可能な 大バイト数を指定しますmapped_size で指定される値は呼び出し側が指定する requested_size引数以下の値になります返された void に対する読み出しまたは書き込み後ホストは 1 回以上の clUnmapHostPipeIntelFPGA関数呼び出しを実行しデバイスに転送するデータが準備できていること (書き込み時) およびメモリーを再利用できること (読み込みおよび書き込みに時) をランタイムに通知する必要があります前回のclMapHostPipeIntelFPGA関数呼び出しでマッピングされたメモリーをclUnmapHostPipeIntelFPGA関数が解除する前に新

continued

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

68

関数 説明

たに clMapHostPipeIntelFPGA関数が呼び出された場合2 回目の clMapHostPipeIntelFPGA関数呼び出しで返されるバッファーは 初の呼び出しで返されたバッファーと重複しません

cl_int clUnmapHostPipeIntelFPGA ( cl_mem pipe void mapped_ptr size_t size_to_unmap size_t unmapped_size )

clMapHostPipeIntelFPGA関数によって返されたホストがアドレス指定可能なバッファーの size_to_unmapバイトをホストがすでに使用していないことをランライムに通知します書き込み可能なホストパイプの場合clUnmapHostPipeIntelFPGAを呼び出すとマッピングが解除されたデータをカーネルが利用できるようになりますsize_to_unmapの値が clMapHostPipeIntelFPGA関数で指定された mapped_sizeの値より小さい場合clUnmapHostPipeIntelFPGA関数を複数回呼び出しバッファー全容量のマッピングを解除する必要がありますclUnmapHostPipeIntelFPGA関数呼び出しを複数回含めclMapHostPipeIntelFPGA関数呼び出しで返されたバッファーの一連のバイトのマッピングをclMapHostPipeIntelFPGA呼び出しで定義された mapped_sizeの値まで解除することができます

5563 ホストがアクセス可能なパイプの作成

OpenCL 22 API Specification の Section 541 で定義されている clCreatePipe関数はflagsパラメーターを含んでいますclCreatePipe関数の flagsの有効値はCL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSです flagsへ渡された値が 0 の場合このフラグはどちらも暗黙的にデフォルトとして渡されると Specification は定義しています

ホストのパイプへのアクセス (読み取りまたは書き込み) を有効にするためcl_intel_fpga_host_pipe拡張機能は次の 2 つの flags値を clCreatePipeに対し正当なものにします

bull CL_MEM_HOST_READ_ONLY

bull CL_MEM_HOST_WRITE_ONLY

この flagsのうち 1 つが clCreatePipe関数に渡されると対応する cl_memオブジェクトは初の引数として clReadPipeIntelFPGAと clWritePipeIntelFPGA関数に渡されます

cl_intel_fpga_host_pipe拡張の残りの部分においてこのようなパイプはホストパイプとして表されます

警告 CL_MEM_HOST_READ_ONLYと CL_MEM_HOST_WRITE_ONLYを同じパイプに指定することまたはこのどちらかの値を CL_MEM_READ_WRITEと CL_MEM_HOST_NO_ACCESSのどちらかもしくは両方と混在させることは不当です無効な flagsの組み合わせは OpenCL ランタイムに検出されclCreatePipeがCL_INVALID_VALUEエラーを返す原因になります

5564 cl_intel_fpga_host_pipe 拡張機能の使用例

以下はcl_intel_fpga_host_pipe拡張のカーネルとホストコードの例です

カーネルコード

pragma OPENCL EXTENSION cl_intel_fpga_host_pipe enable

kernel void reader(__attribute__((intel_host_accessible)) __read_only pipe ulong4 host_in) ulong4 val if (read_pipe(host_in ampval))

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

69

kernel void writer(__attribute__((intel_host_accessible)) __write_only pipe ulong4 device_out) ulong4 val if (write_pipe(device_out ampval))

ホストコード

cl_kernel read_kern = clCreateKernel(program reader NULL)

cl_kernel write_kern = clCreateKernel(program writer NULL)

cl_mem read_pipe = clCreatePipe(context CL_MEM_HOST_READ_ONLY sizeof( cl_ulong4 ) 128 Number of packets that can be buffered NULL amperror)

cl_mem write_pipe = clCreatePipe(context CL_MEM_HOST_WRITE_ONLY sizeof( cl_ulong4 ) 64 Number of packets that can be buffered NULL amperror)

Bind pipes to kernelsclSetKernelArg(read_kern 0 sizeof(cl_mem) (void )ampwrite_pipe)clSetKernelArg(write_kern 0 sizeof(cl_mem) (void )ampread_pipe)

Enqueue kernels

cl_ulong4 valif (clReadPipeIntelFPGA (read_pipe ampval)) cl_int result = clWritePipeIntelFPGA (write_pipe ampval) Check write successfailure and handle

56 任意精度での整数の実装

インテル FPGA SDK for OpenCL の任意精度での整数拡張を使用しカスタムビット幅で整数を定義します整数のカスタムビット幅は 大 64 ビットまで定義できます

任意精度の整数拡張機能を使用するにはカーネルコードのヘッダーファイルのリストに次の行を含めます

include ihc_apinth

ihc_apinthヘッダーファイルを含むカーネルをコンパイルする際は-I$INTELFPGAOCLSDKROOTincludekernel_headersオプションを aocコマンドとともに含める必要があります以下に例を示します

aoc ltother command optionsgt -I $INTELFPGAOCLSDKROOTincludekernel_headers ltmy_kernel_filegt

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

70

ヘッダーは任意精度の整数拡張を有効にし符号付きおよび符号なしの任意精度の整数に対する C スタイル宣言を定義するマクロを次のように備えています

define ap_intltdgt intd_tdefine ap_uintltdgt uintd_t

例えば 10 ビットの符号付きおよび符号なしの任意精度の整数は次のように宣言できます

int10_t x_signeduint10_t x_unsigned

任意精度の整数は 大 64 ビット幅まで宣言することが可能です

ヘッダーファイルを使用せずに整数を任意の精度で利用するには次のプラグマディレクティブで拡張を有効にします

pragma OPENCL EXTENSION cl_intel_arbitrary_precision_integers enable

プラグマ宣言の後次のように任意の精度で整数を宣言することができます

ap_intltdgt intd_t my_signed_integerap_uintltdgt uintd_t my_unsigned_integer

結果のビット幅が引数のビット幅より大きい演算を行う場合は引数の 1 つを結果のビット幅に明示的にキャストする必要があります

例えば次の演算を行った場合結果は宣言された整数のサイズをオーバーフローします

int10_t aint10_t bint20_t res

res = a b

この例においてコンパイラーは2 つの 10 ビットの整数を乗算する乗数をインスタンス化し結果を別の 10 ビットの整数に納めようと試みます結果は符号拡張されるか20 ビットまでゼロ拡張されます

オーバーフローを防ぐには次のように引数の 1 つを結果のビット幅に明示的にキャストします

res = ((int20_t)a) b

注意 x86-64 のプラットフォームに向けてプログラムをコンパイルすると任意の精度での整数のビット幅は32 ビットまたは 64 ビットに切り上げられますFPGA プラットフォームにカーネルをコンパイルするとビット幅は切り上げられず任意の精度の整数は宣言されたビット幅のまま維持されます

その結果x86-64 のプログラムで正しく動作するように見える演算を FPGA カーネルにコンパイルするとオーバーフローし精度を失う可能性がありますx86-64 プラットフォームにおいてビット幅を切り上げることで与えられる追加精度はFPGA カーネルのコンパイル時に発生する可能性があるオーバーフローと精度損失の問題をマスクします

57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用

定義済みプリプロセッサーマクロを活用するとカーネルコードの一部を条件付きでコンパイルできるようになります

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

71

bull デバイス固有のコード (例えば FPGA_board_1) をカーネルプログラムに含めるにはカーネルプログラムを次のように構成します

if defined(AOCL_BOARD_FPGA_board_1) FPGA_board_1-specific statementselse FPGA_board_2-specific statementsendif

カーネルのコンパイルを特定のボードに対して行うと定義済みプリプロセッサーマクロAOCL_BOARD_ltboard_namegt が 1 に設定されますltboard_namegt がFPGA_board_1 の場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはFPGA_board_1 に固有のパラメーターとフィーチャーをコンパイルします

bull インテル FPGA SDK for OpenCL オフラインコンパイラー固有のコンパイラーフィーチャーと適化を導入するにはカーネルプログラムを次のように構成します

if defined(INTELFPGA_CL) statementselse statementsendif

この INTELFPGA_CLは インテル にて定義済みのオフラインコンパイラー用のプリプロセッサーマクロです

関連情報カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)(111 ページ)

58 __constant アドレス空間修飾子の宣言

__constantアドレス空間修飾子をカーネルに含める際にはいくつかの考慮すべき制限と回避策があります

関数スコープ__constant 変数

インテル FPGA SDK for OpenCL オフラインコンパイラーは関数スコープの__constant変数をサポートしません関数スコープの__constant変数はファイルスコープの constant 変数に置き換えてくださいまた関数スコープの__constant変数をホストがカーネルに渡す__constantバッファーに置き換えることも可能です

ファイルスコープ__constant 変数

ホストが常に同じ定数データをカーネルに渡す場合そのデータを初期化された constant ファイルスコープ配列としてカーネルファイルで宣言することを検討ください初期化された constant ファイルスコープ配列宣言はデータを格納するための ROM をハードウェアに直接作成しますこの ROM はNDRange のすべてのワークアイテムが利用可能です

以下に例を示します

__constant int my_array[8] = 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7

__kernel void my_kernel (__global int my_buffer) size_t gid = get_global_id(0) my_buffer[gid] += my_array[gid 8]

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

72

この場合ファイルスコープの定数データはカーネルの呼び出しにわたって変化しないためオフラインコンパイラーは my_arrayの値を ROM に設定します

ホストから__constant パラメーターへのポインター

カーネルの呼び出しにわたってデータが固定されていない場合ファイルスコープの定数データをカーネルコードの__constantパラメーターへのポインターに置き換えることが可能ですその後次の方法でホストアプリケーションを修正する必要があります

1 グローバルメモリーのポインターに関連付けられた cl_memメモリーオブジェクトを作成します

2 カーネルを実行する前にclEnqueueWriteBufferで定数データを cl_memオブジェクトにロードします

3 clSetKernelArg関数でcl_memオブジェクトをカーネルに引数として渡します

constant 変数が複合型の場合は次の表で示されているように typedef引数を使用し簡潔にします

表 2 ファイルスコープ__constant 変数と__constant パラメーターへのポインターの置き換え

元のソースコードの構成 以下のような構文に書き換え

__constant int Payoff[2][2] = 1 3 5 3__kernel void original(__global int A) A = Payoff[1][2] and so on

__kernel void modified(__global int A__constant Payoff_type PayoffPtr ) A = (PayoffPtr)[1][2] and so on

注意 ホストアプリケーションとカーネルでは同じ型定義を使用してください

59 構造体データ型を OpenCL カーネルに引数として含める

OpenCL カーネルの構造体パラメーター (struct) は値もしくは構造体へのポインターとして渡します

注意 __global struct引数は構造体を格納するためにホストプログラムに作成する必要があるバッファーを指定しますポインターのエイリアシングを防ぐため構造体へのポインター宣言にrestrict修飾子を含めます

591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致

OpenCL カーネルで構造体データ型 (struct) を引数として使用する場合ホストアプリケーションとカーネルコードにおいてメンバーのデータ型を一致させデータメンバーのアライメントを揃えてください

メンバーのデータ型を一致させるにはカーネルコードのデータ型に対応するデータ型の cl_バージョンをホストアプリケーションで使用しますデータ型の cl_バージョンはopenclhヘッダーファイルにあります例えばカーネルコードに float4型のデータメンバーがある場合ホストアプリケーションにおいて宣言する対応するデータメンバーはcl_float4です

ホストとカーネルアプリケーションにおける構造とstructデータメンバーのアライメントを揃えます異なるホストコンパイラー間においては変動性があるためアライメントは慎重に管理してください

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

73

例えば構造体にfloat4の OpenCL データ型がある場合これらのデータアイテムのアライメントはOpenCL Specification を満たす必要があります (float4に対しては 16 バイトのアライメント)

インテル FPGA SDK for OpenCL オフラインコンパイラーが OpenCL カーネルをコンパイルする際は次の規則が適用されます

1 組み込みのスカラー型とベクトル型のアラインメントはOpenCL Specification version 10 のSection 615 で説明されている規則に従います

オフラインコンパイラーは通常サイズに基づいてデータ型のアライメントを行いますただしコンパイラーは 3 要素ベクトルの値を4 要素ベクトルと同じ方法でアライメントします

2 配列はその要素の 1 つと同じアラインメントを有します

3 struct (または union) はそのデータメンバーのいずれかに必要な 大アライメントと同じアライメントを有します

以下に例を示します

struct my_struct char data[3] float4 f4 int index

データ型が float4であるためオフラインコンパイラーは上記の struct要素を 16 バイトの境界でアライメントしますその結果dataと indexもまた 16 バイトのアライメント境界を有します

4 オフラインコンパイラーは structのデータメンバーを並び替えません

5 オフラインコンパイラーは通常各データメンバーのアライメント要件を満たすためstructのデータメンバー間に 小限のデータ構造パディングを挿入します

a OpenCL カーネルコードではpacked属性を struct宣言に適用することでデータのパッキングを指定することができます (すなわちデータ構造パディングを挿入しない)データのパッキングを課す場合はデータメンバーのアラインメントが OpenCL のアラインメント要件を満たしていることを確認してください インテル FPGA SDK for OpenCL はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

b OpenCL カーネルコードではaligned(N) 属性をデータメンバーに適用しデータ構造パディングの量を指定することができますここで N はパディングの量を表しますSDK はこのアライメント要件を強制しませんホストコンパイラーがカーネル属性に配慮し適切なアライメントを設定していることを確認してください

Windows システムにおいてMicrosoft Visual Studio コンパイラーの一部のバージョンではデフォルトで構造体データ型をパッキングしますデータのパッキングが不要な場合はデータ構造パディングの量を次のように指定してください

struct my_struct __declspec(align(16)) char data[3]

Note that cl_float4 is the only known float4 definition on the host __declspec(align(16)) cl_float4 f4 __declspec(align(16)) int index

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

74

ヒント データ構造パディングを追加することに代わりchar型または char配列のダミーの structメンバーを挿入する方法もあります

関連情報bull 構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

bull OpenCL Specification version 10

592 データ構造パディング挿入の無効化

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造体のメンバー間への自動的なパディング挿入を無効にする指示を出すことができます

bull 自動パディング挿入を無効にするにはカーネルソースコードの structデータ構造の前にpacked属性を挿入します

例えば次のようになります

struct __attribute__((packed)) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float restrict A __global struct Context restrict c) if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

593 構造体のアライメントの指定

インテル FPGA SDK for OpenCL オフラインコンパイラーではstructデータ構造に特定のアライメントを設定するよう指示を出すことができます

bull 構造のアライメントを指定するにはカーネルソースコードの structデータ構造の前にaligned(N) 属性を挿入します

次に例を示します

struct __attribute__((aligned(2))) Context float param1 float param2 int param3 uint param4__kernel void algorithm(__global float A __global struct Context restrict c)

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

75

if ( c-gtparam3 ) Dereference through a pointer and so on

詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの構造体をパディング付きまたはパディングなしで整列するの章を参照ください

関連情報構造体をパディング付きまたはパディングなしで整列する

510 レジスターの推論

インテル FPGA SDK for OpenCL オフラインコンパイラーではプライベートアドレス空間のデータをレジスターまたはブロック RAM に実装することが可能です 変数へのアクセスが固定されており動的インデックスを必要としない場合オフラインコンパイラーは通常レジスターを選択します可変インデックスで配列にアクセスすると配列は通常ブロック RAM に実装されますプライベートデータをレジスターとして実装することは単一のサイクルで発生する必要があるデータのアクセス (例えば単一ワークアイテムのループでのフィードバックなど) に有効です

オフラインコンパイラーはプライベート配列を単一の値のレジスターまたは区分的なレジスターとして推論します区分的な実装は非常に効率的なハードウェアをもたらしますがオフラインコンパイラーがデータのアクセスを静的に決定できなければなりません区分的な実装を容易にするためにアクセスポイントを配列にハードコードしますまた配列にアクセスするループを展開することでレジスターの推論を容易にすることもできます

配列のアクセスを静的に推論できない場合オフラインコンパイラーは配列をレジスターとして推論する場合がありますただしオフラインコンパイラーは単一のワークアイテムカーネルに対しそれらの配列のサイズを 64 バイトに制限します複数のワークアイテムを有するカーネルには実質的にサイズ制限はありません

次のコードを例に示します

int array[SIZE]for (int j = 0 j lt N ++j) for (int i = 0 i lt SIZE - 1 ++i) array[i] = array[i + 1]

array[i]へのインデックスはループが展開されていないため静的に推論することができませんarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイト以下である場合オフラインコンパイラーは array[SIZE]を単一の値としてレジスターに実装しますarray[SIZE]のサイズが単一ワークアイテムカーネルにおいて 64 バイトより大きい場合オフラインコンパイラーは配列全体をブロック RAM に実装します複数のワークアイテムカーネルの場合サイズが 1 キロバイト (KB) 未満である限りオフラインコンパイラーは単一の値として array[SIZE]をレジスターに実装します

5101 シフトレジスターの推論

シフトレジスターのデザインパターンは多くのアプリケーションを効率的に FPGA へ実装するために非常に重要なデザインパターンですしかしシフトレジスターのデザインパターンを実装することに対し 初は違和感を抱くかもしれません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

76

次のコードを例に示します

channel int in out

define SIZE 512Shift register size must be statically determinable

__kernel void foo() int shift_reg[SIZE] The key is that the array size is a compile time constant

Initialization loop pragma unroll for (int i=0 i lt SIZE i++) All elements of the array should be initialized to the same value shift_reg[i] = 0 while(1) Fully unrolling the shifting loop produces constant accesses pragma unroll for (int j=0 j lt SIZEndash1 j++) shift_reg[j] = shift_reg[j + 1] shift_reg[SIZE ndash 1] = read_channel_intel(in)

Using fixed access points of the shift register int res = (shift_reg[0] + shift_reg[1]) 2

lsquooutrsquo channel will have running average of the input channel write_channel_intel(out res)

各クロックサイクルでカーネルは新しい値を配列にシフトしますこのシフトレジスターをブロックRAM に配置することにより インテル FPGA SDK for OpenCL オフラインコンパイラーは配列への複数のアクセスポイントを効率的に処理できますシフトレジスターのデザインパターンはフィルター (例えばSobel フィルターなどのイメージフィルターや有限インパルス応答 (FIR) フィルターなどの時間遅延フィルター) を実装する際に理想的な方法です

カーネルコードにシフトレジスターを実装する際は次の点に注意してください

1 シフトループを展開し配列のすべての要素にアクセスできるようにします

2 すべてのアクセスポイントは一定のデータアクセスを持つ必要があります例えば複数のアクセスポイントを使用しネスト化されたループに計算を書き込む場合はこれらのループを展開し一定のアクセスポイントを確立します

3 配列の要素すべてを同じ値に初期化します特定の初期値が不要な場合は要素を初期化せずに維持することも可能です

4 大規模な配列へのアクセスが静的に推論できない場合オフラインコンパイラーは非効率なハードウェアを作成することになりますそれらのアクセスが必要な場合は__privateメモリーの代わりに__localメモリーを使用してください

5 大規模なシフトレジスターを条件付きでシフトしないでください非効率なハードウェアの作成を防ぐためシフトはシフトコードを含むループの反復で必ず行わなければなりません

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

77

511 倍精度浮動小数点演算の有効化

インテル FPGA SDK for OpenCL ではすべての倍精度浮動小数点関数に対し暫定的なサポートを提供します

OpenCL カーネルで倍精度浮動小数点のデータ型を宣言する前に次の OPENCL EXTENSIONプラグマをカーネルコードに含めます

pragma OPENCL EXTENSION cl_khr_fp64 enable

512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター

ループ内で累算を実行する単一ワークアイテムカーネルは インテル FPGA SDK for OpenCL オフラインコンパイラーの単一サイクル浮動小数点アキュムレーターの機能を活用することができますオフラインコンパイラーはそれらのカーネルのインスタンスを探索しループで実行される累積をアキュムレーター構造へマッピングしようと試みます

オフラインコンパイラーは値を加算または減算するアキュムレーターをサポートしますこの機能を活用するにはオフラインコンパイラーがアキュムレーターを推論できるように累算を記述します

注意 bull アキュムレーターはArria 10 デバイスでのみ利用可能です

bull アキュムレーターはループの一部である必要があります

bull アキュムレーターは初期値の 0 を持つ必要があります

bull アキュムレーターを条件付きにすることはできません

次はオフラインコンパイラーによる正しいアキュムレーターの推論をもたらす記述例です

channel float4 RANDOM_STREAM

__kernel void acc_test(__global float a int k) Simplest example of an accumulator In this loop the accumulator acc is incremented by 5 int i float acc = 00f for (i = 0 i lt k i++) acc+=5 a[0] = acc

__kernel void acc_test2(__global float a int k) Extended example showing that an accumulator can be conditionally incremented The key here is to describe the increment as conditional not the accumulation itself int i float acc = 00f for (i = 0 i lt k i++) acc += ((i lt 30) 5 0) a[0] = acc

__kernel void acc_test3(__global float a int k) A more complex case where the accumulator is fed by a dot product int i float acc = 00f for (i = 0 i lt k i++ ) float4 v = read_channel_intel(RANDOM_STREAM) float x1 = vx float x2 = vy

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

78

float y1 = vz float y2 = vw acc += (x1y1+x2y2) a[0] = acc

__kernel void loader(__global float a int k) int i float4 my_val = 0 for(i = 0 i lt k i++) if ((i4) == 0) write_channel_intel(RANDOM_STREAM my_val) if ((i4) == 0) my_valx = a[i] if ((i4) == 1) my_valy = a[i] if ((i4) == 2) my_valz = a[i] if ((i4) == 3) my_valw = a[i]

5121 アキュムレーターを推論するためのプログラミング手法

単一サイクル浮動小数点アキュムレーター機能の活用はカーネルコードのアキュムレーターの記述を変更し効率を改善したりプログラミングの制約を回避したりすることで行うことができます

複数のループを使用するアキュムレーターの記述

複数のループを使用し一部のループを展開した状態でアキュムレーターを記述する場合を以下に示します

float acc = 00ffor (i = 0 i lt k i++) pragma unroll for(j=0j lt 16 j++) acc += (x[i+j]y[i+j])

この場合-fp-relaxedの インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションでカーネルをコンパイルし累積が公開されるようにオフラインコンパイラーが操作を再配置できるようにすることが重要です-fp-relaxedでカーネルをコンパイルしない場合アキュムレーターの構成は高いイニシエーションインターバル (II) をともなうことになりますイニシエーションインターバルは連続するループ反復の開始から開始までのサイクル数ですイニシエーションインターバルの値が大きいほどアキュムレーター構造体が次のループ反復を処理するまでの時間が長くなります

複数ループのアキュムレーターの記述変更

-fp-relaxedオフラインコンパイラーのコマンドオプションでアキュムレーターの記述をコンパイルできない場合はコードを書き換え累積を公開します

上記コード例の場合は次のように書き換えます

float acc = 00ffor (i = 0 i lt k i++) float my_dot = 00f pragma unroll for(j=0j lt 16 j++) my_dot += (x[i+j]y[i+j]) acc += my_dot

5 OpenCL カーネルの構築UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

79

変数またはゼロ以外の初期値を含むアキュムレーターの記述変更

ゼロ以外の値で始まるアキュムレーターの記述にオフセットを適用する場合を下に示します

float acc = array[0]for (i = 0 i lt k i++) acc += x[i]

アキュムレーターハードウェアは記述に変数またはゼロ以外の初期値をサポートしないため記述を書き換える必要があります

float acc = 00ffor (i = 0 i lt k i++) acc += x[i]acc += array[0]

上記のように記述を書き換えるとカーネルはループでアキュムレーターを使用できるようになりますその後のループ構造にはarray[0]のインクリメントが続きます

513 整数のプロモーション規則

intX_tのデータ型を使用する際に適用される整数のプロモーション規則はCC++の標準規則とは異なります以下の異なる規則を考慮しカーネルをデザインしてください

bull 両方のオペランドが標準の整数型 (charや shortなど) の場合整数は CC++標準に従ってプロモートされますつまり演算は32 ビット以上の 大オペランドのデータ型とサイズで実行されますこの式はより大きい方のデータ型で結果を返します

bull オペランドがどちらも intX_tデータ型の場合データ型が 32 ビットより小さい場合でも 大の intX_tデータ型で演算は実行されますこの式はそのデータ型で結果を返します

bull 式に標準データ型 1 つと intX_tデータ型 1 つが含まれる場合intX_tデータ型のプロモーション規則が適用されますこの式の型は常に intX_tデータ型になります例えば 大のデータ型が標準整数型の shortの場合結果で返されるデータ型は int16_tです

bull リテラルは CC++のデフォルトにおいて intデータ型のためキャストなしでリテラルを使用すると式の型は常に少なくとも 32 ビットになります例えば次のようなコードの場合比較は 32 ビットで行われます

int5_t apif (ap lt 4)

bull オペランドの符号が異なり符号なしの型が少なくとももう一方の型と同じサイズである場合演算は符号なしで実行されますそれ以外の場合は符号なしオペランドは符号付きの値に変換されます

例えば次のようなコードの場合-1 は 32 ビットの負の値 (0xffffffff) に拡張されuint3_tは 32 ビットの正の値 7 (0x00000007) となり等しくなりません

uint3_t x = 7if (x = -1) FAIL

5 OpenCL カーネルの構築UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

80

6 ホストアプリケーションの設計

インテルではホストに対する要件についてのガイドラインおよびホストアプリケーション構築における手順を提供しています該当する場合はOpenCL カーネルのホストアプリケーションを作成または変更する際にこれらのデザイン戦略を実行してください

ホストのプログラミング要件 (81 ページ)

グローバルメモリーの手動分割における OpenCL バッファーの割り当て (82 ページ)

カーネル実行中におけるプロファイルデータの収集 (86 ページ)

カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

構造パラメーター変換に向けたホストプログラムの変更 (91 ページ)

ホストアプリケーションの管理 (92 ページ)

SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て (102 ページ)

徐々に速度低下する OpenCL システムのデバッグ (104 ページ)

61 ホストのプログラミング要件

インテル FPGA SDK for OpenCL で使用するために OpenCL ホストアプリケーションをデザインする際はアプリケーションが次のホストプログラミング要件を満たしていることを確認ください

611 ホストマシンのメモリー要件

ホストアプリケーションを実行するマシンは複数のコンポーネントを同時にサポートするための十分なホストメモリーが必要です

ホストマシンは次のコンポーネントをサポートする必要があります

bull ホストアプリケーションおよびオペレーティングシステム

bull ホストアプリケーションのワーキングセット

bull 一度に割り当てることのできる OpenCL メモリーバッファーの 大量デバイス側の cl_memバッファーはすべてホストプロセスの対応するストレージエリアに関連付けられますしたがってホストメモリーに必要な容量はFPGA がサポートしている外部メモリーの量と同等になる可能性があります

612 ホストバイナリーの要件

ホストアプリケーションをコンパイルする際はx86-64 (64 ビット) または ARMreg 32-bit ARMV7-A for SoC のいずれかのアーキテクチャーをターゲットにしてください インテル FPGA SDK forOpenCL のホストランタイムはx86-32 (32 ビット) バイナリーをサポートしません

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

613 複数のホストスレッド

インテル FPGA SDK for OpenCL のホストライブラリーはスレッドセーフです

clSetKernelArg関数を除く OpenCL API はすべてスレッドセーフです

clSetKernelArgの同時呼び出しが異なる cl_kernelオブジェクトで実行される限り任意のホストスレッドから clSetKernelArgを呼び出しても再入可能な方法で呼び出しても安全です

関連情報マルチスレッドホストアプリケーション

614 順不同のコマンドキュー

OpenCL ホストランタイムのコマンドキューは順不同なコマンドの実行をサポートしません

615 カーネルを同時に実行するための複数のコマンドキューにおける要件

同じ OpenCL プログラムオブジェクトにあるカーネルを同時実行するには同時に実行する各カーネルに個別のコマンドをインスタンス化します

62 グローバルメモリーの手動分割における OpenCL バッファーの割り当て

グローバルメモリーバッファーを手動で分割するとバッファー間のメモリーアクセスを制御しメモリー帯域幅を 大化することができますバッファーの分割は同じメモリータイプのインターフェイス間または異なるメモリータイプのインターフェイス間で行うことが可能です

621 同じメモリータイプの複数のインターフェイスでのバッファーの分割

同じメモリータイプの複数のインターフェイスにおいてメモリーを分割する際はOpenCL カーネルコンパイル中のバーストインターリーブを 初に無効にする必要があります次にOpenCL バッファーを割り当てるメモリーバンクをホストアプリケーションに指定する必要があります

デフォルトで インテル FPGA SDK for OpenCL オフラインコンパイラーは各グローバルメモリータイプをバーストインターリーブ方式でコンフィグレーションしますバーストインターリーブ方式のコンフィグレーションは通常メモリーバンク間に 良のロードバランスをもたらしますただしインターリーブ領域以外へのメモリー分割がより効率的な場合もあります

次の図はバーストインターリーブでのメモリー分割とインターリーブ以外のメモリー分割における違いを表しています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

82

0x7FFF_FFFFAddress

0x7FFF_FC000x7FFF_FBFF

0x7FFF_F800

0x0000_0FFF

0x0000_0C000x0000_0BFF

0x0000_08000x0000_07FF

0x0000_04000x0000_03FF

0x0000_0000

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Bank 2

Bank 1

Address0x7FFF_FFFF

0x4000_00000x3FFF_FFFF

0x0000_0000

Burst-Interleaved Separate Partitions

使用可能なグローバルメモリータイプの一部またはすべてを手動で分割するには次の作業を実行します

1 OpenCL カーネルを -no-interleaving=ltglobal_memory_typegt フラグでコンパイルし指定されたメモリータイプのメモリーバンクを個別のアドレスでコンフィグレーションします

-no-interleaving=ltglobal_memory_typegt フラグの使用方法に関してはグローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) の章を参照ください

2 ホストアプリケーションに OpenCL バッファーを作成しCL_CHANNELフラグでバッファーをいずれかのバンクへ割り当てます

mdash CL_CHANNEL_1_INTELFPGAを指定しバッファーを使用可能な 下位メモリー領域に割り当てます

mdash CL_CHANNEL_2_INTELFPGAを指定しメモリーを 2 番目のバンクに割り当てます (利用可能な場合)

注意

それぞれのバッファーは単一メモリーバンクにのみ割り当ててくださいランタイムに 2 番目のバンクが利用できない場合メモリーは 1 番目のバンクに割り当てられますグローバルメモリーが利用できない場合はclCreateBuffer呼び出しは失敗しエラーメッセージCL_MEM_OBJECT_ALLOCATION_FAILUREが表示されます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

83

関連情報グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt) (115 ページ)

622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割

FPGA ボードのボードサポートパッケージでは異なるメモリーテクノロジー (DRAM や SRAM など) で構成されるグローバルメモリースペースを組み立てることが可能ですボードサポートパッケージは複数のインターフェイスで構成されるそのようなメモリーの 1 つをデフォルトのメモリーとして指定しますバッファーはすべてそこにあります

異種メモリーを使用するにはclファイルのコードを次のように変更します

1 次のいずれかの方法でFPGA ボードで使用可能なグローバルメモリータイプの名前を確認してください

mdash ボードメーカーの資料を参照する

mdash ボードのカスタムプラットフォームの board_specxmlファイルで名前を検索する各グローバルメモリータイプの名前はglobal_mem要素の name属性に割り当てられた一意の文字列です

2 特定のグローバルメモリータイプにバッファーを割り当てるようにホストに指示するにはbuffer_location(ltmemory_typegt) 属性を挿入しますここで ltmemory_typegtはボードメーカーより提供されているグローバルメモリータイプの名前です

__kernel void foo(__global __attribute__((buffer_location(DDR))) int x __global __attribute__((buffer_location(QDR))) int y)

buffer_location属性を指定しない場合ホストはバッファーをデフォルトのメモリータイプに自動的に割り当てますデフォルトのメモリータイプを確認するにはボードメーカーから提供されている資料を参照してくださいまたはカスタムプラットフォームの board_specxmlファイルで 初に定義されているメモリータイプもしくは属性 default=1が割り当てられたメモリータイプを検索します

インテルでは次のように buffer_location属性をプリプロセッサーマクロに定義し再利用を容易にすることを推奨しています

define QDR__global __attribute__((buffer_location(QDR))) define DDR__global __attribute__((buffer_location(DDR)))__kernel void foo (QDR uint data DDR uint lup) statements

注意

カーネル引数をデフォルト以外のメモリーに割り当てる場合 (上記コードであれば QDRuint dataおよび DDR uint lup)その引数を constantキーワードで宣言することはできませんさらにその引数から派生するポインターでアトミック操作を実行することはできません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

84

clCreateProgramWithBinary関数を使用し OpenCL ランタイムにカーネルをロードするとデフォルトでホストはバッファーをメインメモリーに割り当てますカーネルの呼び出し中にホストはカーネル引数にバインドされている異種メモリーバッファーをメインメモリーに自動的に再配置します

3 異種メモリーバッファーが 初にメインメモリーに割り当てられるのを防ぐにはclCreateBuffer関数を呼び出す際にCL_MEM_HETEROGENEOUS_INTELFPGAフラグを含めますまた clSetKernelArgを使用し cl_memバッファーを buffer_location属性を使用した引数にまずバインドした後にそのバッファーに対する読み取りまたは書き込みを実行してください次に例を示します

mem = clCreateBuffer(context flags|CL_MEM_HETEROGENEOUS_INTELFPGA memSize NULL amperrNum)

clSetKernelArg(kernel 0 sizeof(cl_mem) ampmem)clEnqueueWriteBuffer(queue mem CL_FALSE 0 N 0 NULL ampwrite_event)clEnqueueNDRangeKernel(queue kernel 1 NULL global_work_size NULL 0 NULL ampkernel_event)

例えば次の clCreateBuffer呼び出しはデフォルト以外のメモリーバンクの使用可能な下位メモリー領域にメモリーを割り当てます

mem = clCreateBuffer(context (CL_MEM_HETEROGENEOUS_INTELFPGA|CL_CHANNEL_1_INTELFPGA) memSize NULL amperrNum)

clCreateBuffer呼び出しはカーネル引数で指定した内容に基づきメモリーを特定のグローバルメモリータイプに割り当てますメモリータイプにあるメモリーオブジェクト (cl_mem)が異なるメモリーテクノロジーに対応するカーネル引数として設定されている場合ホストはカーネルをキューする際にそのメモリーオブジェクトを自動的に移動しますバッファーは複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

異種グローバルメモリーアクセスの 適化に関する詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドの異種メモリーバッファーとグローバルメモリーの手動分割の章を参照ください

関連情報bull グローバルメモリーの手動分割

bull 異種メモリーバッファー

623 ホストアプリケーションでのパイプオブジェクトの作成

カーネルに OpenCL パイプを実装するには インテル FPGA SDK for OpenCL 固有のパイプオブジェクトをホストアプリケーションに作成する必要があります

SDK 固有のパイプオブジェクトはOpenCL Specification version 20 で説明されているように真の OpenCL パイプオブジェクトではありませんこの実装は準拠したソリューションによるインテルFPGA 製品からの移行を可能にしますSDK 固有のパイプオブジェクトはメモリーオブジェクト(cl_mem) ですがホストはパイプ自体にメモリーを割り当てません

次の clCreatePipeホスト API はパイプオブジェクトを作成します

cl_mem clCreatePipe(cl_context context cl_mem_flags flags cl_uint pipe_packet_size cl_uint pipe_max_packets const cl_pipe_properties properties cl_int errcode_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

85

clCreatePipeホスト API 関数についての詳細はOpenCL Specification version 20 のSection 541 を参照ください

以下はclCreatePipeホスト API 関数の構文例です

cl_int statuscl_mem c0_pipe = clCreatePipe(context 0 sizeof(int) 1 NULL ampstatus)status = clSetKernelArg(kernel 1 sizeof(cl_mem) ampc0_pipe)

注意 SDK はランタイムの動的なチャネル割り当てをサポートしません SDK は一致する名前に基づきコンパイル中にパイプを静的にリンクします

関連情報OpenCL Specification version 20 (API)

63 カーネル実行中におけるプロファイルデータの収集

カーネルの実行がホストアプリケーションの完了後に終了する場合カーネルの実行中にプロファイルデータを収集するようFPGA に対し明示的に要求することができますほとんどのアプリケーションではカーネルの実行完了時にプロファイルデータを自動的にリードバックするデフォルトの動作で十分です

コンパイル中に OpenCL カーネルをプロファイリングするとprofilemonファイルが自動的に生成されますその後プロファイルデータはFPGA でカーネルの実行が完了した後に profilemonに書き込まれますただしカーネルの実行がホストアプリケーション終了後に完了した場合そのカーネル呼び出しのプロファイル情報はprofilemonファイルに存在しなくなりますこの場合プロファイル情報をカーネルの実行中に取得するようホストコードを修正することができます

重要 カーネルの実行中にプロファイルデータを収集するとカーネルのレイテンシーが増加しカーネルの実行にかなりのオーバーヘッドが追加される可能性があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

86

bull カーネルの実行中にプロファイルデータを収集するよう FPGA に要求するには次のホストライブラリー呼び出しを呼び出します

extern CL_API_ENTRY cl_int CL_API_CALL

clGetProfileInfoIntelFPGA(cl_event)

上記 cl_eventはカーネルのイベントですこのホストライブラリー呼び出しに渡すカーネルイベントはclEnqueueNDRangeKernel呼び出しに渡すものと同じである必要があります

重要

mdash clGetProfileInfoIntelFPGAの呼び出し前にカーネルの実行が完了した場合この関数はイベントエラーメッセージを返します

mdash clGetProfileInfoIntelFPGAおよびclGetProfileDataDeviceIntelFPGA関数呼び出しを使用しているホストプログラムにはCLcl_ext_intelfpgahヘッダーファイルを含む必要があります

注意

カーネルの実行中に clGetProfileInfoIntelFPGA関数を呼び出すとプロファイルカウンターが一時的に無効になり インテル FPGA Dynamic Profiler for OpenCL がFPGA からデータを収集できるようになりますそのためいくつかのプロファイル情報がこの中断中に失われますこの関数を非常に短い間隔で呼び出すとプロファイルデータがカーネルの実際のパフォーマンス動作を正確に反映しない可能性があります

次のホストコードを例に説明します

int main() clEnqueueNDRangeKernel(queue kernel NULL) clEnqueueNDRangeKernel(queue kernel NULL)

このホストアプリケーションはカーネルが 2 回起動した後に完了するという前提で動作しますカーネルの呼び出しごとに 1 組のプロファイルデータが生成されるためprofilemonファイルには合計 2 組のプロファイルデータが生成されますカーネルの実行中にプロファイルデータを収集するにはホストコードを次のように変更します

int main() clEnqueueNDRangeKernel(queue kernel ampevent)

Get the profile data before the kernel completes clGetProfileInfoIntelFPGA(event)

Wait until the kernel completes clFinish(queue)

clEnqueueNDRangeKernel(queue kernel NULL)

clGetProfileInfoIntelFPGAへの呼び出しによりprofilemonファイルに新しいエントリーが追加されます インテル FPGA Dynamic Profiler for OpenCL GUI はその後レポートにこのエントリーを解析します

インテル FPGA Dynamic Profiler for OpenCL についての詳細は次の章を参照ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

87

bull インテル FPGA SDK for OpenCL ベストプラクティスガイドのパフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング

関連情報bull パフォーマンスのボトルネックを特定するためのカーネルのプロファイリング

bull OpenCL カーネルのプロファイリング (140 ページ)

631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング

完了時にプロファイラーデータを自動的に生成するエンキューされたカーネルとは異なり (コンパイラーフラグが設定されている場合)自動実行カーネルは終了しませんしたがってclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しでカーネルをプロファイルするタイミングを明示的に指定する必要がありますプロファイラーデータはすべてprofilemonファイルへ出力されますホストライブラリー呼び出しで収集されるデータは自動実行のプロファイルデータのスナップショットになります

次はclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しのコード例です

cl_int clGetProfileDataDeviceIntelFPGA (cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret)

以下が詳細です

bull read_enqueue_kernelsパラメーターはエンキューされたカーネルをプロファイリングしますこのリリースにおいてこのパラメーターは無効です

bull read_auto_enqueuedパラメーターは自動実行カーネルをプロファイリングします

bull 以下は今後のリリースにおけるプレースホルダーパラメーターです

mdash clear_counters_after_readback

mdash param_value_size

mdash param_value

mdash param_value_size_ret

mdash errcode_ret

注意 このホストライブラリー呼び出しは自動実行カーネルのみをポートしていますread_enqueue_kernelsパラメーターに TRUEを入力できますがブール値は無視されますこれはエンキューされたカーネルがプロファイリングされないという意味ではありませんコンパイラーの profileフラグがエンキューされたカーネルを含むように設定されている場合通常通り実行の終わりにプロファイルデータはキャプチャーされます唯一の違いはclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しはエンキューされたカーネルに対し自動的に行われるプロファイリングとは別にエンキューされたカーネルをプロファイリングしないことです

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

88

clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは成功時にCL_SUCCESSを返しますそれ以外の場合は次のエラーのいずれかを返します

bull デバイスが有効なデバイスではない場合は CL_INVALID_DEVICE

bull プログラムが有効なプログラムではない場合は CL_INVALID_PROGRAM

注意 clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しは与えられたデバイスで与えられたプログラムのプログラミング操作をトリガーしませんホストライブラリー呼び出し時にプログラムがまだデバイスにプログラミングされていない場合ホストライブラリー呼び出しはCL_INVALID_PROGRAMエラーを返します

表 3 clGetProfileDataDeviceIntelFPGA ホストライブラリー呼び出しパラメーターの組み合わせ

read_auto_enqueued

エンキューされたカーネルのみをプロファイリング注意 実行が完了すると自動的にプロファイル情報を出力します

False

自動実行カーネルのみをプロファイリング True

エンキューされたカーネルと自動実行カーネルの両方をプロファイリング

True

632 プロファイルデータの取得

実行中のカーネルからのプロファイルデータの取得はリードバック動作中に一時停止します

注意 データ取得が一時停止してもカーネル自体はまだ実行していますしたがってリードバック動作中にカーネルデータは記録されません

データ取得の一時停止はすべてのカーネル間において完全には同期されませんカーネル間におけるプロファイルデータの取得停止のスキューはデバイスとの通信リンクドライバーのオーバーヘッドおよび通信バス上の輻輳によって異なりますカーネル間におけるプロファイルデータの正確な同期スナップショットに依存するべきではありません

633 複数の自動実行プロファイリング呼び出し

自動実行カーネルは継続的に実行されるためホストアプリケーションは複数のclGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを実行中の特定の時点または特定の時間範囲に含め自動実行カーネルをプロファイリングすることができますホストアプリケーションが clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しを呼び出すたびにプロファイルカウンターが読み取られゼロにリセットされますclGetProfileDataDeviceIntelFPGAを複数回呼び出すことでホストアプリケーションは時間範囲にわたり自動実行カーネルをプロファイリングできます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

89

図 -13 複数の自動実行プロファイリングのキャプチャーフロー

main() clEnqueueNDRangeKernel() system startsclGetProfileDataDeviceIntelFPGA () Time AclGetProfileDataDeviceIntelFPGA () Time BclFinish()

AR0

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 0

Counter 1

AR2 AR8

AR9

Kernel Pipeline Profiler_IP

LSU

EFI

Counter 18

Counter 19

Collect_Autorun_Profiling

CRA

profile_ctrl profile_data

Host

daisy_out

profile_shift

カウンター実行中

カウンターは無効

(~1000us)

カウンター読み取り(Time A) (Time B)

カウンターリセット

カーネルは実行中

カウンター実行中

カウンターは無効

(~1000us)

カウンター実行中

カーネルは実行中

カウンター読み取り カウンター

リセット

64 カスタムプラットフォーム固有の関数へのアクセス

カスタムプラットフォームで利用可能なユーザーがアクセスできる関数をオプションでアプリケーションに含めることができますただしホストアプリケーションを FPGA クライアントドライバー (FCD)にリンクするとそれらのカスタムプラットフォーム固有の関数を直接参照することはできません FCDとリンク中にカスタムプラットフォーム固有のユーザーがアクセス可能な関数を参照するにはホストアプリケーションに clGetBoardExtensionFunctionAddressIntelFPGA拡張を含めます

clGetBoardExtensionFunctionAddressIntelFPGA拡張はカスタムプラットフォームからユーザーがアクセス可能な関数へのポインターを取得する API を指定します

注意 Linux システムの場合clGetBoardExtensionFunctionAddressIntelFPGA関数はFCD の有無にかかわらず機能しますWindows システムの場合この関数は FCD と併用する場合にのみ機能しますカスタムプラットフォームにおいて FCD がサポートされているかはボードメーカーへお問い合わせください

拡張インターフェイスの定義は INTELFPGAOCLSDKROOThostincludeCLcl_exthファイルで確認できます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

90

bull カスタムプラットフォームでユーザーがアクセス可能な関数へのポインターを取得するにはホストアプリケーションで次の関数を呼び出します

void clGetBoardExtensionFunctionAddressIntelFPGA ( const char function_name cl_device_id device )

以下に詳細を説明します

function_name はカスタムプラットフォームのメーカーが提供するユーザーがアクセス可能な関数の名前を指します

また

device はclGetDeviceIDs関数によって返されるデバイス ID です

ユーザーがアクセス可能な関数を識別するとclGetBoardExtensionFunctionAddressIntelFPGA関数はユーザーがアクセス可能な関数へのポインターを返しますカスタムプラットフォームにその関数が存在しない場合clGetBoardExtensionFunctionAddressIntelFPGAは NULLを返します

注意

インストーラブルクライアントドライバー (ICD) を介しclGetBoardExtensionFunctionAddressIntelFPGA API にアクセスする際はICD 拡張 API の clGetExtensionFunctionAddressIntelFPGAが 初にclGetBoardExtensionFunctionAddressIntelFPGA API へのポインターを取得していることを確認してください

次のコード例はICD を介したカスタムプラットフォーム固有の関数へのアクセス方法を示しています

clGetBoardExtensionFunctionAddressIntelFPGA_fn clGetBoardExtensionFunctionAddressIntelFPGA = (clGetBoardExtensionFunctionAddressIntelFPGA_fn) clGetExtensionFunctionAddressForPlatform (platform clGetBoardExtensionFunctionAddressIntelFPGA) if (clGetBoardExtensionFunctionAddressIntelFPGA == NULL) printf (Failed to get clGetBoardExtensionFunctionAddressIntelFPGAn)

void board_extension_function_ptr = clGetBoardExtensionFunctionAddressIntelFPGA(function_namedevice_id)

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

65 構造パラメーター変換に向けたホストプログラムの変更

OpenCL カーネルにおいて構造パラメーターを定数へのポインター構造に変換する場合ホストアプリケーションを適宜変更する必要があります

ホストアプリケーションに次の変更を加えます

1 構造体のコンテンツを格納するための cl_memバッファーを割り当てます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

91

注意 異なる構造体の値を使用するカーネルごとに個別の cl_memバッファーが必要です

2 構造体のカーネル引数を構造体のコンテンツへのポインターではなく構造体のバッファーへのポインターで設定します

3 カーネルをキューする前に構造体のバッファーのコンテンツを設定します次のいずれかの手順を実行しカーネルが起動する前に構造体のバッファーが設定されるようにします

mdash カーネルキューと同じコマンドキューに構造体バッファーをキューします

mdash 個別のカーネルキューと構造体のバッファーキューをイベントと同期させます

4 アプリケーションが構造体バッファーを使用するカーネルを呼び出す必要がなくなった際にはcl_memバッファーを解放します

関連情報bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ)

bull ホストとカーネルにおける構造体データ型のデータレイアウトの一致 (73 ページ)

66 ホストアプリケーションの管理

インテル FPGA SDK for OpenCL にはホストアプリケーションのコンパイルとリンクに必要なフラグおよびライブラリーに関する情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

注意 ホストアプリケーションを SoC FPGA ボードにクロスコンパイルするにはユーティリティーコマンドに--armオプションを含めます

注意 Linux システムにおいてGNU Project Debugger (GDB) を使用しホストアプリケーションをデバッグする場合はホストアプリケーションを実行する前に次のコマンドを呼び出します

handle SIG44 nostop

このコマンドを呼び出していない場合GDB のデバッグプロセスは次のエラーメッセージとともに終了します

Program received signal SIG44 Real-time event 44

661 Makefile フラグメント例の表示 (example-makefile または makefile)

ホストランタイムライブラリーに対してホストアプリケーションをコンパイルおよびリンクするために インテル FPGA SDK for OpenCL で利用可能な Makefile フラグメント例を表示するにはexample-makefileまたは makefileユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

92

bull コマンドプロンプトで aocl example-makefile または aocl makefile ユーティリティーコマンドを呼び出しますソフトウェアは次のような出力を表示します

The following are example Makefile fragments for compiling and linkinga host program against the host runtime libraries included with the Intel FPGA SDK for OpenCL

Example GNU makefile on Linux with GCC toolchain

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_prog host_progo g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile on Windows with Microsoft Visual C++ command line compiler

AOCL_COMPILE_CONFIG=$(shell aocl compile-config) AOCL_LINK_CONFIG=$(shell aocl link-config)

host_progexe host_progobj link -nologo OUThost_progexe host_progobj $(AOCL_LINK_CONFIG)

host_progobj host_progcpp cl MD Fohost_progobj -c host_progcpp $(AOCL_COMPILE_CONFIG)

Example GNU makefile cross-compiling to ARM SoC from Linux or Windows withLinaro GCC cross-compiler toolchain

CROSS-COMPILER=arm-linux-gnueabihf- AOCL_COMPILE_CONFIG=$(shell aocl compile-config --arm) AOCL_LINK_CONFIG=$(shell aocl link-config --arm)

host_prog host_progo $(CROSS-COMPILER)g++ -o host_prog host_progo $(AOCL_LINK_CONFIG)

host_progo host_progcpp $(CROSS-COMPILER)g++ -c host_progcpp $(AOCL_COMPILE_CONFIG)

662 ホストアプリケーションのコンパイルとリンク

OpenCL ホストアプリケーションは標準 OpenCL ラインタイム API を使用しデバイスのコンフィグレーションデータのバッファーカーネルの起動および同期を管理しますまたファイル IOアクセラレーターデバイスで実行しないソースコードの一部などの機能も含んでいます インテル FPGA SDKfor OpenCL にはOpenCL API を記述している C ヘッダーファイルホストアプリケーションとリンクする必要があるボード固有の MMD ライブラリーおよびホストランタイムライブラリーの情報を取得するために呼び出すことができるユーティリティーコマンドが含まれています

重要 Windows システムの場合MDフラグを追加しホストランタイムライブラリーを Microsoft CRuntime ライブラリーのマルチスレッド DLL (ダイナミックリンクライブラリー) バージョンにリンクする必要がありますまたホストアプリケーションをMDコンパイルフラグでコンパイルするかNODEFAULTLIBリンカーオプションでランタイムライブラリーの選択を上書きする必要があります

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

93

注意 ホストアプリケーションを実行する際は INTELFPGAOCLSDKROOThostltOS_platformgtbinフォルダーへのパスをライブラリー検索パスに含めます

ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config) (95 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示 (ldflags) (96ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs) (96 ページ)

OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-configまたは linkflags) (96 ページ)

6621 ホストアプリケーションと Khronos ICD Loader Library のリンク

インテル FPGA SDK for OpenCL はKhronos Group の OpenCL ICD 拡張をサポートしていますOpenCL ICD 拡張機能を使用するとシステムに複数の OpenCL 実装を行うことができますOpenCL ICD Loader Library ではインストールされているプラットフォームのリストを選択し選択した OpenCL の実装に特化した OpenCL API 呼び出しを実行できます

SDK のホストランタイムライブラリーに加えインテルはOpenCL Specification version 10 およびOpenCL Specification versions 111220 に実装されている API をサポートする ICDLoader Library のバージョンを提供します他のメーカーが提供する ICD ライブラリーを使用する場合該当メーカーが発行している資料を参照しICD ライブラリーのリンク方法を確認ください

OpenCL ホストアプリケーションを ICD Loader Library にリンクする前にボード MMD ライブラリーをロードするための FCD を設定する必要がありますFCD をまだ設定していない場合FPGA ボードの管理 (20 ページ) にて詳細を確認ください

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

94

ICD と FCD がどちらも正しくセットアップされていることを確認してくださいこれは aocldiagnose ndashicd-only ユーティリティーを使用し確認することができますこのユーティリティーは対応する ICD または FCD を作成しライブラリーがシステムにレジスターされているかどうかを確認します

bull aocl diagnoseユーティリティーの出力に ICD diagnostics PASSEDが表示されるとホストアプリケーションを作成する際にホストアプリケーションは自動的に ICD LoaderLibrary に接続します

bull aocl diagnoseユーティリティーが ICD を検出しなかった場合次の手順で ICD の設定を確認してください

mdash Windows システムにおいてはregeditを管理者権限で開きWindows レジストリーキーの HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors に移動しますName の値は altera_icddllになりますこの動的ライブラリーファイルは ltINTELFPGAOCLSDKROOTgthostwindows64binにありますType はDWORD でありData は 00000000 になりますレジストリーキーは次の例ようになります

HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]alteracl_icddll=dword00000000

mdash Linux システムにおいてはetcOpenCLvendorsAlteraicdファイルがシステム内に存在しlibalteraclsoのテキストが含まれていることを確認してください

bull aocl diagnoseユーティリティーが FCD を検出しなかった場合次の手順で FCD の設定を確認してください

mdash Windows システムにおいてはHKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards レジストリーキーのライブラリーですべてのユーザーのインストールが選択されていることを確認してくださいもしくは HKEY_CURRENT_USERSOFTWAREIntelOpenCLBoards レジストリーキーを確認してくださいNameの値は ltpath_to_the_mmd_librarygt になりData は 0 に設定された DWORDですレジストリーキーは次の例のようになります

[HKEY_LOCAL_MACHINESOFTWAREIntelOpenCLBoards]cboard_vendor amy_board_mmddll=dword00000000

mdash Linux システムの場合はoptIntelOpenCLBoardsmy_boardfcdファイルがシステムに存在しメーカー固有のライブラリー名が含まれていることを確認してください(databoard_vendor_alibmy_board_mmdsoなど)

注意

bull ボードメーカーが複数のライブラリーを提供している場合それらが特定の順序になっているかを再度確認してくださいライブラリーをロードする正しい順序に関してはボードメーカーにお問い合わせくださいライブラリーはロードする順序通りにレジストリーに並べる必要があります

bull インテル Arria 10 SoC ボードにおいてカスタムプラットフォームに SD フラッシュカードイメージをビルドする際はlibalteraclsoのテキストを含むAlteraicdファイルを作成くださいAlteraicdファイルをカスタムプラットフォームのetcOpenCLvendorsディレクトリーに保存します詳細はBuilding the Software and SD Card Image for the Intel Arria 10 SoCDevelopment Kit Reference Platform を参照ください

6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)

ホストアプリケーションのコンパイルに必要なフラグのリストを表示するにはcompile-configユーティリティーコマンドを呼び出します

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

95

1 コマンドプロンプトで aocl compile-config ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL API ヘッダーファイルが存在するフォルダーまたはディレクトリーへのパスを表示します例えば

bull Windows システムの場合パスは-IINTELFPGAOCLSDKROOThostincludeになります

bull Linux システムの場合パスは-I$INTELFPGAOCLSDKROOThostincludeになります

この INTELFPGAOCLSDKROOT はソフトウェアのインストール位置を指します

2 このパスをC プリプロセッサーに追加します

注意 INTELFPGAOCLSDKROOThostincludeCLフォルダーまたはディレクトリーにあるopenclh OpenCL ヘッダーファイルをホストソースに含めます

6623 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表示(ldflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なパスを表示するにはldflagsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldflags ユーティリティーコマンドを呼び出しますソフトウェアはOpenCL プラットフォームとランタイム API を提供する OpenCL ホストランタイムライブラリーとホストアプリケーションをリンクするためのパスを表示しますOpenCL ホストランタイムライブラリーは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあります

6624 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示 (ldlibs)

ホストアプリケーションをリンクするために必要な OpenCL ホストランタイムライブラリー名およびMMD ライブラリー名を表示するにはldlibsユーティリティーコマンドを呼び出します

bull コマンドプロンプトで aocl ldlibs ユーティリティーコマンドを呼び出します

ソフトウェアは INTELFPGAOCLSDKROOThostltOS_platformgtlibディレクトリーにあるホストランタイムライブラリーのリストを表示しますまたカスタムプラットフォームのltboard_family_namegtltOS_platformgtlibディレクトリー にあるカスタムプラットフォーム固有の MMD ライブラリーのリストも表示します

注意

FCD が正しく設定されているとソフトウェアは MMD ライブラリーのリストを表示しません

mdash Windows システムの場合出力は OpenCLlibになります

mdash Linux システムの場合出力は-lOpenCLになります

6625 OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示(link-config または linkflags)

ホストアプリケーションをOpenCL ホストランタイムライブラリーおよび MMD ライブラリーにリンクするために必要なフラグの一覧を表示するにはlink-configまたは linkflagsユーティリティーコマンドを呼び出します

このユーティリティーコマンドはldflagsと ldlibsユーティリティーコマンドの機能を兼ね備えています

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

96

bull コマンドプロンプトで aocl link-config または aocl linkflags コマンドを呼び出します

mdash Windows システムの場合出力はlibpathINTELFPGAOCLSDKROOThostwindows64lib OpenCLlibになります

mdash Linux システムの場合出力は-L$INTELFPGAOCLSDKROOThost[linux64|arm32]lib -lOpenCLになります

663 OpenCL ICD 拡張 API の使用

ICD を使用する際にOpenCL Specification に正式に記載されていない OpenCL ホスト API 関数を呼び出す場合はclGetExtensionFunctionAddress関数を 初に呼び出しそのホストAPI 関数への関数ポインターを取得後その関数ポインターを使用しホスト API 関数を呼び出す必要がありますこれは関数名に IntelFPGAを含む非標準の呼び出しすべてに適用されます

次のコード例を参照ください

extern CL_API_ENTRY cl_int CL_API_CALLclGetProfileDataDeviceIntelFPGA( cl_device_id device_id cl_program program cl_bool read_enqueue_kernels cl_bool read_auto_enqueued cl_bool clear_counters_after_readback size_t param_value_size void param_value size_t param_value_size_ret cl_int errcode_ret )

以下の関数呼び出しを

cl_int status = clGetProfileDataDeviceIntelFPGA (device program false true false 0 NULL NULL NULL)

以下の構文を使用するコードと置き換え関数ポインターの定義およびロードを行います

typedef cl_int (clGetProfileDataDevice_fn) (cl_device_id cl_program cl_bool cl_bool cl_bool size_t void size_t cl_int )clGetProfileDataDevice_fn get_profile_data_ptr = (clGetProfileDataDevice_fn) clGetExtensionFunctionAddressForPlatform (clGetProfileDataDeviceIntelFPGA)

その後関数呼び出しとして関数ポインターを使用します

cl_int status = (get_profile_data_ptr) (device program false true false 0 NULL NULL NULL)

664 ホストを経由した FPGA のプログラミング

インテル FPGA SDK for OpenCL オフラインコンパイラーはホストアプリケーションから独立してカーネルをコンパイルするオフラインコンパイラーです カーネルを OpenCL ランタイムにロードするにはclCreateProgramWithBinary関数をホストアプリケーションに含めます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

97

注意 ホストシステムが複数のプロセッサーで構成されている場合FPGA には一度に 1 つのプロセッサーしかアクセスできません例えば2 つのプロセッサーに対応する 2 つのホストアプリケーションが同じFPGA にカーネルを同時に起動しようとしているとします2 番目のホストアプリケーションはデバイスがビジーであることを示すエラーメッセージを受け取ります2 番目のホストアプリケーションは1番目のホストアプリケーションが OpenCL のコンテキストを解放するまで実行できません

1 オフラインコンパイラーで OpenCL カーネルをコンパイルしaocxファイルを作成します

2 ホストアプリケーションに clCreateProgramWithBinary関数を含めaocxファイルから cl_program OpenCL プログラムオブジェクトを作成します

3 ホストアプリケーションに clBuildProgram関数を含め指定したデバイスで実行可能なプログラムファイルを作成します

以下はclCreateProgramWithBinaryを使用し FPGA デバイスをプログラムするホストコード例です

size_t lengths[1]unsigned char binaries[1] =NULLcl_int status[1]cl_int errorcl_program programconst char options[] =

FILE fp = fopen(programaocxrb)fseek(fp0SEEK_END)lengths[0] = ftell(fp)binaries[0] = (unsigned char)malloc(sizeof(unsigned char)lengths[0])rewind(fp)fread(binaries[0]lengths[0]1fp)fclose(fp)

program = clCreateProgramWithBinary(context 1 device_list lengths (const unsigned char )binaries status amperror)clBuildProgram(program1device_listoptionsNULLNULL)

clBuildProgram関数が正常に実行されるとCL_SUCCESSが返されます

4 clCreateKernelsInProgramまたは clCreateKernel関数を使用しプログラム実行可能ファイルからカーネルオブジェクトを作成します

5 カーネルを実行するための関数を含めスケジュールされたカーネルを FPGA で実行するようホストランタイムに指示します

mdash NDRange カーネルを実行するためのコマンドをエンキューするにはclEnqueueNDRangeKernelを使用します

mdash 単一ワークアイテムのカーネルをエンキューするにはclEnqueueTaskを使用します

注意

インテルでは使用されていないイベントオブジェクトを解放することを推奨していますSDK は明示的な指示があるまでイベントオブジェクトを解放せずに保持し続けます使用していないイベントオブジェクトを保持し続けると不必要にメモリーが消費されます

イベントオブジェクトの解放にはclReleaseEvent関数を呼び出します

複数の FPGA のプログラムをメモリーにロードすることができますホストはそれらを使用し必要に応じて FPGA を再プログラムします

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

98

OpenCL ホストランタイムの API 呼び出しに関してはOpenCL Specification version 10 を参照ください

関連情報OpenCL Specification version 10

6641 複数の FPGA デバイスのプログラミング

システムに複数の FPGA デバイスをインストールする場合ホストコードを変更し特定の FPGA デバイスをプログラムするようホストランタイムに指示できます

重要 ホストアプリケーションを FCD にリンクすると異なるカスタムプラットフォームから複数の FPGA デバイスをターゲットにすることができますただし161 よりも前のバージョンの SDK と互換性のあるカスタムプラットフォームにおいてはこの機能に対するサポートが制限されています

次のように 大 128 の FPGA デバイスをシステムに提示できます

bull それぞれが単一の FPGA で構成されている複数の FPGA アクセラレーターボード

bull PCIe スイッチを介しホストシステムに接続する単一アクセラレーターボード上の複数の FPGA

bull 上記の組み合わせ

ホストランタイムはそれぞれの FPGA デバイスすべてにカーネルをロードすることができますまたFPGA デバイスは並列に動作できます

関連情報カスタムプラットフォーム固有の関数へのアクセス (90 ページ)

66411 OpenCL FPGA デバイスの診断

ホストはシステムにインストールされている OpenCL FPGA のデバイス数を特定する必要があります

1 ご自身のマシンにインストールされた FPGA デバイスのリストを照会するには aocldiagnose コマンドを呼び出します

2 ホストアプリケーションに次のコード行を追加しホストに Open CL FPGA のデバイス数を特定させます

Get the platformciErrNum = clGetPlatformID(ampcpPlatform)

Get the devicesciErrNum = clGetDeviceIDs(cpPlatform CL_DEVICE_TYPE_ALL 0 NULL ampciDeviceCount)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) が含まれます

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

99

関連情報FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)

66412 デバイス情報の照会

OpenCL FPGA デバイスの情報を照会するようホストに指示することができます

bull システムにインストールされている OpenCL FPGA デバイスのリストを出力するようホストに指示するには次のコード行をホストアプリケーションに追加します

char buf[1024]for (unsigned i = 0 i lt ciDeviceCount i++) clGetDeviceInfo(cdDevices[i] CL_DEVICE_NAME 1023 buf 0) printf(Device d sn i buf)

デバイス情報を照会するとホストは次のように FPGA デバイスの一覧を表示します Device ltNgtltboard_namegt ltname_of_FPGA_boardgt

以下が詳細になります

bull ltNgt はデバイスの番号です

bull ltboard_namegt はaocコマンドを呼び出す際に FPGA デバイスをターゲットにするボードの指定です

bull ltname_of_FPGA_boardgt はFPGA ボードに公示されている名前です

例えばシステムに同一の FPGA ボードが 2 つある場合ホストは次のような出力を生成します

Device 0 board_1 Stratix V FPGA BoardDevice 1 board_1 Stratix V FPGA Board

注意 clGetDeviceInfo関数は aoc -list-boards コマンドの呼び出し時にインテルFPGA SDK for OpenCL オフラインコンパイラーが画面上に表示するボードタイプを返します(board_1など)アクセラレーターボードに FPGA が複数含まれている場合各デバイスは「ボード」として扱われ一意の名前が付けられます

関連情報利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boards および-list-board-packages) (18 ページ)

66413 複数の 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 Stringunsigned char load_file(const char filename size_t size_ret)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

100

FILE fp = fopen(aocx_namerb) fseek(fp0SEEK_END) size_t len = ftell(fp) char result = (unsigned char)malloc(sizeof(unsigned char)len) rewind(fp) fread(resultlen1fp) fclose(fp) size_ret = len return result

Create a Program that is compiled for the devices in the device_listcl_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 devicesn aocx_name num_devices) const unsigned char binaries = (const unsigned char)malloc(num_devicessizeof(unsigned char)) size_t lengths=(size_t)malloc(num_devicessizeof(size_t)) cl_int err for(cl_uint i=0 iltnum_devices i++) binaries[i] = load_file(aocx_nameamplengths[i]) if (binaries[i]) printf(couldnt load sn aocx_name) exit(-1)

cl_program p = clCreateProgramWithBinary(context num_devices device_list lengths binaries NULL amperr) free(lengths) free(binaries) if (err = CL_SUCCESS) printf(Program Create Errorn) return p

main program

main () Normal OpenCL setup program = createMultiDeviceProgram(context device_list num_devices programaocx)clBuildProgram(programnum_devicesdevice_listoptionsNULLNULL)

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

101

665 ランタイム環境の終了とエラー回復

ホストアプリケーションが予期せず終了した場合ランタイム環境を再起動しFPGA を再プログラムする必要があります

ランタイム環境はホストアプリケーションの一部としてコンパイルされるライブラリーですホストアプリケーションが終了するとランタイム環境もまた実行する追跡アクティビティーとともに終了しますホストアプリケーションを再起動すると新しいランタイム環境および関連する追跡アクティビティーが再度初期化されます初期化関数はカーネルのハードウェア状態をリセットします

同様にホストアプリケーションが予期せず終了した場合特定のハードウェア (PCIe ハード IP など)のコンフィグレーションが不完全に終わりますこれらのハードウェアのコンフィグレーションを復元するためにホストは FPGA を再プログラムする必要があります

カスタマイズされたハードウェアブロックを実装するカスタムプラットフォームを使用している場合ホストアプリケーションを再起動しそれらのブロックをリセットすることでデザインに影響を与える可能性があることに注意してください

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すと利用可能なすべてのデバイスに対してカーネルとチャネルはすべてリセットされます

bull ホストアプリケーションが clGetPlatformIDs関数を呼び出すとデバイスのリセット時にFIFO バッファーとチャネルがリセットされます

bull ホストアプリケーションはclCreateBufferおよび clEnqueueWriteBuffer関数呼び出しを介しメモリーバッファーを初期化します新しいホスト実行において前回のホスト実行時のバッファーの内容へはアクセスすることができません

67 SoC をターゲットとする OpenCL カーネルへの共有メモリーの割り当て

インテルでは インテル SoC で動作する OpenCL カーネルはFPGA DDR メモリーではなく共有メモリーにアクセスすることを推奨していますFPGA DDR メモリーには非常に高い帯域幅でカーネルがアクセス可能ですただしARM CPU から FPGA DDR メモリーへの読み出しおよび書き込み動作はダイレクトメモリーアクセス (DMA) を使用していないため非常に低速ですFPGA DDR メモリーはテスト目的でカーネル間または単一のカーネル内で一時データを渡すためだけに予約ください

注意 bull カーネル間の共有バッファーは揮発性としてマークしあるカーネルによるバッファーの変更が他のカーネルも認識できるようにしてください

bull 共有メモリーにアクセスするにはホストコードの変更のみが必要ですカーネルコードの変更は必要ありません

bull ライブラリー関数 mallocまたは new演算子で物理的に共有されたメモリーを割り当てることはできませんまたCL_MEM_USE_HOST_PTRフラグは共有メモリーでは機能しません

DDR メモリーでは共有メモリーは物理的に連続している必要がありますFPGA はSG-DMA コントローラーコアなしでは実質的に連続したメモリーを消費することができませんmalloc関数および new演算子は実質的に連続したメモリーへアクセスするためのものです

bull 共有メモリーの CPU キャッシュは無効になっています

bull 共有メモリーを使用する際はデータのコピー 1 つがホストとカーネルの両方で使用されますこのメモリーを使用するとOpenCL メモリーの呼び出しはバッファー読み取りバッファー書き込みマッピングおよびアンマッピングに対しゼロコピー転送で実行されます

ARM CPU と FPGA は共有メモリーに同時にアクセスできますclEnqueueReadBufferおよびclEnqueueWriteBuffer呼び出しをホストコードに含めFPGA または CPU にデータを認識させる必要はありません

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

102

bull 共有メモリーの割り当てとアクセスには次の例のようなホストコードを構築します

cl_mem src = clCreateBuffer(hellip CL_MEM_ALLOC_HOST_PTR size hellip)int src_ptr = (int)clEnqueueMapBuffer (hellip src size hellip)src_ptr = input_value host writes to ptr directlyclSetKernelArg (hellip src)clEnqueueNDRangeKernel(hellip)clFinish()printf (ldquoResult = dnrdquo dst_ptr) result is available immediatelyclEnqueueUnmapMemObject(hellip src src_ptr hellip)clReleaseMemObject(src) actually frees physical memory

CONFIG_CMA_SIZE_MBYTESカーネルコンフィグレーションオプションを含め割り当てに有効な共有メモリーの 大総量を制御することができます実際には割り当てられた共有メモリーの総量はCONFIG_CMA_SIZE_MBYTESの値よりも小さくなります

重要

1 ターゲットボードに複数の DDR メモリーバンクがある場合clCreateBuffer( CL_MEM_READ_WRITE )関数はメモリーを非共有 DDR メモリーバンクに割り当てますただしFPGA が共有メモリーである単一DDR バンクへアクセスできる場合clCreateBuffer(CL_MEM_READ_WRITE ) はCL_MEM_ALLOC_HOST_PTRフラグを使用するのと同様にメモリーを共有メモリーに割り当てます

2 clCreateBuffer( CL_MEM_ALLOC_HOST_PTR size )関数で要求する共有メモリーはLinux OpenCL カーネルドライバーに割り当てられLinuxカーネルの連続したメモリー割り当て (CMA) 機能に依存しますCMA を有効にしコンフィグレーションする方法に関してはIntel FPGA SDK for OpenCL Intel Arria 10SoC Development Kit Reference Platform Porting Guideの Recompiling theLinux Kernel for the Intel Arria 10 SoC Development Kit および Compilingand Installing the OpenCL Linux Kernel Driverの章を参照ください

bull 共有ハードプロセッサーシステム (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 に共有メモリーとして割り当てます

bull ホストがコンスタントメモリーを共有 HPS DDR システムに割り当てカーネル実行後にそれを変更すると変更が有効にならない可能性がありますその結果続くカーネル実行に古いデータが使用される可能性がありますカーネルの実行に古いコンスタントメモリーが使用されないようにするため次のいずれかを実行してください

a コンスタントメモリーの初期化後はそれを変更しない

b 複数の__constantデータセットが必要な場合複数のコンスタントメモリーバッファーを作成する

c 可能であればアクセラレーターボードの FPGA DDR にコンスタントメモリーを割り当てる

関連情報bull Recompiling the Linux Kernel for the Intel Arria 10 SoC Development Kit

bull Compiling and Installing the OpenCL Linux Kernel Driver

6 ホストアプリケーションの設計UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

103

68 徐々に速度低下する OpenCL システムのデバッグ

ホストアプリケーションのループがイベントを解放しないまま作成を続けるとOpenCL システムが実行中に徐々に遅くなることがありますこの速度低下を緩和するにはホストアプリケーションがスケジューリングや時間のプロファイリングに不要になった cl_eventオブジェクトを解放する必要があります

OpenCL システムに多数の不要なイベントが存在するために速度低下が発生しているかどうかを確認するにはコンテキストのコールバック警告またはエラーを出力するコンテキストコールバック関数を次のコード例に示すように定義します

void oclContextCallback (const char errinfo const void size_t void ) printf (Context callback sn errinfo)int main() hellip Create the context context = clCreateContext (NULL num_devices device ampoclContextCallback NULL ampstatus) hellip

システムで発生しているイベント数がイベントオブジェクトのしきい値制限である 1000 を超えるとコールバック関数は次の警告メッセージを出力します

[Runtime Warning] Too many event objects in the host This causes deterioration in runtime performance

6 ホストアプリケーションの設計UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

104

7 OpenCL カーネルのコンパイル

インテル FPGA SDK for OpenCL はカーネルのコンパイルプロセスのカスタマイズを可能にするコンパイラーのオプション一覧を提供します インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドはaocコマンドコンパイラーのオプションと設定カーネルファイル名から構成されますaocコマンドを呼び出し特定の FPGA ボードをターゲットにしたりレポートを生成したり 適化に向けた手法を実装したりするようコンパイラーに指示することができます

OpenCL カーネルをコンパイルする前に QUARTUS_ROOTDIR_OVERRIDE 環境変数が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアを指定していることを確認してください

この環境変数の設定が正しくない場合 インテル FPGA SDK for OpenCL スタートガイド の インテル FPGA SDK for OpenCL ユーザー環境変数の設定 の章に記載されている手順に基づき設定を変更してください

CompilingEncryptedSource

aocコマンドでは提供されている暗号化されたclファイルをコンパイルする際にその暗号化されたファイルのみをコンパイルすることが可能です暗号化された複数のclファイルを aocコマンドで同時にコンパイルすることはできませんご自身で暗号化したカーネルソースファイルをコンパイルすることはできません

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル

OpenCL カーネルのコンパイルおよびハードウェアのコンフィグレーションファイル (aocxファイル) の作成は1 ステップで行うことができます

インテルでは次のような状況においてこの 1 ステップコンパイル手法を使用することを推奨しています

bull インテル FPGA SDK for OpenCL デザインフローでカーネルを 適化しFPGA に展開するaocxファイルの作成準備が整っている場合

bull 適化を必要としない単純なカーネルが 1 つ以上ある場合

カーネルのコンパイルおよびaocxファイルの生成を 1 ステップで行うには aocltyour_kernel_filename1gtcl [ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

インテル FPGA SDK for OpenCL オフラインコンパイラーはclファイルを一時ファイルにグループ化しますその後このファイルを使用しaocxファイルを生成します

注意 aocコマンドを実行しaocoファイル ( aoc ltyour_kernel_filenamegtaoco) をコンパイルする場合オフラインコンパイラーはaocrファイルとaocxファイルをどちらも生成します

72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネルのコンパイルおよび OpenCL パーサーの出力の生成を行うには-cオプションを aocコマンドに含めます

注意 -cフラグはインクリメンタルコンパイルフローではサポートされていません

bull コマンドプロンプトで aoc -c ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったものでオプションで ltyour_kernel_filename1gtclに加えコンパイル可能です

aocコマンドを-cフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを生成します

mdash 各clカーネルソースファイルのaocoファイルオフラインコンパイラーはaocoファイルを数秒から数分で作成します

73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)

インテル FPGA SDK for OpenCL オフラインコンパイラーでハードウェアのコンフィグレーションファイルを作成することなく OpenCL カーネル (cl) をコンパイルし各カーネルに向けたaocoオブジェクトファイルを生成後それらをリンクしaocrファイルを作成するには-rtlオプションをaocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

106

bull 1 つもしくは複数のカーネルソースファイルをコンパイルするにはコマンドプロンプトで aoc-rtl ltyour_kernel_filename1gtcl[ltyour_kernel_filename2gtcl ]コマンドを呼び出します

この [ ltyour_kernel_filename2gtcl ] はカーネルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtclに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーはカーネルをコンパイルし次のファイルとディレクトリーを作成します

mdash 各clカーネルソースファイルのaocoファイルその後オフラインコンパイラーはそれらをリンクしaocrファイルを生成しますaocoファイルまたはaocrファイルの生成は数秒から数分で行われます

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

bull 1 つ以上のaocoオブジェクトファイルをコンパイルするには aoc -rtlltyour_kernel_filenamegtaoco [ltyour_kernel_filename2gtaoco ]コマンドをコマンドプロンプトで呼び出します

この [ ltyour_kernel_filename2gtaoco ] はオブジェクトファイルのファイル名をスペースで区切ったもので ltyour_kernel_filename1gtaocoに加えオプションでコンパイル可能です

aocコマンドを-rtlフラグとともに呼び出すとオフラインコンパイラーは次のファイルとディレクトリーを作成します

mdash オフラインコンパイラーはすべてのaocoファイルをリンクしaocrファイルを生成します

mdash ltyour_kernel_filenamegt フォルダーまたはサブディレクトリーこれにはFPGA のプログラミングに必要なハードウェアコンフィグレーションファイルを構築するために SDKが使用する中間ファイルが含まれます

74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)

インテル FPGA SDK for OpenCL オフラインコンパイラーがカーネルのコンパイル中にヘッダーファイルを検索するディレクトリーリストにディレクトリーを追加するには -I=ltdirectorygt オプションを aocコマンドに含めます

ヘッダーファイルがカーネルと同じディレクトリーにある場合は -I=ltdirectorygt オプションをaocコマンドに含める必要はありませんオフラインコンパイラーは現在のフォルダーまたはディレクトリーでヘッダーファイルを自動的に検索します

bull コマンドプロンプトで aoc -I=ltdirectorygt ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

107

注意 Windows システムの場合インクルードパスの末尾にスラッシュが含まれていないことを確認してくださいオフラインコンパイラーは末尾のスラッシュ () またはバックスラッシュ () を不正と認識します

次のような方法で aocコマンドを呼び出すとオフラインコンパイラーはエラーメッセージを生成します

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

インクルードパスの正しい指定方法は以下のようになります

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

または

aoc -I=ltdrivegtltfoldergtltsubfoldergt ltyour_kernel_filenamegtcl

75 インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)

aocrファイル名またはaocxファイル名を指定するには -o ltfilenamegt オプションをaocコマンドに含めます

bull 複数ステップでのコンパイルフローを実行する場合は出力ファイル名を次のように指定します

a 中間コンパイルの段階でオフラインコンパイラーが作成するaocoファイルの名前を指定するには aoc -rtl -o ltyour_object_filenamegtaocr ltyourkernel_filenamegtclコマンドを呼び出します

b 終コンパイルの段階でオフラインコンパイラーが作成するaocxファイルの名前を指定するには aoc -o ltyour_executable_filenamegtaocxltyour_object_filenamegtaocrコマンドを呼び出します

bull 1 ステップでのコンパイルフローを実行する場合は aoc -oltyour_executable_filenamegtaocx ltyour_kernel_filenamegtclコマンドを呼び出しaocxファイル名を指定します

76 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)

特定の FPGA ボードに対し OpenCL カーネルをコンパイルするには -board=ltboard_namegtオプションを aocコマンドに含めます

警告 -rtlフラグをともなう中間コンパイル中にkernel1clファイルをボード X (-board=X) にkernel2clファイルをボード Y (-board=Y) にコンパイルすると インテル FPGA SDK forOpenCL オフラインコンパイラーは aoc -rtl kernel1aoco kernel2aocoコマンドを実行した際にエラーメッセージを発行し終了します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

108

-board=ltboard_namegt オプションを aocコマンドに含めてカーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはプリプロセッサーマクロAOCL_BOARD_ltboard_namegt を 1 に定義しますこれによりデバイスに 適化されたコードをカーネルにコンパイルすることができます

bull カスタムプラットフォームで利用可能な FPGA ボードの名前を取得するには aoc -list-boards コマンドを呼び出します

オフラインコンパイラーは以下のような出力を生成します

Board ListFPGA_board_1

この FPGA_board_1はltboard_namegt です

特定のカスタムプラットフォームの利用可能な FPGA ボードをすべて一覧表示することも可能です-board-package=ltcustom_platform_pathgt オプションを aocコマンドに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc ndashboard-package=ltcustom_platform_pathgt -list-boards=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーは特定のカスタムプラットフォームで利用可能なボードの一覧を表示します

bull OpenCL カーネルを FPGA_board_1 にコンパイルするには aoc-board=FPGA_board_1 ltyour_kernel_filenamegtclコマンドを呼び出しますオフラインコンパイラーはプリプロセッサーマクロ AOCL_BOARD_FPGA_board_1を 1 に定義しFPGA_board_1 をターゲットとするカーネルコードをコンパイルします

bull 複数のカスタムプラットフォーム (ボードパッケージ) がインストールされている場合特定のカスタムプラットフォームのボードバリアントでカーネルをコンパイルできます-board-package=ltcustom_platform_pathgt オプションを -board=ltboard_namegt とともに含めてくださいコマンドプロンプトで次のコマンドを呼び出します

aoc -board-package=ltcustom_platform_pathgt -board=ltboard_namegt

インテル FPGA SDK for OpenCL オフラインコンパイラーはltcustom_platform_pathgt で指定されているボードでカーネルをコンパイルします

bull システムで利用可能なカスタムプラットフォームのリストを表示するには-list-board-packagesオプションを aocコマンドに含めますコマンドプロンプトで aoc -list-board-packages コマンドを呼び出します インテル FPGA SDK for OpenCL オフラインコンパイラーは次の例のような出力を生成します

Installed board packagesltboard_package_1gtBoard packages shipped with Intel(R) FPGA SDK for OpenCL(TM)ltboard_package_2gt

この ltboard_package_Ngt はシステムにインストールされているカスタムプラットフォームのボードパッケージまたは インテル FPGA SDK for OpenCL に同梱されているボードパッケージです

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

109

ヒント 特定の FPGA ボードをターゲットとするコンパイル済みのカーネルファイルを容易に識別するためインテルでは-oオプションを aocコマンドに含めカーネルバイナリーの名前を変更することを推奨しています

bull 1 ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次のコマンドを呼び出します

aoc -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 複数ステップのコンパイルフローでカーネルのターゲットを FPGA_board_1 にするには次の作業を実行します

1 以下のコマンドを呼び出しaocoファイルを生成します

aoc -rtl -board=FPGA_board_1 ltyour_kernel_filenamegtcl -o ltmy_object_filenamegt_FPGA_board_1aocr

2 以下のコマンドを呼び出しaocxファイルを生成します

aoc -board=FPGA_board_1 ltyour_object_filenamegt_FPGA_board_1aocr -o ltyour_executable_filenamegt_FPGA_board_1aocx

bull 2 つの FPGA で構成されるアクセラレーターボードの場合各 FPGA デバイスには同等の「ボード」名が付けられます (例えば board_fpga_1board_fpga_2 など)kernel_1clのターゲットを board_fpga_1kernel_2clのターゲットを board_fpga_2 にするには次のコマンドを呼び出します

aoc -board=board_fpga1 kernel_1claoc -board=board_fpga2 kernel_2cl

関連情報インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-oltfilenamegt) (108 ページ)

77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)

デザインがフィッティング制約を満たしていないためにOpenCL カーネルのコンパイルがハードウェアの生成段階で失敗することがありますこの場合aocコマンドの -high-effortオプションを使用しカーネルを再コンパイルしてください

フィッティング制約の問題によってカーネルのコンパイルが失敗すると インテル FPGA SDK forOpenCL オフラインコンパイラーは次のエラーメッセージを表示します

Error Kernel fit error recommend using -high-effortError Cannot fit kernel(s) on device

bull この問題を解決するには次のコマンドを実行しカーネルを再コンパイルします

aoc -high-effort ltyour_kernel_filenamegtcl

コマンドを呼び出すとオフラインコンパイラーは次のメッセージを表示します

High-effort hardware generation selected compile time may increase significantly

オフラインコンパイラーはカーネルの再コンパイルとハードウェアの生成を 3 回試みます-high-effortを試みた後もコンパイルが失敗する場合はカーネルを変更してください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

110

78 カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt)

fmax ターゲットのスケジュールはスケジューリングプロセス中にスケジューラーが試みるパイプライン化の努力目標を決定します

次のオプションの一方または両方を使用しカーネル固有の fmax ターゲットを指定できます

bull __attribute__((scheduler_target_fmax_mhz(__x))) ソースレベル属性を使用する

bull aocコマンドの-fmax=ltfmax target in Mhzgt ですべてのカーネルをグローバルにコンパイルするようインテル FPGA SDK for OpenCL オフラインコンパイラーに指示する

コマンドラインオプションとソースレベル属性をどちらも使用する場合カーネル属性が優先されます次のコードを例にします

kernel void k1() __attribute__((scheduler_target_fmax_mhz(200))) kernel void k2()

オフラインコンパイラーに aocコマンドの-fmax=300をコンパイルするよう指示するとコンパイラーはカーネル k1を 300 MHzカーネル k2を 200 MHz でスケジュールします

重要 スケジュールされたターゲット fmax はコンパイル中のパイプライン化の努力目標を決定します インテル Quartus Prime 開発ソフトウェアプロエディションコンパイラーを実行し実際の fmax の値を取得してください

79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーはマクロの定義を渡し条件付きでのコードのコンパイルを可能にするプリプロセッサーマクロをサポートします

bull プリプロセッサーマクロの定義をオフラインコンパイラーに渡すには aoc -Dltmacro_namegt ltkernel_filenamegtclコマンドを呼び出します

bull 定義済みのプリプロセッサーマクロの既存値を上書きするには aoc -Dltmacro_namegt=ltvaluegt ltkernel_filenamegtclコマンドを呼び出します

次のカーネル sumのコードを例にします

ifndef UNROLL_FACTOR define UNROLL_FACTOR 1endif

__kernel void sum (__global const int restrict x __global int restrict sum) int accum = 0

pragma unroll UNROLL_FACTOR for(size_t i = 0 i lt 4 i++) accum += x[i + get_global_id(0) 4]

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

111

sum[get_global_id(0)] = accum

UNROLL_FACTORの 1 を 4 に上書きし設定するには aoc -DUNROLL_FACTOR=4sumclコマンドを呼び出しますこのコマンドを呼び出すことはsumカーネルソースコードのdefine UNROLL_FACTOR 1の行をdefine UNROLL_FACTOR 4に置き換えることと同等です

bull プリプロセッサーマクロを使用しカーネルのソースコードを変更することなくオフラインコンパイラーによるカーネルの 適化を制御するには aoc -olthardware_filenamegtaocx -D ltmacro_namegt=ltvaluegtltkernel_filenamegtclを呼び出します

以下に詳細を説明します

-oはオフラインコンパイラーが生成するaocxファイル名を指定するために使用するオフラインコンパイラーのオプションです

lthardware_filenamegt は指定したプリプロセッサーマクロの値を使用しオフラインコンパイラーが生成するaocxファイルの名前です

ヒント

コンパイル結果をどちらもファイルシステムに保存するにはaocコマンドの-oフラグを使用しカーネルを個別のバイナリーとしてコンパイルします

例えば同じカーネルを必要なワークグループサイズの 64 および 128 で複数回コンパイルする場合次のように WORK_GROUP_SIZEプリプロセッサーマクロをカーネル属性reqd_work_group_sizeに定義できます

__attribute__((reqd_work_group_size(WORK_GROUP_SIZE11)))__kernel void myKernel()for (size_t i = 0 i lt 1024 i++) statements

次のコマンドを入力しカーネルを複数回コンパイルします

aoc ndasho myKernel_64aocx ndashDWORK_GROUP_SIZE=64 myKernelcl

aoc ndasho myKernel_128aocx ndashDWORK_GROUP_SIZE=128 myKernelcl

710 コンパイル進捗レポートの生成 (-v)

インテル FPGA SDK for OpenCL オフラインコンパイラーにコンパイルの進捗を報告させるには-vオプションを aocコマンドに含めます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

112

bull フルコンパイルの進捗をオフラインコンパイラーに報告させるには aoc -vltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc Setting up project for CvP revision flowaoc Hardware generation completed successfully

bull ハードウェアを構築しない中間コンパイルの進捗をオフラインコンパイラーに報告させるにはaoc -rtl -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyaoc Selected target board a10gxaoc Running OpenCL parseraoc OpenCL parser completed successfullyaoc Compilingaoc Linking with IP library aoc First stage compilation completed successfullyaoc To compile this project run aoc ltyour_kernel_filenamegtaoco

bull エミュレーションに向けたコンパイルの進捗を報告するようオフラインコンパイラーに指示するには aoc -march=emulator -v ltyour_kernel_filenamegtclコマンドを呼び出します

オフラインコンパイラーは次のようなコンパイル進捗レポートを生成します

aoc Environment checks are completed successfullyYou are now compiling the full flowaoc Selected target board a10gxaoc Running OpenCL parserexaoc OpenCL parser completed successfullyaoc Compiling for Emulation aoc Emulator Compilation completed successfullyEmulator flow is successful

関連情報bull ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-

rtl) (106 ページ)

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ)

711 リソース推定使用率要約の画面表示 (-report)

デフォルトにおいてインテル FPGA SDK for OpenCL オフラインコンパイラーはハードウェアのリソース使用率をコンパイル中に見積もりますオフラインコンパイラーはPCIeメモリーコントローラーDMA エンジンなどの外部インターフェイスの使用率も計算に含めますカーネルのコンパイル中にオフラインコンパイラーは推定されるリソース使用率の要約を ltyour_kernel_filenamegtディレクトリーの ltyour_kernel_filenamegtlogファイルに生成します 推定されるリソース使用率の要約を画面上で確認するには-reportオプションを aocコマンドに含めてください

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

113

推定リソース使用率の要約はフルコンパイルを実行しなくても確認することができますハードウェアのコンフィグレーションファイルを生成する前に画面上で使用率の要約を確認するには-rtlオプションを aocコマンドに含めてください

bull コマンドプロンプトで aoc -rtl ltyour_kernel_filenamegtcl -report コマンドを呼び出しますオフラインコンパイラーは次のような出力を生成します

+--------------------------------------------------------------------+ Estimated Resource Usage Summary +----------------------------------------+---------------------------+ Resource + Usage +----------------------------------------+---------------------------+ Logic utilization 35 ALUTs 22 Dedicated logic registers 15 Memory blocks 29 DSP blocks 0 +----------------------------------------+---------------------------

関連情報ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)(106 ページ)

712 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージの抑制 (-W)

すべての警告メッセージを抑制するには-Wオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -W ltyour_kernel_filenamegtclコマンドを呼び出します

713 インテル FPGA SDK for OpenCL オフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)

警告メッセージをすべてエラーメッセージに変換するには-Werrorオプションを aocコマンドに含めます

bull コマンドプロンプトで aoc -Werror ltyour_kernel_filenamegtclコマンドを呼び出します

714 コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0)

clまたはaocoファイルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーはデフォルトでソース情報をコンパイラーレポートに含めソースコードをaocxバイナリーに組み込みます -g0オプションを aocコマンドに含めソース情報をコンパイラーレポートから削除しソースコードとカスタマー IP 情報をaocxファイルから削除します

bull レポートのソース情報とaocxファイルのソースコードおよびカスタマー IP の情報を削除するには aoc -g0 ltyour_kernel_filenamegtclコマンドを呼び出します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

114

715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)

インテル FPGA SDK for OpenCL オフラインコンパイラーでは異なるメモリータイプにわたりグローバルメモリーをバーストインターリーブすることはできません -no-interleaving=ltglobal_memory_typegt オプションを aocコマンドに含め同じタイプのグローバルメモリーバンクすべてのバーストインターリーブを無効にしそれらを手動で管理することができますメモリーバッファーの手動分割はグローバルメモリーにデフォルトで設定されているバーストインターリーブ方式でのコンフィグレーションを上書きします

注意 -no-interleaving オプションはグローバルメモリータイプのパラメーターを必要としますメモリータイプが指定されていない場合オフラインコンパイラーはエラーメッセージを発行します

bull デフォルトのグローバルメモリーのバーストインターリーブを無効にするようオフラインコンパイラーに指示するにはaoc ltyour_kernel_filenamegtcl -no-interleaving=default コマンドを呼び出します

アクセラレーターボードには複数のグローバルメモリータイプが含まれる場合がありますデフォルトのグローバルメモリータイプを特定するにはご利用のカスタムプラットフォームのボードメーカーより提供されている資料を確認ください

bull 異種メモリーのシステムにおいて特定のグローバルメモリータイプのバーストインターリーブを無効にするようオフラインコンパイラーに指示するには次の作業を実行します

a カスタムプラットフォームの Board_specxmlファイルで利用可能なグローバルメモリータイプ名を確認します (DDRクアッドデータレート (QDR) など)

b 例えばDDR のメモリータイプのバーストインターリーブを無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDRコマンドを呼び出しますオフラインコンパイラーはDDR メモリーバンクの手動分割を有効にし他のメモリーバンクをバーストインターリーブ方式でコンフィグレーションします

c 複数のタイプのグローバルメモリーバッファーのバーストインターリーブを無効にするには-no-interleaving=ltglobal_memory_typegt オプションを各グローバルメモリータイプに含めます

例えばDDR と QDR のバーストインターリーブをどちらとも無効にするにはaocltyour_kernel_filenamegtcl -no-interleaving=DDR -no-interleaving=QDRコマンドを呼び出します

注意 バッファーを複数のメモリーテクノロジーに関連付けるカーネル引数として渡さないでください

716 グローバルメモリーのリング型相互接続の強制 (-global-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーはデザインのさまざまな特性を考慮しグローバルメモリーの 適な相互接続トポロジーの選択を試みます

コンパイラーの選択を無効にしリング型トポロジーを強制するには -global-ring オプションを aocコマンドで使用しますこのオプションはツリー型トポロジーの使用によって fmax が制限されている場合などにカーネルの fmax を向上させることができます特に4 バンク以上のグローバルメモリーをともなうボードサポートパッケージをターゲットとするデザインの fmax にこのオプションは有効に働きます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

115

例 aoc -global-ring ltyour_kernel_filenamegtcl

717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製(-duplicate-ring)

インテル FPGA SDK for OpenCL オフラインコンパイラーが (自動選択または-global-ringでリングを強制し) グローバルメモリーの相互接続のためのリング型トポロジーを実行する際のグローバルメモリーへのカーネル書き込みスループットを向上させるには -duplicate-ring オプションを aocコマンドで使用します

このオプションは相互接続の幅を広げるためより多くの書き込みが並行して発生するようになりますしたがってより多くの領域を消費します

例 aoc -duplicate-ring ltyour_kernel_filenamegtcl

関連情報グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ)

718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)

-const-cache-bytes=ltNgt フラグを aocコマンドに含めインテル FPGA SDK forOpenCL オフラインコンパイラーにコンスタントメモリーキャッシュサイズをコンフィグレーションするよう指示します ( も近い 2 の乗数に切り上げられます)

デフォルトのコンスタントキャッシュサイズは 16 kB です

bull コンスタントメモリーキャッシュサイズのコンフィグレーションには aoc -const-cache-bytes=ltNgt ltyour_kernel_filenamegtclコマンドを呼び出しますこのltNgt はバイト単位のキャッシュサイズを表します

例えばOpenCL カーネル myKernelclのコンパイル時に 32 kB のキャッシュをコンフィグレーションするには aoc -const-cache-bytes=32768 myKernelclコマンドを呼び出します

注意 __constantアドレス空間をいずれのカーネルも使用していない場合この引数の効果はありません

719 浮動小数点演算処理順序の緩和 (-fp-relaxed)

-fp-relaxedオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーがバランスの取れたツリー構造のハードウェアを実装し浮動小数点演算の処理順序を緩和するようにします

バランスの取れたツリー構造の実装は結果における数値の変動性と引き換えにより効率的なハードウェアをもたらします

注意 この 適化のための制御を実装するには浮動小数点演算の結果における小さな変動を許容できるプログラムでなければなりません

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

116

bull オフラインコンパイラーに対しバランスの取れた木構造のハードウェア実装を実行するよう指示するには aoc -fp-relaxed ltyour_kernel_filenamegtclコマンドを呼び出します

720 浮動小数点演算における丸め処理の削減 (-fpc)

-fpcオプションを aocコマンドに含め インテル FPGA SDK for OpenCL オフラインコンパイラーに中間で行われる浮動小数点演算の丸め処理および変換を可能な限り削除し精度を維持するための追加ビットを持つよう指示します

この 適化に向けた制御を実装すると丸め処理のモードも変更されますこのモードでは一連の浮動小数点演算処理 (乗算加算減算) の 後でのみゼロに丸める処理が行われます

bull オフラインコンパイラーに丸め処理の回数を削減するよう指示するには aoc -fpcltyour_kernel_filenamegtclコマンドを呼び出します

721 OpenCL コンパイルの高速化 (-fast-compile)

コンパイル時間を 40から 90削減しカーネルのaocxファイルを短時間で作成するには-fast-compile インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

-fast-compileフィーチャーは 適化の作業を減らすことによりコンパイル時間を大幅に削減します

コマンドプロンプトで aoc -rtl ltyour_kernel_filename1gtcl-fast-compile コマンドを呼び出します

警告 -fast-compileフィーチャーを有効にすると次のようなパフォーマンス上の問題が発生する可能性があります

bull リソース使用率の増加

bull fmax の低下およびそれにより発生するアプリケーションパフォーマンスの低下

bull 電力効率の低下

インテルでは-fast-compileオプションを内部での開発目的にのみ使用することを推奨しています

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

117

注意 bull -fast-compileコンパイラーオプションは インテル Arria 10 以降のデバイスをターゲットにする OpenCL デザインをコンパイルする場合にのみ使用することができます

bull デザインの完成後 OpenCL カーネルを-fast-compileオプションを指定せずに複数のシードでコンパイルし 高のパフォーマンスを確立します

bull -fast-compileフィーチャーが有効になっているか否かにかかわらずOpenCL システムの初期コンパイルを新しいボードおよび新しいバージョンのインテル FPGA SDK for OpenCL プロエディションで行う場合45 分から 60 分の時間が追加で必要ですこの追加される時間では今後のコンパイルに備えコンパイルの一部をキャッシュしています (この動作はカーネルのパフォーマンスに影響しません)このキャッシュを作成するには環境変数$AOCL_TMP_DIR を共有できる書き込み可能なディレクトリーに定義しますデフォルトでこのキャッシュはLinux の場合vartmpaocl$USERにWindows の場合USERPROFILEAppDataLocalaoclに格納されますこの書き込み可能なディレクトリーは共有ネットワーク位置に設定することで共有できます

キャッシュを作成後は現在のバージョンのインテル FPGA SDK for OpenCL および現在のターゲットボードに対し再度キャッシュを作成する必要はありません

722 カーネルのインクリメンタルコンパイル (-incremental)

OpenCL デザインに加える変更をインクリメンタルにコンパイルするには-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションを aocコマンドに含めます

複数のカーネルを持つ大規模なシステムにおいて単一のカーネルのみ変更する場合 インテル FPGASDK for OpenCL オフラインコンパイラーでは前回のコンパイル結果を再利用し変更したカーネルのみを合成配置ルーティングすることができますこのインクリメンタルコンパイルフィーチャーはコンパイル時間の大幅な短縮につながります

注意 インクリメンタルコンパイルフィーチャーは内部での OpenCL デザインの開発目的に限り有効にしてください 高の回路パフォーマンスを確立するため 終デザインではフルコンパイルを実行してください

インクリメンタルコンパイルフロー例

aoc-incrementalltyour_kernel_filenamegtcl

Update kernels in your OpenCL design

aoc-incremental-fast-compileltyour_kernel_filenamegtcl

1 aoc -incremental ltyour_kernel_filenamegtclコマンドを呼び出しインクリメンタルモードが有効になっている状態で初期セットアップのコンパイルをクリーンなディレクトリーに行います

注意 セットアップをコンパイルする際は-incrementalフラグを必ず有効にしてください

このセットアップのコンパイルは以前のコンパイル結果を再利用しませんセットアップをコンパイルする際は-fast-compileオフラインコンパイラーコマンドオプションを aocコマンドに含めないでくださいこのオプションを含めると今後のインクリメンタルコンパイル時にエラーが発生する可能性が高くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

118

ヒント

インテルではコンパイルの時間が問題にならない場合は必ずセットアップのコンパイルを新しく実行し今後のインクリメンタルコンパイル時にコンパイルが失敗する可能性を低下させることを推奨しています連続して多くのインクリメンタルコンパイルを実行するとコンパイルが失敗する可能性が高くなりますまたハードウェアのパフォーマンスおよび生成されたaocxファイルの効率も低下します

2 ご自身の OpenCL デザインのカーネルを修正します

デザインには複数のclファイルを含めることが可能です

3 デザインのインクリメンタルコンパイルを実行します 適なコンパイル速度を得るために-fast-compileフラグも aocコマンドに含めます

aoc -incremental -fast-compile ltyour_kernel_filenamegtcl

4 reporthtmlファイルの Incremental compile セクションでオフラインコンパイラーが検出した変更を確認してください

reporthtmlファイルは ltyour_kernel_filenamegtreportsディレクトリーにあります

7221 インクリメンタルコンパイルレポート

-incremental インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションで OpenCL のデザインをコンパイルするとオフラインコンパイラーはIncremental compile セクションを ltyour_kernel_filenamegt プロジェクトディレクトリーの reporthtmlファイルに含めます

インクリメンタルコンパイルレポートはOpenCL のデザインに関する次のようなメトリクスを提供します

bull レポートの下部にある ltgt of design not preservedメトリクスはデザインの全体的な変更の簡単な概要を示しますこれはコンパイル時間を予測する も良い判断材料です

注意

インクリメンタルコンパイルレポートに表示される FPGA リソースは インテル FPGASDK for OpenCL オフラインコンパイラーが作成する推定エリアモデルに基づき計算されますエリアの数字は標準コンパイル (インクリメンタルではないコンパイル) 時の推定エリア使用量を表しますこの数字をもとに標準コンパイル時にデザインが消費するエリアを見積もることが可能です

FPGA のリソース情報は インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアコンパイルレポートの 終的なエリアと完全に一致しない場合があります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

119

図 -14 セットアップコンパイル時のインクリメンタルコンパイルレポート

図 -15 インクリメンタルコンパイル時のコンパイルレポート

7222 インクリメンタルコンパイルのその他のコマンドオプション

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーに含まれているオプションの機能を有効にしOpenCL デザインのコンパイルをカスタマイズすることができます

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

120

複数のカーネルのパーティションへのグループ化 (-incremental-grouping=ltfilenamegt)

デフォルトにおいて インテル FPGA SDK for OpenCL オフラインコンパイラーはインクリメンタルコンパイル時にデザイン内の各カーネルを個別のパーティションに配置します -incremental-grouping=ltpartition_filenamegt コマンドオプションを aocコマンドに含め複数のカーネルを単一のパーティションにまとめることができます通常デザインに含まれるパーティションが少ないほどコンパイル速度は早くなります

例 aoc -incremental-grouping=ltpartition_filenamegtltyour_kernel_filenamegtcl

注意 1 つのカーネルのみを変更した場合でもオフラインコンパイラーはグループ内のすべてのカーネルを再コンパイルしますインテルでは通常同時に変更するカーネルをグループ化することを推奨しています

グループ化されたカーネルが多数のロードおよびストア動作を実行する場合-incremental=aggressiveオプションも aocコマンドに含めコンパイルスピードをさらに加速させることが可能です

-Incremental-groupingオプションに渡すパーティションファイルはプレーンテキストファイルですファイル内の各行は新しいパーティションを指定しておりカーネル名をセミコロン () で区切ったリストを含んでいます例えばパーティションファイルの以下の行は3 つのパーティションを指定しそれぞれに 4 つのカーネルを含んでいます

reader0reader1reader2reader3accum0accum1accum2accum3writer0writer1writer2writer3

アグレッシブモードによるデザインのコンパイル (-incremental=aggressive)

エリア使用量とスループットを引き換えにインクリメンタルコンパイルを加速するには -incremental=aggressiveコマンドオプションを aocコマンドに含めます

このフィーチャーはデザイン内のカーネルが多数のバッファーに対してロードおよびストア動作を行う場合や-incremental-groupingコマンドオプションで複数のカーネルをグループ化した場合に特に有効です

例 aoc -incremental=aggressive -incremental-grouping=ltpartition_filenamegt ltyour_kernel_filenamegtcl

注意 bull アグレッシブモードを有効にするとFmax の低下が示すよりも大きいスループットの低下が生じる可能性があります

bull 各 OpenCL デザインのインクリメンタルコンパイルを行っている間はコンパイルモードを変更しないでくださいデザインをアグレッシブモードでコンパイルする場合そのデザインに対して続けて実行するインクリメンタルコンパイルではすべてアグレッシブモードを有効にしますインクリメンタルコンパイルのモードを切り替えるたびにコンパイルが完了するまでの時間が長くなります

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

121

カスタム入力ディレクトリーの指定 (-incremental-input-dir=ltpath_to_directorygt)

オフラインコンパイラーはインクリメンタルコンパイル中にデフォルトのltyour_kernel_filenamegt プロジェクトディレクトリーを現在の作業ディレクトリーに作成し中間コンパイルファイルを保存しますインクリメンタルコンパイルをデフォルトのプロジェクトディレクトリー以外に配置するには -incremental-input-dir=ltpath_to_directorygtコマンドオプションを aocコマンドに含めます

次のいずれかまたは両方のシナリオでデザインをコンパイルする場合-incremental-input-dirオプションを含める必要があります

bull aocコマンドを前回のコンパイルとは違う作業ディレクトリーから実行する場合

bull -o ltfilenamegt コマンドオプションを前回のコンパイルに含めた場合

mykernelclファイルが初期の作業ディレクトリーにあり同じ mykernelclファイルの別のリビジョンが new_revサブディレクトリーにある以下のシナリオを例にします

aoc -incremental mykernelclcd new_revaoc -incremental -fast-compile mykernelcl -incremental-input-dir=mykernel

このシナリオにおいてオフラインコンパイラーはmykernelプロジェクトディレクトリーにある初期コンパイル時のファイルを再利用しそれをもとに 2 回目のコンパイルを行いますオフラインコンパイラーは元の mykernelディレクトリー内のファイルを変更することなくnew_revmykernelプロジェクトディレクトリーを 2 回目のコンパイルに作成します

-incremental-input-dirコマンドオプションは複数のデベロッパーが同じインクリメンタルセットアップコンパイルを共有する場合に有効です各デベロッパーはその後のインクリメンタルコンパイルを他のデベロッパーのコンパイル結果を上書きすることなく自分の作業スペースで実行できます

自動再試行の無効化 (-incremental-flow=no-retry)

インクリメンタルコンパイルが失敗した場合デフォルトでオフラインコンパイラーはコンパイルの再試行を自動的に行いますその場合パーティションは保存されずに 2 回目のコンパイルが実行されますこの 2 回目のコンパイルはデザイン全体を再コンパイルするため完了までに時間がかかります

オフラインコンパイラーの自動再試行メカニズムを無効にするには-incremental-flow=no-retryコマンドオプションを aocコマンドに含めますこのフィーチャーを有効にすると 初の試みが失敗に終わった際にオフラインコンパイラーは 2 回目のインクリメンタルコンパイルを実行しませんまたオフラインコンパイラーはaocxファイルを生成しません

このフィーチャーを有効にすることにより次のような独自の失敗軽減ストラテジーを実行することが可能になります

bull 複数のシードを並行してコンパイルすることにより 低 1 つのコンパイルが再試行なしで成功する可能性を高める

bull インクリメンタル高速コンパイルに代わり非インクリメンタル高速コンパイル ( aoc -fast-compile ltyour_kernel_filenamegtcl) を実行する

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

122

7223 インクリメンタルコンパイルフィーチャーの制限

インテル FPGA SDK for OpenCL のインクリメンタルコンパイルフィーチャーは インテル Arria10 FPGA をターゲットとする OpenCL デザインにのみ利用可能です

デバイスのサポートのほかにインクリメンタルコンパイルには次の制限があります

bull インクリメンタルコンパイルフィーチャー (-incremental) または高速コンパイルフィーチャー (-fast-compile)もしくはその両方を有効にするとエリアFmax電力の低下が発生します

bull 輻輳したデザインのインクリメンタルコンパイルでは初期セットアップのコンパイルと比較しFmax が大幅に低下することがあります (25以上)Fmax の低下を許容できない場合非インクリメンタル高速コンパイルを実行し一定のコンパイル時間の短縮を維持しながら Fmax の低下量を軽減します

bull オフラインコンパイラーは -l ltlibrary_namegtaoclibオフラインコンパイラーコマンドオプションを呼び出すことで行った RTL ライブラリーの変更を検出しませんRTL ライブラリーを変更した後はセットアップコンパイルを再度行う必要があります

オフラインコンパイラーはセットアップコンパイルを再度実行するよう警告メッセージを表示し注意喚起します

723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)

注意 ECC (誤り訂正符号) は初期のインテル FPGA SDK for OpenCL のフィーチャーでプレビューの段階にあります訂正されたエラーおよび検出されたものの訂正されなかったエラーを報告するこのフィーチャーを 大限に活用するにはECC に対応するカスタムプラットフォームをボードメーカーより入手する必要があります

-eccオプションを aocコマンドに含み インテル FPGA SDK for OpenCL オフラインコンパイラーが誤り訂正符号をカーネルのメモリー (M20k および MLAB) で有効にするようにします

ECC の実装には各 32 ビットワードに対しシングルエラー訂正機能とダブルエラー検出機能があります

注意 ECC フィーチャーを有効にするとRAM と ALM の両方でエリアオーバーヘッドが発生しシステムのFmax が低下します

bull オフラインコンパイラーで誤り訂正符号のハードウェア実装を有効にするには aoc -eccltyour_kernel_filenamegtclコマンドを呼び出します

724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)

インテル FPGA SDK for OpenCL オフラインコンパイラーでOpenCL カーネルの呼び出しキューを削除しカーネルのエリア使用量を低減するには -no-hardware-kernel-invocation-queue オプションを aocコマンドに含めます

例 aoc -no-hardware-kernel-invocation-queueltyour_kernel_filenamegtcl

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

123

このオプションを使用することでカーネルの実行時間が長くなる場合がありますカーネルの呼び出しキューはOpenCL ランタイム環境においてカーネルの起動をアクセラレーターにキューすることを可能にしますそのためアクセラレーターはカーネルの呼び出し終了後すぐに同じカーネルの次の実行をスタートできます

注意 -No-hardware-kernel-invocation-queue オプションはカーネルの実行時間がカーネルの呼び出しキュー (20-100us) に隠れているシステムや OpenCL ランタイム環境のオーバーヘッドより長い場合または インテル FPGA SDK for OpenCL オフラインコンパイラーでカーネルのフィットが難しい場合にのみ使用します

カーネル呼び出しキューの使用方法に関してはIntel FPGA SDK for OpenCL Pro Edition BestPractices Guide のトピックUtilizing Hardware Kernel Invocation Queue を参照ください

関連情報Utilizing Hardware Kernel Invocation Queue

725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)

デザインの特定の領域で使用されているハンドシェイクプロトコルを変更するにはaocコマンドの-hyper-optimized-handshaking=ltauto|offgt オプションを使用します

-hyper-optimized-handshaking オプションには次のいずれかの値を設定できます

auto オプションを指定しないデフォルトの動作です可能な場合コンパイラーは 適化を有効にしますそうでない場合は offに設定されます

より高い fmax を要求する場合にこの値を使用しますこのオプションを有効にすると インテル FPGA SDK for OpenCL オフラインコンパイラーはストールを許容するノードのハンドシェイクパスにパイプラインレジスターを追加しますこれによりエリアとレイテンシーが増加する代わりに fmax が高くなります

例 aoc -hyper-optimized-handshakingltyour_kernel_filenamegtcl

off コンパイラーはfmax が低下する潜在的な可能性と引き換えに低レイテンシーに向けた 適化を試みますこのハンドシェイクの高度な 適化を無効にするとエリアの縮小につながる可能性もありますこれはfmax をあまり必要としない小規模なデザインにおいてレイテンシーとエリアを低減できるため効果的です

例 aoc -hyper-optimized-handshaking=offltyour_kernel_filenamegtcl

注意 -hyper-optimized-handshaking オプションは インテル Stratixreg 10 をターゲットにするデザインにのみ適用されます インテル Stratix 10 デバイス以外のターゲットデバイスにこのオプションを使用するとコンパイルが失敗しエラーが発生します

7 OpenCL カーネルのコンパイルUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

124

8 OpenCL カーネルのエミュレーションとデバッグ

インテル FPGA SDK for OpenCL Emulator はカーネルの機能性を評価します

インテル FPGA SDK for OpenCL Emulator はx86-64 Windows または Linux ホストで実行するaocxファイルを生成しますこの機能によりカーネルの機能性をエミュレーションし毎回実際のFPGA で実行することなくデザインを反復することが可能になりますLinux のプラットフォームではエミュレーターを使用し機能のデバッグを実行することも可能です

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインのエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインを SoC ボードへターゲットにすることが可能です

エミュレーターは64 ビットの Windows および Linux のオペレーティングシステムをサポートしていますLinux システムではGNU C Library (glibc) version 215 以降のバージョンが必要ですお使いの Linux システムがこの要件を満たさない場合レガシーエミュレーターを利用できる可能性があります詳細はレガシーエミュレーターの使用 (135 ページ) を確認ください

1 高速エミュレーターの設定 (125 ページ)

2 エミュレーションに向けたチャネルカーネルコードの変更 (126 ページ)

3 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128ページ)

4 OpenCL カーネルのエミュレーション (129 ページ)

5 Linux における OpenCL カーネルのデバッグ (130 ページ)

6 インテル FPGA SDK for OpenCL Emulator の制限 (131 ページ)

7 ハードウェアとエミュレーターの結果の不一致 (131 ページ)

8 高速エミュレーターの環境変数 (133 ページ)

9 高速エミュレーターでサポートされている拡張機能 (133 ページ)

10 高速エミュレーターの既知の問題 (134 ページ)

11 レガシーエミュレーターの使用 (135 ページ)

81 高速エミュレーターの設定

インテル FPGA SDK for OpenCL プロエディションを管理者権限でインストールしている場合次の手順を実行する必要はありません インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合は高速エミュレーターを有効にするための作業を行う必要があります

インテル FPGA SDK for OpenCL を管理者権限でインストールしていない場合高速エミュレーターを使用する前に次の手順を実行してください

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

1 高速エミュレーターをインストール可能なクライアントドライバー (ICD) エントリーを手動で設定します

bull Linux の場合etcOpenCLvendorsIntel_FPGA_SSG_Emulatoricdファイルが環境変数 INTELFPGAOCLSDKROOT が指定するディレクトリーにあるファイルと一致することを確認しますINTELFPGAOCLSDKROOT 環境変数はSDK をインストールする位置を指しています

ファイルが一致しない場合やetcOpenCLvendorsにファイルが存在しない場合はIntel_FPGA_SSG_Emulatoricdファイルを INTELFPGAOCLSDKROOT 環境変数で指定されている位置からetcOpenCLvendorsディレクトリーへコピーします

bull Windows の場合レジストリーキー HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendorsが次の値を含んでいることを確認してください[HKEY_LOCAL_MACHINESOFTWAREKhronosOpenCLVendors]intelocl64_emudll=dword00000000

2 インテル FPGA サポートプレビューで インテル FPGA SDK for OpenCL を手動でインストール (または再インストール) します

この手順により64 ビットの インテル SDK for OpenCL オフラインコンパイラーコマンドラインインターフェイス (ioc64) がシステムにインストールされます

関連情報bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

bull OpenCL Installable Client Driver (ICD) Loader

bull OpenCL Vector Addition Design Example

82 エミュレーションに向けたチャネルカーネルコードの変更

エミュレーターはカーネル間のチャネルをエミュレーションしますFPGA ボードの入出力フィーチャーに接続する IO チャネルのエミュレーションはサポートしていません IO チャネルの読み書きを行うチャネルを持つアプリケーションをエミュレーションするにはカーネルを変更しIO チャネルに代わる読み取りまたは書き込みチャネルを追加しますまたそのチャネルを使用するソースコードを条件付きにします

インテル FPGA SDK for OpenCL はEMULATORのマクロの定義を設定しませんコマンドラインまたはソースコードで手動にて設定する必要があります

次のカーネルを例に説明します

channel unlong4 inchannel __attribute__((io(eth0_in)))

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ulong4 data = read_channel_intel(inchannel) statements

IO チャネルに接続するチャネルを持つカーネルをエミュレーションするエミュレーターを有効にするには次の手順を実行します

1 次のいずれかの方法でカーネルコードを変更します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

126

mdash 次のように一致する write_channel_intel呼び出しを追加する

ifdef EMULATOR

__kernel void io_in (__global char restrict arr int size) for (unsigned i = 0 i lt size i++) ulong4 data = arr[i] arr[i] being an alternate data source write_channel_intel(inchannel data) endif

mdash IO チャネルアクセスを次のようにメモリーアクセスに置き換える

__kernel void send (int size) for (unsigned i = 0 i lt size i++) ifndef EMULATOR

ulong4 data = read_channel_intel(inchannel)

else ulong4 data = arr[i] arr[i] being an alternate data source

endif statements

2 エミュレーション中にこの条件付きカーネルを作成および起動するようホストアプリケーションを変更します

関連情報io チャネル属性を使用した IO チャネルの実装 (44 ページ)

821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション

インテル FPGA SDK for OpenCL Emulator は値によってパイプやチャネルを渡すカーネルをサポートします

値によってチャネルまたはパイプを渡すカーネルは次のようにエミュレーションできます

channel uint my_ch

void my_function (channel uint ch __global uint dst int i) dst[i] = read_channel_intel(ch)

__kernel voidconsumer (__global uint restrict dst) for (int i=0ilt5i++) my_function(my_ch dst i )

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

127

822 チャネル深度のエミュレーション

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE環境変数を使用しエミュレーションに向けてカーネルをコンパイルすることで変更できます

この CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数は次の値を取ることができます

ignoredepth カーネルのエミュレーション実行時間が 短になるよう選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性は無視されます

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数が設定されていない場合はこの値がデフォルトで使用されます

default 明示的に深度属性が指定されているチャネルはその深度を持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるよう選択されたデフォルトのチャネル深度が与えられます

strict エミュレーションのチャネル深度はすべてFPGA のコンパイルに指定されている深度に一致するように与えられます

重要 チャネルに対する CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数はカーネルをコンパイルする前に設定する必要がありますパイプの場合はホストプログラムを実行する前に設定する必要があります

83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)

エミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorおよび-fast-emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に次の作業を実行します

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認してください

bull LD_LIBRARY_PATH 環境変数の設定に インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認します

bull x86-64 のホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator -fast-emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向けてインテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートではカーネルソースコードの機能的なエラーの原因を特定できます

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

128

関連情報bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

84 OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行しますOpenCL 高速エミュレーターはFPGA ハードウェアをターゲットとする際とは異なる OpenCL プラットフォームを使用します

カーネルをエミュレーションするには次のステップを実行します

1 ホストプログラムを変更しエミュレーターの OpenCL プラットフォームを選択します

次のプラットフォーム名を選択しホストプログラムのエミュレーション用 OpenCL プラットフォームを選択します

Intel(R) FPGA Emulation Platform for OpenCL(TM)

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細についてはホストアプリケーションと Khronos ICD Loader Library のリンクを確認ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置へ動かします現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを次のように実行します

mdash Windows の場合

a set CL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を定義します

b ホストアプリケーションを実行します

c set CL_CONFIG_CPU_EMULATE_DEVICES=を呼び出し変数の設定を解除します

mdash Linux の場合は envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要のある同一のエミュレーションデバイス数を指定します

注意

エミュレーション用 OpenCL プラットフォーム (Intel(R) FPGA EmulationPlatform for OpenCL(TM)) は物理的なボードへのアクセスを提供しませんエミュレーションされたデバイスのみ利用可能です

ヒント

エミュレーターデバイスを 1 つだけ使用する場合はCL_CONFIG_CPU_EMULATE_DEVICES環境変数を設定する必要はありません

5 ホストまたはカーネルプログラムの変更後にテストを行う場合変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

129

85 Linux における OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL Emulator にデバッガーで OpenCL カーネルを実行しホストアプリケーションの一部として機能的にデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証と設定を行うことができます

注意 カーネルのデバッグはホストのデバッグから独立していますWindows の Microsoft Visual StudioDebugger や Linux の GDB など既存のツールでホストコードをデバッグしてください

デバッグに向けて OpenCL カーネルをコンパイルするには次のステップを実行します

1 特定のアクセラレーターボードをターゲットとするデバッグのaocxファイルを生成するためaoc -march=emulator -fast-emulator -gltyour_kernel_filenamegtclコマンドを呼び出します

2 ホストアプリケーションを構築しホストアプリケーションを Khronos ICD Loader Library にリンクします詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94ページ) を確認ください

3 ltyour_kernel_filenamegtaocxファイルがホストが容易に検索できる位置にあることを確認してください現在の作業ディレクトリーが推奨されます

4 アプリケーションの実行には envCL_CONFIG_CPU_EMULATE_DEVICES=ltnumber_of_devicesgt gdb --argsltyour_host_program_namegt [lthost_program_argumentsgt] コマンドを呼び出しますこの ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムの変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行します

カーネルをデバッガーで実行するには次の作業を実行します

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルを呼び出す前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグを開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yと返答します 初のプログラム実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 エミュレーターはOpenCL ランタイムでいくつかのエラーの詳細をレポートしますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

130

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

86 インテル FPGA SDK for OpenCL Emulator の制限

インテル FPGA SDK for OpenCL Emulator のフィーチャーにはいくつかの制限があります

bull 実行モデル

エミュレーターはFPGA バリアントと同じコンパイルモードをサポートしますそのためclCreateProgramBinary関数を呼び出しエミュレーションのための cl_programオブジェクトを作成する必要があります

bull 並列実行

並行するカーネルの実行のモデリングには制限があります実行中にエミュレーターは通信しているワークアイテムを実際には並行して実行しませんよって異なるカーネルが同期化のためにバリアーなしでグローバルメモリーにアクセスしている場合など並行して実行されている動作によっては実行ごとに一貫性のないエミュレーション結果が生成される可能性があります

bull エミュレーターはホストランタイムとカーネルを同じアドレス空間で実行しますホストアプリケーションで特定のポインターや配列を使用することによりカーネルプログラムが失敗する場合がありますまたその逆も同じです使用例としては外部に割り当てられたメモリーのインデックス化やランダムなポインターへの書き込みなどがありますValgrind などのメモリーリーク検出ツールを使用しプログラムを分析することができますただしカーネルでの範囲を超える書き込み動作によってホストに致命的なエラーが発生する可能性がありますまたその逆も同様です

bull チャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合エミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

87 ハードウェアとエミュレーターの結果の不一致

カーネルをエミュレーションするとOpenCL システムはハードウェアにコンパイルされたカーネルとは異なる結果を生成することがありますシミュレーションでカーネルを実行することでハードウェアにカーネルをコンパイルする前にさらにカーネルをデバッグすることが可能です

警告 この結果における不一致はインテル FPGA SDK for OpenCL Emulator がハードウェアの計算の一部を正確にモデル化できない場合またはプログラムが未定義の動作に依存している場合に通常発生します

エミュレーターとハードウェアの結果の不一致を引き起こす も一般的な理由は次のとおりです

bull OpenCL カーネルコードがpragma ivdepディレクティブを使用しているエミュレーターは真の依存関係が pragma ivdepディレクティブによって壊されている場合OpenCL システムをモデル化しませんハードウェアをフルコンパイルする際にこれは誤った結果として考えられます

bull OpenCL カーネルコードが初期化されていないデータに依存している初期化されていないデータとは初期化されていない変数初期化されていないまたは部分的に初期化されたグローバルバッファーローカル配列プライベート配列などです

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

131

bull OpenCL カーネルコードの動作が正確な浮動小数点演算の結果に依存しているエミュレーターが CPU の浮動小数点計算ハードウェアを使用する一方でハードウェアの実行には FPGA コアとして実装されている浮動小数点コアが使用されます-fp-relaxedの aoc オプションをOpenCL カーネルコードに使用すると演算の順序が変わり浮動小数点の計算結果がさらに変動する可能性があります

注意 OpenCL の標準は各プラットフォームの浮動小数点計算の 下位ビットが 1 つ以上異なることを許容します一方でそれはどのプラットフォームでも正しいと見なされます

bull OpenCL カーネルコードの動作が異なるカーネルのチャネルアクセスの順序に依存しているチャネル動作のエミュレーションには制限があります特にカーネルがループの反復ごとにチャネル動作を呼び出さない条件付きのチャネル動作の場合に当てはまりますこのような場合にエミュレーターはハードウェアとは異なる順序でチャネル動作を実行することがあります

bull OpenCL カーネルまたはホストコードが範囲外のグローバルメモリーにアクセスしている

注意

mdash 初期化されていないメモリーの読み取りおよび書き込み動作はプラットフォームに依存しますカーネル内のすべてのアドレスを使用している場合clCreateBuffer関数呼び出しを割り当てている場合clEnqueueReadBufferとclEnqueueWriteBuffer関数呼び出しを転送している場合はグローバルメモリーのバッファーサイズを確認してください

mdash Valgrind などのソフトウェアメモリーリーク検出ツールをエミュレーションされたバージョンの OpenCL システムで使用するとメモリーに関する問題を分析できますこれらのツールからの警告がないということは問題がないということを意味するわけではありませんこれは単にツールが問題を検出できなかったことを意味するだけですインテルではこのような状況においてOpenCL カーネルまたはホストコードの手動検証を推奨しています

bull OpenCL カーネルコードが範囲外のローカルまたはプライベート変数にアクセスしている例えば範囲外のローカルまたはプライベート配列にアクセスしている場合やスコープ外になったプライベート変数にアクセスしている場合です

注意

範囲外の変数へのアクセスは通常ソフトウェアのスタックにおいてアクセスされている変数付近の無関係な変数に影響を及ぼすためこれらの問題はソフトウェア用語でスタックの破損問題と呼ばれていますエミュレーションされた OpenCL カーネルは通常の CPU 機能として実装されており破損する可能性のあるスタックを実際に持っていますハードウェアをターゲットにしている場合はスタックが存在しないためスタックの破損問題は必ず別の形で現れますスタックの破損が疑われる場合はValgrind などのメモリーリーク検証ツールを使用することが可能ですがスタック関連の問題の特定は通常困難ですインテルではスタック関連の問題をデバッグするためOpenCL カーネルコードを手動で検証することを推奨しています

bull OpenCL カーネルコードがシフトされる型よりも大きいシフトを使用している例えば 64 ビットの整数を 65 ビットでシフトしている場合などですOpenCL specification version 10 によるとこのようなシフトの動作は未定義です

bull エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度がカーネルがハードウェアにコンパイルされる際に生成されるデフォルトのチャネル深度と異なるこのチャネル深度の相違はカーネルのエミュレーションは問題なく機能する一方でハードウェアでの実行はハングアップするという状況を引き起こす可能性がありますチャネル深度の相違を修正する方法についてはチャネル深度のエミュレーション (128 ページ) を参照してください

bull 出力されるラインの順序に関してはprintf関数で出力される順序がエミュレーターとハードウェアで異なる場合がありますこれはハードウェアにおいて printfデータはグローバルメモリーバッファーに格納されカーネルの実行が完了した際またはバッファーがフルになった際にのみバッファーからフラッシュされるためですエミュレーターの printf関数はx86 stdoutを使用しています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

132

bull 型のアップキャストでアライメントされていないロードやストアを実行するとFPGA とエミュレーターでは異なる結果が生じる可能性がありますこの型のロードおよびストアはC99 の仕様では定義されていません

次例のような演算では予期しない結果になる可能性があります

int tmp = ((int ) (my_ptr + 5))

関連情報シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

88 高速エミュレーターの環境変数

高速エミュレーターの動作を変更する環境変数をいくつか利用することが可能です

OCL_TBB_NUM_WORKERS

エミュレーターが使用できる 大スレッド数を示しますデフォルト値は 32 大値は 255 です各スレッドは単一のカーネルを実行できます

アプリケーションで複数のカーネルを同時に実行する必要がある場合OCL_TBB_NUM_WORKERSを適切に設定する必要があります (使用されているカーネルの数またはそれ以上の値に設定してください)

CL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE

利用可能な OpenCL ローカルメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE

利用可能な OpenCL プライベートメモリーの容量を単位で設定します例えば 8MB256KB1024Bなどです

CL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE

エミュレーションに向けて OpenCL カーネルをコンパイルするとカーネルをハードウェアに向けてコンパイルする際に生成されるチャネル深度とは異なるチャネル深度になりますこの動作はCL_CONFIG_CHANNEL_DEPTH_EMULATION_MODE 環境変数で変更できます詳細はチャネル深度のエミュレーション (128 ページ) を参照ください

関連情報チャネル深度のエミュレーション (128 ページ)

89 高速エミュレーターでサポートされている拡張機能

高速エミュレーターはさまざまな OpenCL 拡張機能に対しさまざまなレベルのサポートを提供しています

次の OpenCL の拡張機能は高速エミュレーターで完全にサポートされています

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

133

bull cl_intel_fpga_host_pipe

bull cl_khr_byte_addressable_store

bull cl_khr_icd

bull cles_khr_int64

また次の OpenCL 拡張機能をレガシーエミュレーターと同様のレベルでサポートしています

bull cl_intel_channels

bull cl_khr_local_int32_base_atomics

bull cl_khr_local_int32_extended_atomics

bull cl_khr_global_int32_base_atomics

bull cl_khr_global_int32_extended_atomics

bull cl_khr_fp64

bull cl_khr_fp16

810 高速エミュレーターの既知の問題

高速エミュレーターの使用はいくつかの既知の問題に影響を受ける可能性があります起こりうる問題を回避するため高速エミュレーターを使用する際はこれらの問題を考慮ください

自動実行カーネル

自動実行カーネルはclReleaseProgram() 呼び出しの後ではなくホストプログラムの終了後にのみシャットダウンします

コンパイラー診断

一部のコンパイラー診断は高速エミュレーターに未実装です

clEnqueueNDRangeKernel() が返す CL_OUT_OF_RESOURCES エラー

高速エミュレーターがデフォルトでサポートしているよりも多くの__privateまたは__localメモリーをカーネルが使用している場合に発生する可能性があります

CL_CONFIG_CPU_FORCE_PRIVATE_MEM_SIZE またはCL_CONFIG_CPU_FORCE_LOCAL_MEM_SIZE 環境変数を設定してください詳細は高速エミュレーターの環境変数 (133 ページ) を参照ください

clCreateKernel() が返す CL_INVALID_VALUE エラー

clBuildProgram() の呼び出しが行われていない可能性があります

プログラムがバイナリーから作成されている場合でもこの呼び出しは OpenCL 仕様に必要です詳細はOpenCL Specification version 10 の Section 542 を参照してください

uses_global_work_offsetカーネル属性は認識されない属性であるという警告

OpenCL 高速エミュレーターはuses_global_work_offsetカーネル属性をサポートしていません属性が無視されることを通知する警告がコンパイル時に出されることがありますがこの警告は高速エミュレーターにおけるカーネルの実行には影響しないため無視しても問題ありません

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

134

関連情報bull 高速エミュレーターの環境変数 (133 ページ)

bull The OpenCL Specification Version 10

811 レガシーエミュレーターの使用

インテル FPGA SDK for OpenCL バージョン 181 およびそれ以前のバージョンにおけるデフォルトのエミュレーターは現在も入手可能であり利用することができます ただしインテル FPGAOpenCL システムのエミュレーションには高速エミュレーターの利用を推奨しています

OpenCL カーネルのエミュレーションとデバッグ (125 ページ) で紹介されている推奨事項の多くはどちらのエミュレーターにも適用されますただしレガシーエミュレーターには次の章以降で説明されている違いがいくつかあります

重要 エミュレーションはARM プロセッサーへのクロスコンパイルをサポートしていませんARM SoC デバイスをターゲットにするデザインでエミュレーションを実行する場合はSoC 以外のボードでエミュレーションしてください (例えば INTELFPGAOCLSDKROOTboards10_refINTELFPGAOCLSDKROOTboarda10_refなど)エミュレーション結果が満足のいく内容となれば続く 適化の手順に向けてデザインのターゲットを SoC にすることが可能です

8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)

レガシーエミュレーターでのエミュレーションに向けて OpenCL カーネルをコンパイルするには-march=emulatorオプションを aocコマンドに含めます

bull カーネルのエミュレーションを実行する前に以下の作業を実行してください

mdash FPGA アクセラレーターボードに対しボードメーカーから提供されているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションのソフトウェアをインストールするフォルダーを指していることを確認します

bull Windows システムでカーネルをエミュレーションするにはMicrosoft のリンカーおよびコンパイル用のライブラリーが別途必要になりますPATH 環境変数設定に インテル FPGA SDK forOpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設が インテル FPGA SDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

135

bull x86-64 ホストシステムで実行可能なカーネルプログラムを作成するため aoc -march=emulator ltyour_kernel_filenamegtclコマンドを呼び出します

bull 特定のボードをターゲットとするエミュレーションに向けてカーネルをコンパイルするには aoc-march=emulator -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムに向け インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードの機能的なエラーの原因を特定できるようになります

関連情報bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-

board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Windows)

bull インテル FPGA SDK for OpenCL ユーザー環境変数の設定 (Linux)

81111 レガシーエミュレーターでのチャネル深度のエミュレーション

レガシーエミュレーターをターゲットにしている場合はエミュレーターのチャネル深度モデル作成における制御が異なります

エミュレーションに向けて OpenCL カーネルをコンパイルする際のデフォルトのチャネル深度はカーネルをハードウェアに向けてコンパイルする際に生成されるデフォルトのチャネル深度とは異なりますこの動作はカーネルをエミュレーションに向けてコンパイルする際に-emulator-channel-depth-modelオプションを使用し変更することが可能です

-emulator-channel-depth-modelコンパイラーオプションは次の値を取ることができます

default 明示的な深度属性を持つチャネルは指定された深度持ちます深度が指定されていないチャネルにはカーネルのエミュレーション実行時間が 短になるように選択されたデフォルトのチャネル深度が与えられます

strict FPGA のコンパイルに指定されている深度と一致するチャネル深度がエミュレーションのすべてのチャネル深度に与えられます

ignore-depth

カーネルのエミュレーション実行時間が 短になるように選択されたチャネル深度がすべてのチャネルに与えられます明示的に設定されたチャネル深度属性はいずれも無視されます

8112 レガシーエミュレーターでの OpenCL カーネルのエミュレーション

OpenCL カーネルをエミュレーションするにはご自身のカーネルを構築したプラットフォームでaocxエミュレーションファイルを実行します

以下の手順でカーネルをエミュレーションしてください

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

136

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションを構築するために必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーをどちらも表示します

2 ホストアプリケーションを構築し手順 1 で検索したライブラリーにリンクします

注意

複数のデバイスを他の OpenCL SDK と共にエミュレーションするにはホストアプリケーションをホストランタイムのライブラリーに接続する前 にKhronos ICD Loader Libraryに接続しますホストアプリケーションと ICD Loader Library の接続はホストアプリケーションの Makefileを変更して行います詳細は ホストアプリケーションと KhronosICD Loader Library のリンク (94 ページ) を参照ください

3 必要な場合は ltyour_kernel_filenamegtaocxファイルをホストが容易に検索できる位置に移動します現在の作業ディレクトリーが推奨されます

4 エミュレーションに向けてホストアプリケーションを実行するには

mdash Windows の場合 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgt コマンドを呼び出しエミュレーションされたデバイス数を 初に定義しその後ホストアプリケーションを実行します

ホストアプリケーションを実行した後 setCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=を呼び出し変数の設定を解除します

mdash Linux の場合 envCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtlthost_application_filenamegt コマンドを呼び出します

このコマンドはエミュレーターが提供する必要がある同一のエミュレーションデバイス数を指定します

注意

環境変数 CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA を設定するとエミュレーションされたデバイスのみが利用可能になりますつまり物理的なボードへのアクセスはすべて無効になります

5 ホストまたはカーネルプログラムを変更後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしエミュレーションを再度実行してください

エミュレーションされたカーネルを呼び出すたびに共有ライブラリーのコピーであるltprocess_IDgt-libkernelsoがデフォルトの一時ディレクトリーに作成されますこのltprocess_IDgt は各エミュレーションの実行に割り当てられた固有の数値ですWindows ではTMP または TEMP 環境変数を設定しデフォルトのディレクトリーを変更することができますLinux では TMPDIR の設定です

関連情報bull OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情報の表示 (link-

config または linkflags) (96 ページ)

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8113 Linux におけるレガシーエミュレーターでの OpenCL カーネルのデバッグ

Linux システムでは インテル FPGA SDK for OpenCL レガシーエミュレーターにOpenCL カーネルをデバッガーで実行しホストアプリケーションの一部としてデバッグするよう指示することができますデバッグのフィーチャーはシームレスなホストとカーネルのデバッグを可能にしますコードのステップ実行ブレークポイントの設定変数の検証および設定を行うことが可能です

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

137

注意 カーネルのデバッグはホストのデバッグから独立していますWindows では Microsoft VisualStudio DebuggerLinux では GDB など既存のツールでホストコードをデバッグしてください

レガシーエミュレーションでのデバッグに向けて OpenCL カーネルをコンパイルするには以下を行います

1 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator) (135 ページ) の説明に従いカーネルをコンパイルしてください

2 ホストアプリケーションを構築しKhronos ICD Loader Library に接続します詳細は ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ) を参照ください

3 ltyour_kernel_filenamegtaocxファイルがホストが特定できる位置にあることを確認します現在の作業ディレクトリーが推奨されます

4 env CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=ltnumber_of_devicesgtgdb --args ltyour_host_program_namegt [lthost_program_argumentsgt]コマンドを呼び出しアプリケーションを実行しますここで ltnumber_of_devicesgt はエミュレーターが提供する必要のある同一のエミュレーションデバイス数です

5 ホストまたはカーネルプログラムを変更した後にテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしデバッガーを再度実行してください

デバッガーでカーネルを実行するには以下を行います

1 プログラムの実行中デバッガーはホストコードからカーネルコードにステップすることはできません次の行を追加し実際にカーネルが呼び出される前にブレークポイントを設定する必要があります

a break ltyour_kernelgt

この行はカーネルの前にブレークポイントを設定します

b continue

ホストのデバッグをまだ開始していない場合は代わりに startを入力します

2 カーネルはホストがカーネルをロードする直前に共有ライブラリーとしてロードされますホストが実際にカーネル関数をロードするまでデバッガーはカーネル名を認識しませんそのためデバッガーは 初のカーネルの実行の前に設定したブレークポイントに対する次の警告を生成します

Function ltyour_kernelgt not defined

Make breakpoint pending on future shared library load (y or[n])

yを返答します 初のプログラムの実行後にデバッガーはセッション中の関数名と変数名および行番号の参照を認識します

注意 レガシーエミュレーターはOpenCL ランタイムにいくつかのエラーの詳細を報告しますエミュレーションではclCreateContext関数でコンテキストを初期化する際にランタイムはデフォルトのプリントアウトコールバックを使用します

関連情報ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)

8 OpenCL カーネルのエミュレーションとデバッグUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

138

9 カーネルの reporthtml ファイルのレビュー

注意 analyze-area インテル FPGA SDK for OpenCL ユーティリティーオプションは廃止されましたカーネルの推定エリア使用率を確認するにはreporthtmlファイルを参照してください

廃止されたエリアレポートに関する参考情報はAltera SDK for OpenCL Best Practices Guideversion 160 の Review Your Kernels Area Report to Identify Inefficiencies in ResourceUsage の章を参照ください

OpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーは面積ループ構造メモリーの使用率カーネルのパイプラインなどカーネルのさまざまな側面を分析する HTML レポートを自動的に生成しますHTML レポートを起動するには ltyour_kernel_filenamegtreportsディレクトリーのreporthtmlファイルを開きます

HTML レポートについての詳細は インテル FPGA SDK for OpenCL ベストプラクティスガイドのカーネルの reporthtml ファイルのレビューの章を参照ください

関連情報bull カーネルの reporthtml ファイルのレビュー

bull Altera SDK for OpenCL Best Practices Guide version 160

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

10 OpenCL カーネルのプロファイリング

インテル FPGA Dynamic Profiler for OpenCL はFPGA での OpenCL カーネル実行中に収集したパフォーマンスデータを測定し報告します インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスカウンターに依存しパフォーマンスデータを収集しますパフォーマンスデータはその後Profiler GUI で確認することができます

1 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) (140 ページ)

2 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report) (141 ページ)

3 自動実行カーネルのプロファイリング (142 ページ)

101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

パフォーマンスカウンターで OpenCL カーネルのパイプラインを測定するにはaocコマンドの-profile=(all|autorun|enqueued)オプションをカーネルをコンパイルする際に含めます

注意 パフォーマンスカウンターで Verilog コードを測定するとハードウェアのリソース使用率が増加 (つまり FPGA のエリア使用率が増加) し通常パフォーマンスが低下します

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

bull ltyour_kernel_filenamegtaocxファイルの Verilog コードをパフォーマンスカウンターで測定するには aoc -profile=(all|autorun|enqueued)ltyour_kernel_filenamegtclコマンドを呼び出します以下に詳細を説明します

mdash all引数は ltyour_kernel_filenamegtclファイルのすべてのカーネルをパフォーマンスカウンターで測定しますこれは引数が指定されていない場合のデフォルトのオプションです

mdash autorun引数は自動実行のカーネルのみをパフォーマンスカウンターで測定します

mdash enqueued引数は自動実行以外のカーネルのみをパフォーマンスカウンターで測定します

注意

mdash 複数の異なるカーネルをプロファイリングする際は異なるaocxファイルに同じカーネル名を使用しないでください同じカーネル名が付けられている場合それらのカーネルのプロファイルデータは正確なものになりません

mdash clGetProfileDataDeviceIntelFPGAホストライブラリー呼び出しへの入力にかかわらず インテル FPGA Dynamic Profiler for OpenCL はコンパイル中に示したカーネルタイプのみをプロファイルします

mdash すべてのカーネルまたはエンキューされたカーネルの OpenCL カーネルパイプラインをパフォーマンスカウンターで測定するとOpenCL ランタイム環境でのハードウェアのカーネル呼び出しキューの使用が無効になりますそのためプロファイルの時間が異なる場合があります

注意

自動実行カーネルをプロファイルするとカウンターに対するハードウェアのオーバーヘッドが発生します大規模なデザインの場合オーバーヘッドによって fmax およびデザイン周波数が低下する可能性がありますまた インテル FPGA Dynamic Profiler for OpenCL がすべてのカーネルをプロファイルするとデザインがチップに収まらなくなる可能性もあります

bull ローカルディスクからホストアプリケーションを実行しltyour_kernel_filenamegtaocxファイルを FPGA で実行しますカーネルの実行中カーネルパイプライン全体のパフォーマンスカウンターはプロファイル情報を収集しますホストは現在の作業ディレクトリーの profilemonモニター記述ファイルにその情報を保存します

注意

ネットワークディスクのアクセスが遅いためネットワークのディレクトリーからホストアプリケーションを実行すると各カーネルの実行に遅れをもたらす可能性がありますこの遅れによりホストアプリケーションの全体的な実行時間が長くなる可能性がありますさらにランタイムがプロファイル出力データをディスクに格納している間にカーネルの起動に遅れが発生する可能性もあります

102 インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report)

インテル FPGA Dynamic Profiler for OpenCL の reportユーティリティーコマンドを使用しプロファイラー GUI を起動することができますプロファイラー GUI ではカーネルの実行中にインテルFPGA Dynamic Profiler for OpenCL が収集するカーネルのパフォーマンスデータの統計情報を確認できます

インテル FPGA Dynamic Profiler for OpenCL はパフォーマンスデータを現在の作業ディレクトリーの profilemonファイルに格納します

bull インテル FPGA Dynamic Profiler for OpenCL GUI を起動するには aocl reportltyour_kernel_filenamegtaocx profilemon[ltyour_kernel_filenamegtsource]ユーティリティーコマンドを呼び出します

重要 コマンドにsourceファイルを指定しない場合 インテル FPGA Dynamic Profiler forOpenCL GUI はソースコードタブを持たなくなります

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

141

103 自動実行カーネルのプロファイリング

自動実行カーネルのプロファイル機能は自動実行カーネルのプロファイルを可能にします

autorun属性でマークされたカーネルは自動実行カーネルと呼ばれますしたがって自動実行カーネルはホストが明示的に他のカーネルを起動する前に自動的に開始され完了すると自動的に再起動しますautorun属性についての詳細はホストとカーネル間の通信ハードウェアの省略を参照ください

自動実行カーネルは終了することがないためホストライブラリー呼び出しのclGetProfileDataDeviceIntelFPGAを呼び出し自動実行のプロファイルデータをキャプチャーする必要がありますホストアプリケーションに指示することでこの呼び出しは実行中の任意のタイミングで行うことができます

注意 自動実行カーネルのプロファイリング機能はグローバルメモリーを使用する自動実行カーネルをサポートしておらずカーネルの個別プロファイリングも行うことができません

関連情報bull ホストとカーネル間の通信ハードウェアの省略 (175 ページ)

bull エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ページ)

bull プロファイルデータの取得 (89 ページ)

bull 複数の自動実行プロファイリング呼び出し (89 ページ)

10 OpenCL カーネルのプロファイリングUG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

142

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発

インテル Code Builder for OpenCL は インテル FPGA SDK for OpenCL の一部として提供されているソフトウェア開発ツールですこのツールは インテル FPGA をターゲットとする一般的に広く利用されている統合開発環境での OpenCL アプリケーションの開発を可能にします

インテル Code Builder for OpenCL はOpenCL によって加速された Windows および Linux アプリケーションの作成構築デバッグ分析を可能にする一連の Microsoft Visual Studio およびEclipse のプラグインを提供します

111 Microsoft Visual Studio に向けた インテル Code Builder forOpenCL オフラインコンパイラープラグインのコンフィグレーション

Microsoft Visual Studio に向けてインテル Code Builder for OpenCL プラグインを有効にするには次の手順を実行します

1 Visual Studio ソフトウェアでProject gt Properties を選択します

2 Project gt Properties gt Code Builder のページでDevice を目的の FPGA デバイスに変更します

3 CC++ gt General プロパティーページの Additional Include Directories にOpenCL コードのヘッダーファイルが配置されているディレクトリーへのフルパスを入力します($(INTELFPGAOCLSDKROOT)include)

4 Linker gt General プロパティーページの Additional Library Directories にOpenCL コードのランタイムインポートライブラリーファイルが配置されているディレクトリーへのフルパスを入力します例えば 64 ビットのアプリケーションには$(INTELFPGAOCLSDKROOT)libx64を追加します

5 Linker gt Input プロパティーページAdditional Dependencies の OpenCL ICD のインポートライブラリーファイル名に OpenCLlibを入力します

112 Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション

Eclipse IDE に向けてインテル Code Builder for OpenCL オフラインコンパイラープラグインを有効にするには次の手順を実行します

1 CodeBuilder_ltversiongtjarプラグインファイルを$INTELFPGAOCLSDKROOTeclipse-plug-inから ltECLIPSE_ROOT_FOLDERgtdropinsへコピーします

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

注意 Linux では$INTELFPGAOCLSDKROOTbinを LD_LIBRARY_PATH環境変数に追加する必要があります

2 Eclipse IDE を実行します

3 Windows gt Preferences を選択します

4 インテル OpenCL ダイアログに切り替えます

5 OpenCL バイナリーのディレクトリーを$INTELFPGAOCLSDKROOTbinに設定します

オフラインコンパイラーのコンフィグレーションが完了するとCode-Builder メニューを使用し次の基本的な操作を実行できます

bull 新しいセッションの作成

bull 既存のセッションを開く

bull セッションの保存

bull セッションの構築

bull セッションのコンパイル

bull セッションのコンフィグレーション

インテル Code Builder for OpenCL に関する詳細はDeveloper Guide for Intel SDK forOpenCL Applications を参照くださいMicrosoft Visual Studio に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Microsoft Visual Studio を参照くださいEclipse に向けたインテル CodeBuilder for OpenCL のコンフィグレーション方法についてはIntel Code Builder forOpenCL API for Eclipse を参照ください

関連情報bull Developer Guide for Intel SDK for OpenCL Applications

bull Intel Code Builder for OpenCL API for Microsoft Visual Studio

bull Intel Code Builder for OpenCL API for Eclipse

113 インテル Code Builder for OpenCL でのセッションの作成

インテル Code Builder for OpenCL でセッションを作成するには次の手順を実行します

1 Code-Builder gt OpenCL Kernel Development gt New Session を選択します

2 セッション名セッションファイルを格納するフォルダーへのパスおよびセッションのコンテンツを指定します (空のセッションまたは事前に定義された OpenCL コードを持つセッションのどちらか)

3 Done をクリックします

セッションが作成されると新しいセッションが Code Builder Sessions Explorer ビューに表示されます

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

144

図 -16 Code Builder Session Explorer

注意 Code Builder Session Explorer ビューが表示されない場合はCode-builder gt OpenCLKernel Development gt Windows gt Code Builder Session Explorer を選択します

114 セッションのコンフィグレーション

コンフィグレーションとは割り当てられた変数反復回数特定のカーネルのグローバルサイズとローカルサイズなどの一連の分析の入力です分析が必要な入力のセットごとに個別のコンフィグレーションを作成することができます

Code Builder Session Explorer のセッションを右クリックし Session Options を選択するとセッションをコンフィグレーションできますあるいはCode-Builder gt OpenCL KernelDevelopment gt Session Options を選択するとSession Settings ダイアログボックスを開くことができます

Session Settings ダイアログボックスでは次の内容をコンフィグレーションすることができます

bull ターゲットマシンOpenCL プラットフォームOpenCL デバイスなどのデバイスオプション

bull オフラインコンパイラーフラグやビルドアーキテクチャーなどのビルドオプション

bull aocxおよびaocoファイルなどのビルドアーティファクトや静的レポート

bull ジョブアーキテクチャーやネットワーク設定などの一般的なオプション

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

145

Device Options タブの OpenCL platform ドロップダウンリストから インテル FPGA SDKfor OpenCL を選択していることを確認してください

Build Options タブの OpenCL Build Options セクションに インテル FPGA SDK forOpenCL オフラインコンパイラーフラグを手動で入力します

注意 カーネルにチャネルがある場合ワークフローをコンフィグレーションする必要がありますワークフローは一連のカーネルであり連続して実行することができますワークフローはあるカーネルの入力が前のカーネルの出力と接続しているチャネルでワークロードを実行するために使用できます (両方のカーネルに同じ変数を割り当てる必要があります)

セッションのコンフィグレーションと変数管理についてはDeveloper Guide for Intel SDK forOpenCL Applications を参照ください

関連情報bull Configuring a Session in Microsoft Visual Studio

bull Configurations and Settings in Eclipse

bull Variable Management in Microsoft Visual Studio

bull Variable Management in Eclipse

11 インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの開発UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

146

12 インテル FPGA SDK for OpenCL のアドバンスト機能

インテル FPGA SDK for OpenCL が提供するアドバンスト機能を使用しデザインアーキテクチャーの以下の側面および インテル FPGA SDK for OpenCL オフラインコンパイラーの動作を制御することができます

121 OpenCL ライブラリー

OpenCL ライブラリーは複数の機能を含む単一のファイルです各機能は任意のクロック周波数で動作するデータ処理ロジックで構成されています OpenCL ライブラリーはOpenCL あるいはレジスター転送レベル (RTL) で作成できますこのライブラリーファイルをインクルードしOpenCL カーネル内の関数を使用することができます

図 -17 インテル FPGA SDK for OpenCL のライブラリーサポートの概要

OpenCL

Verilog

VHDL OpenCL Kernel

OpenCL LibraryIntel FPGA SDK for OpenCL

Offline CompilerOffline Compiler

Executable File (aocx)

以前に作成したライブラリーを使用することも独自のライブラリーを作成することも可能ですOpenCL ライブラリーの使用にあたりハードウェアデザインやライブラリーコンポーネントの実装に関する詳細な知識は必要ありませんOpenCL ライブラリーを作成するには次のファイルとコンポーネントを作成する必要があります

表 4 OpenCL ライブラリーの作成に必要なファイルとコンポーネント

ファイルまたはコンポーネント 説明

RTL コンポーネント

RTL ソースファイル RTL コンポーネントを定義する VerilogSystem VerilogまたはVHDL ファイルですインテル Quartus Prime IP ファイル (qip)SDC ファイル(sdc)Tcl Script ファイル (tcl) などの付加的なファイルは使用することができません

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ファイルまたはコンポーネント 説明

eXtensible Markup Language ファイル (xml) RTL コンポーネントのプロパティーを記述します インテル FPGASDK for OpenCL オフラインコンパイラーはこれらのプロパティーを使用し RTL コンポーネントを OpenCL パイプラインに統合します

ヘッダーファイル (h) RTL コンポーネントにより実装される関数のシグニチャーを宣言するCスタイルのヘッダーファイルです

OpenCL エミュレーションモデルファイル (cl) エミュレーションでのみ使用される RTL コンポーネントの C モデルを提供しますハードウェアのフルコンパイルには RTL ソースファイルを使用します

OpenCL の機能

OpenCL ソースファイル (cl) OpenCL 関数の定義を含んでいますこれらの関数はエミュレーションおよびハードウェアのフルコンパイルの際に使用されます

ヘッダーファイル (h) OpenCL ソースファイルで定義される関数のシグネチャーを宣言する Cスタイルのヘッダーファイルです

注意 RTL と OpenCL ライブラリー関数に使用されるヘッダーファイルに違いはありません単一のヘッダーファイルで両方の関数の型を宣言することができます単一のライブラリーにRTL と OpenCL のライブラリーの関数をどちらも含めることができます

RTL モジュールと OpenCL パイプラインの理解 (148 ページ)

OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化 (161 ページ)

OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化 (162 ページ)

RTL モジュールの検証 (164 ページ)

複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ)

シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ)

OpenCL ライブラリーのコマンドラインオプション (170 ページ)

関連情報OpenCL ライブラリーのコマンドラインオプション (170 ページ)

1211 RTL モジュールと OpenCL パイプラインの理解

OpenCL のライブラリー機能によりVerilogSystemVerilogVHDL で記述された RTL モジュールを OpenCL カーネルで使用することができます この章では インテル FPGA SDK for OpenCL オフラインコンパイラーがRTL モジュールをインテル FPGA SDK for OpenCL パイプラインアーキテクチャーに統合する方法の概要を説明します

次の状況において RTL モジュールを使用してください

bull 適化および検証がされた RTL モジュールをOpenCL 関数として書き直すことなく OpenCL カーネルで使用する場合

bull OpenCL で効果的に表現できない OpenCL カーネル機能を実装する必要がある場合

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

148

12111 インテル FPGA SDK for OpenCL パイプラインのアプローチの概要

次の図はインテル FPGA SDK for OpenCL パイプラインのアーキテクチャーを表しています

図 -18 インテル FPGA SDK for OpenCL パイプラインステージの並列実行モデル右側の動作は左側の OpenCL カーネルコードにおける SDK のパイプライン実装を表しています黄色の各ボックスはパイプラインにある動作またはデータの値です各動作に付けられている数字はパイプラインのスレッド数を表します

Load A Load B

Add

Store C

global ID (gid)

gid

gid

2

1

0

2 2

3

1

void kernel pe (global int A global int B global int C) int gid = get_global_id(0)

int a = A[gid] int b = B[gid]

C[gid] = a + b

各レベルの動作がパイプラインの 1 ステージであると仮定します各ステージにおいてインテル FPGASDK for OpenCL はそのステージに存在するスレッドに基づきすべての動作を並列で実行します例えばスレッド 2 では Load ALoad B を実行し現在のグローバル ID を (gidを介し) 次のパイプラインステージにコピーしますRISC (縮小命令セットコンピューター) プロセッサーでのパイプライン化された命令の実行と同様SDK のパイプラインステージもまた並列して実行を行いますステージの実行がすべて完了しなければスレッドは次のパイプラインステージに進みません

Add

oready

iready

ivalid

ovalid

一部の動作ではインテル FPGA SDK for OpenCL パイプラインをストールさせることができます例えばメモリーのロードやストア動作のような可変レイテンシー動作などがそれにあたりますストールをサポートするにはready 信号と valid 信号をパイプライン全体に伝播しオフラインコンパイラーがパイプラインステージをスケジュールできるようにしますただしすべての動作のレイテンシーが固定されている場合ready 信号は必要ありませんこのような場合オフラインコンパイラーはパイプラインを 適化し静的に動作をスケジュールするためパイプラインの実装に必要なロジックが大幅に削減されます

12112 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合

カーネルのコンパイル中に OpenCL ライブラリーを指定するとオフラインコンパイラーはライブラリーの RTL モジュールをパイプライン全体に統合します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

149

図 -19 RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合この図はRTL モジュール myModを図 18 (149 ページ) のパイプラインへ統合しているものです

Load A Load B

myMod

Store C

gid

gid

gid

4

3

0

4 4

5

3

myMod

oready

iready

ivalid

ovalid

extern int myMod(int int)void kernel pe(global int A global int B global int C)

int gid = get_global_id(0) int a = A[gid] int b = B[gid] C[gid] = myMod(a b)

2

1

gid2

gid1

3 cycles

示されている RTL モジュールはバランスの取れたレイテンシーを有しRTL モジュールのスレッドはパイプラインのステージ数と一致していますレイテンシーのバランスが取れているためRTL モジュールのスレッドは SDK のパイプラインをストールさせることなく実行することができます

RTL の仕様ファイルで RTL モジュールのレイテンシーを設定するとオフラインコンパイラーはパイプラインのレイテンシーのバランスを取ることができるようになります RTL は Avalontrade Streaming(Avalontrade -ST) インターフェイスをサポートしているためRTL モジュールのレイテンシシーは可変です (つまり固定ではありません)ただし性能を 大限に上げるためにはレイテンシーの変動は小さくなければなりませんさらにレイテンシーを ltRTL module description filenamegtxml仕様ファイルで指定するとRTL モジュールは安定状態で実際のレイテンシーの適切な概算を得られるようになります

関連情報bull Avalon Interface Specifications

bull Pipelined Read Transfer with Variable Latency

bull Pipelined Read Transfers with Fixed Latency

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ)

bull RTL モジュールの XML 構文 (154 ページ)

12113 ストールのない RTL

インテル FPGA SDK for OpenCL オフラインコンパイラーではレイテンシーを固定し RTL モジュール周辺のストールロジックを削除することによりハードウェアのリソース使用率とパフォーマンスを適化できます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

150

可変レイテンシーを持ちAvalon-ST の入出力信号を使用する RTL モジュールは入力データの準備が整うまで待機します一方インテル FPGA SDK for OpenCL パイプラインはRTL モジュールからの有効な出力データを受け取るまでストールします固定レイテンシーを有する RTL モジュールではltRTL module description file namegtxml仕様ファイルを次の記述のように変更することでRTL のストールを削除することができます

1 可能な場合に RTL モジュール周囲のストールロジックを削除するようオフラインコンパイラーに指示するにはFUNCTION要素の IS_STALL_FREE属性をyesに設定します

この変更はRTL モジュールが EXPECTED_LATENCYサイクルごとに有効なデータを生成することをオフラインコンパイラーに通知します

注意 EXPECTED_LATENCYはFUNCTION要素のxmlファイルで指定する属性です

2 レイテンシーがモジュールのパイプラインステージ数に等しくなるよう EXPECTED_LATENCYの値を指定します

注意 不正確な EXPECTED_LATENCYの値を指定するとRTL モジュールがパイプラインの他の部分と同期しなくなります

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを通して無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールではivalid=0入力の処理に注意する必要があります

12114 RTL モジュールインターフェイス

RTL モジュールが他のコンパイラーによって生成された動作と適切に通信するにはRTL モジュールの入力および出力の両方において単純化された Avalon-ST インターフェイスをサポートする必要があります

次の図は図 19 (150 ページ) で示されている RTL モジュール myModの 終的なインターフェイスを表しています

Upstream module

Downstream module

oready ivalid A B

iready ovalid C

myMod

この図において myModはABのデータ信号や ivalid (入力) および oready (出力) のコントロール信号を介しアップストリームのモジュールと通信していますivalidコントロール信号はデータ信号 Aおよびデータ信号 Bが有効なデータを含む場合のみ1に等しくなります (ivalid =1)コントロール信号 oreadyが 1 に等しくなると (oready = 1)データ信号 Aと Bが有効であれば (ivalid = 1)myMod RTL モジュールはそれらの信号の処理を行うことができることを示しますivalid = 1で oready = 0の場合アップストリームのモジュールは次のクロックサイクルで ivalidAおよび Bの値を保持すると考えられます

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

151

myModはデータ信号 Cおよびコントロール信号の ovalid (出力) と iready (入力) を介しダウンストリームのモジュールと通信しますovalidコントロール信号はデータ信号 Cが有効なデータを含む場合にのみ1に等しくなります (ovalid = 1)ireadyコントロール信号が 1に等しくなると (ivalid = 1)データ信号 Cが有効であればダウンストリームのモジュールは処理が可能なことを示しますovalid = 1で iready = 0の場合myMod RLT モジュールは次のクロックサイクルで ovalidと C信号の有効性を保持すると考えられます

myModモジュールはoreadyを 1 クロックサイクル間アサートしアクティブサイクルに向け準備が整っていることを示しますmyModモジュールのデータの準備ができているサイクルをレディーサイクルと呼びますレディーサイクル中myModモジュールの上にあるモジュールはivalidをアサートし myModにデータを送信することができます

バックプレッシャー下でのデータ転送に関する詳細な説明はAvalon Interface Specifications のData Transfer with Backpressureを参照くださいレディーレイテンシーに関する情報は参考にしないでください

関連情報Data Transfer with Backpressure

12115 Avalon Streaming (Avalon-ST) インターフェイス

オフラインコンパイラーは入力と出力の両方において RTL モジュールがreadyLatency = 0の Avalon-ST インターフェイスをサポートすることを想定しています

図 19 (150 ページ) で示されているようにRTL モジュールには 4 つのポートがなければなりません

bull Avalon-ST インターフェイス入力の ivalidと iready

bull Avalon-ST インターフェイス出力の ovalidと oready

次にバックプレッシャーでの入力データ転送のタイミング図を示していますAvalon-ST インターフェイスに関する詳細はAvalon Interface Specifications の Avalon Streaming Interfaces の章を参照ください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

152

固定レイテンシーを持つ RTL モジュールの場合出力信号 (ovalidと oready) は一定の高い値を持つことができ入力レディー信号 (iready) は無視することができます

ストールのない RTL モジュールは無効な (ivalidが Low の) 入力信号を受け取る可能性がありますこの場合モジュールは入力を無視し出力に無効なデータを生成しますストールのない RTL モジュールに内部状態がない場合モジュールを介し無効な入力を伝播するほうが容易な場合がありますただし内部状態を持つ RTL モジュールにおいてはivalid = 0入力の処理に注意する必要があります

12116 RTL リセットおよびクロック信号

RTL モジュールのリセットおよびクロックはOpenCL パイプラインの他の部分と同じクロックおよびリセットドライバーに接続されています

共通のクロックドライバーとリセットドライバーであるためRTL モジュールは OpenCL カーネルと同じクロックドメインで動作しますモジュールは インテル FPGA SDK for OpenCL の programユーティリティーまたは clCreateProgramwithBinaryホスト関数でOpenCL カーネルが 初に FPGA にロードされた際にのみリセットされますつまりホストがカーネルを連続するclEnqueueNDRangeKernelまたは clEnqueueTask呼び出しで再起動した場合関連するRTL モジュールはこの再起動時にリセットされません

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

153

カーネルのクロック周波数を設定する過程を次に説明します

1 インテル Quartus Prime ソフトウェアのフィッターはカーネルクロックに積極的な制約を適用します

2 インテル Quartus Prime ソフトウェアのタイミングアナライザーは静的なタイミング解析を実行しフィッターが実際に達成する周波数を決定します

3 カーネルのクロックを駆動するフェーズロックループ (PLL) は上記 2 で決定された周波数をカーネルのクロック周波数に設定します

オプションにより RTL モジュールはOpenCL カーネルクロックの 2 倍の周波数で動作するシステム全体のクロックにアクセスできますこのシステム全体のクロックを RTL モジュールの入力信号に接続するにはAVALON要素のタイプ clock2xを含めますこの 2 つのクロックは定義された位相関係を持ちません

121161 ストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテル Stratix10 デザイン固有のリセット要件

インテル Stratix 10 OpenCL デザインに RLT モジュールを作成する際は特定のロジックリセット要件を満たしていることを確認してください

ストールのない RTL モジュールのリセット要件

ストールのない RTL モジュールはレイテンシーが固定されたモジュールであり インテル FPGA SDKfor OpenCL オフラインコンパイラーはストールロジックを削除し 適化することができます

bull インテル Stratix 10 のデザインに向けストールのない RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールのない RTL モジュールに対するリセットシグナルのディアサート後モジュールは 15 クロックサイクル以内に動作可能でなければなりませんリセット信号がモジュール内でパイプライン化されている場合この要件はリセットのパイプライン化を 15 ステージ以下に制限します

ストールをサポートする RTL モジュールのリセット要件

ストールをサポートする RTL モジュールは可変レイテンシーを持ち正確に機能するためにバックプレッシャー入力および出力インターフェイスに依存します

bull インテル Stratix 10 デザインにストールをサポートする RTL モジュールを作成する際は同期クリアー信号のみを使用してください

bull ストールをサポートする RTL モジュールにリセット信号をアサートした後モジュールは oreadyおよび ovalidインターフェイス信号を 40 クロックサイクル内にディアサートしなければなりません

bull ストールをサポートする RTL モジュールにリセット信号をディアサートした後モジュールは 40 クロックサイクル以内に完全に動作可能になる必要がありますモジュールは準備が完了したことを oreadyインターフェイス信号をアサートし知らせます

関連情報ストールのない RTL (150 ページ)

12117 RTL モジュールの XML 構文

この章では倍精度平方根関数を実装する RTL モジュールのシンプルな XML 仕様ファイルの構文を提供しますRTL モジュールはVerilog ラッパーで VHDL に実装されています

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

154

次の XML 仕様ファイルはOpenCL のヘルパー関数 my_sqrtfdを実装する RTL モジュールmy_fp_sqrt_doubleのものです (どちらの名前もライン 2 にあります)

1 ltRTL_SPECgt 2 ltFUNCTION name=my_sqrtfd module=my_fp_sqrt_doublegt 3 ltATTRIBUTESgt 4 ltIS_STALL_FREE value=yesgt 5 ltIS_FIXED_LATENCY value=yesgt 6 ltEXPECTED_LATENCY value=31gt 7 ltCAPACITY value=1gt 8 ltHAS_SIDE_EFFECTS value=nogt 9 ltALLOW_MERGING value=yesgt 10 ltATTRIBUTESgt 11 ltINTERFACEgt 12 ltAVALON port=clock type=clockgt 13 ltAVALON port=resetn type=resetngt 14 ltAVALON port=ivalid type=ivalidgt 15 ltAVALON port=iready type=ireadygt 16 ltAVALON port=ovalid type=ovalidgt 17 ltAVALON port=oready type=oreadygt 18 ltINPUT port=datain width=64gt 19 ltOUTPUT port=dataout width=64gt 20 ltINTERFACEgt 21 ltC_MODELgt 22 ltFILE name=c_modelcl gt 23 ltC_MODELgt 24 ltREQUIREMENTSgt 25 ltFILE name=my_fp_sqrt_double_s5v gt 26 ltFILE name=fp_sqrt_double_s5vhd gt 27 ltREQUIREMENTSgt 28 ltRESOURCESgt 29 ltALUTS value=2057gt 30 ltFFS value=3098gt 31 ltRAMS value=15gt 32 ltMLABS value=43gt 33 ltDSPS value=15gt 34 ltRESOURCESgt 35 ltFUNCTIONgt 36 ltRTL_SPECgt

表 5 XML 仕様ファイルにおける要素と属性

XML 要素 説明

RTL_SPEC XML 仕様ファイルにおける 上位の要素ですこのような 上位の要素はファイルに 1 つしか存在できません

FUNCTION RTL モジュールが実装する OpenCL 関数を定義する要素ですFUNCTION要素の name属性は関数の名前を指定しますOpenCL カーネルから呼び出すことのできる異なる関数を宣言する複数の FUNCTION要素を持つことが可能です異なるパラメーターを指定することで同じ RTL モジュールに複数の関数を実装できます

ATTRIBUTES RTL モジュールのさまざまな特性 (レイテンシーなど) を記述する他の XML 要素を含む要素です例にある RTL モジュールは32 の値を持つ WIDTHという PARAMETER設定を 1 つ取りますその他の ATTRIBUTES固有の要素に関しては表 6 (156 ページ) を参照ください

注意

異なるモジュールに複数の OpenCL ヘルパー関数を作成する場合や異なるPARAMETER設定で同じ RTL モジュールを使用する場合は関数ごとに個別のFUNCTION要素を作成する必要があります

INTERFACE RTL モジュールのインターフェイスを記述する他の XML 要素を含む要素です例にある XML仕様ファイルではすべての RTL モジュールが提供する必要のある Avalon-ST インターフェイス信号 (clockresetnivalidireadyovalidoready) を示していますこの信号名はxmlファイルで指定する名前と一致している必要があります信号名が一致しない場合ライブラリー作成時にエラーが発生します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

155

XML 要素 説明

C_MODEL 関数に OpenCL C モデルを実装する 1 つ以上のファイルを指定する要素ですモデルはエミュレーション時にのみ使用されますただしC_MODEL要素と関連するファイルはライブラリーファイル作成時に存在している必要があります

REQUIREMENTS 1 つ以上の RTL リソースファイル (vsvvhdhexmif) を指定する要素ですこれらのファイルに指定されたパスはXML 仕様ファイルの位置に対応します各 RTL リソースファイルはOpenCL システム全体に対応する関連するプラットフォームデザイナーコンポーネントの一部になります注意

インテル FPGA SDK for OpenCL ライブラリー機能はqipファイルをサポートしませんサポートされていないリソースファイルタイプを含むライブラリーを使用しOpenCL カーネルをコンパイルすると インテル FPGA SDK for OpenCL オフラインコンパイラーのエラーが発生します

 

RESOURCES RTL モジュールが使用する FPGA リソースを指定するオプションの要素ですこの要素を指定しない場合RTL モジュールが使用する FPGA リソースはデフォルトのゼロになります

121171 ATTRIBUTES を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの特性を設定するために指定できる XML 要素が ATTRIBUTESにあります

表 6 RTL モジュールの XML 仕様ファイルにおける ATTRIBUTES 要素に関連する XML 要素

注意 IS_STALL_FREEおよび EXPECTED_LATENCYを除きすべての要素には安全な値があります属性に指定する値に確信がない場合は安全な値を設定してください安全な値を使用するライブラリーでカーネルをコンパイルすると機能的なハードウェアをもたらしますただしハードウェアは実際のサイズよりも大きい場合があります

XML 要素 説明

IS_STALL_FREE インテル FPGA SDK for OpenCL オフラインコンパイラーにRTL モジュール周囲のすべてのストールロジックを削除するように指示しますIS_STALL_FREEをyesに設定しモジュールでストールを生成しないことおよび受信ストールの適切な処理ができないことを示しますモジュールはストールの入力を単純に無視しますIS_STALL_FREEをnoに設定する場合モジュールはストールおよび有効な信号をすべて適切に処理する必要があります

注意 IS_STALL_FREEをyesに設定する際はIS_FIXED_LATENCYもyesに設定する必要がありますまたRTL モジュールが内部状態がを持つ場合ivalid=0入力を適切に処理する必要があります

不正な IS_STALL_FREEを設定するとハードウェに不正確な結果をもたらします

IS_FIXED_LATENCY RTL モジュールのレイテンシーが固定されているかどうかを示しますRTL モジュールが常に既知のクロックサイクル数で出力を計算する場合はIS_FIXED_LATENCYをyesrdquoに設定しますEXPECTED_LATENCY要素に指定する値はクロックサイクル数を指定しますIS_FIXED_LATENCYの安全な値はnordquoですIS_FIXED_LATENCY=noを設定する際にEXPECTED_LATENCYの値は少なくとも 1 でなければなりません

注意

特定のモジュールではIS_FIXED_LATENCYをyesにしIS_STALL_FREEをnoに設定することができますこのようなモジュールは固定のクロックサイクル数で出力を生成しストール信号を適切に処理します

EXPECTED_LATENCY RTL モジュールの予想されるレイテンシーを指定しますIS_FIXED_LATENCYをyesに設定するとEXPECTED_LATENCYの値はモジュールにあるパイプラインのステージ数を示しますこの場合この値はモジュールの正確なレイテンシーに設定する必要があります正確に設定されていない場合オフラインコンパイラーは不正確なハードウェアを生成しますレイテンシーが可変のモジュールにおいてはオフラインコンパイラーはこのモジュール周辺のパイプラインを指定した EXPECTED_LATENCYの値でバランスを取りますストールをサポートしireadyなどの信号を必要とするモジュールにおいてはEXPECTED_LATENCYの値は 低でも 1 に設定する必要があります指定した値と実際のレイテンシーは異なることがありパイプラインのストール数に影響を与える場合があります ただし生成されるハードウェアは正しいものです

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

156

XML 要素 説明

CAPACITY このモジュールが同時に処理できる複数の入力の数を指定しますIS_STALL_FREE=noおよびIS_FIXED_LATENCY=noも設定する場合はCAPACITYの値を指定する必要がありますそれ以外の場合は CAPACITYの値を指定する必要はありませんCAPACITYが EXPECTED_LATENCYよりもわずかでも小さい場合オフラインコンパイラーは必要に応じて容量のバランスをとる FIFO バッファーをこのモジュールの後に自動的に挿入しますCAPACITYの安全な値は 1です

HAS_SIDE_EFFECTS RTL モジュールに副作用があるかどうかを示します内部状態のあるモジュールや外部メモリーと通信するモジュールは副作用をともなうモジュールの例になりますHAS_SIDE_EFFECTSをyesに設定しモジュールに副作用があることを示しますHAS_SIDE_EFFECTSをyesに指定すると 適化を行う際に副作用のあるモジュールへの呼び出しは削除されません副作用がありストールのないモジュール (IS_STALL_FREE=yesでありHAS_SIDE_EFFECTS=yesのモジュール) は無効なデータを受け取る可能性があるためivalid=0の入力を適切に処理する必要がありますHAS_SIDE_EFFECTSの安全な値はyesです

ALLOW_MERGING オフラインコンパイラーにRTL モジュールの複数のインスタンスをマージするよう指示しますALLOW_MERGINGをyesに設定しモジュールの複数のインスタンスのマージを可能にしますインテルではALLOW_MERGINGをyesに設定することを推奨していますALLOW_MERGINGの安全な値はnoです

注意 HAS_SIDE_EFFECTS=yesでモジュールをマークしてもマージを防ぐことはできません

PARAMETER RTL モジュールのパラメーター値を指定しますPARAMETERの属性bull namemdashRTL モジュールのパラメーター名を指定しますbull valuemdashパラメーターに 10 進数の値を指定しますbull typemdashシステムパラメーターにRTL モジュールのパラメーター値として使用される値を指定します次

のシステムパラメーター名を type属性で使用できますmdash bspaddresswidthmdashボードサポートパッケージの OpenCL グローバルメモリーにコンフィグレ

ーションされたメモリー範囲のアドレスを指定するために必要なAvalon メモリーバス幅を指定します

注意 RTL モジュールのパラメーター値はvalue属性または type属性を使用し指定できます

121172 INTERFACE を指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはRTL モジュールのインターフェイスの側面を指定するために定義できる XML 要素が INTERFACEにあります(Avalon-ST インターフェイスなど)

表 7 RTL モジュール XML 仕様ファイルの INTERFACE 要素に関連のある必須 XML 要素

XML 要素 説明

INPUT RTL モジュールの入力パラメーターを指定しますINPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

AOCL はOpenCL のデータ型に対応する幅のみをサポートしますつまり 8 (uchar)1632641282565121024 (long16) ビットのみをサポートします

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力パラメーターは連結されて入力ストリームを形成します構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

出力 RTL モジュールの出力パラメーターを指定します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

157

XML 要素 説明

OUTPUT属性bull portmdashRTL モジュールのポート名を指定しますbull widthmdashポート幅をビットで指定します

SDK はOpenCL のデータ型に対応する幅のみをサポートしますつまり8 (uchar)1632641282565121024 (long16) ビットのみのサポートです

注意 type3 ベクトルのサイズは 4 x sizeof(type) のため有効サイズの 244896192 ビットはサポートされていないという印象を与えます

入力ストリームからの戻り値は出力ストリームの出力パラメーターを介し送信されます構造体や配列などの集約データ構造は入力パラメーターとしてサポートされていません

RTL モジュールが外部メモリーと通信する場合はXML 要素を追加し含める必要があります

ltMEM_INPUT port=m_input_A access=readonlygtltMEM_INPUT port=m_input_sum access =readwritegtltAVALON_MEM port=avm_port0 width=512 burstwidth=5 optype=read buffer_location=gt

表 8 外部メモリーアクセスをサポートするために追加する XML 要素

XML 要素 説明

MEM_INPUT RTL モジュールへのポインター入力を記述しますMEM_INPUT属性bull portmdashポインター入力の名前を指定しますbull accessmdashRTL モジュールにおけるこのポインターの使用方法をインテル FPGA SDK

for OpenCL オフラインコンパイラーに指定します有効なアクセスの値はreadonlyと readwrite ですRTL モジュールがこのポインターでのみ書き込む場合はreadwriteを accessに割り当てます

外部メモリーへのポインターはすべて 64 ビットである必要があるためMEM_INPUTに関連付けられる width属性はありません

AVALON_MEM RTL モジュールの Avalon-MM インターフェイスを宣言しますAVALON_MEM属性bull portmdashRTL モジュールの対応するポート名のルートを指定します例えば port が

avm_port0_の値を持っている場合RTL モジュールの Avalon-MM インターフェイスのポート名はすべてavm_port0_で始まります

bull width mdash デ ー タ幅 を指定 し ま す こ の 値は ア ク セ ラ レ ー タ ー ボ ー ド のboard_specxml ファイルの対応する幅の値と一致している必要がありますboard_specxml ファイルでは幅の値は global_mem の interface要素で指定されています詳細は インテル FPGA SDK for OpenCL カスタムプラットフォームツールキットユーザーガイドの Board_specxml ファイル内の XML 要素属性およびパラメーターにある global_mem の章を参照ください

bull burstwidthmdashバーストサイズを表すために必要なビット数を指定します burstwidth = log(maxburst) +1 を使用しバーストサイズを計算しますこのmaxburstはboard_specxmlファイルで指定された対応する 大バーストサイズです例えば maxburst=16 の場合burstwidth=5 です

bull optypemdash Avalon-MM ポートが外部メモリーから読み取り (read) を行うか書き込み(write) を行うかを指定しますoptypeには readまたは writeのいずれかしか割り当てることができません

bull Buffer_locationmdash異種メモリーをサポートします異種メモリーコンパイルフローは現在検証されていないためこの属性は空白のままにしてください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

158

上のコード例で定義された AVALON_MEM要素に対応する RTL モジュールポートは次のようになります

output avm_port0_enableinput [5110] avm_port0_readdatainput avm_port0_readdatavalidinput avm_port0_waitrequestoutput [310] avm_port0_addressoutput avm_port0_readoutput avm_port0_writeinput avm_port0_writeackoutput [5110] avm_port0_writedataoutput [630] avm_port0_byteenableoutput [40] avm_port0_burstcount

MEM_INPUTで指定するポインターと AVALON_MEMで指定する Avalon-MM インターフェイス間に想定の関係はありませんRTL モジュールは 1 つのポインターを使用し0 から複数の Avalon-MMインターフェイスのアドレスを指定することができます

関連情報Board_specxml ファイル内の XML 要素属性およびパラメーター

121173 リソースを指定する XML 要素

インテル FPGA SDK for OpenCL ライブラリーの RTL モジュール XML 仕様ファイルにはモジュールの FPGA リソース使用率を指定するために定義できるオプションの要素が RESOURCESにあります特定の要素を指定しない場合はデフォルト値のゼロになります

表 9 RTL モジュールの XML 仕様ファイルの RESOURCES 要素に関連する XML 要素

XML 要素 説明

ALUTS モジュールが使用する組み合わせ対応可能なルックアップテーブル (ALUT) の数を指定します

FFS モジュールが使用する専用のロジックレジスター数を指定します

RAMS モジュールが使用するブロック RAM の数を指定します

DSPS モジュールが使用するデジタル信号処理 (DSP) ブロックの数を指定します

MLABS モジュールが使用するメモリーロジックアレイ (MLAB) の数を指定します各 MLAB は 10の ALM を消費するためこの値はメモリーに使用される ALM (アダプティブロジックモード)の数を 10 で割った値に等しくなります

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

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

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

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

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

159

表 10 外部メモリーと通信する RTL モジュールのコード例

複雑な RTL モジュール 簡潔化された RTL モジュール

my_rtl_fn does out_ptr[idx] = fn(in_ptr[idx])my_rtl_fn (in_ptr out_ptridx)

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 forOpenCL オフラインコンパイラーにおいて非常に控えめなポインター分析が行われます

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

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

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

bull RTL モジュールがポインターへ書き込む場合OpenCL カーネルの他の部分はこのポインターに対する読み書きはできません

bull RTL モジュールがポインターから読み取る場合OpenCL カーネルの他の部分および他の RTL モジュールもまたこのポインターから読み取ることができます

bull MEM_INPUT属性の accessフィールドを設定することでRTL モジュールのメモリーポインターの使用方法を指定できます値を検証する方法がないためアクセスを行うための値が正しく設定されていることを確認してください

12119 RTL モジュールに入るスレッドの順序

RTL モジュールに入るスレッドが定義された順序に従うと想定しないでくださいさらにRTL モジュールはスレッドを並べ替えることができますよってスレッド 0 がスレッド 1 の前にモジュールに入るとは限りません

121110 RTL モジュールの OpenCL C モデル

OpenCL ライブラリーの各 RTL モジュールにはOpenCL C モデルが必要ですOpenCL C モデルはエミュレーション時に OpenCL システム全体を検証します

平方根関数の OpenCL C モデルファイル例

double my_sqrtfd (double a) return sqrt(a)

インテルではOpenCL システムをエミュレーションすることを推奨していますOpenCL システムをエミュレーションしない場合はXML 仕様ファイルで指定した関数名と一致する名前の空の関数を作成してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

160

関連情報RTL モジュールの XML 構文 (154 ページ)

121111 RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

RTL モジュールを使用し OpenCL ライブラリーを作成するとパーシャルリコンフィグレーションに関係する問題が発生する場合があります

パーシャルリコンフィグレーション (PR) をサポートしていないデバイスでライブラリーを作成し検証した後にライブラリーのユーザーがライブラリーの RTL モジュールを PR 領域で使用するとPR 後にモジュールが正しく機能しない可能性があります

PR を使用するデバイスで RTL モジュールを正しく機能させるため次の内容を確認してください

bull RTL モジュールは初期化されたコンテンツのメモリーロジックアレイブロック (MLAB) を使用していないこと

bull RTL モジュールはロジックのパワーアップ値に関していかなる仮定もしていないこと

PR コーディングの完全なガイドラインに関してはインテル Quartus Prime プロエディション ユーザーガイドパーシャルリコンフィグレーションのパーシャルリコンフィグレーションデザインの作成を参照ください

1212 OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

OpenCL ライブラリーファイルを作成する前にヘルパー関数を持つ各 OpenCL ソースファイルをaocoファイルにパッケージ化しますRTL モジュールとは異なりXML 仕様ファイルを作成する必要はありません

OpenCL で書かれたヘルパー関数を共有するためのライブラリーは通常作成する必要はありません例えば ltshared_filegtclなどのソース形式でヘルパー関数を配布しincludeltshared_filegtcl行を OpenCL カーネルのソースコードに挿入することができます

次のような状況においてライブラリーを作成することを検討ください

bull ヘルパー関数が複数のファイルにあり配布を簡素化する必要がある

bull ヘルパー関数のソースコードの公開を望まない

ヘルパー関数はアセンブリー言語のような LLVM IR として関連するライブラリーにコメントなしで格納されます

aocoファイルの作成にハードウェアの生成は必要ありません-cオフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

注意 ライブラリーには OpenCL ヘルパー関数のみを含むことができますライブラリーが OpenCL カーネルを含んでいる場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはエラーメッセージを発行します

bull OpenCL ソースファイルをaocoファイルにパッケージ化するには次のコマンドを呼び出します aoc -c -shared ltOpenCL_source_file_namegtcl -oltOpenCL_object_file_namegtaoco

このオフラインコンパイラーコマンドオプション-sharedはOpenCL ライブラリーに含むために適したaocoファイルの作成をコンパイラーに指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

161

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

1213 OpenCL ライブラリーに向けた RTL コンポーネントのパッケージ化

OpenCL ライブラリーファイルを作成する前に各 RTL コンポーネントをaocoファイルにパッケージ化します

aocoファイルの作成においてハードウェアの生成は必要ありません-c インテル FPGA SDK forOpenCL オフラインコンパイラーコマンドオプションを使用しOpenCL ソースファイルをコンパイルします

bull RTL コンポーネントをaocoファイルにパッケージ化するには次のコマンドを呼び出しますaoc -c ltRTL component description file namegtxml -o ltRTLobject file namegtaoco

関連情報bull 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化 (164 ページ)

bull RTL モジュールの検証 (164 ページ)

bull OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定 (165 ページ)

12131 インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限

インテル FPGA SDK for OpenCL はOpenCL ライブラリーにおける RTL モジュールの使用をいくつかの制約と制限をともないサポートしています

RTL モジュールを作成する際は次の制約内で動作させることを確認してください

bull RTL モジュールは単一入力の Avalon-ST インターフェイスを使用する必要がありますつまりreadyと validロジックの単一ペアがすべての入力を制御しなければなりません

必要な Avalon-ST ポートを提供しRTL モジュールをストールのないモジュールとして宣言するオプションもありますこの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはモジュールに向けてラッパーを作成するため適切なストール動作を実装する必要はありません構文と使用法に関する詳細はRTL モジュールの XML 構文およびシンプルな関数で動作するOpenCL ライブラリーの使用 (例 1) を参照ください

注意 RTL モジュールが内部状態を持つ場合はivalid信号を適切に処理する必要があります詳しくはストールのない RTL を参照ください

bull RTL モジュールはカーネルのクロック周波数にかかわらず正確に動作する必要があります

bull データの入力および出力サイズはcharの 8 ビットから long16の 1024 ビットまでの有効なOpenCL データ型と一致する必要があります

例えば RTL モジュールで 24 ビットの値を使用する場合入力が 32 ビットになるよう宣言しSDK ライブラリーのヘッダーファイルで関数シグニチャーを宣言し uintデータ型を受け取るようにしますその後RTL モジュールで 32 ビットの入力を受け入れ上位 8 ビットを破棄します

bull RTL モジュールは外部 IO 信号に接続することができません入出力信号はすべてOpenCL カーネルから発行される必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

162

bull RTL モジュールにはclockポートresetnポートAvalon-ST 入力および出力ポート(ivalidovalidireadyoready) が必要ですここで指定されている通りに名前を付けてください

bull 外部メモリーと通信する RTL モジュールには対応するカスタムプラットフォームパラメーターに一致する Avalon メモリーマップド (Avalon-MM) ポートのパラメーターが必要ですオフラインコンパイラーは幅またはバーストの調整を行いません

bull 外部メモリーと通信する RTL モジュールは次のように動作する必要があります

mdash バースト境界を越えてバーストしないこと

mdash クロックサイクルごとに要求を行いアービトレーションロジックを独占しハードウェアをストールさせないことRTL モジュールは定期的に要求を一時停止し他のロードまたはストアユニットが動作を実行できるようにする必要があります

bull RTL モジュールは独立した OpenCL カーネルとして動作することはできませんRTL モジュールはヘルパー関数にしかなれずカーネルのコンパイル時に OpenCL カーネルに統合されます

bull RTL モジュールのインスタンス化に対応する関数呼び出しはすべて他のインスタンス化から完全に独立していますハードウェアの共有はありません

bull カーネルコード (kernelとしてマークされた関数) はaoclibライブラリーファイルに組み込まないでくださいカーネルコードをライブラリーファイルに組み込むとオフラインコンパイラーはエラーメッセージを発行しますヘルパー関数をライブラリーファイルに組み込むことは可能です

bull RTL コンポーネントはすべての入力を同時に受け取る必要があります単一の ivalid入力はすべての入力が有効なデータを含んでいることを意味します

bull SDK は IO RTL モジュールをサポートしません

bull RTL モジュールのパラメーターはOpenCL カーネルソースファイルではなく ltRTLmodule description file namegtxml仕様ファイルでのみ設定できます同じ RTLモジュールを複数のパラメーターで使用するには個別の FUNCTIONタグを各パラメーターの組み合わせに作成します

SDK の RTL モジュールのライブラリー機能に対するサポートには現在次の制限があります

bull RTL モジュールへのデータ入力はOpenCL カーネルコードを介した値でのみ渡すことができます参照渡し構造体またはチャネルを介し RTL モジュールにデータ入力を渡さないでくださいチャネルデータの場合はまずチャネルからデータを抽出し抽出したスカラーデータを RTL モジュールに渡します

注意 参照渡しまたは構造体によってデータ入力を RTL モジュールに渡すとオフラインコンパイラーで致命的なエラーが発生します

bull デバッガー (Linux の GDBなど) はエミュレーション中にライブラリー関数にステップインできませんさらに 適化レポートおよびエリアレポートはライブラリー関数の横にコード行番号を含みません

bull RTL モジュールのソースファイル名は インテル FPGA SDK for OpenCL オフラインコンパイラー IP ファイル名と競合することはできませんRTL モジュールのソースファイルとオフラインコンパイラーの IP ファイルはどちらも ltkernel file namegtsystemsynthesissubmodulesディレクトリーに格納されます名前が競合するとディレクトリーにある既存のオフラインコンパイラー IP ファイルがRTL モジュールのソースファイルに上書きされます

bull SDK はqipファイルをサポートしませんネスト化されたqipファイルを手動で解析しRTLファイルのフラットリストを作成する必要があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

163

bull 単独では正しく動作する一方でOpenCL カーネルの一部としては正しく動作しない RTL モジュールをデバッグすることは非常に困難です ltRTL module description filenamegtxmlファイルの ATTRIBUTES要素にあるパラメーターをすべて再度確認してください

bull オフラインコンパイラーのエリア見積りツールはすべてRTL モジュールのエリアが 0 であると仮定していますSDK は現在RTL モジュールのエリアモデルを指定する機能をサポートしていません

bull RTL モジュールはカーネルクロックと同位相でありカーネルクロック周波数の 2 倍の2x クロックにアクセスできません

関連情報bull RTL モジュールの XML 構文 (154 ページ)

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ)

bull ストールのない RTL (150 ページ)

1214 RTL モジュールの検証

OpenCL ライブラリーの作成者はライブラリーの RTL モジュールを独立したエンティティーとしてまた OpenCL システムの一部として検証する責任があります

1 各 RTL モジュールを標準のハードウェア検証方法にて検証します

2 インテル FPGA SDK for OpenCL ライブラリーデザイン例の 1 つを変更しOpenCL システム全体において RTL モジュールをテストします

この手順はライブラリーのユーザーがハードウェアの問題に直面しないようにするために重要です

XML 仕様ファイルの ATTRIBUTES要素の値を正しく設定していることが重要ですOpenCL システム全体をシミュレーションすることはできないためインターフェイスレベルのエラーによって発生する問題はハードウェアを動作させるまで検出されない可能性があります

3 注意 インテル FPGA SDK for OpenCL libraryユーティリティーはXML 仕様ファイルとソースファイルの整合性を確認しますがそれにはいくつかの制限があります

aocl library [ltcommand optiongt]コマンドを呼び出します

bull サポートされている ltcommand optionsgt リストは aocl library コマンドで呼び出します

bull libraryユーティリティーはXML 仕様ファイルの ATTRIBUTESMEM_INPUTAVALON_MEM要素内の要素に割り当てられている値のエラーを検出しません

bull library ユーティリティーはRTL 構文のエラーを検出しませんRTL 構文のエラーについては ltyour_kernel_filenamegtquartus_sh_compilelogファイルを確認する必要がありますただしエラーの解析には時間を要する可能性があります

1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化

OpenCL ライブラリーに含めるaocoファイルを作成後 インテル FPGA SDK for OpenCLlibraryユーティリティーコマンドオプションを呼び出しそれらをライブラリーファイルにパッケージ化します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

164

bull 複数のオブジェクトファイルを単一のライブラリーファイルにパッケージ化するには次のコマンドを呼び出します aocl library create -o ltlibrary filenamegtaoclib ltobject file 1gtaoco [ltobject file 2gtaoco ltobject file Ngtaoco]

aocl libraryユーティリティーコマンドは ltlibrary file namegtaoclibライブラリーファイルを作成しますこのファイルにはコマンドで指定したaocoオブジェクトファイルが含まれていますライブラリーファイルにはRTL ベースのオブジェクトファイルおよびOpenCL ベースのオブジェクトファイルをどちらも含むことができます

1216 OpenCL カーネルコンパイル時の OpenCL ライブラリーの指定

OpenCL カーネルで OpenCL ライブラリーを使用するにはカーネルをコンパイルする際にライブラリーファイル名とディレクトリーを指定します

重要 ライブラリーを使用してもカーネルのコンパイル時間は短縮されません

bull OpenCL ライブラリーを インテル FPGA SDK for OpenCL オフラインコンパイラーに指定するには次のコマンドを呼び出します aoc -l ltlibrary_file_namegtaoclib [-Lltlibrary directorygt] ltkernel file namegtcl

この-l ltlibrary_file_namegtaoclibコマンドオプションはライブラリーファイル名を指定し-L ltlibrary directorygt コマンドオプションはライブラリーファイルを含むディレクトリーを指定します

-l ltlibrary file namegt および-L ltlibrary directorygt の複数のインスタンスをオフラインコンパイラーコマンドに含めることができます

例えば関数 my_div_fd()my_sqrtfd()myrsqrtfd()を含むライブラリーを作成する場合OpenCL のカーネルコードは次のようになります

include ldquolib_headerhrdquo

kernel void test_lib ( global double restrict in global double restrict out int N) int i = get_global_id(0) for (int k =0 k lt N k++) double x = in[iN + k] out[iN + k] = my_divfd (my_rsqrtfd(x) my_sqrtfd(my_rsqrtfd (x)))

注意 ライブラリー関連の行は太字で強調されています

対応する lib_headerhファイルは次のようになります

double my_sqrtfd (double x)double my_rsqrtfd(double x)double my_divfd(double a double b)

1217 シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー)

インテル FPGA SDK for OpenCL シミュレーターは OpenCL ライブラリーの機能性を評価します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

165

インテル FPGA SDK for OpenCL シミュレーターはx86-64 Windows または Linux ホストで動作するaocxファイルを生成しますこの機能により毎回ハードウェアにライブラリーをコンパイルしたり FPGA で動作させたりすることなくカーネルの機能性のシミュレーションやデザインのイタレーションができるようになります

OpenCL ライブラリーの動的なパフォーマンスをより深く理解することが必要な場合や OpenCL ライブラリー機能の正確性に関しエミュレーションや OpenCL のレポートツールが提供する内容以上の情報が必要な場合はシミュレーターを使用してください

シミュレーターはサイクル精度が高くハードウェアを生成するのと同じネットリストを持ちデバッグに向けた完全な波形を提供することが可能です波形は Mentor Graphics ModelSim ソフトウェアで確認してください

12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

シミュレーションに向け OpenCL ライブラリーをコンパイルするには-march=simulatorオプションを aocコマンドに含めますシミュレーション中の波形収集を有効にするには-ghdlオプションを aocコマンドに含めます

bull ライブラリーのシミュレーションを実行する前に次の作業を実行してください

mdash FPGA アクセラレーターボードにボードメーカーが提供しているカスタムプラットフォームをインストールします

mdash 環境変数 QUARTUS_ROOTDIR_OVERRIDE が インテル Quartus Prime 開発ソフトウェアプロエディションソフトウェアのインストールフォルダーを指していることを確認します

bull Windows システムでライブラリーをシミュレーションするにはMicrosoft のリンカーおよびコンパイル時のライブラリーが追加で必要になりますPATH 環境変数設定に インテル FPGASDK for OpenCL スタートガイドの インテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスがすべて含まれていることを確認してください

PATH 環境変数設定はMicrosoft Visual Studio の LINKEXEファイルへのパスを含んでいる必要があります

bull LIB 環境変数設定にMicrosoft のコンパイル時のライブラリーへのパスが含まれていることを確認してください

コンパイル時のライブラリーはMicrosoft Visual Studio で利用可能です

bull LD_LIBRARY_PATH 環境変数設定が インテル FPGA SDK for OpenCL スタートガイドのインテル FPGA SDK for OpenCL ユーザー環境変数の設定の章で説明されているパスをすべて含んでいることを確認してください

bull 特定のボードをターゲットとするシミュレーションをコンパイルするには aoc-march=simulator -ghdl -board=ltboard_namegtltyour_kernel_filenamegtclコマンドを呼び出します

bull Linux システムの場合 インテル FPGA SDK for OpenCL オフラインコンパイラーはシンボリックデバッガーのデバッグサポートを提供しています

オフラインコンパイラーのデバッグサポートによりカーネルソースコードにおける機能的なエラーの原因を特定できるようになります

12172 OpenCL ライブラリーのシミュレーション

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

166

シミュレーション中に生成された波形を確認するには Mentor Graphics ModelSim ソフトウェアをインストールしコンフィグレーションする必要があります

重要 エミュレーターとシミュレーターを同じ端末またはコマンドプロンプトセッションから実行する場合シミュレーターを実行する前にエミュレーターの環境変数設定(CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA) を解除しますエミュレーター環境変数の設定が解除されていないとシミュレーションはエラーにより失敗します

エミュレーターとシミュレーターは別々の端末セッションまたはコマンドプロンプトセッションから実行することもできます

OpenCL ライブラリーをシミュレーターで実行するには以下を行います

1 ユーティリティーコマンド aocl linkflags を実行しホストアプリケーションの構築に必要なライブラリーを検索しますソフトウェアはエミュレーションおよび通常のカーネルのコンパイルフローに必要なライブラリーの一覧を表示します

2 ホストアプリケーションを構築し手順 1 のライブラリーにリンクします

ヒント

他の OpenCL SDK とともに複数のデバイスをエミュレーションするにはホストランタイムのライブラリーに接続する前 にホストアプリケーションを Khronos ICD LoaderLibrary に接続しますホストアプリケーションを ICD Loader Library に接続するにはホストアプリケーションの Makefileを変更します詳細はホストアプリケーションとKhronos ICD Loader Library のリンクを確認ください

3 必要であればaocxファイルをホストが容易に見つけることのできる位置に動かします現在の作業ディレクトリーが推奨されます

4 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA環境変数を設定しシミュレーションデバイスを有効にします

mdash Windows の場合

set CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

mdash Linux の場合

env CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1

注意

環境変数 CL_CONTEXT_MPSIM_DEVICE_INTELFPGA を設定するとシミュレーションデバイスのみが利用可能になりますすなわち物理的なボードおよびエミュレーションデバイスへのアクセスは無効になります

ホストプログラムがシミュレーションデバイスを識別できない場合CL_CONTEXT_COMPILER_MODE_INTELFPGA=3を設定する必要があります

5 ホストプログラムを実行します

ホストコードとデバイスをデバッグするにはgdb または Eclipse でホストコードを実行します

ホストプログラムを実行すると波形ファイル vsimwifが作成されますこの波形ファイルはホストコードを実行時に ModelSim ソフトウェアで確認することができますvsimwifファイルはホストプログラムを実行しているディレクトリーと同じディレクトリーに書き込まれます

6 ホストまたはカーネルプログラムを変更しテストを行う場合は変更したホストまたはカーネルプログラムのみを再コンパイルしシミュレーションを再度実行してください

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

167

12173 シミュレーターの制限

シミュレーターの制限を確認しシミュレーションを試みる際に発生する可能性がある問題をトラブルシューティングしてください

Windows のコンパイルが失敗しホストプログラムがaocxファイルの破損を報告している場合

deviceclファイルをコンパイルする際のディレクトリーパスが長すぎる可能性があります-oコンパイラーオプションを使用し短いパスでコンパイル結果を出力してください

socket=-11エラーが transcriptlogに記録される場合

次のエラーメッセージが表示される場合 ModelSim - Intelreg FPGA Edition と ModelSim SE のリソースを混同しています

Message srchls_cosim_ipc_socketcpp202 void IPCSocketMasterconnect()Assertion `sockfd = -1 ampamp IPCSocketMasterconnect() call to accept() failed failed

ModelSim リソースの混同例には ModelSim SE でデバイスをコンパイルしホストプログラムをModelSim - Intel FPGA Edition で実行している場合などがあります

ホストプログラムを実行するとセグメンテーション違反が発生する場合

ホストプログラムを実行した際にセグメンテーション違反が発生する場合は同じ端末またはコマンドプロンプトセッションからエミュレーターとシミュレーターを実行している可能性がありますシミュレーターを実行する前にエミュレーターの環境変数設定を必ず解除してください

同じ端末セッションまたはコマンドプロンプトセッションでデバイスとホストプログラムをコンパイルしないようにしてください別々のセッションを使用することで起こりうる環境変数の競合を回避できます

1218 シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1)

インテルでは倍精度関数を 3 つ実装した (sqrtrsqrtdivide) RTL を含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example1tgzターボールにはライブラリーカーネルおよびホストシステムが含まれていますexample1clカーネルソースファイルには2 つのカーネルが含まれますカーネルのtest_libはライブラリー関数を使用しますすなわちカーネルの test_builtinは組み込み関数を使用しますホストは両方のカーネルを実行しそれらの出力とランタイムを比較しますインテルでは同じ方法でご自身がデザインしたライブラリー関数を検証することを推奨しています

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページからexample1tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example1aocx Create buffersGenerate random data for conversionEnqueuing both library and builtin in kernels 4 times with global size 65536Kernel computation using library function took 535333 secondsKernel computation using built-in function took 539949 secondsReading results to buffers

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

168

Checking resultsLibrary function throughput is within 5 of builtin throughputPASSED

関連情報OpenCL デザイン例のページ

1219 外部メモリーと動作する OpenCL ライブラリーの使用 (例 2)

インテルではグローバルメモリーと通信する 2 つの RTL モジュールを含むライブラリーを使用するシンプルなカーネルの OpenCL ライブラリーデザイン例を提供しています

Example2tgzターボールにはライブラリーカーネルそしてホストシステムが含まれていますこの例においてグローバルメモリーと通信する RTL コードはカスタムプラットフォームまたはリファレンスプラットフォームに依存しますコンパイルがStratix V Network Reference Platform に対応するボードをターゲットとしていることを確認してください

インテルではRTL モジュールの copyElement()および sumOfElements() を インテルFPGA SDK for OpenCL オフラインコンパイラーを使用し生成しました インテル FPGA SDK forOpenCL オフラインコンパイラーはコードの追加入力を示します

Example2clカーネルソースファイルは 2 つのカーネルを含みますカーネル test6はcopyElement() RTL 関数を呼び出す NDRange カーネルでありデータを B[]から A[]へコピーし global_id+100を C[]に格納しますカーネル test11はRTL 関数を使用する単一ワークアイテムのカーネルですsumOfElements() RTL 関数は範囲[i N]の A[]の要素の合計を確定し残りを C[i]に追加します

注意 sumOfElements(i=0)の 初の呼び出しの実行はその後の呼び出しよりも時間がかかります

このデザイン例をコンパイルするには次の作業を実行します

1 OpenCL デザイン例のウェブページから example2tgzを入手します

2 入手したデザイン例をローカルディレクトリーに解凍します

3 解凍したデザイン例のトップレベルに位置する READMEhtmlファイルの指示に従いますコンパイルされたホストプログラムを実行すると次の出力が生成されます

Loading example2aocx Running test6Launching the kernel test6 with globalsize=128 localSize=16Loading example2aocx Running test11Launching the kernel test11 with globalsize=1 localSize=1PASSED

関連情報bull OpenCL デザイン例のページ

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

bull Intel FPGA SDK for OpenCL Stratix V Network Reference Platform Porting Guide

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

169

12110 OpenCL ライブラリーのコマンドラインオプション

インテル FPGA SDK for OpenCL オフラインコンパイラーの一連のコマンドおよびSDK ユーティリティーはOpenCL ライブラリーに関連するタスクを実行するために呼び出すことができるオプションを含んでいます

表 11 ライブラリーに関連する インテル FPGA SDK for OpenCL オフラインコンパイラーのコマンドオプション

コマンドオプション 説明

-shared -rtlコマンドオプションとともにOpenCL ソースファイルをオブジェクトファイル (aoco) へコンパイルしますその後それをライブラリーに含めることができますaoc -rtl -shared ltOpenCL source file namegtcl -oltOpenCL object file namegtaoco

-I=ltlibrary_directorygt ltlibrary directorygt をヘッダーファイルの検索パスに追加します

aocl -I ltlibrary_header_file_directorygt -lltlibrary_file_namegtaoclib ltkernel_file_namegtcl

-L=ltlibrary directorygt ltlibrary directorygt を OpenCL ライブラリーの検索パスに追加します「-L」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-l=ltlibrary_file_namegtaoclib OpenCL ライブラリーファイル ( ltlibrary_file_namegtaoclib) を指定します「 -l 」の後のスペースはオプションです

aoc -l=ltlibrary_file_namegtaoclib [-L=ltlibrarydirectorygt] ltkernel file namegtcl

-library-debug ライブラリーに関連のあるデバッグ出力を生成します追加の出力の一部はstdout に表示されその他の部分は ltkernel_file_namegtltkernel_file_namegtlog ファイルに表示されます

aoc -l=ltlibrary_file_namegtaoclib -library-debugltkernel_file_namegtcl

表 12 インテル FPGA SDK for OpenCL ライブラリーユーティリティー (aocl library) のコマンドオプション

コマンドオプション 説明

hdl-comp-pkg ltXML_specification_filegtxml

単一の HDL コンポーネントをaocoファイルにパッケージ化しますそれをその後ライブラリーに含みますこのコマンドの呼び出しは aoc -rtlltXML_specification_filegtxmlを呼び出すことに類似していますただしaoclは環境チェックを行わないため処理時間は短くなります

aocl library hdl-comp-pkg ltXML_specification_filegtxml -o ltoutput_filegtaoco

-rtl ltXML_specification_ filegtxml hdl-comp-pkg ltXML_specification_ filegtxmlと同じ機能ですaocl library -rtl ltXML_specification_ filegtxml

create hdl-comp-pkgユーティリティーオプションまたは aoc -shared コマンドを呼び出すことによって作成したaocoファイルからライブラリーファイルそしてその他のaoclibライブラリーを作成します

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

170

コマンドオプション 説明

aocl library create [-name ltlibrary_namegt] [-vendor ltlibrary_vendorgt] [-versionltlibrary_versiongt] [-o ltoutput_filegtaoclib][aoco] [aoclib]

この-name-vendor-versionはオプションの情報文字列でそれらを指定しライブラリーに加えることができます

list ltlibrary_namegt ライブラリーの RTL コンポーネントをすべてリスト表示します現在このオプションはOpenCL 関数のリスト化には利用できません

aocl library list ltlibrary_namegt

help インテル FPGA SDK for OpenCL ライブラリーユーティリティーオプションのリストとその説明を画面上に表示しますaocl library help

122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性

インテル FPGA SDK for OpenCL はデザインのコンスタントローカルおよびプライベート変数に適用できるカーネルメモリー属性を提供しますそれらを使用しローカルメモリーシステムおよびプライベートメモリーシステムのオンチップメモリーアーキテクチャーをカスタマイズすることが可能です

注意 これらのローカルメモリーカーネル属性はコンスタントローカルまたはプライベート変数にのみ適用してください

表 13 ローカルメモリーをコンフィグレーションするための OpenCL の属性

属性 説明

register ローカル変数がレジスターのパイプラインを介して伝達される必要があることを指定しますレジスター変数の実装はFF のみで行うこともFF と RAM ベースのFIFO を組み合わせて行うことも可能です

memory(impl_type) ローカル変数をメモリーシステムに実装する必要があることを指定しますメモリーカーネル属性を含めることはローカル変数を__local修飾子で宣言することと同等ですオプションで文字列引数を渡しメモリーの実装タイプを指定することが可能ですimpl_type に BLOCK_RAMまたは MLABを指定するとメモリーはそれぞれメモリーブロック (M20K など) またはメモリーロジックアレイブロック(MLAB) を使用し実装されます

numbanks(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

bankwidth(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN バイト幅のバンクを有する必要があることを指定しますN は 0 より大きい 2 のべき乗の整数値です

singlepump ローカル変数を実装しているメモリーシステムをシングルポンピングする必要があることを指定します

doublepump ローカル変数を実装しているメモリーシステムをダブルポンピングする必要があることを指定します

numreadports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の読み出しポートを有する必要があることを指定しますN は 0 より大きい整数値です

numwriteports(N)

N は整数値ですローカル変数を実装しているメモリーシステムがN 個の書き込みポートを有する必要があることを指定しますN は 0 より大きい整数値です

continued

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

171

属性 説明

merge(label direction) 2 つ以上の変数を同じメモリーシステムに実装するように強制しますlabel は任意の文字列です結合しようとしている変数に同じラベルを割り当てますdirection に widthもしくは depthを指定しメモリーをそれぞれ幅方向または深さ方向のどちらに結合するかを特定します

bank_bits(b 0 b 1 b n ) メモリーシステムを2n のバンクに分割するよう強制しますb 0 b 1 b nはバンク選択ビットを形成しています重要 b 0 b 1 hellipb n はかならず連続する正の整数にしてください

bank_bits属性なしで numbanks(n)属性を指定するとバンク選択ビットはデフォルトで 下位ビット (01helliplog2(numbanks)-1) になります

max_concurrency(N) メモリーが 大 N 個のプライベートコピーを保有しN 回のループの同時反復を常に実行することを指定しますここで N は2 の累乗に切り上げられます(宣言またはアクセスパターンによって) 変数の範囲がループに限定されている場合この属性を適用しますループがpragma max_concurrency M も持っている場合作成されるプライベートコピーの数はmin(MN)になります

表 14 メモリー属性のコード例

ユースケース例 構文

レジスターに変数を実装する int __attribute__((register)) a[12]

それぞれ 8 バイト幅の 8 つのバンクを持つメモリーシステムを実装する int __attribute__((memory numbanks(8) bankwidth(8)) b[16]

ダブルポンピングのメモリーシステムを128 バイト幅のバンク 1 つ書き込みポート 1 つ読み出しポート 4 つとともに実装する

int __attribute__((memory numbanks(1) bankwidth(128) doublepump numwriteports(1) numreadports(4)) c[32]

structのデータメンバーにメモリー属性を適用することも可能ですstruct 宣言の structデータメンバーに属性を指定してくださいstructのオブジェクトのインスタンス化に属性を適用するとこの属性は structデータメンバーの宣言で指定された属性を上書きします以下を例として示します

struct State int array[100] __attribute__((__memory__)) int reg[4] __attribute__((__register__)) __kernel void sum() struct State S1 struct State S2 __attribute__((__memory__)) some uses

オフラインコンパイラーは S1 をメモリーに実装される S1array[100]とレジスターに実装される S1reg[4]の 2 つの変数に分割しますただしS2には memory属性が適用されているためコンパイラーは struct宣言でオブジェクト S2に適用された属性を無視しそれを分割しません

関連情報bull ローカルメモリーのバンキングによるカーネルパフォーマンスの向上

bull メモリーレプリケーションファクタの制御によるローカルメモリーへのアクセスの 適化

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

172

1221 変数固有の属性を使用する際の制約

サポートされていない変数固有の属性の使用法または不正なメモリー構成を検出した場合 インテルFPGA SDK for OpenCL オフラインコンパイラーではエラーが発生するもしくは警告を発行します

コンパイルエラーの原因となる変数固有の属性のサポートされていない使い方

bull カーネル属性をコンスタントローカルまたはプライベート変数の宣言以外の宣言で使用している (例えば関数パラメーターの宣言グローバル変数宣言関数宣言など)

bull register属性を他の変数固有の属性と組み合わせて使用している

bull singlepumpと doublepump属性をどちらも同じ変数宣言に含んでいる

bull singlepumpおよび doublepump属性をnumreadportsまたは numwriteports属性を含まずに指定している

bull numreadports属性を指定する際に numwriteports属性を同じ変数宣言に含んでいないまたはその逆

bull 同じ変数宣言に numbanksと bankwidth属性を含まずに次の属性のいずれかを指定している

mdash numreadports

mdash numwriteports

mdash singlepump

mdash doublepump

コンパイル時にオフラインコンパイラーが警告を発行する原因となる不正なメモリー構成

bull 変数固有の属性で定義されているメモリー構成が利用可能なストレージサイズを超えている (例えば8 バンクのローカルメモリーを整数変数に指定するなど)

コンパイルエラーの原因となる不正なメモリー構成

bull バンク幅がデータのストレージサイズよりも小さい (例えば 4 バイト整数の配列の場合バンク幅は2 バイトです)

bull 変数にメモリーのコンフィグレーションを指定しているコンパイラーの制約またはコーディングスタイルのためオフラインコンパイラーはメモリーを分割するのではなく同じメモリーに変数を実装します

bull register属性を変数に指定しているコンパイラーの制約またはコーディングスタイルによりオフラインコンパイラーは変数をレジスターに実装できません

123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性

インテル FPGA SDK for OpenCL にはロジック使用率を低減しカーネルのパフォーマンスを向上させるカーネル属性が含まれておりそれを単一のワークアイテムカーネルに含むことができますこれらのカーネル属性により インテル FPGA SDK for OpenCL オフラインコンパイラーは不要なハードウェアの生成を省略し効率を向上させることが可能になります

1231 カーネルインターフェイスに向けたハードウェア

インテル FPGA SDK for OpenCL オフラインコンパイラーはカーネルのパイプライン周辺にハードウェアを生成します一部の OpenCL アプリケーションではこれらのインターフェイスのハードウェアコンポーネントは不要です

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

173

カーネルパイプライン周辺のハードウェアは次のような機能において必要です

bull ワークアイテムおよびワークグループ ID の振り分け

bull カーネル引数とワークグループのサイズに関するホストとの通信

図 20 (174 ページ) はオフラインコンパイラーが次のカーネルをコンパイルする際に生成するハードウェアを表しています

__kernel void my_kernel(global int arg) hellip int sum = 0 for(unsigned i = 0 i lt n i++) if(sum lt m) sum += val arg = sum hellip

図 -20 カーネルパイプライン周辺に インテル FPGA SDK for OpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

12311 カーネル ID を生成し振り分けるハードウェアの省略

Max_global_work_dim(0)カーネル属性はグローバルローカルまたはグループ ID を生成しコンパイルされたカーネルに振り分けるロジックを省略するよう インテル FPGA SDK forOpenCL オフラインコンパイラーに指示します

意味的に max_global_work_dim(0)カーネル属性はカーネルのグローバルワークサイズがゼロであることを指定しますこのカーネル属性を設定するとカーネルがグローバルローカルまたはグループ ID を使用しないことを意味しますカーネルコード内のこの属性の存在はカーネルが単一のワークアイテムカーネルであるということをオフラインコンパイラーに対し保証しています

次のカーネルをコンパイルするとオフラインコンパイラーは図 21 (175 ページ) で表されているインターフェイスハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__kernel void plusK (int N int k) for (int i = 0 i lt N ++i) int data_in = read_channel_intel(chan_in)

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

174

write_channel_intel(chan_out data_in + k)

図 -21 max_global_work_dim(0) 属性をともなうカーネルに向けて インテル FPGA SDK forOpenCL オフラインコンパイラーが生成するインターフェイスハードウェア

Host Link Hardware

Kernel ID Generators

Kernel

現在のカーネル実装に複数のワークアイテムがありグローバルローカルまたはグループ ID を使用していない場合次のようにカーネルコードを変更するとmax_global_work_dim(0)カーネル属性を使用することができます

1 ワークアイテムと同じ数だけ反復する forループのカーネル本体をラップする

2 変更したカーネルを 1 つのワークアイテムのみで起動する

12312 ホストとカーネル間の通信ハードウェアの省略

autorunカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーにホストとカーネルの通信に使用されるロジックを省略するよう指示します autorun属性を使用するカーネルはホストが明示的に起動するカーネルよりも前に自動的に実行を開始しますさらにこのカーネルは実行が終了するとすぐに自動的に再起動します

autorunカーネル属性はオフラインコンパイラーに対しカーネルが独立して実行されどのホストからもエンキューされないことを通知します

autorun属性を活用するにはカーネルが次の基準をすべて満たしている必要があります

1 IO チャネルを使用しないこと

注意 カーネルからカーネルへのチャネルはサポートされています

2 引数を持たないこと

3 max_global_work_dim(0)属性または reqd_work_group_size(XYZ) 属性のどちらかを持つこと

注意 reqd_work_group_size(XYZ) 属性のパラメーターは 232 の除数である必要があります

前述のようにautorun属性のあるカーネルは引数を持つことができずホストが明示的に起動することなく実行を開始しますそのためオフラインコンパイラーはホストとカーネルの通信のためのロジックを生成する必要がありませんこのロジックを省略するとロジック使用率が低下しオフラインコンパイラーがパフォーマンスの 適化をさらに適用することが可能になります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

175

autorun属性の一般的な使用例はカーネル間の 1 つ以上のチャネルからデータを読み取りデータを処理しその結果を 1 つ以上のチャネルに書き込むカーネルですカーネルをコンパイルするとオフラインコンパイラーは図 22 (176 ページ) で表されているようにハードウェアを生成します

channel int chan_inchannel int chan_out

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__kernel void plusOne () while(1) int data_in = read_channel_intel(chan_in) write_channel_intel(chan_out data_in + 1)

図 -22 インターフェイスハードウェアのない単一ワークアイテムカーネル

Host Link Hardware

Kernel ID Generators

Kernel

12313 clEnqueueNDRangeKernel API の global_work_offset引数をサポートするハードウェアの省略

uses_global_work_offset(0) のカーネル属性は インテル FPGA SDK for OpenCL オフラインコンパイラーに対しNDRange カーネルの 0 以外または NULL 以外のglobal_work_offset引数をサポートするために必要なハードウェアを省略するよう指示します

このカーネル属性は0 もしくは NULL の global_work_offset引数で必ずエンキューされるカーネルすべてに推奨されますこのカーネル属性が設定されるとインテル FPGA ホストランタイムは0 以外もしくは NULL 以外の global_work_offset引数でカーネルがエンキューされた場合にCL_INVALID_GLOBAL_OFFSETエラーコードを返します

124 num_compute_units(XYZ) 属性を使用したカーネルの複製

num_compute_units(XYZ) カーネル属性を含めると単一ワークアイテムの OpenCL カーネルを複製することができます

計算ユニット数の指定 で示されているようにnum_compute_units(N) カーネル属性をカーネルに含めることで インテル FPGA SDK for OpenCL オフラインコンパイラーに対し複数の計算ユニットを生成しデータを処理するよう指示しますnum_compute_unit(N) 属性はオフラインコンパイラーにカーネルの同一のコピーを N 個ハードウェアに生成するよう指示します

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

176

注意 データに依存するカーネルの処理を制御している特定の計算ユニットを識別するにはget_compute_id()組み込み関数を呼び出します

関連情報bull get_compute_id() 関数を使用した複製カーネルのカスタマイズ (177 ページ)

bull 計算ユニット数の指定 (33 ページ)

1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ

それぞれの違いがわずかで共通するコードを多く持つ複数の計算ユニットを作成するにはnum_compute_units (XYZ) 属性を使用しているカーネルで get_compute_id() 組み込み関数を呼び出します

注意 get_compute_id() 関数はautorunおよび max_global_work_dim(0) カーネル属性を使用するカーネルにのみ使用することができます

計算 ID の取得はカーネルをソースコードに複写し各カーネルのコピーに特定のコードを追加することに代わる有用な方法ですカーネルが num_compute_units(XYZ) 属性を使用しget_compute_id() 関数を呼び出すと インテル FPGA SDK for OpenCL オフラインコンパイラーは固有の計算 ID を各計算ユニットに割り当てますその後 get_compute_id() 関数はそれらの固有の計算 ID を取得します計算 ID を使用することで関連付けられている計算ユニットの動作を指定し同じカーネルのソースコードから派生した他の計算ユニットと異なる動作をさせることが可能です例えばget_compute_id() の戻り値を使用しチャネルの配列にインデックスを付け各計算ユニットが読み書きするチャネルを指定することができます

num_compute_units属性は 大 3 つの引数を受け取ります(num_compute_units(XYZ))get_compute_id() 関数とともにこの属性を使用すると1 次元2 次元および 3 次元のロジック配列の計算ユニットを作成することが可能になります計算ユニットの 1D 配列の使用例には線形パイプラインのカーネル (カーネルのデイジーチェーンとも呼ばれる) があります計算ユニットの 2D 配列の使用例はカーネルのシストリックアレイです

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

177

図 -23 4x4 配列の計算ユニットの概略図次のコード例はnum_compute_units(44)を単一ワークアイテムカーネルで指定しておりこれは 4x4=16 の計算ユニットで構成される 4x4 配列になります

__attribute__((max_global_work_dim(0)))__attribute__((autorun))__attribute__((num_compute_units(44)))__kernel void PE()

row = get_compute_id(0) col = get_compute_id(1)

hellip

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

PE

0

3

2

1

3210col

row

3D 配列の計算ユニットにおいては論理計算ユニット配列の計算ユニットの XYZ 座標をget_compute_id(0)get_compute_id(1)get_compute_id(2)をそれぞれ使用することで取得できますこの場合の API はワークアイテムの組み込み関数 API(get_global_id()get_local_id()get_group_id()) と非常に類似しています

グローバル IDローカル IDおよびグループ ID はホストがカーネルを呼び出す方法によってランタイムで変化しますただし計算 ID はコンパイル時に認識されるためオフラインコンパイラーは各計算ユニットに 適化されたハードウェアを生成できます

1242 カーネルコピーでのチャネル使用

カーネルを複製コピーした計算ユニットにチャネルを実装するにはチャネルの配列を作成しget_compute_id() の戻り値を使用しその配列にインデックスを付けます

次のコード例は複数の計算ユニットにチャネルを実装しています

define N 4channel int chain_channels[N+1]

__attribute__((max_global_work_dim(0)))__kernel void reader(global int data_in int size) for (int i = 0 i lt size ++i) write_channel_intel(chain_channels[0] data_in[i])

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

178

__attribute__((max_global_work_dim(0)))__attribute__((autorun)) __attribute__((num_compute_units(N))) __kernel void plusOne() int compute_id = get_compute_id(0) int input = read_channel_intel(chain_channels[compute_id]) write_channel_intel(chain_channels[compute_id+1] input + 1)

__attribute__((max_global_work_dim(0)))__kernel void writer(global int data_out int size) for (int i = 0 i lt size ++i) data_out[i] = read_channel_intel(chain_channels[N])

図 -24 チャネルを実装するカーネルコピーのトポロジー例この図は上記 OpenCL アプリケーションコードが生成するカーネルグループのトポロジーを表しています

reader writer+1 +1 +1 +1

DDR4 DDR4kernel copies created using num_compute_units(N)

注意 このカーネルコピーの実装はソースコードに 4 つのカーネルを個別に定義しchain_channels[N]へアクセスするためのインデックスをそれぞれハードコーディングすることと機能的に同等です

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

インテル 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() 関数は次のような目的で使用します

bull 大規模なストリックアレイを処理する要素間など空間的に離れたデータパスの間のクリティカルパスの切断

bull 空間的に異なるカーネル実装によって発生する配置とルーティングエフォートの負荷の軽減

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

179

__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 つより多くのレジスターをパスに挿入する場合があります

12 インテル FPGA SDK for OpenCL のアドバンスト機能UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

180

A OpenCL 機能のサポート状況

インテル FPGA SDK for OpenCL のホストランタイムは明確にした内容と例外をともなうかたちでOpenCL プラットフォームレイヤーおよびアプリケーションプログラミングインターフェイス (API)に準拠しています

OpenCL10 の機能のサポート状況 (181 ページ)

OpenCL 12 の機能のサポート状況 (186 ページ)

OpenCL 20 の機能のサポート状況 (187 ページ)

インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ)

A1 OpenCL10 の機能のサポート状況

以降の章ではOpenCL Specification version 10 に記載されている OpenCL 機能のサポート状況の概要を説明します

A11 OpenCL10 C プログラミング言語の実装

OpenCL は一部制限をともなうかたちで C99 に基づいていますOpenCL Specification version10 の Section 6 はOpenCL C プログラミング言語について説明しています インテル FPGA SDKfor OpenCL は明確化された内容と例外をともない OpenCL C プログラミング言語に準拠しています次の表はOpenCL プログラミング言語の実装における機能に対するサポート状況の概要です内容を明確化することなくサポートしている OpenCL プログラミング言語の実装に関しては記載していません

サポート状況の表の見方

シンボル 説明

この機能はサポートされており備考欄にてサポートされている内容を明確にしています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

セクション

機能 サポート状況 備考

611 組み込みスカラーデータ型

倍精度浮動小数点 倍精度浮動小数点の組み込みスカラーデータ型すべてに対する暫定サポートですこの機能はOpenCL Specification version 10 に準拠していない可能性があります現在次の倍精度浮動小数点関数はOpenCL Specification version10 に準拠すると考えられています

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

セクション

機能 サポート状況 備考

add subtract multiply divide ceil floor rint trunc fabs fmax fmin sqrt rsqrt exp exp2 exp10 log log2 log10 sin cos asin acos sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

半精度浮動小数点 スカラーの加算減算乗算に対するサポートです単精度浮動小数点との変換をサポートしますこの機能はOpenCL Specification version 10 に準拠していない可能性がありますこの機能はエミュレーターでサポートされています

612 組み込みベクトルデータ型 3 要素のベクトルに対する暫定サポートです3 要素ベクトルのサポートはOpenCL Specification version 10 を補うものです

613 その他の組み込みデータ型 SDK はイメージをサポートしていないためイメージ型またはサンプラー型をサポートしていません

621 暗黙的な変換 スカラー型とベクトル型の暗黙的な変換に関する重要な説明についてはOpenCL Specification version 12 の Section 626UsualArithmetic Conversions を参照してください

622 明示的なキャスト SDK ではスカラーを異なる要素型のベクトルにキャストできます

65 アドレス空間修飾子 関数スコープ__constant変数はサポートされていません

66 イメージアクセス修飾子 X SDK はイメージをサポートしていません

67 関数修飾子

672 オプションの属性修飾子 カーネルのパフォーマンス向上に向けた reqd_work_group_sizeの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照くださいSDK は vec_type_hintと work_group_size_hint属性修飾子の解析は行いますがそれらを無視します

69 プリプロセッサーディレクティブとマクロ

pragmaディレクティブ (pragmaunroll)

インテル FPGA SDK for OpenCL オフラインコンパイラーはpragmaunrollのみサポートしています整数引数をアンロールディレクティブに割り当てループ展開の範囲を制御することができます例えばpragma unroll 4はループの 4 つの反復を展開します展開係数のないアンロールディレクティブの場合デフォルトでオフラインコンパイラーはループを完全に展開しようと試みますカーネルのパフォーマンス向上に向けたpragma unrollの使用方法に関するヒントは インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

値 1に定義された__ENDIAN_LITTLE__

ターゲット FPGA はリトルエンディアンです

__IMAGE_SUPPORT__ X __IMAGE_SUPPORT__は未定義ですSDK はイメージをサポートしていません

610 Attribute Qualifiersmdashオフラインコンパイラーは以下ように属性修飾子を解析します

6103 変数の属性を指定する (endian) X

6104 ブロック属性と制御フローステートメント属性の指定

X

6105 属性修飾子の拡張 オフラインコンパイラーはさまざまな構文構造の属性を解析することができますまた内部使用のためにいくつかの属性名を予約していますこれらのカーネル属性を使用しカーネルのパフォーマンスを 適化する方法については インテル FPGA SDK for OpenCL ベストプラクティスガイドを参照ください

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

182

セクション

機能 サポート状況 備考

6112 数学関数

組み込み数学関数 倍精度浮動小数点の組み込み数学関数に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

組み込み数学関数の half_とnative_

倍精度浮動小数点の組み込み数学関数 half_および native_に対する暫定サポートですOpenCL Specification version 10 に準拠していない可能性があります

6115 ジオメトリック関数 倍精度浮動小数点の組み込みジオメトリック関数に対する暫定サポートですこの関数は OpenCL Specification version 10 に準拠していない可能性がありますSDK でサポートされる組み込みのジオメトリック関数のリストについては組み込みジオメトリック関数の引数型 を参照してください

6118 イメージ読み取りおよび書き込み機能 X SDK はイメージをサポートしていません

6119 Synchronization Functionsmdash バリアー同期機能

内容の明確化と例外bull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合バリアーは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合バリアーはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

ワークアイテムの制限はカーネルにサポートされているワークグループの大サイズでありこの制限はランタイムに強制されます

61111

グローバルメモリーからローカルメモリーローカルメモリーからグローバルメモリーの非同期コピーおよびプリフェッチ

実装は単純なものですワークアイテム (000) はコピーを実行しwait_group_eventsがバリアーとして実装されますbull カーネルが reqd_work_group_sizeまたは

max_work_group_size属性を指定している場合wait_group_eventsは対応するワークアイテム数をサポートします

bull どちらの属性も指定されていない場合wait_group_eventsはデフォルトの制限である 256 ワークアイテムでインスタンス化されます

関連情報bull Intel FPGA SDK for OpenCL ベストプラクティスガイド

bull 組み込みジオメトリック関数の引数型 (184 ページ)

A12 OpenCL C プログラミング言語の制約

インテル FPGA SDK for OpenCL は特定のプログラミング言語機能に関し OpenCLSpecification version 10 の Section 68 で示されている OpenCL Specification の制約に準拠します

重要 インテル FPGA SDK for OpenCL オフラインコンパイラーは許可されていない特定のプログラミング言語機能に対する制約を強制しません使用しているカーネルコードにOpenCL Specificationversion 10 がサポートしていない機能が含まれていないようにしてください

次の表は インテル FPGA SDK for OpenCL が強制する OpenCL C プログラミング言語の制約に関する補足説明のみを記載しています他の制約はすべてOpenCL Specification version 10 のSection 68 の内容と完全に一致します

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

183

機能 サポート状況 備考

構造体型のカーネル引数 X 構造体引数をグローバルメモリーの構造体へのポインターに変換します

既約の制御フロー X オフラインコンパイラーはこの制約に関しエラーは返しませんがこの機能はサポートされていません

32 ビット未満の組み込み型メモリーへの書き込み

サイズが 32 ビット未満のストア操作はメモリーの性能が低下する可能性がありますがサポートされています

異なるアドレス空間に属する structまたはunion要素

X オフラインコンパイラーはこの制約を強制しません警告 structまたは union要素を異なるアドレス空間に割り当てると致

命的なエラーが発生する可能性があります

サポート状況表の見方

シンボル 説明

この機能はサポートされています備考欄にてサポートされている内容を明確化しています

この機能は備考欄で特定されている内容を除きサポートされています

X この機能はサポートされていません

A13 組み込みジオメトリック関数の引数型

インテル FPGA SDK for OpenCL はスカラーおよびベクトル引数の組み込みジオメトリック関数を特定の制限をともないサポートしています

関数 引数型

浮動 倍精度

cross

dot

distance

length

normalize

fast_distance mdash

fast_length mdash

fast_normalize mdash

サポート状況表の見方

記号 説明

この機能はサポートされています

mdash この機能は OpenCL Specification で定義されていません

A14 数値コンプライアンスの実装

OpenCL Specification version 10 の Sectoin 7 はOpenCL に準拠するデバイスがサポートする必要がある C99 と IEEE 754 標準の機能を説明しています インテル FPGA SDK for OpenCL はIEEE 標準 754-2008 形式の 32 ビットおよび 64 ビットの浮動小数点値で動作しますがすべての浮動小数点演算子が実装されているわけではありません 

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

184

以下の表は浮動小数点演算子の実装状況の概要です

セクション 機能 サポート状況 備考

71 丸めモード 整数と単精度または半精度の浮動小数点型の変換においてはすべての丸めモードをサポートしています整数と倍精度の浮動小数点型の変換については暫定的な形式ですべての丸めモードをサポートしていますがOpenCL Specification version10 に準拠していない可能性があります

72 INFNaN非正規化数 単精度の演算における無限大 (INF) および非数 (NaN) の結果はOpenCL Specification version 10 に準拠する形式で生成されます非正規化数を処理する演算のほとんどは浮動小数点演算の前後にフラッシュされます倍精度浮動小数点演算に対しては暫定的なサポートでありOpenCLSpecification version 10 に準拠していない可能性があります

73 浮動小数点の例外 X

74 ULP の相対誤差 単精度浮動小数点演算はOpenCL Specification version 10 の埋め込みプロファイルに対する数値精度要件に準拠しています倍精度浮動小数点演算については暫定サポートでありOpenCLSpecification version 10 に準拠していない可能性があります

75 エッジケースの動作

A15 イメージのアドレス指定とフィルタリングの実装

インテル FPGA SDK for OpenCL はイメージのアドレス指定とフィルタリングをサポートしませんSDK はイメージをサポートしていません

A16 アトミック関数

OpenCL Specification version 10 の Section 9 には一部の OpenCL 実装においてサポートされる場合があるオプションの機能が記載されています インテル FPGA SDK for OpenCL は条件付きでアトミック関数をサポートしますサポートされているこの関数の実装はOpenCL SpecificationVersion 10 に準拠していない可能性があります

bull Section 95 の Atomic Functions for 32-bit Integers に関しSDK は 32 ビットのグローバルおよびローカルメモリーのアトミック関数をすべてサポートしますSDK はまたOpenCLSpecification version 11 の Section 61111OpenCL Specification version 12 のSection 61211 に記載されている 32 ビットのアトミック関数もサポートしています

mdash SDK はOpenCL Specification version 10 の Section 97 に記載されている 64 ビットのアトミック関数をサポートしていません

注意 アトミック関数を使用するとデザインのパフォーマンスが低下する可能性がありますカーネルに複数の型のアトミック関数を実装する場合 (atomic_addと atomic_subなど)ハードウェアの動作周波数がさらに低下する可能性があります

A17 埋め込みプロファイルの実装

OpenCL Specification version 10 の Section 10 はOpenCL の埋め込みプロファイルについて説明しています インテル FPGA SDK for OpenCL は明確化した内容および例外をともないOpenCL の埋め込みプロファイルに準拠しています

次の表はOpenCL 埋め込みプロファイルの明確化した内容および例外の概要です

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

185

項目 機能 サポート状況 備考

1 64 ビット整数 64 ビット整数はOpenCL Specification version 10 の埋め込みプロファイルに対し補助的な形式でサポートされています

2 3D イメージ X SDK はイメージをサポートしていません

3 image_channel_data_typeの値による 2D および 3D イメージの作成

X SDK はイメージをサポートしていません

4 サンプラー X SDK はサンプラーをサポートしていません

5 丸めモード CL_DEVICE_SINGLE_FP_CONFIGのデフォルトの丸めモードはCL_FP_ROUND_TO_NEARESTです

6 単精度の基本的な浮動小数点演算に対し記載されている制約事項

X

7 半精度型 X OpenCL Specification version 10 のこの項目はSDK に適用されません

8 CL_UNORM_INT8CL_SNORM_INT8CL_UNORM_INT16CL_SNORM_INT16から float への変換に対して記載されているエラー範囲

A2 OpenCL 12 の機能のサポート状況

以降の章ではOpenCL Specification version 12 に記載されている OpenCL 機能のサポート状況の概要を説明します

A21 OpenCL 12 のランタイムの実装

インテル FPGA SDK for OpenCL はサブバッファーオブジェクトの実装をサポートしていますサブバッファーオブジェクトに関する詳細はOpenCL Specification version 12 の Section 52 を参照ください

SDK は次の API の実装もサポートしています

bull clSetMemObjectDestructorCallback

bull clGetKernelArgInfo

bull clSetEventCallback

これらの API についての詳細はOpenCL Specification 12 の Section 541573 および 59をそれぞれ参照ください

関連情報OpenCL Specification version 12

A22 OpenCL 12 C プログラミング言語の実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 12 の Section 6 で指定されている OpenCL C プログラミング言語機能の多くをサポートしています SDK は明確にした内容および例外をともないOpenCL C プログラミング言語に準拠しています

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

186

注意 サポート状況欄の「」はサポートされている機能であり備考欄においてサポートされている内容を明確にしていますサポート状況欄の「」は備考欄で特定されている内容を除きサポートされている機能です

表 15 OpenCL 12 C プログラミング言語機能のサポート状況

セクション 機能 サポート状況 備考

613 その他の組み込みデータ型 この機能は OpenCL Specification version 12 に準拠していない可能性があります

61212 各種ベクトル関数 SDK は次の組み込みベクトル関数を追加しサポートしていますbull vec_step

bull shuffle

bull shuffle2

61213 printf この機能は OpenCL Specification version 12 に準拠していない可能性があります詳細は下記を確認ください

OpenCL の printf関数は一部例外をともないC99 の printf関数に類似する構文と機能を持ちます詳細はOpenCL Specificationversion 12 を参照くださいprintf関数の使用においてコンパイル手順バッファーまたはフラグに対する特別な要件はありません通常の aocコマンドでprintf命令を含むカーネルをコンパイルすることができますカーネルの実行中に printfデータは インテル FPGA SDK for OpenCL オフラインコンパイラーが自動的に割り当てるグローバルprintfバッファーに格納されますこのバッファーのサイズは 64 kB でありprintf呼び出しのデータ引数の合計サイズがこのサイズを超えてはいけませんカーネルの実行が完了すると printfバッファーのコンテンツは標準出力されますprintfステートメントのフォーマット文字列は256 文字を超えることはできませんバッファーのオーバーフローはシームレスに処理されますつまりprintf命令は無制限に実行することができますただしprintfバッファーがオーバーフローするとカーネルのパイプラインの実行はホストがバッファーを読み取りバッファー内容を出力するまでストールしますprintf関数はデータをグローバルメモリーバッファーに格納するためそのような関数が含まれている場合カーネルのパフォーマンスは低下しますprintf関数の使用上の制限はありませんprintf命令はifと elseのステートメントやループなどで使用することができますカーネルは複数のワークアイテムで実行される複数の printf命令を含むことができますprintf呼び出しのフォーマット文字列引数と文字列リテラル引数は特別なメモリー領域を使用し FPGA からホストシステムに転送されますprintf文字列引数の合計サイズが大きい場合このメモリー領域はオーバーフローする可能性があります (一般的な OpenCL アプリケーションでは通常 3000 文字以下が安全です)オーバーフローした場合エラーメッセージ cannot parse auto-discovery string atbyte offset 4096がホストプログラムの実行中に出力されますprintfからの出力はワークアイテムが並行して printf関数を実行しても混在することはありませんただし並行して実行される printfの順序は保証されていませんつまり printf命令が並行するデータパスにある場合printf出力はプログラム順に表示されない可能性があります

関連情報OpenCL Specification version 12

A3 OpenCL 20 の機能のサポート状況

以降の章ではOpenCL Specification version 20 に記されている OpenCL の機能のサポート状況の概要を提供します

A31 OpenCL 20 のヘッダー

インテル FPGA SDK for OpenCL はすべての OpenCL バージョンをサポートする統一ヘッダーを提供します

OpenCL 20 の機能を使用するには次の 2 行をコードに含めてください

define CL_TARGET_OPENCL_VERSION 200include ltCLopenclhgt

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

187

注意 SDK は現在OpenCL 20 の API をすべてサポートしているわけではありませんサポートされていない API を呼び出すとその API が完全にはサポートされていないことを示すエラーコードが返されます

A32 OpenCL 20 ランタイムの実装

インテル FPGA SDK for OpenCL は OpenCL Specification version 20 の Section 56 に記載されているように共有仮想メモリーの実装に対する暫定サポートを提供しています共有仮想メモリーに関する詳細は OpenCL Specification version 20 の Section 56 を参照ください

重要 ご利用のボード仕様を参照しボードが共有仮想メモリーをサポートしていることを確認してください

関連情報OpenCL Specification version 20 (API)

A33 OpenCL 20 C プログラミング言語のパイプにおける制約

インテル FPGA SDK for OpenCL はOpenCL のパイプに対する暫定サポートを提供します次の表はOpenCL Specification version 20 に記載されているパイプ固有の OpenCL C プログラミング言語の実装に対するサポート状況を示しています

注意 サポート状況欄の「」はサポートされている機能であり一部については備考欄においてサポートされている内容を明確化していますSDK がサポートしていない機能は「X」で識別されています

表 16 パイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数ついての詳細はOpenCL Specification version 20 の Section 613162 で提供されています

関数 サポート状況

int read_pipe (pipe gentype p gentype ptr)

int write_pipe (pipe gentype p const gentype ptr)

int read_pipe (pipe gentype p reserve_id_t reserve_id uint index gentypeptr)

X

int write_pipe (pipe gentype p reserve_id_t reserve_id uint index constgentype ptr)

X

reserve_id_t reserve_read_pipe (pipe gentype p uint num_packets)

reserve_id_t reserve_write_pipe (pipe gentype p uint num_packets)

X

void commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

bool is_valid_reserve_id (reserve_id_t reserve_id) X

表 17 ワークグループのパイプ読み出しおよび書き込みの組み込み関数に対するサポート状況パイプ読み出しおよび書き込みの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613163で提供されています

関数 サポート状況

reserve_id_t work_group_reserve_read_pipe (pipe gentype p uint num_packets) X

continued

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

188

関数 サポート状況

reserve_id_t work_group_reserve_write_pipe (pipe gentype p uint num_packets)

void work_group_commit_read_pipe (pipe gentype p reserve_id_t reserve_id)

void work_group_commit_write_pipe (pipe gentype p reserve_id_t reserve_id)

X

表 18 パイプクエリーの組み込み関数に対するサポート状況パイプクエリーの組み込み関数についての詳細はOpenCL Specification version 20 の Section 613164 で提供されています

関数 サポート状況

uint get_pipe_num_packets (pipe gentype p) X

uint get_pipe_max_packets (pipe gentype p) X

関連情報OpenCL Specification version 20 (C Language)

A4 インテル FPGA SDK for OpenCL の割り当てにおける制限

項目 制限

大コンテキスト数 ホストメモリーのサイズによってのみ制限されます

大デバイス数 128

ランタイムの 小グローバルメモリー割り当て ランタイムはコンテキストが作成されると 64 kB のデバイスメモリーを割り当てますこのメモリーはプログラム変数の場合はグローバルアドレス空間に静的変数の場合は関数内に予約されていますOpenCL カーネルが printf関数を使用する場合ランタイムは 64 kB のデバイスメモリーを追加し割り当てます

大キュー数 1024

注意 各コンテキストはシステム目的でキューを 2 つ使用します

コンテキストあたりの 大プログラムオブジェクト数 20

コンテキストあたりの 大イベントオブジェクト数 ホストメモリーのサイズによってのみ制限されます

コンテキスト内のイベント間における依存関係の 大数

1000

コマンドあたりのイベント依存関係の 大数 20

大同時実行カーネル数 キューの合計数

エンキューされるカーネルの 大数 1000

FPGA デバイスあたりの 大カーネル数 ハードウェアに静的な制限はありませんエミュレーターは 256 です

カーネルあたりの 大の引数の数 128

カーネル引数の 大合計サイズ カーネルあたり 256 バイト

各カーネルのローカルメモリーにおける宣言済み変数の 大数

128

A OpenCL 機能のサポート状況UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

189

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20190401 191 bull 以下のトピックを新しく追加しましたmdash ループの投機的実行 (speculated_iterations Pragma) (32 ページ)mdash メモリー属性の指定 (34 ページ)

bull ループの並列性 (max_concurrency Pragma) (31 ページ) に無制限の並行性に関する注意を加えました

bull ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ページ)においてIntelFPGAを関数名に含む非標準の呼び出しに ICD を使用する場合の手順を更新しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)(140 ページ) にパフォーマンスカウンターを使用した OpenCL カーネルのパイプライン計測に関する注記を追加しました

bull ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue) (123 ページ) を追加し-no-hardware-kernel-invocation-queueオプションに関し説明しています

bull グローバルメモリーのリング型相互接続の強制 (-global-ring) (115 ページ) を追加し-global-ringオプションに関し説明しています

bull グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring) (116 ページ) を追加し-duplicate-ringオプションに関し説明しています

bull ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking) (124 ページ) を追加し-hyper-optimized-handshakingオプションに関し説明しています

bull 整数のプロモーション規則 (80 ページ) を追加し整数のプロモーションに関し説明しています

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) およびカーネル実行中におけるプロファイルデータの収集 (86 ページ) にCLcl_ext_intelfpgahヘッダーファイルを含める際の注意を追加しました

bull uses_global_work_offset(0) カーネル属性に関する新しい項目clEnqueueNDRangeKernel API の global_work_offset 引数をサポートするハードウェアの省略 (176 ページ) を追加しました

bull OpenCL10 C プログラミング言語の実装 (181 ページ) の以下の内容を変更しましたmdash 613 に対するサポート状況の内容を変更し説明を追加mdash 614615 および 6102 を削除mdash 66 および 6118 の説明を追加mdash 6112 および 6115 に関する説明を更新mdash 6119 および 61111 のサポート状況を変更

continued

UG-OCL002 | 20190401

フィードバック

Intel Corporation無断での引用転載を禁じますIntelインテルIntel ロゴAlteraARRIACYCLONEENPIRIONMAXNIOSQUARTUS および STRATIX の名称およびロゴはアメリカ合衆国および またはその他の国における Intel Corporationの商標ですインテルは FPGA 製品および半導体製品の性能がインテルの標準保証に準拠することを保証しますがインテル製品およびサービスは予告なく変更される場合がありますインテルが書面にて明示的に同意する場合を除きインテルはここに記載されたアプリケーションまたはいかなる情報製品またはサービスの使用によって生じるいっさいの責任を負いませんインテル製品の顧客は製品またはサービスを購入する前および公開済みの情報を信頼する前にはデバイスの仕様を 新のバージョンにしておくことをお勧めしますその他の社名製品名などは一般に各社の表示商標または登録商標です

ISO90012015登録済

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull OpenCL C プログラミング言語の制約 (183 ページ) において以下の内容を変更していますmdash 次の機能に関する注記を削除しました

bull 関数へのポインターbull ビットフィールドbull externstaticautoregisterのストレージクラス指定子bull 再帰bull event_t型の__kernel関数のへの引数宣言

mdash 特別な注意がない機能をすべて削除しましたmdash 以下の機能を削除しました

bull アドレススペース間のポインター割り当てbull イメージbull 定義済み識別子

mdash 「32 ビット未満の組み込み型メモリーへの書き込み」に関する説明を更新しました

bull 組み込みジオメトリック関数の引数型 (184 ページ) にサポート状況表の見方を追加しました

bull 数値コンプライアンスの実装 (184 ページ) の71 の説明を更新しましたbull 埋め込みプロファイルの実装 (185 ページ) の項目 4 に説明を追加しましたbull OpenCL 12 のランタイムの実装 (186 ページ) のイメージオブジェクトに対する

サポート情報を削除しましたbull OpenCL 12 C プログラミング言語の実装 (186 ページ) のprintfに対するサ

ポート情報と注記およびその他のデータ型の組み込み関数についての注記を更新しました

bull OpenCL 20 のヘッダー (187 ページ) の古い情報を削除し新しい情報を追加しました

bull 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages) (18 ページ) に-list-board-packagesオプションの詳細を追加しました

bull FPGA ボードのインストール (install) (21 ページ) において手順 6 の FCD に関する詳細および手順 5 の例を追記しました

bull FPGA ボードのアンインストール (uninstall) (22 ページ) にFCD に関する詳細を追記しました

bull 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ) に-board-package=ltboard_package_pathgt に関する詳細を追記しました

bull 高速エミュレーターの既知の問題 (134 ページ) のAutoRun (自動実行) の表記をAutorun に変更しました (英語版のみ)

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) を追加し-fmax=ltfmax target in MHzgt に関し説明しています

bull Windows での ICD Loader Library への接続およびLinux での ICD LoaderLibrary への接続の項目を削除しWindows および Linux における ICD と FCD ドライバーに関する情報を次の項目に追加しましたmdash ホストアプリケーションと Khronos ICD Loader Library のリンク (94 ペー

ジ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーへのパスの表

示 (ldflags) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーのリスト表示

(ldlibs) (96 ページ)mdash OpenCL ホストランタイムライブラリーおよび MMD ライブラリーに関する情

報の表示 (link-config または linkflags) (96 ページ)bull OpenCL ICD 拡張 API の使用 (97 ページ) の項目を追加しOpenCL ICD 拡張

API の使用方法を説明しています

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

191

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull カーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ)において次の内容を変更しましたmdash タイトルの変更mdash 概要説明の変更mdash registerの説明を FF と FIFO の情報とともに更新mdash memory属性の名前と説明を更新しメモリーの実装型に関する詳細を追加mdash max_concurrency(N) 属性およびそれに関する説明の追加mdash 構造型データメンバーでのメモリー属性の指定に関する情報を追加

bull 変数固有の属性を使用する際の制約 (173 ページ) にconstant 変数に関する内容を記載しnumbanks属性に関する箇条書きの項目を削除しました

bull カーネルの Fmax ターゲットのスケジュール指定 (-fmax=ltfmax target inMHzgt) (111 ページ) の項目を追加しfmax ターゲット属性と aoc コマンドオプションに関して説明しています

bull OpenCL カーネルのエミュレーションとデバッグ (125 ページ) を更新し高速エミュレーターが現在はデフォルトであり推奨されることを反映しました

20181224 1811 bull RTL リセットおよびクロック信号 (153 ページ) を更新しOpenCL カーネルクロックの2倍の周波数で動作するシステム全体のクロックに対する RTL モジュールのアクセスに関する内容を説明しています

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のEXPECTED_LATENCY要素に関する説明を更新しストールをサポートし ireadyなどの信号を必要とするモジュールに対する EXPECTED_LATENCY値の要件を含めました

bull ATTRIBUTES を指定する XML 要素 (156 ページ) のIS_FIXED_LATENCYXML 要素の説明を更新しIS_FIXED_LATENCY=noが設定されている場合のEXPECTED_LATENCY値の要件を含めました

bull PARAMETER要素を ATTRIBUTES を指定する XML 要素 (156 ページ) に追加しました

bull unique_212unique_212_Connect_42_ul_rlt_5pj_w5 (162 ページ) の箇条書きの2番目の項目において「正確にクロック 1 つ」を削除しました

bull インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt) (108 ページ) を更新し-oオプションの構文から=を削除しましたaocコマンドで出力ファイル名を指定する正しい方法は-o ltfilenamegt ですこのオプションは-o=ltfilenamegt と誤って記載されていましたまたこのコマンドオプションを使用する本プログラミングガイドの構文例はすべて今回の更新において訂正されています

20180927 181 bull RTL モジュールインターフェイス (151 ページ) の重複していた内容を削除しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

192

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

20180924 181 bull インテル FPGA SDK for OpenCL プロエディションのインテル FPGA SDK forOpenCL オフラインコンパイラーには新しいフロントエンドがありますこの新しいフロントエンドによって変更になった内容の概要は Intel FPGA SDK for OpenCLPro Edition Release Notes の Improved Intel FPGA SDK for OpenCLCompiler Front End を参照ください

bull シミュレーションによる OpenCL ライブラリーのデバッグ (プレビュー) (165 ページ) に新しい OpenCL シミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash シミュレーションに向けたライブラリーのコンパイル (-march=emulator)

(166 ページ)mdash OpenCL ライブラリーのシミュレーション (166 ページ)mdash シミュレーターの制限 (168 ページ)

bull 高速エミュレーターの設定 (125 ページ) に新しい OpenCL 高速エミュレーターのプレビューに関する情報を追加しましたまた次のサブ項目も追加されましたmdash 高速エミュレーターの環境変数 (133 ページ)mdash 高速エミュレーターでサポートされている拡張機能 (133 ページ)mdash 高速エミュレーターの既知の問題 (134 ページ)

bull 構造体データ型を OpenCL カーネルに引数として含める (73 ページ) を更新しstructカーネルパラメーターは値または structへのポインターとして渡さなければならないことを示しました

bull 参照でのチャネル渡しに対するサポートは終了したため参照でのチャネル渡しに関する参照内容を削除しました

20180803 180 bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ) の誤記を訂正しました正しいフラグは CL_MEM_HETEROGENEOUS_INTELFPGAですこれまでこのフラグは誤って CL_MEM_HETEROGENEOUS_INTELになっていました

20180614 180 bull ハードウェアを構築せずに行うカーネルのコンパイル (-c) (106 ページ) のaoc -cコマンドの動作についての説明を訂正しました-cコマンドオプションでフォルダーやサブディレクトリーは作成されません

20180523 180 bull カーネルコピーでのチャネル使用 (178 ページ) のコード例を訂正しデザイン例が正常にコンパイルされるようにしました

20180504 180 bull インテル Quartus Prime 開発ソフトウェアスタンダードエディションに関する情報を削除しました

bull 中間コンパイルでの aocコマンドおよび関連するすべての内容において-cを-rtlに変更しました インテル FPGA SDK for OpenCL プロエディションは-rtlフラグを中間コンパイルに提供します

bull 次の項目に記載されているデバイスの 大数を 128 に増加しましたmdash FPGA ボードのインストール (install) (21 ページ)mdash FPGA ボードのデバイス名の照会 (diagnose) (23 ページ)mdash ボード診断テストの実行 (diagnose ltdevice_namegt) (24 ページ)mdash オフラインまたはホストなしでの FPGA のプログラミング (program

ltdevice_namegt) (24 ページ)mdash フラッシュメモリーのプログラミング (flash ltdevice_namegt) (24 ページ)mdash 複数の FPGA デバイスのプログラミング (99 ページ)

bull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) のワンステップでの OpenCL カーネルのコンパイルフローに記載されている図およびトピックの内容を更新しました

bull 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー (12 ページ) の複数のステップによる インテル FPGA SDK forOpenCL プロエディションデザインフローの図を更新し-rtl高速コンパイルおよびインクリメンタルコンパイルに関する情報を追記しました

bull データの処理効率を 適化するためのプログラミング手法 (27 ページ) にループの並列性 (max_concurrency Pragma) (31 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

193

ドキュメントバージョン インテル QuartusPrime のバージョン

変更内容

bull 項目のタイトルをローカルメモリー効率の 適化に向けたプログラミング手法からローカルメモリーサイズへのポインターの 適化に向けたプログラミング手法 (35ページ) へ変更しました

bull IO チャネルのエミュレーション (46 ページ) の章においてカーネルとホストまたはカーネルと他のプロセス間における通信のエミュレーション (Linux 限定) を削除しました

bull 値によってチャネルまたはパイプを渡すカーネルのエミュレーション (127 ページ)を更新し値によるパイプまたはチャネル渡しに関する情報を追加しましたまた参照によるチャネル渡しに対するサポートは非推奨です

bull 項目のタイトルを「チャネルまたはパイプの複数のコマンドキュー実装に向けた要件」からカーネルを同時に実行するための複数のコマンドキューにおける要件 (82ページ) に変更し内容を更新しました

bull カーネルのインクリメンタルコンパイル (-incremental) (118 ページ) の項目を次のサブ項目とともに追加しましたmdash インクリメンタルコンパイルレポート (119 ページ)mdash インクリメンタルコンパイルのその他のコマンドオプション (120 ページ)mdash インクリメンタルコンパイルフィーチャーの制限 (123 ページ)

bull 早期の ECC 機能に関するメモリーの誤り訂正符号をともなうカーネルのコンパイル(-ecc) (123 ページ) の項目を追加しました

bull ホストパイプを介したカーネルとの直接通信 (67 ページ) の次の内容を変更していますmdash 項目のタイトルを新しいカーネル引数属性オプションから

intel_host_accessible カーネル引数属性オプション (67 ページ) に変更mdash 項目のタイトルを新しい API 機能から ホストがアクセス可能なパイプカーネル

引数にバインドされた cl_mem パイプオブジェクトと通信するための API 関数(68 ページ) に変更

bull インテル FPGA SDK for OpenCL の割り当てにおける制限 (189 ページ) の次の内容を変更していますmdash ランタイムでのサポートが終了したことによる環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA の参照項目を削除

mdash キューの 大数を更新bull RTL モジュールの XML 構文 (154 ページ) にRESOURCES要素に関する内容を

追加しましたmdash リソースを指定する XML 要素 (159 ページ) の項目を追加

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にストールのない RTL モジュールおよびストールをサポートする RTL モジュールの インテルStratix 10 デザイン固有のリセット要件 (154 ページ) の項目を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) にカーネル内に登録される割り当ての組み込み関数 (179 ページ) の項目を追加しました

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

194

日付 バージョン 変更内容

2017 年 12 月 20171208 bull 次の項目を新しく追加しましたmdash 自動実行カーネルのプロファイリング (142 ページ)mdash エンキューされたカーネルおよび自動実行カーネルのプロファイリング (88 ペー

ジ)mdash プロファイルデータの取得 (89 ページ)mdash 複数の自動実行プロファイリング呼び出し (89 ページ)mdash インテル Code Builder for OpenCL を使用する OpenCL アプリケーションの

開発 (143 ページ)mdash Microsoft Visual Studio に向けた インテル Code Builder for OpenCL オフ

ラインコンパイラープラグインのコンフィグレーション (143 ページ)mdash Eclipse に向けた インテル Code Builder for OpenCL オフラインコンパイラ

ープラグインのコンフィグレーション (143 ページ)mdash インテル Code Builder for OpenCL でのセッションの作成 (144 ページ)mdash セッションのコンフィグレーション (145 ページ)

bull RTL モジュールの XML 構文 (154 ページ) のXML 仕様ファイルからltPARAMETER name=WIDTH value=32gt を削除しました

2017 年 11 月 20171106 bull トピックを各章へ移動しましたbull リファレンスの商標を次のように変更しました

mdash マクロ ALTERA_CLを INTELFPGA_CLへmdash 環境変数 ALTERAOCLSDKROOTを INTELFPGAOCLSDKROOTへmdash 環境変数

CL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_ALTERA をCL_CONTEXT_PROGRAM_VARIABLES_TOTAL_SIZE_INTELFPGA へ

mdash clGetExtensionFunctionAddressをclGetExtensionFunctionAddressIntelFPGAへ

mdash 環境変数 CL_CONTEXT_EMULATOR_DEVICE_ALTERA をCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA へ

mdash write_channel_alteraを write_channel_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash CL_MEM_BANKを CL_CHANNELへmdash CL_MEM_BANK_1_INTELを CL_CHANNEL_1_INTELFPGAへmdash CL_MEM_BANK_2_INTELを CL_CHANNEL_2_INTELFPGAへmdash Arria 10 を インテル Arria 10 へmdash Quartus Prime をインテル Quartus Prime へmdash インテル FPGA SDK for OpenCL Profiler を インテル FPGA Dynamic

Profiler for OpenCL へmdash TimeQuest タイミングアナライザーをタイミングアナライザーへmdash Qsys Pro をプラットフォームデザイナーへ

bull インテル FPGA SDK for OpenCL の FPGA プログラミングフロー (8 ページ) にFPGA データフローのアーキテクチャー図と関連する記述を追加しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の項目にRTL モジュールインターフェイス (151 ページ) を追加しRTL モジュールインターフェイスの動作例を提供しています

bull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) のタイミング図を更新しました

bull ブロッキングのチャネル書き込みの実装 (42 ページ) とブロッキングのチャネル読み取りの実装 (43 ページ) においてlttypegt の定義から「一定にできない」という記述を削除しました

bull 徐々に速度低下する OpenCL システムのデバッグ (104 ページ) の項目を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

195

日付 バージョン 変更内容

bull PLDA ウェブサイトへのリンクを OpenCL カーネルのコンパイル (105 ページ) に追加しました

bull カーネルの命名ガイドライン (26 ページ) において箇条書きの 後のポイントを更新しキーワードとなる VHDL と Verilog を含めました

bull インテル FPGA SDK for OpenCL のアドバンスト機能 (147 ページ) に制御可能なデザインの側面を一覧にしました

bull OpenCL ライブラリー (147 ページ) に RTL の拡張を追加しましたbull RTL モジュールと OpenCL パイプラインの理解 (148 ページ) の項目をインテル

FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ) と RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149 ページ)に分割しました

bull インテル FPGA SDK for OpenCL パイプラインのアプローチの概要 (149 ページ)の左側のコード例を右側の図に合わせました図の下部を図を説明する段落の上に移動させました

bull RTL モジュールのインテル FPGA SDK for OpenCL パイプラインへの統合 (149ページ) に Avalon -ST の関連リンクを追加しました

bull ストールのない RTL (150 ページ) のパラグラフを手順ごとに分割し関連リンクを追加しました

bull 複数のワークアイテムの決定論的な順序付けにおける要件 (38 ページ) にワークアイテムの順序付けにおける 3 番目の要件を追加しました

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) を更新しましたbull 新しいトピック OpenCL コンパイルの高速化 (-fast-compile) (117 ページ) を追

加し-option=ltvaluegt の規則を実装しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のlog ファイルへのリファレンスを HTML レポートに置き換え二重ダッシュのコマンドオプションを単一ダッシュに置き換えました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にStratix 10 に対するサポートを追加しました

bull ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得(16 ページ) に二重ダッシュおよび aoc コマンドの-option ltvaluegt の表記規則が非推奨となったことを強調する注記を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

196

日付 バージョン 変更内容

bull 次の項目に単一ダッシュと-option=ltvaluegt の表記規則を適用しましたmdash コンパイラーバージョンの表示 (-version) (17 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプショ

ンリストの表示 (引数なし-help-h) (17 ページ)mdash 利用可能な FPGA ボードとカスタムプラットフォームのリスト表示 (-list-

boards および-list-board-packages) (18 ページ)mdash 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)mdash ヘッダーファイル位置の指定 (-I=ltdirectorygt) (107 ページ)mdash インテル FPGA SDK for OpenCL オフラインコンパイラーの出力ファイル名の

指定 (-o ltfilenamegt) (108 ページ)mdash 特定の FPGA ボードとカスタムプラットフォームに対するカーネルのコンパイル

(-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt) (108 ページ)

mdash カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort) (110 ページ)

mdash カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt) (111 ページ)

mdash リソース推定使用率要約の画面表示 (-report) (113 ページ)mdash グローバルメモリーのバーストインターリーブの無効化 (-no-

interleaving=ltglobal_memory_typegt) (115 ページ)mdash コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-

cache-bytes=ltNgt) (116 ページ)mdash 浮動小数点演算処理順序の緩和 (-fp-relaxed) (116 ページ)mdash 浮動小数点演算における丸め処理の削減 (-fpc) (117 ページ)mdash チャネル深度のエミュレーション (128 ページ)mdash エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-

emulator) (128 ページ)mdash OpenCL ライブラリーに向けた OpenCL ヘルパー関数ファイルのパッケージ化

(161 ページ)mdash OpenCL ライブラリーのコマンドラインオプション (170 ページ)mdash パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)

(140 ページ)bull カスタムプラットフォーム固有の関数へのアクセス (90 ページ) にICD Loader の

関連リンクを追加しましたbull 計算ユニット数の指定 (33 ページ)num_compute_units(XYZ) 属性を使用し

たカーネルの複製 (176 ページ)OpenCL カーネルのエミュレーション (129 ページ) に計算ユニットに関する注記を追加しました

bull エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator) (128 ページ) にインテル Stratix 10 に対するサポートを追加しました

bull ハードウェアとエミュレーターの結果の不一致 (131 ページ) の項目を追加しましたbull OpenCL C プログラミング言語の制約 (183 ページ) にサポート状況表の見方を

追加しましたbull シンプルなカーネルに向けたワンステップコンパイル (11 ページ) と複数のステッ

プによる インテル FPGA SDK for OpenCL プロエディションデザインフロー(12 ページ) のフローチャートを簡略化しそれにともなう記述を更新しました

bull AOCL_BOARD_PACKAGE_ROOT は廃止されているためリファレンスを本プログラミングガイドから削除しました

bull aocl installのインスタンスをaocl installltpath_to_customplatformgt に更新しました

bull aocl uninstallのインスタンスをaocl uninstallltpath_to_customplatformgt に更新しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

197

日付 バージョン 変更内容

bull ホストパイプに関する次の項目を新しく追加しましたmdash ホストパイプを介したカーネルとの直接通信 (67 ページ)mdash intel_host_accessible カーネル引数属性オプション (67 ページ)mdash ホストがアクセス可能なパイプカーネル引数にバインドされた cl_mem パイプ

オブジェクトと通信するための API 関数 (68 ページ)mdash ホストがアクセス可能なパイプの作成 (69 ページ)mdash cl_intel_fpga_host_pipe 拡張機能の使用例 (69 ページ)

bull OpenCL カーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化(41 ページ) にチャネル拡張を有効にするためのプラグマを追加しました

bull シンプルな関数で動作する OpenCL ライブラリーの使用 (例 1) (168 ページ) および外部メモリーと動作する OpenCL ライブラリーの使用 (例 2) (169 ページ) のデザイン例のコンパイル手順を更新しました

bull インテル FPGA SDK for OpenCL チャネル拡張の実装における制約 (39 ページ)の「単一のチャネル呼び出しサイト」の項目を「複数のチャネル呼び出しサイト」に置き換えました

2017 年 5 月 20170508 bull コード例の関数の商標を次のように変更しましたmdash read_channel_alteraを read_channel_intelへmdash write_channel_alteraを write_channel_intelへmdash read_channel_nb_alteraを read_channel_nb_intelへmdash write_channel_nb_alteraを write_channel_nb_intelへmdash clGetBoardExtensionFunctionAddressAlteraを

clGetBoardExtensionFunctionAddressIntelFPGAへbull IO チャネルのエミュレーション (46 ページ) を追加しましたbull 任意精度での整数の実装 (70 ページ) を追加しましたbull ネスト化されたループの結合 (28 ページ) を追加しましたbull ループ開始間隔の指定 (II) (30 ページ) を追加しましたbull チャネル深度のエミュレーション (128 ページ) を追加しましたbull Avalon Streaming (Avalon-ST) インターフェイス (152 ページ) を追加しまし

たbull pragma OPENCL EXTENSION cl_altera_channels enableへ

のリファレンスをすべて削除しましたチャネルの実装にこのプラグマは必要ありません

bull 異種メモリーに関する情報を次のように再編成しましたmdash メモリーにおけるポインターサイズの指定の内容をローカルメモリーサイズへ

のポインターの 適化に向けたプログラミング手法 (35 ページ) へ統合mdash 次の 3 項目に構成を変更

bull グローバルメモリーの手動分割における OpenCL バッファーの割り当て(82 ページ)

bull 同じメモリータイプの複数のインターフェイスでのバッファーの分割 (82 ページ)

bull 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割 (84 ページ)mdash グローバルメモリーにおけるバッファー位置の指定の内容を異なるメモリータイ

プ (異種メモリー) 間でのバッファーの分割 (84 ページ) に移動(これまではアクセス効率の 適化に向けたプログラミング手法にありました)

bull カーネル実行中におけるプロファイルデータの収集 (86 ページ) を更新しプロファイルデータの収集がカーネル起動時に与える影響についての警告を加えました

bull OpenCL カーネルのコンパイル (105 ページ) に暗号化されたclファイルをコンパイルする際の制約を加え更新しました

bull インテル FPGA SDK for OpenCL ライブラリー機能に対する RTL サポートの制約と制限 (162 ページ) を更新しRTL モジュールは入力を制御するために単一入力のAvalon-ST インターフェイスを使用する必要があることを明記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

198

日付 バージョン 変更内容

bull OpenCL Profiler の変更によって影響を受ける項目を以下のように更新しましたmdash インテル FPGA Dynamic Profiler for OpenCL GUI の起動 (report) (141

ページ) に新しいコマンドオプションを含め更新mdash 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデ

ザインフロー (12 ページ) の図 5 (13 ページ) に新しいコマンドオプションを反映させて更新

bull ノンブロッキングのチャネル読み取りの実装 (43 ページ) のコード例を訂正しました

bull チャネルのワークアイテムのシリアル実行 (39 ページ) の複数のワークアイテムをともなうループのチャネル実行の章に記載されているコード例を訂正しました

bull インテル FPGA SDK for OpenCL のアドバンスト機能の章に以下の更新を行いましたmdash RTL モジュールと外部メモリーの通信 (159 ページ) を更新しRTL モジュール

と外部メモリーの通信において推奨される手法を明記mdash RTL モジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性

(161 ページ) を更新しインテル Quartus Prime 開発ソフトウェアプロエディションユーザーガイドのパーシャルリコンフィグレーションへのリンクを追記

mdash bankbitsと mergeの内容をカーネルのメモリーシステムをコンフィグレーションするメモリー属性 (171 ページ) に追加

mdash コード例の関数の商標を以下のように変更bull read_channel_alteraを read_channel_intelへbull write_channel_alteraを write_channel_intelへ

2016 年 10 月 20161031 bull Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更しました

bull Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコンパイラーに商標を変更しました

bull ビッグエンディアンシステムに対するサポートが廃止削除されたため次の内容が変更になっていますmdash ビッグエンディアンシステムのためのカーネルのコンパイル (--big-endian) の

項目を削除mdash ビッグエンディアン (64 ビット) をホストアプリケーションがターゲットにでき

るアーキテクチャーのリストから削除bull OpenCL バイナリーのコンパイル環境の表示の項目を追加しaoc envコマンドを

導入しましたbull 適化レポートへのソースの参照先追加 (-g) を削除しましたオフラインコンパイ

ラーは自動的にソース情報をコンパイラーレポートに含めx86 Linux マシンでのエミュレーション中のシンボリックデバッグを有効にします

bull コンパイラーレポートのデバッグデータの削除およびaocx ファイルのソースコードの削除 (-g0) の項目を追加し-g0 aocコマンドオプションを導入しました

bull インテル FPGA SDK for OpenCL エミュレーターの制限事項から「エミュレーターはハーフデータ型をサポートしません」という記述を削除しました

bull ホストアプリケーションと Khronos ICD Loader Library のリンクにおいてサポート内容を更新しましたインテルが提供する ICD Loader Library はOpenCLSpecification version 10 およびOpenCL Specification version 111220 で実装されている API をサポートします

bull FPGA ボードの管理における以下内容を更新しましたmdash SDK が複数のカスタムプラットフォームのインストールをサポートすることを明

記複数のボードをインストレールする際に SDK ユーティリティーを各ボードに使用するにはAOCL_BOARD_PACKAGE_ROOT 環境変数設定が関連するボードのカスタムプラットフォームのサブディレクトリーに対応している必要があります

mdash カスタムプラットフォームが複数あるシステムではMMD ライブラリーに直接リンクするのではなくホストプログラムが ACD を使用しボードを検出する必要があることを明記

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

199

日付 バージョン 変更内容

bull カーネルの reporthtml ファイルのレビューの章を追加しanalyze-areaユーティリティーオプション廃止の通知を追加しましたHTML レポートの導入により以下の項目を削除しましたmdash エリアレポートでのカーネルのリソース使用率情報のレビューmdash エリアレポートへのアクセスmdash エリアレポートのレイアウト

bull 複数のステップによるデザインフローのデザイン手順および複数のステップによるインテル FPGA SDK for OpenCL デザインフローの図を更新しエリアレポートをHTML レポートに置き換えましたまた-gを有効化するための情報を削除しました

bull レジスターの推論のコード例に続く文章においてハードウェアでの配列の実装をオフラインコンパイラーが決定する方法の説明を訂正しました

bull Windows での ICD Loader Library のリンクの内容をより明確化しましたbull OpenCL 機能のサポートの章に次の更新を行いました

mdash Altera SDK for OpenCL を インテル FPGA SDK for OpenCL に商標を変更mdash Altera Offline Compiler を インテル FPGA SDK for OpenCL オフラインコ

ンパイラーに商標を変更mdash インテル FPGA SDK for OpenCL 割り当ての制限の章の次の内容を修正

bull ランタイムの 小メモリー割り当てに関する情報を更新bull 大キュー数を 70 から 256 へ更新bull FPGA デバイスあたりの 大カーネル数の 64 を変更ハードウェアにコンパ

イルする場合の静的な制限はなくなりエミュレーターにコンパイルする場合は 256 になります

mdash OpenCL 10 C プログラミング言語の実装の半精度浮動小数点の備考欄にこの機能はエミュレーターでサポートされているという注記を追加さらに半精度浮動小数点のサポート状況を「X」から「」へ更新

mdash OpenCL 20 機能のサポート状況にOpenCL 20 のヘッダーを加えOpenCL20 のヘッダーを使用しサポートされていない API を呼び出すとエラーの原因になることを追記

2016 年 5 月 20160502 bull AOCL プログラミングモデルの回路図を Altera SDK for OpenCL FPGAProgramming Flow の章に追加しました

bull AOCL FPGA プログラミングフローの図をAltera Offline Compiler KernelCompilation Flows の章へ移動しました

bull 複数ステップでの AOCL デザインフローの図とそれに関連する内容をエリアレポートのレビュー手順を含めて更新しました

bull 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの機能に関する情報を追加しました詳細は単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーターの章を参照ください

bull OpenCL カーネルのエミュレーションの章にICD を使用する他の OpenCL SDK とともにエミュレーションを行うための複数のデバイスサポートに関する情報を追加しました

bull 強化されたエリアレポート機能に関する情報を追加しましたmdash analyze-area AOCL ユーティリティーコマンドを呼び出しHTML エリアレ

ポートを生成するオプションを追加mdash HTML エリアレポートのレイアウトを説明する項目を追加

bull Windows での ICD Loader Library のリンクにおいて変更後の Makefileのコード例から$(AOCL_LDLIBS) を削除しました

bull チャネルおよびパイプの複数のワークアイテムの順序付けの章においてチャネルまたはパイプ呼び出しがワークアイテムに対し不変であることを確認するために AOCLが使用する特性を変更しました

bull インテル FPGA SDK for OpenCL アドバンスト機能の章を追加しましたbull OpenCL 機能のサポート状況の章の OpenCL 12 のランタイムの実装にAOCL が

clSetEventCallbackclGetKernelArgInfoclSetMemObjectDestructorCallback の API をサポートすることを注記しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

200

日付 バージョン 変更内容

2015 年 11 月 20151102 bull aocコマンドを引数なしで呼び出しAltera Offline Compiler のヘルプメニューにアクセスするオプションを追加しました

bull 複数のホストスレッドの章を更新しOpenCL ホストランタイムはスレッドセーフであることを明記しました

bull 複数のカーネルのソースファイルサポートを反映するため以下の図と章を更新しましたmdash AOCL FPGA プログラミングフローの章の AOCL FPGA プログラミングフロ

ーの図mdash ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコン

パイルの章mdash ハードウェアを構築せずに行うカーネルのコンパイル (-c) の章

bull チャネルに対する複数のワークアイテムの順序付けの誤解を招く文章を削除しましたbull チャネル実装の概要の図を更新しましたbull 次の章の OpenCL パイプに関する内容を更新しました

mdash OpenCL パイプ機能の概要のパイプネットワーク実装の概要の図mdash OpenCL のパイプ実装における制約の章のエミュレーションサポートmdash 誤ったコードを正しい構文に修正mdash パイプハンドルの宣言の io 属性を使用した IO パイプの実装にリンクを追加

bull ホストを経由した FPGA のプログラミングに注意事項を追記しましたイベントオブジェクトは使用後に解放し過剰なメモリー使用を防ぐ必要があります

bull OpenCL 機能のサポート状況の以下の内容を更新しましたmdash OpenCL Specification のバージョンに基づき各機能のサポート状況と制限事

項を分類mdash OpenCL に準拠する倍精度浮動小数点関数リストに次の関数を追加

sinh cosh tanh asinh acosh atanh pow pown powr tanh atan atan2 ldexp log1p sincos

mdash OpenCL 12 のランタイムの実装にサブバッファーオブジェクトのサポートを追加

mdash OpenCL 12 のランタイムの実装に共有仮想メモリーに対する暫定サポートを追加

mdash Altera SDK for OpenCL 割り当ての制限にランタイムの 小グローバルメモリーの割り当て制限を追加

2015 年 5 月 1500 bull カーネルの命名ガイドラインにOpenCL カーネルを kernelclと命名することに反対する内容を追記しました

bull パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile) にローカルディスクからホストアプリケーションを実行し低速なネットワークディスクアクセスに起因する潜在的な遅延を回避する必要があることを明記しました

bull OpenCL カーネルのエミュレーションとデバッグの注記を変更しSoC をターゲットとするデザインのエミュレーションは SoC 以外のボードで行う必要があることを示しました

bull OpenCL カーネルのエミュレーションのホストアプリケーションを実行するコマンドを更新し ltprocess_IDgt-libkernelsoを含むデフォルトの一時ディレクトリーを上書きする命令を追加しました

bull カーネルコンパイル時のハードウェア生成フィッティングエラーの解決に--high-effort aocコマンドフラグを導入しました

bull 倍精度浮動小数点演算の有効化に倍精度浮動小数点演算を有効にするためのOPENCL EXTENSIONプラグマを導入しました

bull OpenCL パイプのサポートを導入しました詳しくはOpenCL パイプの実装 (またその章内の項目) およびホストアプリケーションでのパイプオブジェクトの作成を参照してください

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

201

日付 バージョン 変更内容

bull AOCL チャネル拡張の制約にチャネル ID の配列への静的なインデックス付けの方法を表すコード例を追加しました

bull 複数のホストスレッドにOpenCL ホスト関数の呼び出しを複数のスレッドを持つホストアプリケーションで同期するための推奨事項を追加しました

bull ICD と ACD のサポートを導入しました詳しくはホストアプリケーションとKhronos ICD Loader Library のリンクを参照してください

bull clGetBoardExtensionFunctionAddressAlteraを導入しユーザーが利用可能な関数をリファレンスできるようにしました詳細はカスタムプラットフォーム固有の関数へのアクセスを参照してください

bull OpenCL 機能のサポート状況の以下内容を更新しましたmdash Alterareg SDK for OpenCL が暫定的にサポートする倍精度浮動小数点関数の

一覧を表示mdash OpenCL C プログラミング言語のパイプにおける制約を追記

2014 年 12 月 1410 bull 情報フローを再編成しましたAltera reg SDK for OpenCL (AOCL) または AlteraRTE OpenCL を使用して実行する可能性のある作業に基づき情報を提供しています

bull --util ltNgt および-O3の AOC (Altera Offline Compiler) オプションに関連する情報を削除しました

bull OpenCL カーネルのコンパイルに以下の PLDA QuickUDP IP コアライセンスに関する情報を追加しました1 PLDA QuickUDP IP コアライセンスは Stratix V ネットワークリファレンスプ

ラットフォームまたは QuickUDP IP コアを使用するカスタムプラットフォームに必要です

2 QuickUDP IP コアライセンスを不適切にインストールするとQuickTCP IP コアに関するエラーメッセージが表示されコンパイルは失敗します

bull 大規模なシフトレジスターの条件付きシフトは推奨されないという注記を追加しました

bull 複数のデバイスでのシステムのエミュレーションの章を削除しました現在は新しいenvCL_CONTEXT_EMULATOR_DEVICE_ALTERA=ltnumber_of_devicesgtコマンドが複数のデバイスをエミュレーションするために利用可能です

bull 言語サポートの制限を AOCL エミュレーターの制限の章から削除しましたbull OpenCL 機能のサポートの章の AOCL の割り当て制限でFPGA あたりの 大カー

ネル数を 32 から 64 に更新しました

2014 年 6 月 1400 bull --estimate-throughputおよび--sw-dimm-partitionの AOC オプションを削除しました

bull -march=emulator-g--big-endian--profileの AOC オプションを追加しました

bull --no-interleavingはltglobal_memory_typegt 引数を必要としますbull -fp-relaxed=trueは現在--fp-relaxedですbull -fpc=trueは現在--fpcですbull SoC 以外のデバイスにおいて aocl diagnostic は現在 aocl

diagnose および aocl diagnose ltdevice_namegt ですbull programおよび flashはltdevice_namegt 引数を必要としますbull FPGA ボードのデバイス名の識別を追加しましたbull AOCL プロファイラーユーティリティーを追加しましたbull AOCL のチャネル拡張と関連する項目を追加しましたbull チャネルの属性を追加しましたbull ホストとカーネルにおける構造体データ型のデータレイアウトの一致を追加しましたbull レジスターインターフェイスおよびシフトレジスターインターフェイスを追加しまし

たbull Channels and Multiple Command Queues を追加しましたbull SoC で動作する OpenCL カーネルの共有メモリーアクセスを追加しましたbull カーネル実行中におけるプロファイルデータの収集を追加しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

202

日付 バージョン 変更内容

bull OpenCL カーネルのエミュレーションとデバッグとそれに関連するサブ項目を追加しました

bull AOC カーネルのコンパイルフローを更新しましたbull -v を更新しましたbull ホストバイナリーの要件を更新しましたbull グローバルメモリーアクセスの分割と異種グローバルメモリーアクセスの分割を

グローバルメモリーアクセスの分割に統合しましたbull 付録 A の AOC 割り当ての制限を更新しましたbull max_unroll_loopsmax_share_resources

num_share_resourcestaskのカーネル属性を削除しましたbull packedと aligned(ltNgt) のカーネル属性を追加しましたbull OpenCL 機能のサポート状況の章の以下 AOCL 割り当て制限の内容を更新しまし

たmdash 大コンテキスト数mdash 大キュー数mdash コンテキストあたりの 大イベントオブジェクト数

2013 年 12 月 1311 bull 「-W と-Werror」の章を削除し「-W」と「-Werror」の 2 章に再編成しましたbull 複数のデバイスのサポートを反映するために次の内容を更新しました

mdash AOCL FPGA プログラミングフローの図mdash --list-boards の章mdash -board ltboard_namegt の章mdash 複数の FPGA デバイスのプログラミングの項目をFPGA のプログラミングに追

加bull 異種グローバルメモリーのサポートを反映するため以下の内容を追加しました

mdash --no-interleaving の章mdash カーネルのプラグマと属性に buffer_locationのカーネル属性mdash 異種グローバルメモリーアクセスの分割の章

bull 付録OpenCL 機能のサポート状況においてサポート状況の指定を更新しましたbull OpenCL プログラミング言語の実装の章からOpenCL プログラミング言語の制約

に関する情報を削除しましたまた新しく OpenCL プログラミング言語の制約の章を作成しその内容を記載しました

2013 年 11 月 1310 bull 情報フローを再編成しましたbull インテル FPGA SDK for OpenCL コンパイルフローを更新後AOCL FPGA プロ

グラミングフローにタイトルを変更しましたbull 1 ステップでの AOC コンパイルフローと 2 ステップでの AOC コンパイルフローの

図を追加しましたbull AOCL バージョン 131 の内容の章を更新しましたbull 以下の章を削除しました

mdash OpenCL カーネルソースファイルのコンパイルmdash Altera Offline Kernel Compiler の使用mdash FPGA ボードの設定mdash 特定の FPGA ボードのターゲットmdash OpenCL アプリケーションの実行mdash カーネルソースファイルの統合mdash アライメントされたメモリー割り当てmdash FPGA ハードウェアのプログラミングmdash FPGA のフラッシュメモリーのプログラミング

bull OpenCL カーネルソースファイルのコンパイルを更新後AOC コンパイルフローへ名称を変更しました

bull OpenCL カーネルへのファイルスコープ構造の受け渡しを OpenCL カーネルでの構造体引数の使用にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張を更新しカーネルのプラグマと属性へタイトルを変更しました

bull FPGA へのカーネルのロードを FPGA のプログラミングにタイトルを変更しました

continued

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

フィードバック インテル FPGA SDK for OpenCL プロエディション プログラミングガイド

203

日付 バージョン 変更内容

bull ホストプログラムのコンパイルおよびリンクホストプログラムのコンパイルの設定およびライブラリーパスとリンクを 1 つの章に統合しました

bull プリプロセッサーマクロの章を追加しましたbull グローバルメモリーアクセスの 適化のタイトルをグローバルメモリーアクセス

の分割に変更しました

2013 年 6 月 130 SP10 bull FPGA ボードの設定の章を追加しましたbull カーネルプログラミング時の考慮事項からターゲット FPGA ボードの指定の項目

を削除しましたbull 特定の FPGA ボードのターゲットとコンパイルレポートの生成の項目をOpenCL カ

ーネルソースファイルのコンパイルに追加しましたbull ファイルスコープ__constant アドレス空間修飾子のタイトルを__constant アドレ

ス空間修飾子に変更し次の項目を挿入しましたmdash 関数スコープ__constant 変数mdash ファイルスコープ__constant 変数mdash ホストからの__constant パラメーターの指定

bull OpenCL カーネルへのファイルスコープ構造の受け渡しの項目をカーネルプログラミング時の考慮事項に追記しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの変更をカーネル属性とプラグマの指定による OpenCL カーネルの拡張にタイトルを変更しました

bull カーネル属性とプラグマの指定による OpenCL カーネルの拡張の章の unrollプラグマディレクティブの内容を更新しました

bull 順不同のコマンドキューおよび構造パラメーター変換に向けたホストプログラムの変更の項目をホストプログラミング時の考慮事項に追加しました

bull clCreateProgramWithBinary を使用した FPGA へのカーネルのロード およびアライメントされたメモリー割り当ての章を更新しました

bull フラッシュプログラミング手順を更新しましたbull 付録 B のオプションの拡張の内容を更新しアトミック関数にタイトルを変更しまし

たbull 付録 B からプラットフォームレイヤーとランタイムの実装を削除しました

2013 年 5 月 1301 bull 明示的なメモリーフェンス機能がサポートされるようになったため関連する内容をOpenCL プログラミング言語の実装の表から削除しました

bull FPGA のフラッシュメモリーのプログラミングの章を更新しましたbull カーネル属性とプラグマの指定による OpenCL カーネルの変更の章を追加しカー

ネルのパフォーマンスを 適化するために実装可能なカーネル属性とプラグマを導入しました

bull グローバルメモリーアクセスの 適化の章を追加しデータの分割に関する説明を追加しました

bull 付録 A からaocl プラグムコマンドを使用した FPGA のプログラミングの章を削除しました

2013 年 5 月 1300 bull コンパイルフローを更新しましたbull カーネルのコンパイラーコマンドを更新しましたbull Altera SDK for OpenCL ユーティリティーコマンドを追加しましたbull OpenCL プログラミング時の考慮事項を追加しましたbull フラッシュプログラミング手順を更新しこれを付録 A に移動しましたbull 新しい clCreateProgramWithBinary FPGA ハードウェアプログラミング

フローを追加しましたbull ホストを必要としない clCreateProgramWithBinaryハードウェアプログラ

ミングフローを付録 A の aocl プラグマコマンドを使用した FPGA プログラミングに移動しました

bull 割り当て制限と OpenCL 言語サポートに関する 新情報を付録 B へ移動しました

2012 年 11 月 1210 初版

B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴UG-OCL002 | 20190401

インテル FPGA SDK for OpenCL プロエディション プログラミングガイド フィードバック

204

  • インテル FPGA SDK for OpenCLプロエディション プログラミングガイド
  • 目次
  • 1 インテルreg FPGA SDK for OpenCLtrade の概要
    • 11 インテル FPGA SDK for OpenCL プロエディションプログラミングガイドのご利用における前提条件
    • 12 インテル FPGA SDK for OpenCLのFPGAプログラミングフロー
      • 2 インテル FPGA SDK for OpenCLオフラインコンパイラーのカーネルコンパイルフロー
        • 21 シンプルなカーネルに向けたワンステップコンパイル
        • 22 複数のステップによる インテル FPGA SDK for OpenCL プロエディションデザインフロー
          • 3 ソフトウェアコンパイラーカスタムプラットフォームに関する一般的な情報の取得
            • 31 ソフトウェアバージョンの表示 (version)
            • 32 コンパイラーバージョンの表示 (-version)
            • 33 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプションリストの表示 (help)
              • 331 インテル FPGA SDK for OpenCL ユーティリティーコマンドオプション情報の表示 (help ltcommand_optiongt)
                • 34 インテル FPGA SDK for OpenCL オフラインコンパイラーコマンドオプションリストの表示 (引数なし-help-h)
                • 35 利用可能なFPGAボードとカスタムプラットフォームのリスト表示 (-list-boardsおよび-list-board-packages)
                • 36 OpenCLバイナリーのコンパイル環境の表示 (env)
                  • 4 FPGAボードの管理
                    • 41 FPGAボードのインストール (install)
                    • 42 FPGAボードのアンインストール (uninstall)
                    • 43 FPGAボードのデバイス名の照会 (diagnose)
                    • 44 ボード診断テストの実行 (diagnose ltdevice_namegt)
                    • 45 オフラインまたはホストなしでのFPGAのプログラミング (program ltdevice_namegt)
                    • 46 フラッシュメモリーのプログラミング (flash ltdevice_namegt)
                      • 5 OpenCLカーネルの構築
                        • 51 カーネルの命名ガイドライン
                        • 52 データの処理効率を最適化するためのプログラミング手法
                          • 521 ループ展開 (unroll Pragma)
                          • 522 ネスト化されたループの結合
                          • 523 ループ開始間隔の指定 (II)
                          • 524 ループの並列性 (max_concurrency Pragma)
                          • 525 ループの投機的実行 (speculated_iterations Pragma)
                          • 526 ワークグループサイズの指定
                          • 527 計算ユニット数の指定
                          • 528 SIMDワークアイテム数の指定
                          • 529 メモリー属性の指定
                            • 53 ローカルメモリーサイズへのポインターの最適化に向けたプログラミング手法
                            • 54 インテル FPGA SDK for OpenCL チャネル拡張の実装
                              • 541 インテル FPGA SDK for OpenCL チャネル拡張の概要
                              • 542 チャネルにおけるデータの動作
                              • 543 チャネルに対する複数のワークアイテムの順序付け
                                • 5431 チャネルのワークアイテムのシリアル実行
                                  • 544 インテル FPGA SDK for OpenCL チャネル拡張の実装における制約
                                  • 545 OpenCLカーネルに向けた インテル FPGA SDK for OpenCL チャネルの有効化
                                    • 5451 チャネルのハンドル宣言
                                    • 5452 ブロッキングのチャネル書き込みの実装
                                      • 54521 ノンブロッキングのチャネル書き込みの実装
                                        • 5453 ブロッキングのチャネル読み取りの実装
                                          • 54531 ノンブロッキングのチャネル読み取りの実装
                                            • 5454 ioチャネル属性を使用したIOチャネルの実装
                                            • 5455 IOチャネルのエミュレーション
                                            • 5456 インテル FPGA SDK for OpenCL チャネル実装を活用したモデル例
                                            • 5457 depth属性を使用するバッファーされたチャネルの実装
                                            • 5458 チャネルの呼び出し順序の強制
                                              • 54581 チャネル使用時のカーネル間におけるメモリーの一貫性の定義
                                                • 55 OpenCLパイプの実装
                                                  • 551 OpenCLパイプ機能の概要
                                                  • 552 パイプデータの動作
                                                  • 553 パイプにおける複数のワークアイテムの順序付け
                                                    • 5531 パイプにおけるワークアイテムのシリアル実行
                                                      • 554 OpenCLのパイプ実装における制約
                                                      • 555 カーネルに向けたOpenCLパイプの有効化
                                                        • 5551 他のOpenCL SDKとの互換性の確保
                                                        • 5552 パイプハンドルの宣言
                                                        • 5553 パイプ書き込みの実装
                                                        • 5554 パイプ読み出しの実装
                                                        • 5555 depth属性を使用するバッファーされたパイプの実装
                                                        • 5556 io属性を使用したIOパイプの実装
                                                        • 5557 パイプ呼び出し順序の強制
                                                          • 55571 パイプ使用時におけるカーネル間のメモリーの一貫性の定義
                                                              • 556 ホストパイプを介したカーネルとの直接通信
                                                                • 5561 intel_host_accessibleカーネル引数属性オプション
                                                                • 5562 ホストがアクセス可能なパイプカーネル引数にバインドされたcl_memパイプオブジェクトと通信するためのAPI関数
                                                                • 5563 ホストがアクセス可能なパイプの作成
                                                                • 5564 cl_intel_fpga_host_pipe拡張機能の使用例
                                                                    • 56 任意精度での整数の実装
                                                                    • 57 条件付きコンパイルにおける定義済みプリプロセッサーマクロの使用
                                                                    • 58 __constantアドレス空間修飾子の宣言
                                                                    • 59 構造体データ型をOpenCLカーネルに引数として含める
                                                                      • 591 ホストとカーネルにおける構造体データ型のデータレイアウトの一致
                                                                      • 592 データ構造パディング挿入の無効化
                                                                      • 593 構造体のアライメントの指定
                                                                        • 510 レジスターの推論
                                                                          • 5101 シフトレジスターの推論
                                                                            • 511 倍精度浮動小数点演算の有効化
                                                                            • 512 単一ワークアイテムカーネルに向けた単一サイクル浮動小数点アキュムレーター
                                                                              • 5121 アキュムレーターを推論するためのプログラミング手法
                                                                                • 513 整数のプロモーション規則
                                                                                  • 6 ホストアプリケーションの設計
                                                                                    • 61 ホストのプログラミング要件
                                                                                      • 611 ホストマシンのメモリー要件
                                                                                      • 612 ホストバイナリーの要件
                                                                                      • 613 複数のホストスレッド
                                                                                      • 614 順不同のコマンドキュー
                                                                                      • 615 カーネルを同時に実行するための複数のコマンドキューにおける要件
                                                                                        • 62 グローバルメモリーの手動分割におけるOpenCLバッファーの割り当て
                                                                                          • 621 同じメモリータイプの複数のインターフェイスでのバッファーの分割
                                                                                          • 622 異なるメモリータイプ (異種メモリー) 間でのバッファーの分割
                                                                                          • 623 ホストアプリケーションでのパイプオブジェクトの作成
                                                                                            • 63 カーネル実行中におけるプロファイルデータの収集
                                                                                              • 631 エンキューされたカーネルおよび自動実行カーネルのプロファイリング
                                                                                              • 632 プロファイルデータの取得
                                                                                              • 633 複数の自動実行プロファイリング呼び出し
                                                                                                • 64 カスタムプラットフォーム固有の関数へのアクセス
                                                                                                • 65 構造パラメーター変換に向けたホストプログラムの変更
                                                                                                • 66 ホストアプリケーションの管理
                                                                                                  • 661 Makefileフラグメント例の表示 (example-makefileまたはmakefile)
                                                                                                  • 662 ホストアプリケーションのコンパイルとリンク
                                                                                                    • 6621 ホストアプリケーションとKhronos ICD Loader Libraryのリンク
                                                                                                    • 6622 ホストアプリケーションをコンパイルするためのフラグの表示 (compile-config)
                                                                                                    • 6623 OpenCLホストランタイムライブラリーおよびMMDライブラリーへのパスの表示 (ldflags)
                                                                                                    • 6624 OpenCLホストランタイムライブラリーおよびMMDライブラリーのリスト表示 (ldlibs)
                                                                                                    • 6625 OpenCLホストランタイムライブラリーおよびMMDライブラリーに関する情報の表示 (link-config または linkflags)
                                                                                                      • 663 OpenCL ICD拡張APIの使用
                                                                                                      • 664 ホストを経由したFPGAのプログラミング
                                                                                                        • 6641 複数のFPGAデバイスのプログラミング
                                                                                                          • 66411 OpenCL FPGAデバイスの診断
                                                                                                          • 66412 デバイス情報の照会
                                                                                                          • 66413 複数のFPGAデバイスへのカーネルのロード
                                                                                                              • 665 ランタイム環境の終了とエラー回復
                                                                                                                • 67 SoCをターゲットとするOpenCL カーネルへの共有メモリーの割り当て
                                                                                                                • 68 徐々に速度低下するOpenCLシステムのデバッグ
                                                                                                                  • 7 OpenCL カーネルのコンパイル
                                                                                                                    • 71 ハードウェアのコンフィグレーションファイルを作成するためのカーネルのコンパイル
                                                                                                                    • 72 ハードウェアを構築せずに行うカーネルのコンパイル (-c)
                                                                                                                    • 73 ハードウェアを構築せずに行うカーネルまたはオブジェクトファイルのコンパイルおよびリンク (-rtl)
                                                                                                                    • 74 ヘッダーファイル位置の指定 (-I=ltdirectorygt)
                                                                                                                    • 75 インテル FPGA SDK for OpenCLオフラインコンパイラーの出力ファイル名の指定 (-o ltfilenamegt)
                                                                                                                    • 76 特定のFPGAボードとカスタムプラットフォームに対するカーネルのコンパイル (-board=ltboard_namegt) および (-board-package=ltboard_package_pathgt)
                                                                                                                    • 77 カーネルコンパイル時のハードウェア生成フィッティングエラーの解決 (-high-effort)
                                                                                                                    • 78 カーネルのFmaxターゲットのスケジュール指定 (-fmax=ltfmax target in MHzgt)
                                                                                                                    • 79 カーネルパラメーターを指定するためのプリプロセッサーマクロの定義 (-Dltmacro_namegt)
                                                                                                                    • 710 コンパイル進捗レポートの生成 (-v)
                                                                                                                    • 711 リソース推定使用率要約の画面表示 (-report)
                                                                                                                    • 712 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージの抑制 (-W)
                                                                                                                    • 713 インテル FPGA SDK for OpenCLオフラインコンパイラーの警告メッセージのエラーメッセージへの変換 (-Werror)
                                                                                                                    • 714 コンパイラーレポートのデバッグデータの削除およびaocxファイルのソースコードの削除 (-g0)
                                                                                                                    • 715 グローバルメモリーのバーストインターリーブの無効化 (-no-interleaving=ltglobal_memory_typegt)
                                                                                                                    • 716 グローバルメモリーのリング型相互接続の強制 (-global-ring)
                                                                                                                    • 717 グローバルメモリーへの書き込みスループット向上に向けたストアリングの複製 (-duplicate-ring)
                                                                                                                    • 718 コンスタントメモリーキャッシュサイズのコンフィグレーション (-const-cache-bytes=ltNgt)
                                                                                                                    • 719 浮動小数点演算処理順序の緩和 (-fp-relaxed)
                                                                                                                    • 720 浮動小数点演算における丸め処理の削減 (-fpc)
                                                                                                                    • 721 OpenCLコンパイルの高速化 (-fast-compile)
                                                                                                                    • 722 カーネルのインクリメンタルコンパイル (-incremental)
                                                                                                                      • 7221 インクリメンタルコンパイルレポート
                                                                                                                      • 7222 インクリメンタルコンパイルのその他のコマンドオプション
                                                                                                                      • 7223 インクリメンタルコンパイルフィーチャーの制限
                                                                                                                        • 723 メモリーの誤り訂正符号をともなうカーネルのコンパイル (-ecc)
                                                                                                                        • 724 ハードウェアのカーネル呼び出しキューの無効化 (-no-hardware-kernel-invocation-queue)
                                                                                                                        • 725 ハンドシェイクプロトコルの変更 (-hyper-optimized-handshaking)
                                                                                                                          • 8 OpenCLカーネルのエミュレーションとデバッグ
                                                                                                                            • 81 高速エミュレーターの設定
                                                                                                                            • 82 エミュレーションに向けたチャネルカーネルコードの変更
                                                                                                                              • 821 値によってチャネルまたはパイプを渡すカーネルのエミュレーション
                                                                                                                              • 822 チャネル深度のエミュレーション
                                                                                                                                • 83 エミュレーションに向けたカーネルのコンパイル (-march=emulator -fast-emulator)
                                                                                                                                • 84 OpenCLカーネルのエミュレーション
                                                                                                                                • 85 LinuxにおけるOpenCLカーネルのデバッグ
                                                                                                                                • 86 インテル FPGA SDK for OpenCL Emulatorの制限
                                                                                                                                • 87 ハードウェアとエミュレーターの結果の不一致
                                                                                                                                • 88 高速エミュレーターの環境変数
                                                                                                                                • 89 高速エミュレーターでサポートされている拡張機能
                                                                                                                                • 810 高速エミュレーターの既知の問題
                                                                                                                                • 811 レガシーエミュレーターの使用
                                                                                                                                  • 8111 レガシーエミュレーターでのエミュレーションに向けたカーネルのコンパイル (-march=emulator)
                                                                                                                                    • 81111 レガシーエミュレーターでのチャネル深度のエミュレーション
                                                                                                                                      • 8112 レガシーエミュレーターでのOpenCLカーネルのエミュレーション
                                                                                                                                      • 8113 LinuxにおけるレガシーエミュレーターでのOpenCLカーネルのデバッグ
                                                                                                                                          • 9 カーネルのreporthtmlファイルのレビュー
                                                                                                                                          • 10 OpenCLカーネルのプロファイリング
                                                                                                                                            • 101 パフォーマンスカウンターを使用したカーネルパイプラインの測定 (-profile)
                                                                                                                                            • 102 インテル FPGA Dynamic Profiler for OpenCL GUIの起動 (report)
                                                                                                                                            • 103 自動実行カーネルのプロファイリング
                                                                                                                                              • 11 インテル Code Builder for OpenCL を使用するOpenCLアプリケーションの開発
                                                                                                                                                • 111 Microsoft Visual Studioに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 112 Eclipseに向けた インテル Code Builder for OpenCL オフラインコンパイラープラグインのコンフィグレーション
                                                                                                                                                • 113 インテル Code Builder for OpenCL でのセッションの作成
                                                                                                                                                • 114 セッションのコンフィグレーション
                                                                                                                                                  • 12 インテル FPGA SDK for OpenCL のアドバンスト機能
                                                                                                                                                    • 121 OpenCLライブラリー
                                                                                                                                                      • 1211 RTLモジュールとOpenCLパイプラインの理解
                                                                                                                                                        • 12111 インテルFPGA SDK for OpenCLパイプラインのアプローチの概要
                                                                                                                                                        • 12112 RTLモジュールのインテル FPGA SDK for OpenCLパイプラインへの統合
                                                                                                                                                        • 12113 ストールのないRTL
                                                                                                                                                        • 12114 RTLモジュールインターフェイス
                                                                                                                                                        • 12115 Avalon Streaming (Avalon-ST) インターフェイス
                                                                                                                                                        • 12116 RTLリセットおよびクロック信号
                                                                                                                                                          • 121161 ストールのないRTLモジュールおよびストールをサポートするRTLモジュールの インテル Stratix 10デザイン固有のリセット要件
                                                                                                                                                            • 12117 RTLモジュールのXML構文
                                                                                                                                                              • 121171 ATTRIBUTESを指定するXML要素
                                                                                                                                                              • 121172 INTERFACEを指定するXML要素
                                                                                                                                                              • 121173 リソースを指定するXML要素
                                                                                                                                                                • 12118 RTLモジュールと外部メモリーの通信
                                                                                                                                                                • 12119 RTLモジュールに入るスレッドの順序
                                                                                                                                                                • 121110 RTLモジュールのOpenCL Cモデル
                                                                                                                                                                • 121111 RTLモジュールとパーシャルリコンフィグレーションにおける潜在的な非互換性
                                                                                                                                                                  • 1212 OpenCLライブラリーに向けたOpenCLヘルパー関数ファイルのパッケージ化
                                                                                                                                                                  • 1213 OpenCLライブラリーに向けたRTLコンポーネントのパッケージ化
                                                                                                                                                                    • 12131 インテル FPGA SDK for OpenCL ライブラリー機能に対するRTLサポートの制約と制限
                                                                                                                                                                      • 1214 RTLモジュールの検証
                                                                                                                                                                      • 1215 複数のオブジェクトファイルのライブラリーファイルへのパッケージ化
                                                                                                                                                                      • 1216 OpenCLカーネルコンパイル時のOpenCLライブラリーの指定
                                                                                                                                                                      • 1217 シミュレーションによるOpenCLライブラリーのデバッグ (プレビュー)
                                                                                                                                                                        • 12171 シミュレーションに向けたライブラリーのコンパイル (-march=emulator)
                                                                                                                                                                        • 12172 OpenCL ライブラリーのシミュレーション
                                                                                                                                                                        • 12173 シミュレーターの制限
                                                                                                                                                                          • 1218 シンプルな関数で動作するOpenCLライブラリーの使用 (例1)
                                                                                                                                                                          • 1219 外部メモリーと動作するOpenCLライブラリーの使用 (例2)
                                                                                                                                                                          • 12110 OpenCLライブラリーのコマンドラインオプション
                                                                                                                                                                            • 122 カーネルのメモリーシステムをコンフィグレーションするメモリー属性
                                                                                                                                                                              • 1221 変数固有の属性を使用する際の制約
                                                                                                                                                                                • 123 ハードウェア使用量のオーバーヘッド低減に向けたカーネル属性
                                                                                                                                                                                  • 1231 カーネルインターフェイスに向けたハードウェア
                                                                                                                                                                                    • 12311 カーネルIDを生成し振り分けるハードウェアの省略
                                                                                                                                                                                    • 12312 ホストとカーネル間の通信ハードウェアの省略
                                                                                                                                                                                    • 12313 clEnqueueNDRangeKernel APIのglobal_work_offset引数をサポートするハードウェアの省略
                                                                                                                                                                                        • 124 num_compute_units(XYZ) 属性を使用したカーネルの複製
                                                                                                                                                                                          • 1241 get_compute_id() 関数を使用した複製カーネルのカスタマイズ
                                                                                                                                                                                          • 1242 カーネルコピーでのチャネル使用
                                                                                                                                                                                            • 125 カーネル内に登録される割り当ての組み込み関数
                                                                                                                                                                                              • A OpenCL機能のサポート状況
                                                                                                                                                                                                • A1 OpenCL10の機能のサポート状況
                                                                                                                                                                                                  • A11 OpenCL10 Cプログラミング言語の実装
                                                                                                                                                                                                  • A12 OpenCL Cプログラミング言語の制約
                                                                                                                                                                                                  • A13 組み込みジオメトリック関数の引数型
                                                                                                                                                                                                  • A14 数値コンプライアンスの実装
                                                                                                                                                                                                  • A15 イメージのアドレス指定とフィルタリングの実装
                                                                                                                                                                                                  • A16 アトミック関数
                                                                                                                                                                                                  • A17 埋め込みプロファイルの実装
                                                                                                                                                                                                    • A2 OpenCL 12の機能のサポート状況
                                                                                                                                                                                                      • A21 OpenCL 12のランタイムの実装
                                                                                                                                                                                                      • A22 OpenCL 12 Cプログラミング言語の実装
                                                                                                                                                                                                        • A3 OpenCL 20の機能のサポート状況
                                                                                                                                                                                                          • A31 OpenCL 20のヘッダー
                                                                                                                                                                                                          • A32 OpenCL 20ランタイムの実装
                                                                                                                                                                                                          • A33 OpenCL 20 Cプログラミング言語のパイプにおける制約
                                                                                                                                                                                                            • A4 インテル FPGA SDK for OpenCL の割り当てにおける制限
                                                                                                                                                                                                              • B インテル FPGA SDK for OpenCL プロエディションプログラミングガイドの改訂履歴
Page 5: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 6: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 7: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 8: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 9: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 10: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 11: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 12: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 13: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 14: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 15: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 16: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 17: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 18: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 19: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 20: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 21: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 22: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 23: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 24: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 25: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 26: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 27: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 28: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 29: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 30: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 31: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 32: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 33: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 34: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 35: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 36: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 37: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 38: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 39: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 40: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 41: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 42: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 43: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 44: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 45: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 46: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 47: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 48: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 49: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 50: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 51: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 52: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 53: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 54: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 55: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 56: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 57: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 58: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 59: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 60: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 61: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 62: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 63: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 64: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 65: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 66: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 67: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 68: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 69: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 70: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 71: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 72: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 73: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 74: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 75: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 76: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 77: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 78: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 79: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 80: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 81: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 82: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 83: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 84: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 85: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 86: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 87: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 88: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 89: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 90: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 91: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 92: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 93: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 94: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 95: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 96: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 97: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 98: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 99: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 100: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 101: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 102: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 103: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 104: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 105: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 106: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 107: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 108: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 109: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 110: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 111: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 112: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 113: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 114: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 115: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 116: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 117: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 118: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 119: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 120: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 121: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 122: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 123: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 124: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 125: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 126: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 127: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 128: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 129: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 130: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 131: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 132: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 133: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 134: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 135: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 136: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 137: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 138: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 139: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 140: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 141: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 142: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 143: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 144: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 145: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 146: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 147: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 148: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 149: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 150: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 151: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 152: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 153: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 154: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 155: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 156: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 157: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 158: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 159: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 160: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 161: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 162: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 163: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 164: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 165: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 166: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 167: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 168: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 169: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 170: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 171: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 172: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 173: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 174: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 175: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 176: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 177: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 178: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 179: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 180: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 181: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 182: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 183: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 184: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 185: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 186: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 187: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 188: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 189: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 190: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 191: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 192: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 193: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 194: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 195: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 196: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 197: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 198: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 199: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 200: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 201: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 202: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 203: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus
Page 204: インテル FPGA SDK for OpenCL プロ・ エディション...インテル® FPGA SDK for OpenCL プロ・ エディション プログラミング・ガイド インテル ® Quartus