Mmul TB 4_8_16

top Top: -

par Par: 12 lines

Problem Statement

\(4 \times 8\) 行列 \(A\) と、\(16 \times 8\) 行列 \(B\) に対して、行列積 \(C = A \times B^T\) (shape:\(4 \times 16\)) を計算してください。\(A,B,C\) のレイアウトは以下のとおりです。

A: (( 4:1), ( 4_PE:1, 2_W:1)) B: ((16:1), ( 4_PE:1, 2_W:1)) C: (( 4:2), (2: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], [164,165,166,167,168,169,170,171], [172,173,174,175,176,177,178,179], [180,181,182,183,184,185,186,187], [188,189,190,191,192,193,194,195], [196,197,198,199,200,201,202,203], [204,205,206,207,208,209,210,211], [212,213,214,215,216,217,218,219], [220,221,222,223,224,225,226,227]]

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], [164,165,166,167,168,169,170,171], [172,173,174,175,176,177,178,179], [180,181,182,183,184,185,186,187], [188,189,190,191,192,193,194,195], [196,197,198,199,200,201,202,203], [204,205,206,207,208,209,210,211], [212,213,214,215,216,217,218,219], [220,221,222,223,224,225,226,227]]) A @ B.T

[[ 2940, 3164, 3388, 3612, 3836, 4060, 4284, 4508, 4732, 4956, 5180, 5404, 5628, 5852, 6076, 6300], [ 9564,10300,11036,11772,12508,13244,13980,14716,15452,16188,16924,17660,18396,19132,19868,20604], [16188,17436,18684,19932,21180,22428,23676,24924,26172,27420,28668,29916,31164,32412,33660,34908], [22812,24572,26332,28092,29852,31612,33372,35132,36892,38652,40412,42172,43932,45692,47452,49212]]

Explanation

Mmul TB 4_8_8 の \(B\) の 1 次元目が 2 倍になり、出力 \(C\) の 2 次元目も 2 倍になりました。

考え方・方針

以下のコードで、32 value(s) correct, but 32 value(s) mismatch、つまり半分通ります。

gbfn $lm8v $nowrite gmwrite $aluf $ly0 gbfn $lm16v $nowrite gmwrite $aluf $ly4 gbfn $lm0v $lr0v gmmul $ly $aluf $ln0v4 # 出力を $ln0v4 に変更

Mmul TB 4_8_8 では、\(C\) の 1 次元目のレイアウトが (4:1) でした。つまり 1 次元目は 1 長語(2単語)の間隔で 4 個配置されていたので、$ln0v、つまり $ln0v2 で表現できていました。

今回の \(C\) は、2 次元目のサイズが倍増したため、1 次元目が (4:2)、つまり 2 長語(4単語)の間隔で 4 個配置されることになります。そのため、$ln0v4 で表現する必要があります。

これで \(C\) の左半分が格納されたことになります。\(B\) はまだ、$lm[8:40] のうちの上半分、$lm[8:24] しかまだ使っていません。\(B\) の下半分 $lm[24:40] のぶんも計算し、\(C\) の右半分を埋めましょう。

残りの半分の回答例
gbfn $lm24v $nowrite gmwrite $aluf $ly0 gbfn $lm32v $nowrite gmwrite $aluf $ly4 gbfn $lm0v $lr0v gmmul $ly $aluf $ln2v4

Inputs

Outputs

Testcases

testcase.vsm

Submission

ログイン / 新規登録