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

ID 683680
日付 9/26/2022
Public
ドキュメント目次

2. HLSデザイン例およびチュートリアル

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

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

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

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

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

デザイン例の実行方法については、次のセクションを参照してください。
表 2.  HLSデザイン例
重点分野 名前 説明
線形代数 QRD 行列のQR因数分解に修正グラム・シュミット・アルゴリズムを使用します。

このデザインは、 Advanced QRD Optimization with Intel HLS Compiler Intel FPGA white paper で参照できます。ホワイトペーパーは、次のURLからダウンロードできます。https://cdrdv2.intel.com/v1/dl/getContent/655469

信号処理 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 コーディング・スタイルのわずかな変動を用いてより良いQoR (結果の品質) が得られる ac_fixed コンストラクターの使用を示します。
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 下線の種類を double から hls_float <11,44> (reduced double) に変更することでアプリケーションが hls_float からメリットを得る方法を示します。
2_explicit_arithmetic 明示的なバージョンの hls_float バイナリー演算子を使用して、浮動小数点算術演算を必要に応じて実行する方法を示します。
3_conversions his_float 型のデザインに変換が現れるタイミングを示します。また、異なる hls_float 型を使用して、コンパイル型定数を生成するためにさまざまな変換モードを使用する方法を示します。
表 4.  コンポーネント・メモリー・デザインのチュートリアル
名前 説明
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/component_memories
attributes_on_mm_agent_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_host_testbench_operators Avalon Memory Mapped (MM) ホスト (mm_master クラス) インターフェイスの異なるインデックスでコンポーネントを呼び出す方法を示します。
mm_agents Avalon-MMエージェント・インターフェイス (エージェント・レジスターおよびエージェント・メモリー) を作成する方法を示します。
mm_agents_double_buffering hls_readwrite_mode マクロを使用してメモリーホストからエージェント・メモリーにアクセスする方法を制御することによる効果を示します。
mm_agents_csr_volatile volatile キーワードを使用してコンポーネントの実行中にエージェント・メモリーへの同時アクセスを許可することによる効果を示します。
multiple_stream_call_sites 複数のストリーム呼び出しサイトを使用する利点を示します。
pointer_mm_host Avalon-MMホスト・インターフェイスおよびそのパラメーターを作成する方法を示します。
stable_arguments リソース使用率を向上させるために不変の引数に stable 属性を使用する方法を示します。
表 6.  ベスト・プラクティス・デザインのチュートリアル
名前 Description
下欄のチュートリアルは、 インテル® Quartus® Primeシステムの次の場所にあります。
<quartus_installdir>/hls/examples/tutorials/best_practices
ac_datatypes int データ型の代わりに ac_int データ型を使用することによる効果を示します。
control_of_dsp_usage サポートされている一部のデータ型と数学関数が、DSPまたはソフトロジックによって実装するかどうかを制御する効果を示します。これには、i++ コマンドの --dsp-mod オプションと ihc::math_dsp_control 関数を使用します。
const_global const 修飾グローバル変数を使用したパフォーマンスおよびリソース使用率の向上を示します。
divergent_loops 分岐ループのあるデザインのソースレベルの最適化を示します。
floating_point_contract -ffp_contract オプションを使用してデザインの倍精度浮動小数点演算のパフォーマンスを向上させる方法を示します。
floating_point_ops i++ 内の -ffp-contract=fast および -ffp-reassociate フラグによる浮動小数点演算への影響を示します。このとき、スループット用に最適化された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ホスト・インターフェイス向けにインスタンス化された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_1 High-Level Design ReportのLoop Analysisレポートを活用して、fMAX をターゲットにするさまざまな方法を示します。
set_component_target_fmax_2 hls_scheduler_target_fmax_mhz component 属性と ii ループプラグマ の有無に基づいてfMAX と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
full-design

最小限のシステムでシンプルな sort コンポーネントを示します。これは、インテルFPGA YouTubeチャネルのHLS Walkthroughビデオシリーズでも説明しています。

compiler_interoperability インテル® HLSコンパイラー、GCC、またはMicrosoft* Visual Studio* でコンパイルしたテストベンチ・コードと、 インテル® HLSコンパイラーを使用して個別にコンパイルしたコンポーネント・コードを使用してデザインをビルドする方法を示します。
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 オブジェクトを使って「内部ストリーム」を使用する方法を示します。
launch_and_collect_capacity ihc::launch および ihc::collect 関数の容量テンプレート・パラメーターを使用して、タスクのシステムを持つコンポーネントのスループットを向上させる方法を示します。
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があること
  • ループがパイプライン・ループに含まれていること
  • ループの実行が、パイプライン化されたループの呼び出し全体でシリアル化されること
small_speculated_iterations ループ本体のレイテンシーが低く、頻繁に呼び出されることが予想される場合に、推測される反復回数を減らすとレイテンシーがどのように改善されるかを示します。
speculated_iterations 終了条件の計算がIIの低下を妨げるボトルネックである場合に、推測される反復回数を増やすとIIがどのように改善されるかを示します。