時間的なデータ並列処理: ホストからカーネルへのデータフロー - 2021.1 Japanese

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

Document ID
UG1393
Release Date
2022-03-29
Version
2021.1 Japanese

計算ユニットで処理されたデータがカーネルの 1 つの処理段階から次の処理段階へ渡されることがあります。この場合、カーネルの最初の段階では新しいデータ セットをいつでも自由に処理できます。つまり、工場の組み立てラインのように、カーネルが新しいデータを受信している間に元のデータがライン上を移動できます。

たとえば、カーネルに FPGA 上の 1 つのカーネルしか含まれない場合、ホスト アプリケーションが別のデータ セットを使用してカーネルを何度もエンキューするとします。ホスト ポインター バッファーの使用 に示すように、ホスト アプリケーションはデータをカーネル実行前にデバイスのグローバル メモリに送信できるので、カーネル実行でデータ転送レイテンシを隠することで「ソフトウェア パイプライン」をイネーブルにできます。

ただし、デフォルトでは、カーネルは現在のデータ セットの処理を終了してからのみ、新しいデータ セットを処理し始めることができるようになっています。clEnqueueMigrateMemObject を使用すると、データ転送時間を隠すことはできますが、カーネル実行はシーケンシャルのままです。

ホストからカーネルへのデータフローをイネーブルにすると、カーネルがまだ前のデータ セットを処理している間に新しいデータ セットでカーネルを再開して、パフォーマンスをさらに改善できます。ホストからカーネルのデータフローのイネーブル で説明するように、カーネルは ap_ctrl_chain インターフェイスをインプリメントし、段階的にデータ処理を許可するように書き込まれる必要があります。この場合、XRT はカーネルが新しいデータを受信できるようになると即座に再開するので、複数のカーネル実行がオーバーラップします。ただし、カーネルが新しいデータの受信準備完了後すぐに再開できるように、ホスト プログラムは要求でいっぱいになったコマンド キューを維持する必要があります。

次の図は、ホストからカーネルへのデータフローの概念を示しています。

図 1. ホストからカーネルのデータフロー

カーネルで開始から終了までデータ セットを処理するのに時間がかかるほど、ホストからカーネルへのデータフローが使用される機会が増えて、パフォーマンスが改善します。カーネルが 1 つのデータ セットを終了するまで待つよりも、単にカーネルが次のデータ セットを処理し始める準備ができるのを待ちます。これにより、「時間的な並列処理」ができるようになり、同じカーネルの異なる段階で複数の clEnqueueTask コマンドからの異なるデータ セットをパイプライン処理できるようになります。

高度なデザインの場合は、データを処理するのに複数の CU を使用する空間的な並列処理とホストからカーネルへのデータフローを使用した時間的な並列処理を効率的に組み合わせて使用し、各計算ユニットのカーネル実行をオーバーラップさせます。

重要: エンベデッド プロセッサ プラットフォームでは、ホストからカーネルへのデータフロー機能はサポートされません。