インテル®高位合成 (HLS) コンパイラー プロ・エディション: スタートガイド

ID 683680
日付 6/22/2020
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

2. 高位合成 (HLS) のデザイン例およびチュートリアル

インテル®HLS (高位合成) コンパイラー・プロ・エディションに含まれているデザイン例およびチュートリアルでは、サンプル・コンポーネントが用意されており、コンポーネントをモデル化またはコード化することにより、 インテル®HLSコンパイラーからデザインにとって最良の結果を得る方法を示します。

高位合成 (HLS) デザイン例

高位合成 (HLS) デザイン例では、さまざまなアルゴリズムを効果的に実装する方法を素早く確認し、 インテル®HLSコンパイラーから最良の結果を得ることができます。

HLSデザイン例は次の場所にあります。
<quartus_installdir>/hls/examples/<design_example_name>

<quartus_installdir> のある場所は、 インテル® Quartus® Primeデザインスイートがインストールされているディレクトリーです。例 : /home/<username>/intelFPGA_pro/20.2 または C:\intelFPGA_pro\20.2

表 2.  HLSデザイン例
重点分野 名前 説明
線形代数 QRD 修正グラムシュミット・アルゴリズムを使用して、行列をQR分解します。
信号処理 interp_decim_filter シンプルで効率的な補間/デシメーション・フィルターを実装します。
シンプルなデザイン counter シンプルで効率的な32ビット・カウンター・コンポーネントを実装します。
ビデオ処理 YUV2RGB 基本的なYUV422からRGB888への色空間変換を実装します。
ビデオ処理 image_downsample 画像ダウンサンプリング・アルゴリズムを実装し、バイリニア補間を使用して、画像サイズを縮小します。

HLSデザインのチュートリアル

HLSデザインのチュートリアルでは、HLS固有の重要なプログラミング概念のほか、優れたコーディング方法を示します。

各チュートリアルのREADMEファイルには、チュートリアルでカバーしている内容やチュートリアルの詳しい実行方法に関する説明が記載されています。

表 3.  任意精度データ型デザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/ac_datatypes
ac_fixed_constructor ac_fixed コンストラクターの使用方法を示します。コーディング・スタイルの小数の変動を使用して、より良いQoR (結果の品質) を得ることができます。
ac_fixed_math_library インテル®HLSコンパイラーac_fixed_math 固定小数点の数学ライブラリー関数の使用方法を示します。
ac_int_basic_ops ac_int クラスで使用可能な演算子を示します。
ac_int_overflow DEBUG_AC_INT_WARNING および DEBUG_AC_INT_ERROR キーワードの使用方法を示します。エミュレーション実行時のオーバーフロー検出に役立ちます。
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/hls_float
1_reduced_double アプリケーションが hls_float からメリットを得る方法を示します。下線の種類を double から hls_float <11,44> (reduced double) に変更します。
2_explicit_arithmetic hls_float バイナリー演算子の明示的なバージョンを使用して、浮動小数点算術演算を必要に応じて実行する方法を示します。
3_conversions his_float 型のデザインに変換が現れるタイミングと、異なる変換モードを使用してコンパイル型定数を生成する方法を示します。異なる hls_float 型を使用します。
表 4.  コンポーネント・メモリー・デザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/component_memories
attributes_on_mm_slave_arg Avalon® Memory Mapped (MM) スレーブ引数をメモリー属性に適用する方法を示します。
exceptions 定数上のメモリー属性および struct メンバーを使用する方法を示します。
memory_bank_configuration 各メモリーバンクのロードポート/ストアポートの数を制御し、コンポーネント領域の使用率とスループットのいずれかまたはその両方を最適化する方法を示します。次のメモリー属性を1つ以上使用します。
  • hls_max_replicates
  • hls_singlepump
  • hls_doublepump
  • hls_simple_dual_port_memory
  • non_power_of_two_memory
  • non_trivial_initialization
memory_geometry メモリーをバンクに分割し、各メモリーバンクのロードポート/ストアポートの数を制御する方法を示します。次のメモリ属性を1つ以上使用します。
  • hls_bankwidth
  • hls_numbanks
  • hls_bankbits
memory_implementation レジスターの変数もしくは配列、MLAB、またはRAMの実装方法を示します。次のメモリー属性を使用します。
  • hls_register
  • hls_memory
  • hls_memory_impl
