Gibt es parallele Matrix-Exponentiationsalgorithmen, die effizienter sind als die sequentielle Multiplikation?


11

Man muss die Potenz (positive ganze Zahl) der Matrix reeller Zahlen finden. Es gibt viele effiziente Matrixmultiplikationsalgorithmen (z. B. einige parallele Algorithmen sind Cannons, DNS ), aber gibt es Algorithmen, die genau dazu bestimmt sind, die Leistung der Matrix zu ermitteln, und die effizienter sind als die sequentielle Ausführung der Matrixmultiplikation? Ich interessiere mich besonders für parallele Algorithmen.


1
Was hast du versucht? Wo bist du festgefahren? Welche Recherchen haben Sie durchgeführt? Wo ist neben dem Titel die Frage? Für die Entscheidungsversion Ihres Problems (aus dem Titel) lautet die Antwort "Ja", aber Sie wissen es bereits, oder?
Evil

2
@ TomR Diese Frage ist wahrscheinlich von Interesse für Sie
AdrianN

1
Vielleicht so etwas wie diese ? Oder suchen Sie etwas anderes? Was sind Größen und Fähigkeiten in Ihrer Anwendung?
Evil

1
Sie können die n-te Potenz mit weniger als n-1 Multiplikationen berechnen, wenn n ≥ 4 ist. Für große Matrizen lohnt es sich normalerweise, die kleinstmögliche Anzahl von Multiplikationen zu finden (zum Beispiel gibt es eine einfache Methode, um n ^ 15 mit 6 zu berechnen Multiplikationen, aber es kann mit 5) gemacht werden. Sie können dann dasselbe Prinzip anwenden, um die kleinste Anzahl von sequentiellen Multiplikationen zu finden, was schwieriger sein wird.
Gnasher729

1
Sie sollten auch das Ausmaß der Parallelität berücksichtigen, das Ihnen zur Verfügung steht. Bei "Parallelität" geht es darum, Ressourcen auszunutzen, die sonst nicht genutzt würden. Wenn eine Implementierung der Matrixmultiplikation bereits alle verfügbaren Ressourcen effizient nutzen kann, gibt es nichts anderes, das für die Berechnung der Potenzen von Matrizen genutzt werden kann.
Gnasher729

Antworten:


5

Wenn Sie mehrere Prozessoren haben, die parallel arbeiten können, können Sie jede Leistung bis zur Leistung (2 ^ k) in k Schritten berechnen. Zum Beispiel: Um zu berechnen , berechnen Sie:M.15

Stufe 1: Berechnen Sie M.2

Stufe 2: Berechnen Sie und M 4 = M 2M 2M.3=M.2M.M.4=M.2M.2

Stufe 3: Berechnen Sie und M 8 = M 4M 4M.7=M.4M.3M.8=M.4M.4

Stufe 4: Berechnen Sie M.15=M.8M.7

Dies ist eine Multiplikation mehr als die Berechnung von in drei Multiplikationen und das Erhöhen von M 5 auf die dritte Potenz in zwei weiteren Multiplikationen. Sie sollte jedoch schneller sein, wenn Sie zwei Prozessoren haben. Für beliebig hohe Leistungen benötigen Sie mehr Prozessoren.M.5M.5

Wenn Sie einen Brute-Force-Algorithmus für die Multiplikation verwenden und Zeile für Spalte multiplizieren, können Sie Zeit sparen, indem Sie eine Zeile eines Produkts berechnen und diese Zeile dann sofort für das nächste Produkt verwenden. Dies würde bei der Berechnung des hilft , wo wir die Berechnung beginnen M 3 , sobald die erste Zeile von M 2 berechnet wurde; Mit M 4 wäre es nicht so hilfreich, da wir sowohl Zeilen als auch Spalten von M 2 benötigen . Für große Kräfte könnten Sie wahrscheinlich festlegen, welche Kräfte berechnet werden sollen.M.3M.3M.2M.4M.2

Und nach dieser Veröffentlichung wird es offensichtlich , dass Sie sehr leicht mehrere Prozessoren verwenden können: Sie beginnen , indem Sie die erste Zeile der Berechnung . Wenn Sie diese Zeile haben, haben Sie alle Informationen, die Sie benötigen, um die erste Zeile von M 3 = M 2M zu berechnen. Sie berechnen also die zweite Zeile von M 2 und die erste Zeile von M 3 parallel. Dann können Sie die dritte Reihe von M 2 , die zweite Reihe von M 3 und die erste Reihe von M 4 parallel berechnen und so weiter.M.2=M.M.M.3=M.2M.M.2M.3M.2M.3M.4

