Hay dos niveles que puede analizar aceleraciones paralelas con exponenciación de matrices: el nivel "macro-algorítmico" que decide qué matrices multiplicar, y el nivel "micro-algorítmico" donde puede acelerar las multiplicaciones con paralelismo.
Para este último, Wikipedia sugiere que para multiplicar una matriz por , podemos lograr una complejidad de teóricamente con un número ilimitado de procesadores, u con un algoritmo paralelo más realista .nnO(log2(n))O(n)
(Nota: la página de wikipedia es para computación matricial general. No estoy seguro de si eso se puede paralelizar aún más usando la información de que estamos cuadrando una matriz).
Para el primero, la pregunta se convierte en cuántas rondas de multiplicación de matrices son necesarias para calcular para alguna matriz ? (Digo rondas, porque todas las multiplicaciones en una ronda dada pueden hacerse en paralelo).AmA
El algoritmo secuencial para vencer, como se señaló en otras respuestas, es la exponenciación por cuadratura . Esto le permite calcular en multiplicaciones.AkO(log(k))
La pregunta es: ¿podemos vencer esto con paralelismo? Afirmo que la respuesta es no.
La razón simple es que la exponenciación por cuadratura es esencialmente un algoritmo de programación dinámico; le permite omitir todo el trabajo reutilizando subresultados, pero esto a su vez crea una dependencia de datos que no permite el paralelismo. Si nos deshacemos de la dependencia de datos, pero también aumentamos enormemente la cantidad de trabajo que tenemos que hacer.
Para ilustrar mejor esto, veamos cómo paralelizaría la multiplicación de matrices si no estuviéramos haciendo exponenciación. Suponga que busca paralelizar multiplicando matrices cuadradas separadas :k
A1A2A3A4A5...Ak
La forma natural de paralelizar esto es obvia, debe abusar de la asociatividad para realizar multiplicaciones en la primera ronda:k2
(A1A2)(A3A4)(A5A6)...(Ak−1Ak)
A partir de esto, podemos multiplicar claramente nuestras matrices en rondas de multiplicación porque reducimos el tamaño del problema a la mitad en cada ronda.kO(log(k))
Sin embargo, si realizáramos la exponenciación de esta manera, se vería así:
(AA)(AA)(AA)...(AA)
En otras palabras, todo nuestro paralelismo nos está haciendo volver a calcular el mismo producto matricial para calcular . Por lo tanto, si utilizamos un algoritmo memorizado como Exponenciación por cuadratura, podemos hacer lo mismo que el algoritmo paralelo en cada ronda de multiplicación.A2
En conjunto, si queremos calcular para por matriz , la complejidad paralela es para el algoritmo paralelo optimista u para el realista. n n A O ( log 2 ( n ) log ( k ) ) O ( n log ( k ) )AknnAO(log2(n)log(k))O(nlog(k))