input_plio/output_plio の設定 - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

input_plio/output_plio オブジェクトは、AI エンジンからプログラマブル ロジック (PL) 境界を越える外部ストリーム接続に使用するよう設定できます。このような状況は、ハードウェア プラットフォームが個別に設計されており、PL ブロックがプラットフォーム内で既にインスタンシエートされている場合に生じます。このハードウェア デザインは、Vivado ツールからパッケージ XSA としてエクスポートされ、このプラットフォームを使用して AMD Vitis™ ツールで新規プロジェクトを作成するときに指定する必要があります。プラットフォームでサポートされる AI エンジンの I/O ポートは、XSA に含まれる論理アーキテクチャ インターフェイス仕様で指定されています。次に、AI エンジンの観点から見た、ストリーム ポートを含む外部インターフェイス仕様の例を示します。

表 1. 論理アーキテクチャのポート仕様の例
AI エンジンのポート アノテーション タイプ 方向 データ幅 クロック周波数 (MHz)
S00_AXIS Weight0 ストリーム slave 32 300
S01_AXIS Datain0 ストリーム slave 32 300
M00_AXIS Dataout0 ストリーム master 32 300

このインターフェイス仕様は、2 つのストリーム入力ポート (AI エンジン アレイ インターフェイスのスレーブ ポート) と 1 つのストリーム出力ポート (AI エンジン アレイ インターフェイスのマスター ポート) を表しています。input_plio/output_plio 属性仕様は、これらのインターフェイス ポートを表し、データフロー グラフ内でそれぞれのデスティネーションまたはソース カーネル ポートへの接続に使用されます。

次の例に、前の表に示した input_plio/output_plio 属性をプログラム内で使用して、ファイルから入力データを読み出したり、ファイルに出力データを書き込んだリする方法を示します。input_plio/output_plio ポートの幅と周波数も、PLIO コンストラクターで指定されています。

input_plio wts  = input_plio::create("Weight0", adf::plio_32_bits, "inputwts.txt", 300);
input_plio din  = input_plio::create("Datain0", adf::plio_32_bits, "din.txt", 300);
output_plio out = output_plio::create("Dataout0", adf::plio_32_bits, "dout.txt", 300);

シミュレーション中、提供された 2 つのファイルから入力の重みとデータが読み出され、指定された出力ファイルにストリームとして出力データが渡されます。

ハードウェア プラットフォームがエクスポートされる時点で、AI エンジンから PL ストリームへのすべての接続が、PL 側から特定の物理チャネルに既に配線されています。

ストリーム データパス幅の広い PLIO

AI エンジン アレイは通常、内部プログラマブル ロジックよりも高いクロック周波数で動作します。aiecompiler のコンパイラ オプション --pl-freq を使用すると、PL ブロックの動作周波数を指定できます。AI エンジンと内部プログラマブル ロジックでスループットのバランスを取るために、PL ブロックのストリーム データパス幅を広く (64 ビット、128 ビット) 設計できます。これは、AI エンジンから PL へのインターフェイスを越える際に、AI エンジン ストリーム ネットワークで自動的に 32 ビット ストリームにシーケンス化されます。

次の例に、ストリーム幅の広い input_plio/output_plio 属性をプログラム内で使用して、ファイルから入力データを読み出し、ファイルに出力データを書き込む方法を示します。

output_plio pl_out = output_plio::create("TestLogicalNameOut", plio_128_bits, "data/output.txt");
input_plio  pl_in  = input_plio::create("TestLogicalNameIn", plio_128_bits, "data/input.txt");
...
connect(pl_in.out[0], kernel_first.in[0]);
connect(kernel_last.out[0], pl_out.in[0]);

上記の例では、128 ビットの PLIO 属性が入力と出力に 1 つずつ宣言されています。input_plio および output_plio は、通常どおりにグラフに接続されます。その後、input_plio/output_plio 属性に指定されたデータ ファイルが、それぞれ入力データの読み出しまたは出力データの書き込み用に自動的に開きます。

データ ファイルを使用した input_plio/output_plio のシミュレーションでは、PL ブロックの幅だけでなく、AI エンジン ブロックの接続ポートのデータ型に対応するようにデータを構成する必要があります。たとえば、int16 を前提とした AI エンジン カーネルへの 32 ビット PL インターフェイスを表すデータ ファイルの場合、1 行に 2 列が含まれ、各列が 16 ビット値を表します。別の例として、cint16 を前提とした AI エンジン カーネルへの 64 ビット PL インターフェイスを表すデータ ファイルの場合、1 行に 4 列が含まれ、各列が 16 ビットの実数または虚数値を表します。同じ 64 ビット PL インターフェイスで、int32 ポートを使用して AI エンジン カーネルにデータを入力する場合、1 行に 2 列が含まれ、各列が 32 ビットの実数値を表します。説明した入力ファイルの形式を次の例に示します。

64-bit PL interface feeding AI Engine kernel expecting cint16
input file:
0 0 0 0
1 1 1 1
2 2 2 2

64-bit PL interface feeding AI Engine kernel expecting int32
input file:
0 0
1 1
2 2

このように幅の広い PLIO 属性仕様では、aiecompiler が自動的に AI エンジン アレイ インターフェイス構成を生成して、64 ビットまたは 128 ビット データを 32 ビット ワードのシーケンスに変換します。AXI4-Stream プロトコルとそれに続くすべての PL IP ブロックにより、データ幅の広いパスの部分的データも、どのワードが有効かを示す適切なストローブ信号を使用して確実に送信されます。