Top: -
Par: 113 lines
\(256 \times 1024\) 行列 \(A\) と、\(16 \times 1024\) 行列 \(B\) に対して、行列積 \(C = A \times B^T\) (shape:\(256 \times 16\)) を計算し、DRAMへ 出力してください。\(A,B,C\) のレイアウトは以下のとおりです。
前回の Mmul TB 256_128_16 では、レイアウトは以下の通りでした。
比較してみると、\(A,B\) の 2 次元目に 8_L1B:1 が増えたことで長さが 8 倍になっています。問題の都合で、16_MAB:1 が 8_MAB:2, 2_MAB:1 の2つに別れていますが結局総和で縮約するので、要素セットが同じであれば順番はあまり気にしなくて良いです。
さて、今回の問題は、最終的に DRAM へ出力することが求められています。((4_L2B:2, 64:8), (8:1, 2_W:1)) というレイアウトは、\(256 \times 16 = 4096\) 要素の Float を、4 グループの DRAM に順番に 4 分割して配置することを意味します。
出力が LM ではなく DRAM なので、Mmul TB 256_128_16 では l1bmm 命令で L1BM → LM へ戻していましたが、今回は不要です。
代わりに、8 個の L1BM を縮約して L2BM へ上げる必要があるため、l2bmrffadd $lb0 $lc0 L1BM → L2BM 縮約 l2bmr 命令を使います。
L2BM から DRAM への移動は、8_L2B:1 と、8 個の L2BM に分割された行列を結合し、各グループ、合計4枚ある DRAM へ分配する必要があります。
このとき、mvp/n256 $lc0@.0 $d0 DRAM → L2BM 並列個別転送命令 mvp を使うと良いでしょう。
L1BM には 256 長語あり、l2bmr は 1 命令で 64 長語を処理するので、4 回発行する必要があります。
8 個の L2BM それぞれにある 256 長語を、4 グループの DRAM へ分配し、各グループの DRAM に 512 長語を集めます。
DRAM から見たら、グループ内の L2BM それぞれから 256 長語を貰えばいいので、以下のように書けます。
入力の値は、小数点以下切り捨てされています。
$lm[0:64], (256,1024)/((8_L2B:1, 32:1), (8_MAB:2, 8_L1B:1, 2_MAB:1, 4_PE:1, 2_W:1))
$lm[64:96], (16,1024)/((16:1), (8_MAB:2, 8_L1B:1, 2_MAB:1, 4_PE:1, 2_W:1); B@[L2B])
$d[0:512]@0, (256,16)/((4_L2B:2, 64:8), (8:1, 2_W:1))
/ \(0.00001\) 以下の絶対誤差が許容されます