Há dois níveis nos quais você pode analisar acelerações paralelas com exponenciação de matriz: o nível "macro-algorítmico" que decide quais matrizes multiplicar e o nível "micro-algorítmico" onde você pode acelerar as multiplicações com paralelismo.
nnO(log2(n))O(n)
(Nota: a página da wikipedia é para cálculo geral da matriz. Não tenho certeza se isso pode ser paralelizado ainda mais usando as informações que estamos construindo ao quadrado uma matriz.)
AmA
AkO(log(k))
A questão é: podemos vencer isso com paralelismo? Eu afirmo que a resposta é não.
A razão simples é que a exponenciação ao quadrado é essencialmente um algoritmo de programação dinâmica; permite que você pule todo o trabalho reutilizando sub-resultados, mas isso, por sua vez, cria uma dependência de dados que não permite o paralelismo. Se nos livrarmos da dependência de dados, mas também aumentamos bastante a quantidade de trabalho que temos que fazer.
k
A1A2A3A4A5...Ak
k2
(A1A2)(A3A4)(A5A6)...(Ak−1Ak)
kO(log(k))
No entanto, se realizássemos a exponenciação dessa maneira, ficaria assim:
(AA)(AA)(AA)...(AA)
A2
AknnAO(log2(n)log(k))O(nlog(k))