matrix multiplication in strassen algorithm

9
Strassenのアルゴリズム による行列の積の計算 2017-09-19 宮川 拓

Upload: taku-miyakawa

Post on 29-Jan-2018

73 views

Category:

Software


0 download

TRANSCRIPT

Strassenのアルゴリズム

による行列の積の計算

2017-09-19

宮川 拓

概要

n*nの密な正方行列の積が、Θ(n^3)よ

りも漸近的に小さな計算量で計算できる

びっくり

実装&計測してみた

元ネタ:

コルメン等『アルゴリズム・イントロダク

ション』第3版 , 4.2節

2/9

行列の積をふつうに計算

ふつうに計算

𝐴 = (𝑎 𝑖𝑗 ) , 𝐵 = (𝑏 𝑖𝑗 )をn次の正方行列と

する。𝐶 = 𝐴 ∙ 𝐵とすると、その要素𝑐 𝑖𝑗

は、𝑐 𝑖𝑗 = σ𝑘=1𝑛 𝑎 𝑖𝑘 ∙ 𝑏𝑘𝑗

これは素直に下記の3重ループで書ける

f o r i i n 1~n

fo r j i n 1~n

fo r k i n 1~n

c [ i , j ]+=a[ i , k ]*b [k , j ]

計算量はΘ(n*n*n)=Θ(n^3)

3/9

準備: 分割統治

A, B, Cを4つずつの(n /2)次正方行列に分割すると、C=A・Bは

𝐶11 𝐶12𝐶21 𝐶22

=𝐴11 𝐴12

𝐴21 𝐴22∙𝐵11 𝐵12

𝐵21 𝐵22=

𝐴11 ∙ 𝐵11 + 𝐴12 ∙ 𝐵21 𝐴11 ∙ 𝐵12 + 𝐴12 ∙ 𝐵22

𝐴21 ∙ 𝐵11 + 𝐴22 ∙ 𝐵21 𝐴21 ∙ 𝐵12 + 𝐴22 ∙ 𝐵22

と書き直せる

書き直した式を再帰関数で実装すると、1回の呼び出しは、半分の次数の部分行列同士の乗算について、8回関数を呼び出す

したがって、その計算量はΘ(n^3)

4/9

Strassenのアルゴリズム

ここで𝑃1~𝑃7を下記のように置くと

𝑃1 = 𝐴 1 1 ( 𝐵 1 2 − 𝐵 2 2 )

𝑃2 = ( 𝐴 1 1 + 𝐴 1 2 ) 𝐵 2 2

𝑃3 = ( 𝐴 2 1 + 𝐴 2 2 ) 𝐵 1 1

𝑃4 = 𝐴 2 2 𝐵 2 1 − 𝐵 1 1

𝑃5 = ( 𝐴 1 1 + 𝐴 2 2 ) ( 𝐵 1 1 + 𝐵 2 2 )

𝑃6 = 𝐴 1 2 − 𝐴 2 2 𝐵 2 1 + 𝐵 2 2

𝑃7 = 𝐴 1 1 − 𝐴 2 1 𝐵 1 1 + 𝐵 1 2

次が成り立つ

𝐶1 1 = 𝐴 1 1 ∙ 𝐵 1 1 + 𝐴 1 2 ∙ 𝐵 2 1 = 𝑃5 + 𝑃4 − 𝑃2 + 𝑃6

𝐶1 2 = 𝐴 1 1 ∙ 𝐵 1 2 + 𝐴 1 2 ∙ 𝐵 2 2 = 𝑃1 + 𝑃2

𝐶 2 1 = 𝐴 2 1 ∙ 𝐵 1 1 + 𝐴 2 2 ∙ 𝐵 2 1 = 𝑃3 + 𝑃4

𝐶 2 2 = 𝐴 2 1 ∙ 𝐵 1 2 + 𝐴 2 2 ∙ 𝐵 2 2 = 𝑃5 + 𝑃1 − 𝑃3 − 𝑃7

5/9

Strassenのアルゴリズム

前ページの計算を再帰関数として実装

すると、1回の呼び出しごとに、部分

行列の乗算の呼び出しは7回

nを2倍すると計算量は7倍に増える

したがって、計算量は

Θ 𝑛 𝑙𝑜𝑔27 = Θ 𝑛2.8073…

6/9

実装

https://bitbucket.org/miyakawataku/

matrix-

multiplication/src/default/matrix.go

7/9

計測

log2(n) 単純 Strassenn-1との比(単純)

n-1との比(Strassen)

4 22,724 577,688 - -

5 133,972 4,008,528 5.90 6.94

6 1,129,255 28,688,124 8.43 7.16

7 9,924,139 203,509,826 8.79 7.09

8 133,242,248 1,576,870,691 13.43 7.75

9 1,327,584,877 11,072,402,847 9.96 7.02

10 11,892,402,060 86,182,808,153 8.96 7.78

11 106,612,149,065 619,821,838,102 8.96 7.19

12 3,073,269,379,009 5,012,791,249,199 28.83 8.09

実行環境:

GCE n1-standard1

CPU: 2.20GHz(x1コア) , キャッシュ55MB

たぶんXeon E5-2699 v4

キャッシュに乗らなくなったため?

4096*4096*4byte = 64MiB

8/9

総括

素敵なアルゴリズムは、nが小さい時には遅い。

そして大抵の場合、nは小さい。

素敵なアルゴリズムの計算量の式には、大きな

定数項が掛かっている。

nが頻繁に大きくなることが分かっていない限り、

素敵にしてはならない。

― Rob Pike “Notes on Programming in C”

9/9