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