FOR ALL 0 i, j, k n - 1 DO IN PARALLEL
Pijk : tmp [i,j,k] := a[i,k] * b[k,j]
END
FOR ALL 0 i, j n - 1 DO IN PARALLEL
Pij * : c[i,j] :=
tmp [i,j,k]
END
Die Bestimmung vom tmp [i,j,k]
verursacht einen Schritt,
das Aufaddieren des Vektors tmp [i,j,*]
verursacht log n Schritte.
Zur Realisierung im Hypercube wird ein logisches
2k × 2k × 2k-Prozessorgitter gemäß Einbettungsidee
aus Kapitel 3.3.2 mit Kantenstreckung 1 in einen Hypercube der Dimension
3k eingebettet.
Der Hypercube hat n Ebenen, zu Beginn befinden sich die Matrizen
A,B in Ebene 0, d.h., Pij0 speichert a[i,j]
und b[i,j].
Ziel ist es, Zeile i der Matrix A und Spalte j
der Matrix B in die Prozessorvertikale
Pij * zu bekommen,
genauer Pijk soll a[i,k] und b[k,j] erhalten.
Hierzu wird zunächst jede Spalte k von A auf die Ebene k kopiert, d.h., a[i,k] wandert von Pik0 nach Pikk . Danach findet auf jeder Ebene k ein One-to-All Broadcast dieser Spalte statt, d.h., Prozessoren Pi * k erhalten Kopien von a[i,k] von Pikk . Somit verfügt Pijk über a[i,k]. Analog wird die Matrix B verteilt, indem jeweils die Zeilen nach oben wandern und dann ebenenweise durch Broadcast verteilt werden. Somit verfügt Pijk über b[k,j].
Kommunikationsschritte im DNS-Algorithmus | |
für zwei 4 × 4 -Matrizen auf 64 Prozessoren |
Nach der Multiplikation tmp[i,j,k] := a[i,k] * a[k,j]
muß jede Prozessorvertikale ihre Produkte tmp [i,j,*]
aufaddieren und das Ergebnis nach Pij0 bringen.
Alle Phasen (Lift der Matrizen A,B , Broadcast
in einer Ebene, Aufsummieren) finden in n -elementigen
Subwürfeln des Hypercubes statt und benötigen daher log n
Schritte.
Die Gesamtlaufzeit für n 3 Prozessoren beträgt daher
O(log n) .