Dies führt viel mehr Operationen als nötig aus (zum Beispiel 14 Matrixmultiplikationen für anstelle der minimalen 5 oder 6 der vierstufigen Methode). Wenn die Leistung im Vergleich zur Anzahl der Prozessoren nicht groß ist, ist dies immer noch schneller. Die Berechnung von M 1000 mit vier Prozessoren mit dieser Methode ist jedoch ineffizient. Dies auf optimale Weise zu tun, wäre ein interessantes Problem.M.15M.1000

Kombinieren von Ansätzen: Mit vier Prozessoren können Sie beispielsweise AB, ABC, ABCD und ABCDE nahezu parallel berechnen, indem Sie jedes Produkt zeilenweise berechnen. Dies ermöglicht die Berechnung aller vier von bis M 5 mit vier Prozessoren ungefähr zur gleichen Zeit wie ein Produkt mit einem Prozessor.M.2M.5

Mit diesen vier Ergebnissen und dem ursprünglichen M können Sie vier der Matrizen bis M 25 wieder gleichzeitig berechnen , vorausgesetzt, die Matrizen haben höchstens fünf Potenzen voneinander entfernt. So kann jede Leistung bis zu M 25 in etwa der doppelten Zeit eines einzelnen Prozessormatrixprodukts berechnet werden.M.6M.25M.25

Wenn diese Matrizen berechnet sind, können alle Matrizen bis zu und einige weitere bis zu M 125 in der dreifachen Zeit eines einzelnen Matrixprodukts berechnet werden, wenn vier Prozessoren verfügbar sind. Bei k Prozessoren sollte dies mindestens die Leistung k ( k + 1 ) 2 erreichen .M.108M.125k(k+1)2


4

Es gibt zwei Ebenen, auf denen Sie parallele Beschleunigungen mit Matrixexponentiation analysieren können: Die Ebene "Makroalgorithmus", die entscheidet, welche Matrizen multipliziert werden sollen, und die Ebene "Mikroalgorithmus", auf der Sie die Multiplikationen selbst mit Parallelität beschleunigen können.

Für letztere schlägt Wikipedia vor, dass wir zum Multiplizieren einer mit n- Matrix theoretisch eine Komplexität von O ( log 2 ( n ) ) mit einer unbegrenzten Anzahl von Prozessoren oder O ( n ) mit einem realistischeren parallelen Algorithmus erreichen können.nnO(log2(n))O(n)

(Hinweis: Die Wikipedia-Seite dient der allgemeinen Matrixberechnung. Ich bin mir nicht sicher, ob dies mithilfe der Informationen, die wir zum Quadrieren einer Matrix verwenden, noch weiter parallelisiert werden kann.)

AmA

EINkO(log(k))

Die Frage ist: Können wir dies mit Parallelität schlagen? Ich behaupte, die Antwort ist nein.

Der einfache Grund ist, dass die Potenzierung durch Quadrieren im Wesentlichen ein dynamischer Programmieralgorithmus ist; Sie können die gesamte Arbeit überspringen, indem Sie Unterergebnisse wiederverwenden. Dies führt jedoch zu einer Datenabhängigkeit, die Parallelität nicht zulässt. Wenn wir die Datenabhängigkeit loswerden, aber auch den Arbeitsaufwand erheblich erhöhen.

k

A1A2A3A4A5...Ak

Der natürliche Weg, dies zu parallelisieren, liegt auf der Hand. Sie sollten die Assoziativität missbrauchen, um auszuführenk2

(A1A2)(A3A4)(A5A6)...(Ak1Ak)

kÖ(Log(k))

Wenn wir jedoch die Potenzierung auf diese Weise durchführen würden, würde dies folgendermaßen aussehen:

(EINEIN)(EINEIN)(EINEIN)...(EINEIN)

EIN2

AknnAO(log2(n)log(k))O(nlog(k))


3

mlogm2m

A=SΛS1Am=SΛmS1
mÖ(1)m
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.