Il y a deux niveaux que vous pouvez analyser les accélérations parallèles avec une exponentiation matricielle: le niveau "macro-algorithmique" qui décide quelles matrices multiplier, et le niveau "micro-algorithmique" où vous pouvez accélérer les multiplications elles-mêmes avec le parallélisme.
Pour ce dernier, Wikipedia suggère que pour multiplier une matrice par , nous pouvons atteindre une complexité de théoriquement avec un nombre illimité de processeurs, ou avec un algorithme parallèle plus réaliste .nnO(log2(n))O(n)
(Remarque: la page wikipedia est destinée au calcul matriciel général. Je ne sais pas si cela peut être parallélisé encore plus en utilisant les informations que nous mettons au carré une matrice.)
Pour les premiers, la question se transforme en combien de tours de multiplication matricielle sont nécessaires pour calculer pour une matrice ? (Je dis rounds, car toutes les multiplications dans un round donné peuvent se faire en parallèle).AmA
L'algorithme séquentiel à battre, comme indiqué dans d'autres réponses, est l' exponentiation par quadrature . Cela vous permet de calculer dans multiplications.AkO(log(k))
La question est: pouvons-nous battre cela avec le parallélisme? Je prétends que la réponse est non.
La raison simple est que l'exponentiation par quadrature est essentiellement un algorithme de programmation dynamique; il vous permet de sauter tout le travail en réutilisant les sous-résultats, mais cela crée à son tour une dépendance aux données qui interdit le parallélisme. Si nous nous débarrassons de la dépendance aux données, mais nous augmentons également considérablement la quantité de travail que nous devons faire.
Pour mieux illustrer cela, regardons comment vous pourriez paralléliser la multiplication matricielle si nous ne faisions pas d'exponentiation. Supposons que vous cherchiez à paralléliser en multipliant matrices carrées distinctes :k
A1A2A3A4A5...Ak
La manière naturelle de paralléliser ceci est évidente, vous devez abuser de l'associativité pour effectuer des multiplications au premier tour:k2
(A1A2)(A3A4)(A5A6)...(Ak−1Ak)
À partir de cela, nous pouvons clairement multiplier nos matrices en tours de multiplication car nous réduisons la taille de notre problème de moitié à chaque tour.kO(log(k))
Cependant, si nous devions effectuer l'exponentiation de cette façon, cela ressemblerait à ceci:
(AA)(AA)(AA)...(AA)
En d'autres termes, tout notre parallélisme nous gagne, c'est recalculer le même produit matriciel pour calculer ! Ainsi, si nous utilisons un algorithme mémorisé tel que l'exponentiation par quadrature, nous pouvons faire la même chose que l'algorithme parallèle à chaque cycle de multiplication.A2
En mettant tout cela ensemble, si nous voulons calculer pour par matrice , la complexité parallèle est pour l'algorithme parallèle optimiste, ou pour le réaliste.AknnAO(log2(n)log(k))O(nlog(k))