手順 1: コードをロード/計算/ストア パターンに分割 - 2023.2 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

カーネルは、基本的には必要な機能用に最適化されたカスタム データパスと、それに関連するデータ ストレージおよびモーション ネットワークです。「メモリ アーキテクチャ」または「メモリ階層」とも呼ばれるカーネルのデータ ストレージおよびモーション ネットワークの役割りは、データをカーネルに入出力し、カスタム データパスを介してできるだけ効率的に移動することです。

カーネルがグローバル メモリにアクセスするのはコストが高く、帯域幅も限られるので、カーネルのこの部分を注意深く設計することが重要です。

そのため、カーネル開発手法の最初の手順では、カーネル コードをロード/計算/ストア パターンの構造に変更する必要があります。

これには、次を使用して最上位関数を作成します。

  • 必要なカーネル インターフェイスと同じインターフェイス パラメーター。
  • ロード、計算、ストアの 3 つのサブ関数。
  • これらの関数間でデータを転送するローカル配列または hls::stream 変数。
図 1. ロード/計算/ストア パターン

カーネル コードの構造をこのようにすると、タスク レベルのパイプライン処理 (HLS データフローとも呼ぶ) が使用できるようになります。このコンパイラ最適化により、各関数を同時に実行できるようになり、タスクを同時実行するパイプラインが作成されます。これが工場の組立ラインです。必要なスループットを達成して保持するには、この構造が重要です。HLS データフローの詳細は、 『Vitis 統合ソフトウェア プラットフォーム資料: アプリケーション アクセラレーション開発』 (UG1393) の異なるカーネル使用したタスクの並列処理 を参照してください。

ロード関数は、カーネル外 (グローバル メモリなど) からカーネル内の計算関数にデータを移動します。この関数はデータ処理は実行しませんが、必要に応じて、バッファリングおよびキャッシングなどの効率的なデータ転送を実行します。

計算関数は、その名前のとおり、すべてのデータ処理を実行します。開発フローのこの段階では、計算関数の内部構造は重要ではありません。

ストア関数はロード関数の逆で、計算関数から結果を取り出してそのデータをカーネル外に移動し、グローバル メモリに転送します。

パフォーマンス目標を達成するロード/計算/ストア構造を作成するには、まずカーネル内のデータの流れを設計します。この際、次の点に注意してください。

  • カーネル外からカーネル内にどのようにデータが流れるか。
  • このデータを処理するためにカーネルをどれくらいの速さにする必要があるか。
  • 処理されたデータをカーネル外にどのように書き出すか。

データ移動をブロック図を使用して可視化すると、カーネル内の異なる関数を分割して構成するのに役立ちます。

ロード/計算/ストア パターンの例は、Vitis Examples GitHub リポジトリを参照してください。