Besoin en mémoire pour une multiplication matricielle rapide


12

Supposons que nous voulons multiplier matrices. L'algorithme de multiplication à matrice lente s'exécute dans le temps et utilise la mémoire . La multiplication matricielle la plus rapide s'exécute dans le temps , où est la constante d'algèbre linéaire, mais que sait-on de sa complexité en mémoire?n×nO(n3)O(n2)nω+o(1)ω

Il semble qu'il soit possible a priori que la multiplication matricielle rapide consomme mémoire. Y a-t-il une garantie que cela peut être fait dans la mémoire ? Est-il vrai que les algorithmes de multiplication matricielle actuellement connus utilisent la mémoire ?nωO(n2)O(n2)

(Je m'intéresse en fait à la multiplication matricielle rectangulaire, mais je suppose que la réponse serait la même dans ce cas que pour le cas carré, et le cas carré est mieux étudié.)

Réponses:


16

L'utilisation de l'espace est au maximum de pour tous les algorithmes de type Strassen (c'est-à-dire ceux basés sur la limite supérieure du rang de multiplication matricielle algébriquement). Voir Complexité spatiale de l'algorithme Coppersmith – WinogradO(n2)

Cependant, j'ai réalisé dans ma réponse précédente que je n'avais pas expliqué pourquoi l'utilisation de l'espace était ... alors voici quelque chose de vague. Considérez ce que fait un algorithme de type Strassen. Il part d'un algorithme fixe pour multiplication de matrice qui utilise les multiplications pour une constante . En particulier, cet algorithme (quel qu'il soit) peut être écrit WLOG pour que:O(n2)K×KKcc<3

  1. Il calcule différentes matrices qui multiplient les entrées de la première matrice par différents scalaires et matrices partir de la deuxième matrice d'une forme similaire,KcL1,,LKcAKcR1,,RKcB

  2. Il multiplie ces combinaisons linéaires , puisLiRi

  3. Il multiplie les entrées de par divers scalaires, ajoute toutes ces matrices jusqu'à entrywise pour obtenir .LiRiAB

(Il s'agit d'un algorithme dit "bilinéaire", mais il s'avère que chaque algorithme de multiplication matricielle "algébrique" peut être écrit de cette manière.) Pour chaque , cet algorithme n'a qu'à stocker le produit actuel et la valeur actuelle de (initialement définie sur tous les zéros) en mémoire à tout moment donné, de sorte que l'utilisation de l'espace est .i=1,,KcLiRiABO(K2)

Étant donné cet algorithme fini, il est ensuite étendu à des matrices arbitraires , en divisant les grandes matrices en blocs de dimensions , en appliquant l' algorithme fini aux matrices de blocs et en appelant récursivement l'algorithme chaque fois qu'il a besoin de multiplier deux blocs. À chaque niveau de récursivité, nous devons conserver uniquement les éléments de champ en mémoire (stocker différentes matrices ). En supposant que l'utilisation de l'espace pour la multiplication de la matrice estK×KK×KK1×K1K×KO(K2)O(1)K×KK1×K1S(1), l'utilisation de l'espace de cet algorithme récursif est , qui pour résout en .S()S(1)+O(K2)S(1)=2K2S()O(K2)


Pour tout algorithme de style Strassen, cela me semble juste. Mais Coppersmith-Winograd a également prouvé que pour passer à faut en fait une séquence infinie d'algorithmes de style Strassen, dont chacun se rapproche de plus en plus du véritable exposant. En effet, à la fois les algorithmes de style CW et les algorithmes de style CU fournissent de telles séquences (bien qu'elles ne se rapprochent pas de , à notre connaissance). Au fil des logiques, il est possible que les constantes utilisées dans une telle séquence se développent très rapidement, de sorte que "l' algorithme " finisse par utiliser l' espace . nωωnωω(n2)
Joshua Grochow

1
... Mais par votre argument, on peut toujours obtenir un algorithme dans le temps et l'espace pour tout . O(nω+δ)O(n2)δ>0
Joshua Grochow

@Joshua, les besoins en mémoire de ces algorithmes de type Strassen sont comme , où i est le numéro d'index de l'algorithme et f est calculable. Donc, si vous recherchez sur ces algorithmes à partir de et k est une fonction à croissance lente de n, alors le travail devient et la mémoire est . f(i)n2i=0,...,knω+o(1)n2+o(1)
David Harris

@DavidHarris: Eh bien, bien sûr, tant que croît assez lentement par rapport à , à savoir, doit croître au plus aussi vite que . La question est, pour une famille donnée, ce qui est et à quelle vitesse croît. Mais rien ne garantit que croîtra assez lentement pour obtenir une utilisation globale de la mémoire ...kff - 1 f k k n 2 + o ( 1 )kf1fkkn2+o(1)
Joshua Grochow

@Joshua. L'idée est que sur les entrées de longueur , nous recherchons les premiers putatifs de type Strassen, vérifions s'ils sont valides et choisissons celui qui est le plus rapide. Choisissez simplement en fonction de pour que . Puisque , cela implique que tout algorithme de type Strassen sera sélectionné suffisamment grand. Le temps passe donc aussi à . k k n f ( k ( n ) ) = n o ( 1 ) k ( n ) n n ω + o ( 1 )nkknf(k(n))=no(1)k(n)nnω+o(1)
David Harris

4

Plus généralement, une multiplication matricielle rapide peut être effectuée sur processeurs en mémoire par processeur. Cependant, la communication entre les processeurs est alors sous-optimale. Une communication optimale peut être obtenue en utilisant plus de mémoire. Pour autant que je sache, on ne sait pas si une communication optimale et une mémoire optimale peuvent être obtenues simultanément. Les détails sont dans http://dx.doi.org/10.1007/PL00008264pO(n2/p)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.