Top: 6 lines / tantal
Par: 14 lines
LM上の整数ベクトル \(A\), \(B\) に対して \(C = A + B\) を計算し、LM上に出力してください。
以下の入出力に記載のとおり、$lm[0:32]
と $ln[0:32]
を加算した結果を $lm[32:64]
に出力したいです。
今回は Int
の加算になるので、iadd
を使いましょう。
LM の制約のため、違うアドレスの LM0 ($lm
) に同時に入出力できないので、データ移動命令 ipassa
などを用いると良いでしょう。
例えば、ipassa $lr0v $ls0v
とすると $lr0v
のデータを $ls0v
にそのままコピーできます。
ちなみに、passa
命令は ALU の \(A\) ポート入力をそのまま転送 (pass) する、"pass A" という意味です。
ところで、入出力に書いてある ((4_PE:1, 16:1, 2_W:1))
について軽く説明しましょう。
実は MN-Core 2 は階層構造になっており、具体的には、最上位には \(8\) 個の L2B があり、各L2Bには \(8\) 個の L1B があり、各L1Bには \(16\) 個の MAB、各MABの中には \(4\) 個の PE があります。
すなわち、合計して \(4096\) 個の PE が存在していることになりますが、その全てが同じ命令を並列に処理しています。
「MAB」や「L1BM」など説明していない要素もありますが、今は MN-Core 2 がこのような階層構造をしていることを覚えておいてください。
MN-Core ではベクトル(配列)やテンソル(多次元配列)をこれらで分割して並列に計算することを考えます。
今回の ((4_PE:1, 16:1, 2_W:1))
という表記は、\(4\times16\times2\) の長さの配列が、「\(4\) つのPEの」、「\(16\) 長語分のアドレス領域に」、「長語内に \(2\) 要素」で配置されていることを意味します。
その後ろの B@[MAB,L1B,L2B]
に関しては、\(16\) 個の MAB、\(8\) 個の L1B、\(8\) 個の L2B に関してはそれぞれ同じ内容が配置されている(Broadcast されている)ことを意味します。
詳細が気になる方は MN-Core におけるテンソルのメモリ配置レイアウト表現 をご覧ください。
「LM の制約のため、違うアドレスの LM0 に同時に入出力できない」といった制約について、こちら に MN-Core の機械語の仕組みに基づく説明があります。理解の補足として参考にしてください。
ipassa
の \(4\) 行を、\(2\) 行にすることができます。
ALU の passa
は \(2\) 長語のデータをコピーできます。
$lm[0:32]
/ ((4_PE:1, 16:1, 2_W:1); B@[MAB,L1B,L2B])
$ln[0:32]
/ ((4_PE:1, 16:1, 2_W:1); B@[MAB,L1B,L2B])
$lm[32:64]
/ ((4_PE:1, 16:1, 2_W:1))