memory_merging リソース使用率を向上させる方法を示します。2つのロジックメモリーを1つの物理メモリーとして実装します。hls_merge メモリー属性を使用して、深さ方向または幅方向にマージします。
non_power_of_two_memory force_pow2_depth メモリー属性を使用して、 2のべき乗以外の深さのメモリーのパディングを制御する方法と、それによってFPGAメモリーリソース使用率がどのように影響されるかを示します。
non_trivial_initialization C++ キーワード constexpr を使用して読み出し専用変数の効率的な初期化を実現する方法を示します。
static_var_init コンポーネント内のスタティックの初期化動作を制御する方法を示します。hls_init_on_reset または hls_init_on_powerup メモリー属性を使用します。
表 5.  インターフェイス・デザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/interfaces
overview コンポーネント・アルゴリズムが同じ場合に、異なるコンポーネント・インターフェイスを選択することによるQoR (結果の品質) への影響を示します。
explicit_streams_buffer

明示的な stream_in インターフェイスおよび stream_out インターフェイスをコンポーネントおよびテストベンチで使用する方法を示します。

explicit_streams_packets_ empty usesPacketsusesEmpty および firstSymbolInHighOrderBits ストリーム・テンプレート・パラメーターを使用する方法を示します。
explicit_streams_packets_ ready_valid usesPacketsusesValid および usesReady ストリーム・テンプレート・パラメーターを使用する方法を示します。
mm_master_testbench_operators Avalon Memory Mapped (MM) Master (mm_master クラス) インターフェイスの異なるインデックスでコンポーネントを呼び出す方法を示します。
mm_slaves Avalon-MM Slaveインターフェイス (スレーブレジスターおよびスレーブメモリー) を作成する方法を示します。
mm_slaves_double_buffering hls_readwrite_mode マクロを使用してメモリーマスターからスレーブメモリーへアクセスする方法を制御することによる効果を示します。
mm_slaves_csr_volatile volatile キーワードを使用してコンポーネントの実行中にスレーブメモリーへの同時アクセスを許可することによる効果を示します。
multiple_stream_call_sites 複数のストリーム呼び出しサイトを使用する利点を示します。
pointer_mm_master Avalon-MM Masterインターフェイスおよびそのパラメーターを作成する方法を示します。
stable_arguments stable 属性を不変の引数に使用してリソース使用率を向上させる方法を示します。
表 6.  ベスト・プラクティス・デザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/best_practices
ac_datatypes int データ型の代わりに ac_int データ型を使用することによる効果を示します。
const_global const 修飾グローバル変数を使用したパフォーマンスおよびリソース使用率の向上を示します。
divergent_loops 分岐ループのあるデザインのソースレベルの最適化を示します。
floating_point_contract fp_contract オプションを使用してデザインの倍精度浮動小数点演算のパフォーマンスを向上させる方法を示します 。
floating_point_ops I++ 内の --fpc および --fp-relaxed フラグによる浮動小数点演算への影響を示します。スループット用に最適化された32タップ有限インパルス応答 (FIR) フィルターデザインを使用します。
fpga_reg fpga_reg マクロを使用してデザインのパイプラインを正確に調整する方法を示します。
hyper_optimized_handshaking インテルHLSコンパイラーi++ コマンドの --hyper-optimized-handshaking オプションを使用する方法を示します。
loop_coalesce ネスト化ループで loop_coalesce プラグマを使用したパフォーマンスとリソース使用率の向上を示します。

#pragma loop_coalesce は、スタンダード・エディションとプロ・エディションの両方にありますが、デザイン・チュートリアルがあるのは、プロ・エディションのみです。

loop_fusion ループ・フュージョンのレイテンシーおよびリソース使用率の向上を示します。
loop_memory_dependency Ivdep プラグマを使用してループ運搬依存を解除する方法を示します。
lsu_control 可変レイテンシー Avalon® MM Masterインターフェイス向けにインスタンス化されたLSU型を制御する効果を示します。
parallelize_array_operation fMAX を向上させる方法を示します。ループ内の配列に対する動作の実行時に発生するボトルネックを修正します。
optimize_ii_using_hls_register hls_register 属性を使用して、ループIIを削減する方法や、hls_max_concurrency を使用してコンポーネントのスループットを向上させる方法を示します。
parameter_aliasing

