L2での結合
join_L2.pyのデザインには3つのWorkerがあり、それぞれが3つのObject FIFOのうちの1つを介してL2に8xi32のデータを送信します。そこで、データは各Object FIFOのオフセットに基づいて24xi32テンソルに結合されます。次に、of_outを使用してデータが外部メモリに送信されます。
# ObjectFifosを使用したデータフロー
# 出力
of_offsets = [8 * worker for worker in range(n_workers)]
of_out = ObjectFifo(tile24_ty, name="out")
of_outs = (
of_out.prod().join(
of_offsets,
obj_types=[tile8_ty] * n_workers,
names=[f"out{worker}" for worker in range(n_workers)],
)
)
すべてのWorkerは、それぞれの入力Object FIFOから生成するために1つのオブジェクトをacquireし、そのすべてのエントリに1を書き込み、オブジェクトをreleaseするという同じプロセスを実行しています。
このデザインは、前のdistributeデザインと組み合わされて、外部メモリからAIE配列への完全なデータ移動とその逆を実現します。結果のコードは、distribute_and_join_L2.pyで利用できます。次のコマンドでコンパイル、実行、テストできます:
make
make run
このデザインの明示的に配置されたレベルのIRONプログラミングは、distribute_and_join_L2_placed.pyで利用できます。次のコマンドでコンパイル、実行、テストできます:
env use_placed=1 make
make run
test.cppおよびデザインコードの# To/from AIE-array data movementセクションについては、セクション2dで詳しく説明されます。
注意: distribute_and_join_L2.pyのデザインは、ext_to_coreを取り、入力データのより小さな部分を3つのWorkerに分散します。このパターンは通常、入力データが単一のコアのメモリモジュールに対して大きすぎて、より小さなチャンクで処理する必要がある場合に使用され、その結果が結合されて最終的な出力が生成されます。
このデータ移動パターンを含む他の例は、programming_examplesで利用できます。注目すべき例はvector_expです。
注意: より詳細な情報については、公式ドキュメントを参照してください。