Top: -
Par: 13 lines
LM上に Float \(256\times16\) 行列 \(A\) が与えられます。1 次元目を総和で縮約して、ベクトル \(S\) (size:16)を DRAM に出力してください。
また、出力の 16 要素を最終的に DRAM に格納する事になっています。
入力レイアウトから 8_L2B, 8_L1B を無視すると ((4:2), (2:1, 4_PE:1, 2_W:1)) になり、SumCol mini と同じになります。
なので一旦、PE 内で 4 要素の縮約をした後、DRAM に移動する過程で、8 個の L1B を縮約、更に8個の L2B を縮約することで、256 要素の縮約ができます。
MAB 同士の縮約は必要ないので個別転送命令で MAB0 の内容を L1BM に転送します。
その後、L1BM から L2BM へ移動させる際、8 個の L1BM の値を縮約して L2BM に格納する命令を使用します。
そして最後に、8 個の L2BM の値を縮約し、4 グループそれぞれにある DRAM に同じ内容を書き込む、L2BM → DRAM グループ間縮約命令を使用します。
l1bmm@0 $ln0v $lb0 (16x1 個別転送命令)で、MAB0 の内容を L1BM にそのまま転送します。[link]l2bmrffadd $lb0 $lc0 (L1BM → L2BM 縮約命令 l2bmr) で 8 個の L1BM の値を縮約します。ffadd で、浮動小数点数の和として縮約できます。[link]mvrffadd/n64 $lc0 $d0 (L2BM → DRAM グループ間結合縮約命令) で、8 個の L2BM の値を縮約します。[link]各命令間に最大 3 nop 程度挟む必要があるので、適宜挿入しましょう。
$lm[0:16], (256,16)/((8_L2B:1, 4:2, 8_L1B:1), (2:1, 4_PE:1, 2_W:1); B@[MAB])
$d[0:8]@0, (16)/((8:1, 2_W:1))
/ \(0.001\) 以下の絶対誤差が許容されます