Top: -
Par: 5 lines
DRAM に分割されて配置された shape = (256, 16) の Float Tensor \(D\) を、
LM にある Tensor \(L\) に((8_L2B:1, 4:2, 8_L1B:1), (2:1, 4_PE:1, 2_W:1))のレイアウトで格納してください。
DRAM にある値を PE の LM に転送する操作を、MN-Core 用語でダウンロードと呼びます。問題名の DL は Download の略です。
MN-Core は、各 PE が独立したメモリ空間を持つ、分散メモリのアーキテクチャです。
分散メモリが採用される代表例としてスーパーコンピューター(スパコン)があります。スパコンでは多数の計算ノードが独立したメモリ空間を持ち、ネットワークを介して通信します。これにより、1 ノードでは扱えない大規模なデータを分散して処理することが可能になりますが、データの転送を効率的に行う必要があります。
近年では、AI アクセラレーターなどでも分散メモリアーキテクチャが採用されることが増えてきました。
各 PE で L1 キャッシュのような HW に任せたキャッシュ機構を持たず、各 PE が独立したメモリ空間を持つことで、キャッシュのテーブルや競合対策機構などが不要になり、そういった機構で使用していたぶんの回路を、演算器やメモリに使用することができます。
ただし、的確に分配・放送・個別転送操作を行い欲しいデータを PE に転送する必要があります。いわばミニチュアスパコン的に、スパコンで行っていたノード間通信を、チップの中の PE 同士で行う必要があります。
さて、問題の説明をしましょう。まずは DRAM 入力の "((4_L2B:2, 64:8), (8:1, 2_W:1))" というレイアウトです。
MN-Core2 は、8 個ある L2BM が 2個ペアでグループという単位になっており、4 グループのそれぞれに DRAM があります。4_L2B:2 というのは、2 個間隔で 4 つの L2B という意味なので、4 グループそれぞれの DRAM に 値が分配して配置していることを意味します。
今回の問題セットでは、アドレスの順番は無視して、レイアウト表記に L2B, L1B, MAB, PE が含まれているかどうかの判断だけで解けるように設計されています。
入力の DRAM レイアウトには 4_L2B が含まれているので、4 グループの DRAM に分配されていることが分かります。データ量が少ない DL 16 以外の問題は、DRAM 側はすべて 4グループの DRAM に均等に分配されているものとしています。
出力のレイアウト ((8_L2B:1, 4:2, 8_L1B:1), (2:1, 4_PE:1, 2_W:1)) には、8_L2B, 8_L1B, 4_PE が含まれているので、\(256\times16 = 4096\) 個の Float を、8 個の L2B, 8 個の L1B, 4 個の PE に分配していることが分かります。逆に、MAB が含まれないので、各 MAB では同じ内容を放送することが読み取れます。
SDM や 転送命令可視化 の各命令を眺めて、希望の分配・放送・個別転送を行う命令を選びましょう。
今回の場合は、各 DRAM $d[0:512] に 512 長語ずつある値を、
4_L2B:2 を 8_L2B:1 に、つまり配下の 2 グループに分配する命令…、は無いので個別転送命令 mvp を2 回8_L1B:1 に分配する L2BM → L1BM 分配命令 l2bmd 4_PE:1 に分配するが、MAB 毎には同じものを転送する 16x1MAB 放送命令 l1bmm を行えば良いです。
4 グループの DRAM に分配して \((4\times64) \times (8\times2) = 4096\) 個の値、DRAM あたりだと 1024 個の Float が配置されています。Inputs の $d[0:512] とは、DRAM の 0 番アドレスから 512 長語(1024単語)の領域に値が格納されていることを意味します。
元々、4_L2B:2 と 各グループ計 4 個の DRAM に分配されていたデータを 8_L2B:1 と 8 個の L2B に分配させろという指示なので、DRAM → L2BM 並列個別転送命令 を用いて以下のように転送します。
これは、$d[0:512] の前半 256 長語を $lc0@.0 に、後半 256 長語を $lc0@.1 に転送しています。
次に、出力レイアウトに 8_L1B:1 が含まれているのに注目します。8 個の L1BM に分配せよとのことなので、L2BM → L1BM 分配 命令を用いて以下のように転送します。
この命令は、サイクルあたり 64 長語を L2BM から読み出し、8個の L1BM に 8 長語ずつ分配、を 4 サイクル行う命令です。これにより、L2BM に合った 256 長語が、各 L1BM に 32 長語ずつ分配されます。
最後に、レイアウトに 4_PE:1 が含まれていて、MAB は含まれていないことに注目します。これはつまり、4 PE には分配するが、各 MAB には同じ内容を放送せよという指示です。なので、16x1MAB 放送 命令 命令(2長語)を用いて以下のように転送します。
これは、サイクルあたり 8 長語を L1BM から読み出し、4 個の PE に 2 長語ずつ分配、16 個ある MAB にはそれぞれ同じ内容を放送する命令です。1 命令で 4 サイクル動作するので、これで L1BM の 32 長語が、各 PE に 8 長語ずつ転送されます。
出力レイアウトのアドレス軸だけを抜き出すと ((4:2), (2:1, 2_W:1))、要するにアドレスが詰まっていて (4:2) に注目すると \(4\times2 = 8\) 長語なので、転送量の辻褄は合いそうです。
値の順番が合っているかは自信がないところですが、実はこれで問題なく転送できています。これまでのこの 4 行を順に実行してみましょう。
と言われると思いますが、これは「4 行目の L1BM を読むときにメモリ読み取り競合が発生したので nop を入れろ」と言っているので、4 行目の前に nop を怒られなくなるまで 1~3 個程度入れます。そうすると、Accept が得られると思います。
入力 DRAM レイアウトの 2 次元目の (8:1, 2_W:1) は、長語内に 2 個、その塊が 1 長語間隔で 8 個という意味なので、単語が順に 16 個、つまり 8 長語連続して並んでいることを意味します。そして、1次元目は (64:8) なので、8 長語間隔で 64 個の値、合計 512 長語ぶんの値が並んでいることを意味します。
まず最初に DRAM ((4_L2B:2, 64:8), (8:1, 2_W:1)) のレイアウトが
でどう L2BM に転送されるかです。mvp/n256 の挙動の通り、/n で指定したサイズが連続して L2BM に転送されます。256 長語ずつ転送して、グループ内の 2 個の L2B に分配したので、(64:8) の連続した 512 長語が、(32:8) の 256 長語 × 2 個に分かれます。ここでは (32:8) を、8長語の塊が 32 個なので 256 長語、のように計算します。
よって、L2BM では ((8_L2B:1, 32:8), (8:1, 2_W:1)) になります。
次に l2bmd を見ると、連続した 8 長語が 8 個の L1BM に分配され
ています。
なので (32:8) の部分が 8 長語の塊が 32 個という意味ですが、これが 8 つに分割されるので (4:64, 8:8)( 8長語の塊が 8 個,が 4個)に一旦読み替え、8:8 の 8 長語の塊 8 個が、8 個の L1BM に分配されるので、8_L1B:1 になり、4:64 の 64 長語ごとに 4 個の部分が詰められて 4:8(8 長語ごとに 4 個)になります。
まとめると、L1BM では ((8_L2B:1, 4:8, 8_L1B:1), (8:1, 2_W:1)) になります。
最後に l1bmm です。まず、1長語×4 の塊が、4 PE に分配されているので、(8:1) の部分を (2:4, 4:1)(1長語が4個,が2個)に読み替え、(4:1)(1長語×4個)が 4 PE に分配なので (4_PE:1) になり、(2:4) は 4 長語の塊が2個だったところ、1 長語の塊が2個になったので (2:1) とアドレスを詰めます。(4:8) の部分も、8長語の塊だった部分が2長語の塊に分配されて減ったので 4:2 になります。
これで最終的に、((8_L2B:1, 4:2, 8_L1B:1), (2:1, 4_PE:1, 2_W:1)) というレイアウトを得ます。
一応説明をしましたが、慣れないと非常に難しいと思います。今回の問題セットではここまで意識しなくても大丈夫なように設計されているので、レイアウトに (8_L1B:1) とあったら L1BM で分配されているんだなとか、(8_L1B:1) がなかったら、それぞれの L1BM で同じ内容を放送しているんだな程度の認識で大丈夫です。
$d[0:512]@0, (256,16)/((4_L2B:2, 64:8), (8:1, 2_W:1); B@[4_L2B:2])
$lm[0:16], (256,16)/((8_L2B:1, 4:2, 8_L1B:1), (2:1, 4_PE:1, 2_W:1))