Mmul TA 16_4_16

top Top: -

par Par: 65 lines

Problem Statement

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

A: (( 4:2), (2:1, 4_PE:1, 2_W:1)) B: (( 4:2), (2:1, 4_PE:1, 2_W:1)) C: ((16: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], [ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], [ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]]

B:

[[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,228,229,230,231], [232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247], [248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263]]

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], [ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], [ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]]) B = np.array([[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,228,229,230,231], [232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247], [248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263]]) A.T @ B

[[22784,22880,22976,23072,23168,23264,23360,23456,23552,23648,23744,23840,23936,24032,24128,24224], [23680,23780,23880,23980,24080,24180,24280,24380,24480,24580,24680,24780,24880,24980,25080,25180], [24576,24680,24784,24888,24992,25096,25200,25304,25408,25512,25616,25720,25824,25928,26032,26136], [25472,25580,25688,25796,25904,26012,26120,26228,26336,26444,26552,26660,26768,26876,26984,27092], [26368,26480,26592,26704,26816,26928,27040,27152,27264,27376,27488,27600,27712,27824,27936,28048], [27264,27380,27496,27612,27728,27844,27960,28076,28192,28308,28424,28540,28656,28772,28888,29004], [28160,28280,28400,28520,28640,28760,28880,29000,29120,29240,29360,29480,29600,29720,29840,29960], [29056,29180,29304,29428,29552,29676,29800,29924,30048,30172,30296,30420,30544,30668,30792,30916], [29952,30080,30208,30336,30464,30592,30720,30848,30976,31104,31232,31360,31488,31616,31744,31872], [30848,30980,31112,31244,31376,31508,31640,31772,31904,32036,32168,32300,32432,32564,32696,32828], [31744,31880,32016,32152,32288,32424,32560,32696,32832,32968,33104,33240,33376,33512,33648,33784], [32640,32780,32920,33060,33200,33340,33480,33620,33760,33900,34040,34180,34320,34460,34600,34740], [33536,33680,33824,33968,34112,34256,34400,34544,34688,34832,34976,35120,35264,35408,35552,35696], [34432,34580,34728,34876,35024,35172,35320,35468,35616,35764,35912,36060,36208,36356,36504,36652], [35328,35480,35632,35784,35936,36088,36240,36392,36544,36696,36848,37000,37152,37304,37456,37608], [36224,36380,36536,36692,36848,37004,37160,37316,37472,37628,37784,37940,38096,38252,38408,38564]]

Explanation

前回の問題 Mmul TA 16_8_16 では、\(8 \times 16\) 行列同士の行列積を計算しましたが、今度の問題は \(8 \times 16\) 行列同士の行列積です。

前回の回答をベースに、一部の入力を 0 に変更することで、小さな行列も計算できるようにしましょう。

なお、行列サイズが減ったので、\(B\) の位置が $lm[32:64] から $lm[16:32] に変わったのでお気をつけください。

考え方・方針

元々 \(8\) 行だったものが、\(4\) 行と、行列の下半分がなくなりました。

そのため、行列転置を行うとき、行列レジスタの上半分 $lx0 にはいつもどおり値を入れ、下半分 $lx4 には \(0\) を入れます。\(0\) は ALU 命令 zero $OUT で手に入ります。

\(0\) を入れないと、未定義の値がレジスタに入っている可能性があり、それを使用すると演算結果がおかしくなる場合があります。

Inputs

Outputs

Testcases

testcase.vsm

Submission

ログイン / 新規登録