ストリーミング データ パラダイム - 2023.2 日本語

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

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

「ストリーム」は重要な抽象的な概念で、境界のない継続的なデータ セットのアップデートを示します。ここでの「境界のない」は不明または無制限のサイズを意味します。ストリームとは、ソース (プロデューサー) プロセスとデスティネーション (コンシューマー) プロセス間で一方向に流れる一連のデータ (スカラーまたはバッファー) です。ストリーミング パラダイムでは、データ アクセス パターン (またはシーケンス) について考える必要があります。ソフトウェアの場合、データへのランダムなメモリ アクセスは実質自由 (キャッシュ コストは無視) ですが、ハードウェアの場合、ストリームに変換可能なシーケンシャル アクセスの方がかなりの利点があります。ネットワーク経由でデータをストリーミングすることで通信するプロデューサーとコンシューマーの関係にアルゴリズムを分解すると、次のような利点があります。まず、プログラマがアルゴリズムを順次定義し、並列処理をほかの方法 (コンパイラなど) で抽出できます。タスク間の同期などの複雑さは無視されます。これにより、プロデューサーとコンシューマーのタスクが同時にデータを処理できるようになり、高いスループットを達成するための鍵となります。もう 1 つの利点は、よりクリーンでシンプルなコードです。

前述のように、プロデューサー/コンシューマー パラダイムの場合、データ転送パターンは FIFO または PIPO バッファー インプリメンテーションにマップされます。FIFO バッファーは、キューに挿入される最初のエレメントがキューからポップできる最初のエレメントにもなる、定義済みのサイズ/深さのキューです。FIFO バッファーを使用する主な利点は、プロデューサーがバッファーにデータを挿入した直後に、コンシューマー プロセスが FIFO バッファー内のデータへのアクセスを開始できるところです。FIFO バッファーを使用する場合の唯一の問題は、プロデューサーとコンシューマー間で生産/消費のレートが異なるため、FIFO バッファーのサイズが不適切な場合にデッドロックが発生する可能性があることです。これは通常、複数のプロデューサーとコンシューマーのあるデザインで発生します。ピンポン バッファーは、I/O 操作とデータ処理操作をオーバーラップさせるプロセスを高速化するために使用されるダブルバッファーです。1 つのバッファーがデータ ブロックを保持するために使用され、コンシューマー プロセスがデータの完全な (古い) バージョンを参照するようになり、もう 1 つのバッファーでは、プロデューサー プロセスは新しい (部分的な) バージョンのデータが作成されます。新しいデータ ブロックが完了して有効になると、コンシューマー プロセスとプロデューサー プロセスが 2 つのバッファーへ交互にアクセスします。このため、ピンポン バッファーを使用すると、デバイスの全体的なスループットが向上し、最終的なボトルネックを回避するのに役立ちます。PIPO の主な利点は、このツールが生産レートと消費レートを自動的に一致させ、パフォーマンスに優れたデッドロックのない通信チャネルを作成することです。ここで重要なのは、FIFO と PIPO のどちらが使用されているかに関係なく、主な特性は同じであることです。つまり、プロデューサーはデータのブロックをコンシューマーに送信またはストリームします。データ ブロックは、単一の値または N 値のグループにできます。ブロック サイズが大きいほど、必要なメモリリソースが増えます。

次は、従来のストリーミング/データフロー ネットワークを示す単純な合計アプリケーションです。この場合、アプリケーションの目的は、ペア単位で乱数のストリームを追加してから表示することです。最初の 2 つのタスク (Task 1 と Task 2) は、追加する乱数のストリームを提供します。これらは、FIFO チャネルを介して FIFO チャネルから値を読み出す合計タスク (Task 3) に送信されます。次に、合計タスクが出力を表示タスク (Task 4) に送信して結果を発行します。FIFO チャネルは、これらの独立した実行スレッド間で非同期バッファリングを提供します。

図 1. ストリーミング/データフロー ネットワーク

各「タスク」を接続するストリームは、通常 FIFO キューとしてインプリメントされます。FIFO はプログラマからの並列動作を無視し、タスクがアクティブ (スケジュール済み) になる時間の「スナップショット」について判断できるようにします。FIFO を使用すると、並列処理のインプリメントがしやすくなります。これは主に、並列処理フレームワークまたはフォールト トレラントなソリューションをインプリメントする際に、プログラマが対処する必要がある可変空間の減少によるものです。2 つの独立したカーネル間の FIFO (上記の例を参照) は、従来のキュー動作を示します。純粋なストリーミング システムを使用すると、キュー モデルまたはネットワーク フロー モデルを使用してモデル化できます。このデータフロー タイプのネットワークおよびストリーミング最適化のもう 1 つの大きな利点は、異なるレベルの粒度で適用できるところにあります。プログラマは、各タスクの内部だけでなく、タスクやカーネルのシステムのためにも、このようなネットワークを設計できます。実際には、複数のストリーミング ネットワークまたはタスクを階層的にインスタンシエートして、接続するストリーミング ネットワークを構築できます。さらに細かい並列処理を可能にする最適化は、「パイプライン処理」です。