Top: 4 lines / syttrea
Par: 11 lines
LM0 上の Float
配列 \(X\) の各要素 \(X[i]\) について、 \(X[i] \geq 1.0\) なら \(Y[i] = \infty\) (符号が \(0\) かつ指数部の全ビットが \(1\) で仮数部は任意)、そうでなければ \(Y[i] = 0\) として LM1 に出力してください。
様々な解法が考えられますが、MAU とマスクレジスタを使って解く方法を紹介します。
次の VSM をご覧ください。
MAU を用いて $lm[0:8]
から \(1.0\) を引き、ALU で $m[i]
が \(1.0\) 以上のときにだけ $n[i]
に \(\infty\) を書き込みます。
ここで、MAU と ALU は同時に使うことができます。
使用する入出力のレジスタが衝突していないなどの条件を満たせば、以下のように記述することで \(1\) ステップ内で同時に実行できます(3.6.4 並列実行条件)。
この例では MAU 命令の fvadd
と、ALU 命令の isub
を同時に実行しています。
しかし、以下の VSM はエラーになってしまいます。
これは「即値命令」と「LM0($lm8v
)へのアクセス」が同時に行えないためです。
即値の書き込みを工夫して、ALU と MAU を同時に利用できないでしょうか。
Tips: ALU と MAU が同時に実行可能なことや、並列実行条件に関連し、こちら に MN-Core の機械語の仕組みについての説明があります。理解の補足として参考にしてください。
入力 \(X\) はベクトル長 \(n=16\times4\times20\times2\) として、等差数列 [5/n, 10/n, 15/n, ..., 5]
をシャッフルしたものが与えられます。
$lm[0:40]
/ ((16_MAB:1, 4_PE:1, 20:1, 2_W:1); B@[L1B,L2B])
$ln[0:40]
/ ((16_MAB:1, 4_PE:1, 20:1, 2_W:1))