Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Matrix Multiplication in Strassen Algorithm

737 views

Published on

Matrix Multiplication in Strassen Algorithm

Published in: Software
  • Be the first to comment

  • Be the first to like this

Matrix Multiplication in Strassen Algorithm

  1. 1. Strassenのアルゴリズム による行列の積の計算 2017-09-19 宮川 拓
  2. 2. 概要  n*nの密な正方行列の積が、Θ(n^3)よ りも漸近的に小さな計算量で計算できる  びっくり  実装&計測してみた  元ネタ:  コルメン等『アルゴリズム・イントロダク ション』第3版, 4.2節 2/9
  3. 3. 行列の積をふつうに計算  ふつうに計算  𝐴 = ( 𝑎 𝑖 𝑗 ), 𝐵 = ( 𝑏 𝑖 𝑗 )をn次の正方行列と する。 𝐶 = 𝐴 ∙ 𝐵とすると、その要素 𝑐 𝑖 𝑗 は、 𝑐 𝑖 𝑗 = σ 𝑘=1 𝑛 𝑎 𝑖 𝑘 ∙ 𝑏 𝑘 𝑗  これは素直に下記の3重ループで書ける  for i in 1~n for j in 1~n for k in 1~n c [i,j ]+=a[ i,k ]* b [k,j ]  計算量はΘ(n*n*n)=Θ(n^3) 3/9
  4. 4. 準備: 分割統治  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
  5. 5. 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
  6. 6. Strassenのアルゴリズム  前ページの計算を再帰関数として実装 すると、1回の呼び出しごとに、部分 行列の乗算の呼び出しは7回  nを2倍すると計算量は7倍に増える  したがって、計算量は Θ 𝑛 𝑙𝑜𝑔27 = Θ 𝑛2.8073… 6/9
  7. 7. 実装  https://bitbucket.org/miyakawataku/ matrix- multiplication/src/default/matrix.go 7/9
  8. 8. 計測 log2(n) 単純 Strassen n-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
  9. 9. 総括 素敵なアルゴリズムは、nが小さい時には遅い。 そして大抵の場合、nは小さい。 素敵なアルゴリズムの計算量の式には、大きな 定数項が掛かっている。 nが頻繁に大きくなることが分かっていない限り、 素敵にしてはならない。 ― Rob Pike “Notes on Programming in C” 9/9

×