Istnieją dwa poziomy, na których można analizować równoległe przyspieszenia z potęgowaniem macierzy: poziom „makro-algorytmiczny”, który decyduje, które macierze należy pomnożyć, oraz poziom „mikro-algorytmiczny”, na którym można przyspieszyć same multiplikacje z równoległością.
nnO ( log2)( n ) )O ( n )
(Uwaga: strona wikipedia służy do ogólnego obliczania macierzy. Nie jestem pewien, czy można to zrównoleglić jeszcze bardziej, korzystając z informacji, że kwadraty macierz).
ZAmZA
ZAkO ( log( k ) )
Pytanie brzmi: czy możemy to pokonać równolegle? Twierdzę, że odpowiedź brzmi „nie”.
Prostym powodem jest to, że potęgowanie przez kwadrat jest zasadniczo dynamicznym algorytmem programowania; pozwala ominąć całą pracę poprzez ponowne użycie wyników cząstkowych, ale to z kolei tworzy zależność danych, która uniemożliwia równoległość. Jeśli pozbędziemy się zależności danych, ale znacznie zwiększymy ilość pracy, którą musimy wykonać.
k
ZA1ZA2)ZA3)ZA4ZA5. . . ZAk
k2)
( A1ZA2)) ( A3)ZA4) ( A5ZA6) . . . ( Ak - 1ZAk)
kO ( log( k ) )
Gdybyśmy jednak wykonywali potęgowanie w ten sposób, wyglądałoby to tak:
( A A ) ( A A ) ( A A ) . . . ( A A )
ZA2)
ZAknnZAO ( log2)( n ) log( k ) )O ( n log( k ) )