Mmul TA 8_8_8

top Top: -

par Par: 16 lines

Problem Statement

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

A: ((2:4, 4:1), (4_PE:1, 2_W:1)) B: ((2:4, 4:1), (4_PE:1, 2_W:1)) C: ((2:4, 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], [ 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:

[[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], [ 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([[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.T @ B

[[31360,31584,31808,32032,32256,32480,32704,32928], [32384,32616,32848,33080,33312,33544,33776,34008], [33408,33648,33888,34128,34368,34608,34848,35088], [34432,34680,34928,35176,35424,35672,35920,36168], [35456,35712,35968,36224,36480,36736,36992,37248], [36480,36744,37008,37272,37536,37800,38064,38328], [37504,37776,38048,38320,38592,38864,39136,39408], [38528,38808,39088,39368,39648,39928,40208,40488]]

Explanation

今度は、 \(A^T \times B\) と、行列 \(A\) を転置してから行列 \(B\) を掛ける問題です。

振り返ると、\(A \times B^T\) のときは転置は必要ありませんでした。\(A \times B\) のときは、\(B\) を転置してから行列演算しました。

今回は、\(A\), \(B\) 両方を転置してから行列演算を行います。

16 行の解法
gmwrite $lm16v $lx0 # B の上半分を 行列レジスタ X に書き込む gmwrite $lm24v $lx4 # B の下半分を 行列レジスタ X に書き込む gmread $lx0 $nowrite # B を転置した上半分(もともとの左半分)を読み込み gbfn $mreadf $nowrite # BF 化を行い、 gmwrite $aluf $ly0 # 行列レジスタ Y の上半分に書き込む gmread $lx4 $nowrite # B を転置した下半分(もともとの右半分)を読み込み gbfn $mreadf $nowrite # BF 化を行い、 gmwrite $aluf $ly4 # 行列レジスタ Y の下半分に書き込む gmwrite $lm0v $lx0 # A の上半分を 行列レジスタ X に書き込む gmwrite $lm8v $lx4 # A の下半分を 行列レジスタ X に書き込む gmread $lx0 $nowrite # A を転置した上半分(もともとの左半分)を読み込み gbfn $mreadf $nowrite # BF 化を行い、 gmmul $ly $aluf $ln0v # 疑似単精度で行列レジスタ Y と行列演算して、結果の上半分を書き込み gmread $lx4 $nowrite # A を転置した下半分(もともとの右半分)を読み込み gbfn $mreadf $nowrite # BF 化を行い、 gmmul $ly $aluf $ln8v # 疑似単精度で行列レジスタ Y と行列演算して、結果の下半分を書き込み

Inputs

Outputs

Testcases

testcase.vsm

Submission

ログイン / 新規登録