\(4 \times 8\) 行列 \(A\) と、\(8 \times 8\) 行列 \(B\) に対して、行列積 \(C = A \times B\) (shape:\(4 \times 8\)) を計算してください。\(A,B,C\) のレイアウトは以下のとおりです。
A: ((4:1), (4_PE:1, 2_W:1))
B: ((8:1), (4_PE:1, 2_W:1))
C: ((4:1), (4_PE:1, 2_W:1))
\(A, B, C\) の値はこちらです。
A:
[[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15],
[ 16, 17, 18, 19, 20, 21, 22, 23],
[ 24, 25, 26, 27, 28, 29, 30, 31]]
B:
[[100,101,102,103,104,105,106,107],
[108,109,110,111,112,113,114,115],
[116,117,118,119,120,121,122,123],
[124,125,126,127,128,129,130,131],
[132,133,134,135,136,137,138,139],
[140,141,142,143,144,145,146,147],
[148,149,150,151,152,153,154,155],
[156,157,158,159,160,161,162,163]]
C:
import numpy as np
A = np.array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15],
[ 16, 17, 18, 19, 20, 21, 22, 23],
[ 24, 25, 26, 27, 28, 29, 30, 31]])
B = np.array([[100,101,102,103,104,105,106,107],
[108,109,110,111,112,113,114,115],
[116,117,118,119,120,121,122,123],
[124,125,126,127,128,129,130,131],
[132,133,134,135,136,137,138,139],
[140,141,142,143,144,145,146,147],
[148,149,150,151,152,153,154,155],
[156,157,158,159,160,161,162,163]])
A @ B
[[ 3920, 3948, 3976, 4004, 4032, 4060, 4088, 4116],
[12112,12204,12296,12388,12480,12572,12664,12756],
[20304,20460,20616,20772,20928,21084,21240,21396],
[28496,28716,28936,29156,29376,29596,29816,30036]]
gmwrite $lm8v $ly0 # B の上半分を 行列レジスタに書き込む
gmwrite $lm16v $ly4 # B の下半分を 行列レジスタに書き込む
gmread $ly0 $lm8v # B を転置した上半分(もともとの左半分)を読み込み、B に上書き
gmread $ly4 $lm16v # B を転置した下半分(もともとの右半分)を読み込む、B に上書き
nop # LM は書いてから 2 サイクル待つ必要がある
nop
### これ以降は、Mmul TB 4_8_8 と同じ
gbfn $lm8v $nowrite # (転置した) B の 上半分を BF 化
gmwrite $aluf $ly0 # それを行列レジスタの上半分に書き込む
gbfn $lm16v $nowrite # (転置した) B の 下半分を BF 化
gmwrite $aluf $ly4 # それを行列レジスタの下半分に書き込む
gbfn $lm0v $nowrite # A を BF 化
gmmul $ly $aluf $ln0v # 疑似単精度で行列演算して、結果を書き込み
と同じ \(4\times8\) 行列と \(8\times8\) 行列を扱います。向こうは \(A\times B^T\) を計算していましたが、こちらの問題は \(B\) を転置せず、そのまま \(A\times B\) を計算します。