HLS 用のプログラミング モデル - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

高性能なハードウェアを実現するには、HLS ツールでシーケンシャル コードから並列処理を推論して、それを利用する必要があります。これは簡単な問題ではありません。また、優れたソフトウェア デザインには通常、ランタイム タイプ情報 (RTTI)、再帰、ダイナミック メモリ割り当てなどの適切に定義された規則と手法が使用されます。これらの手法の多くは、ハードウェアでまったく同じものがないので、HLS ツールでの課題となっています。通常、既製ソフトウェアは効率的にハードウェアに変換できません。少なくとも、このようなソフトウェアの合成不可能な構造体について調べ、コードをリファクタリングして合成できるようにする必要があります。ソフトウェア プログラムが自動的にハードウェアに変換 (または合成) されるとしても、ベスト プラクティスを理解し、優れたソフトウェアを記述してハードウェアで実行できるようにする必要があります。

設計原則で、FPGA プラットフォーム用の優れたソフトウェアを記述するために理解しておく必要がある 3 つの主要なパラダイム (プロデューサーとコンシューマー、ストリーミング データ、パイプライン処理) を紹介しました。これらのパラダイムが動作する、基盤となる並列プログラミング モデルは次のとおりです。

  • デザイン/プログラムは、通信リンク (別名チャネル) を介して互いにメッセージを送信して通信するタスクの集合体として構築する必要があります。
  • タスクは、何らかの信号を待機して実行を開始する制御駆動型と、チャネル上のデータによってタスクの実行が促されるデータ駆動型に分類されます。
  • タスクは、ローカル ストレージ/メモリと入出力 (I/O) ポートの集まりを備えた実行ユニットで構成されます。
  • ローカル メモリにはプライベート データ、つまりタスクが排他的にアクセスするデータが格納されています。
  • このプライベート メモリへのアクセスは、ブロック RAM/URAM に格納されているデータと同様に、ローカル データ アクセスと呼ばれています。このタイプのアクセスは高速です。タスクは自身の出力ポートを使用することでのみローカル データのコピーをその他のタスクに送信でき、自身の入力ポートを使用することでのみデータを受信できます。
  • I/O ポートは抽象化されており、タスクがデータの送受信に使用するチャネルに相当し、モジュールの呼び出し元によって、または最上位ポートの場合はシステム統合レベルで接続されます。
  • チャネルを介して送受信されるデータは非ローカル データ アクセスと呼ばれます。チャネルは、あるタスクの出力ポートと別のタスクの入力ポートを接続するデータ キューです。
  • チャネルは問題なく安定しており、次のように動作します。
    • プロデューサーの出力で書き込まれたデータは、同じ順序でコンシューマーの入力ポートで読み出されます (FIFO の場合)。PIPO の場合、データはランダムな順序で読み出し/書き込みされます。
    • データ値が失われることはありません。
  • チャネルでは、ブロッキングおよびノンブロッキングの両方の読み出しと書き込みセマンティクスがサポートされています (HLS ストリーム ライブラリ を参照)。
図 1. ブロッキング/ノンブロッキング セマンティクス

ブロッキング セマンティクスがモデルで使用されている場合、空チャネルからの読み出しは、読み出しプロセスのブロッキングとなります。同様に、フル チャネルへの書き込みは、書き込みプロセスのブロッキングとなります。その結果、プロセス/チャネル ネットワークは、計算のタイミングや通信の遅延に依存しない確定的な動作となります。このような形式のモデルは、エンベデッド システム高パフォーマンスの計算システム、信号処理システム、ストリーム処理システム、データフロー プログラミング言語、その他の計算タスクのモデリングに容易に使用できることが実証されています。

ブロッキング形式のモデリングでは、チャネル キュー (チャネルが FIFO の場合) のサイズ設定が不十分であったり、プロデューサーとコンシューマー間の処理速度が異なるためにデッドロックが発生することがあります。ノンブロッキング セマンティクスがモデルで使用されている場合、空チャネルから読み出すと、初期化されていないデータが読み出される、または最後のデータ アイテムが再度読み出されます。同様に、フルのキューに書き込むと、そのデータが失われます。このようにデータが失われないように、読み出し/書き込みを実行する前に、キューのステータスを確認しておく必要があります。ただし、このようなモデルのシミュレーションは、チャネルのランタイム ステータスに基づく判断に依存するため、非確定的なものとなる可能性があります。このため、このモデルの結果検証には、より多くの課題が伴います。

Vitis HLS の抽象的な並列プログラミング モデルでは、ブロッキングとノンブロッキングの両方のセマンティクスがサポートされています。