コンポーネント引数で restrict キーワードを使用する方法を示します。

random_number_generator 乱数ジェネレーター・ライブラリーを使用する方法を示します。
reduce_exit_fifo_width fMAX を向上させる方法を示します。ストールのないクラスターの出口ノードに属するFIFOの幅を小さくします。
relax_reduction_dependency

浮動小数点アキュムレーターを含むループのIIを削減する方法、またはその他の単一のクロックサイクルでの高速計算ができない削減演算を示します。

remove_loop_carried_dependency ループのパフォーマンスを向上させる方法を示します。ネストされたループ間での同じ変数へのアクセスを削除します。
resource_sharing_filter 32タップ有限インパルス応答 (FIR) フィルターデザインのエリア最適化バリアントを示します
set_component_target_fmax hls_scheduler_target_fmax_mhz コンポーネント属性を使用する方法と、それが ii ループプラグマとどのように相互作用するかを示します。
shift_register シフトレジスターを実装するための推奨コーディング・スタイルを示します。
sincos_func sin または cos 関数の代わりに sinpi または ospi 関数をコンポーネントで使用した場合の効果を示します。
single_vs_double_ precision_math 倍精度リテラルおよび関数の代わりに単精度リテラルおよび関数を使用した場合の効果を示します。
stall_enable ストール・フリー・クラスターをストール・イネーブル・クラスターに置き換え、一部の小規模なデザインのレイテンシーを改善する方法を示します。
struct_interface ac_int を使用して、パディングビットなしでインターフェイスを実装する方法を示します。
submnormal_and_rounding --daz および --rounding i++ コマンドオプション使用の効果を示します。
swap_vs_copy レジスターを使ったディープコピーによる、コンポーネント・デザインのパフォーマンスおよびリソース使用率への影響を示します。
triangular_loop 依存関係を持つ三角ループパターンを記述する方法を示します。
表 7.  ユーザビリティー・デザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Prime システムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/usability
compiler_interoperability (Linuxのみ) GCCでコンパイルされたテストベンチ・コードを、 i++ コマンドでコンパイルされたコードと共に使用する方法を示します。
enqueue_call コンポーネントを非同期で実行し、テストベンチでパイプライン・パフォーマンスを実行する方法を示します。エンキュー機能を使用します。

platform_designer_2xclock

clock2x 入力を備えたコンポーネント向けに推奨されるクロックおよびリセットの生成を示します。

platform_designer_stitching

複数のコンポーネントを結合して1つのまとまったデザインとして機能させる方法を示します。
表 8.  タスクのシステムのデザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Prime システムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/system_of_tasks
balancing_loop_delay タスクのシステムを使用しているコンポーネントのスループットを改善する方法を示します。ストリームをバッファリングします。
balancing_pipeline_latency タスクのシステムを使用しているコンポーネントのスループットを改善する方法を示します。ストリームをバッファリングします。
interfaces_sot タスク間で情報を転送する方法を示します。 Avalon® ストリーミングおよび Avalon® メモリーマップド・マスター・インターフェイスを使用します。
internal_stream HLSタスクで ihc::stream オブジェクトを使って「内部ストリーム」を使用する方法を示します。
parallel_loop パイプライン方式で順次ループを実行する方法を示します。コンポーネントのHLSタスクのシステムを使用します。
resource_sharing コンポーネント内の高価な計算ブロックを共有して、領域使用率を節約する方法を示します。
task_reuse 同じタスク関数の複数コピーを呼び出す方法を示します。
表 9.  HLSライブラリー・デザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/libraries
basic_rtl_library_flow

RTLライブラリーを開発し、それをHLSコンポーネントで使用するプロセスを示します。

rtl_struct_mapping C++ 構造体フィールドからRTLモジュール・インターフェイス信号のビットスライスへのマッピングを取得する方法を示します。
表 10.  HLSループ制御のチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/loop_controls
max_interleaving
次の条件を満たすループの領域使用率を削減する方法を示します。
  • ループにII > 1があること
  • ループがパイプライン・ループに含まれていること
  • ループの実行が、パイプライン化されたループの呼び出し全体でシリアル化されること