Top: 10 lines / v
Par: 160 lines
LM0上の 次元 Float
配列 に対して、 次元目と 次元目に対する 次元行列積の転置 を計算してLM1に出力してください。
各 MAB に 行列が、((4_PE:1, 2:1, 2_W:1), (16:2))
のレイアウトで格納されています。
この行列の 乗を計算し、転置を行った結果を同様のレイアウトで出力する問題です。
いよいよ最後のチュートリアルです。MN-Core の大きな特色の一つである行列演算の問題です。
行列演算は大まかに、各行列のブロックフロート化と行列レジスタへの書き込み、m(mul|fma)
命令の呼び出しが必要になります。
また行列演算では、半精度と単精度の中間の精度である疑似単精度も使用することができます。
チュートリアルの内容が長いため、別ページに分けています。以下のリンクから進んでください。
・行列レジスタ($lx
, $ly
) の読み書きをする命令は、mwrite
と mread
であり、読み出しの方は転置で読み込みをします。
・行列演算を行う際、乗算を行う値は、内積を行う組単位で指数を合わせる「ブロックフロート」化を行う必要があります。
・行列積和演算 mfma
の場合、加算項はブロックフロート化を行う必要はありません。
・疑似単精度は指数部は単精度と同じ bit、仮数部長は bit で、MSB側に有効値が配置されています。つまり単精度から、 LSB 側 bit が無視されるものです。
・LM, GRF は単語 ( bit) 基準のアドレッシングですが、行列レジスタは長語 ( bit) 基準のアドレッシングですのでお気をつけください。
いきなり 行列の行列積を実装するのは難しいかもしれませんので練習用の小さい入出力を用意しました。必要であれば練習にご使用ください。
$l2bid = 0
の 行列 テキスト形式入力の値は、小数点以下切り捨てされています。
$lm[0:64]
/ ((8_L2B:1), (4_PE:1, 2:1, 2_W:1), (16:2); B@[MAB,L1B])
$ln[0:64]
/ ((8_L2B:1), (4_PE:1, 2:1, 2_W:1), (16:2))
/ 以下の絶対誤差が許容されます