Mmul 4_8_8

top Top: -

par Par: 10 lines

Problem Statement

\(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]]

Answer

端的には、以下の 12 行のコードで Accept できます。

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 # 疑似単精度で行列演算して、結果を書き込み

この仕組みを、解説します。

Explanation

Mmul TB 4_8_8 と同じ \(4\times8\) 行列と \(8\times8\) 行列を扱います。向こうは \(A\times B^T\) を計算していましたが、こちらの問題は \(B\) を転置せず、そのまま \(A\times B\) を計算します。

簡潔な説明をすると、この与えられた \(B\) を転置してしまって Mmul TB 4_8_8 と同じことをすれば、解けることがわかると思います。

行列の転置は、行列レジスタに書き込んだ後、mread 命令で転置読み出しできます。ワード長によって転置の仕方が変わるので、疑似単精度で転置読み出しする際は gmread 命令を使います。

Inputs

Outputs

Testcases

testcase.vsm

Submission

ログイン / 新規登録