カーネルは、基本的には必要な機能用に最適化されたカスタム データパスと、それに関連するデータ ストレージおよびモーション ネットワークです。「メモリ アーキテクチャ」または「メモリ階層」とも呼ばれるカーネルのデータ ストレージおよびモーション ネットワークの役割りは、データをカーネルに入出力し、カスタム データパスを介してできるだけ効率的に移動することです。
カーネルがグローバル メモリにアクセスするのはコストが高く、帯域幅も限られるので、カーネルのこの部分を注意深く設計することが重要です。
そのため、カーネル開発手法の最初の手順では、カーネル コードをロード/計算/ストア パターンの構造に変更する必要があります。
これには、次を使用して最上位関数を作成します。
- 必要なカーネル インターフェイスと同じインターフェイス パラメーター。
- ロード、計算、ストアの 3 つのサブ関数。
- これらの関数間でデータを転送するローカル配列または
hls::stream
変数。
カーネル コードの構造をこのようにすると、タスク レベルのパイプライン処理 (HLS データフローとも呼ぶ) が使用できるようになります。このコンパイラ最適化により、各関数を同時に実行できるようになり、タスクを同時実行するパイプラインが作成されます。これが工場の組立ラインです。必要なスループットを達成して保持するには、この構造が重要です。HLS データフローの詳細は、 『Vitis 統合ソフトウェア プラットフォーム資料: アプリケーション アクセラレーション開発』 (UG1393) の異なるカーネル使用したタスクの並列処理 を参照してください。
ロード関数は、カーネル外 (グローバル メモリなど) からカーネル内の計算関数にデータを移動します。この関数はデータ処理は実行しませんが、必要に応じて、バッファリングおよびキャッシングなどの効率的なデータ転送を実行します。
計算関数は、その名前のとおり、すべてのデータ処理を実行します。開発フローのこの段階では、計算関数の内部構造は重要ではありません。
ストア関数はロード関数の逆で、計算関数から結果を取り出してそのデータをカーネル外に移動し、グローバル メモリに転送します。
パフォーマンス目標を達成するロード/計算/ストア構造を作成するには、まずカーネル内のデータの流れを設計します。この際、次の点に注意してください。
- カーネル外からカーネル内にどのようにデータが流れるか。
- このデータを処理するためにカーネルをどれくらいの速さにする必要があるか。
- 処理されたデータをカーネル外にどのように書き出すか。
データ移動をブロック図を使用して可視化すると、カーネル内の異なる関数を分割して構成するのに役立ちます。
ロード/計算/ストア パターンの例は、Vitis Examples GitHub リポジトリを参照してください。