prev up inhalt next


6.5 Matrizenmultiplikation im Hypercube

Sei n = 2k. Zwei n × n -Matrizen A,B können in einem Hypercube mit n 3 = 23k Prozessoren multipliziert werden nach der Idee von Dekel, Nassimi und Sahni (DNS) in Anlehnung an den CREW PRAM-Algorithmus aus Kapitel 2.5:

FOR ALL 0 $\leq$ i, j, k $\leq$ n - 1 DO IN PARALLEL
     Pijk : tmp [i,j,k] := a[i,k] * b[k,j]
END
FOR ALL 0 $\leq$ i, j $\leq$ n - 1 DO IN PARALLEL
     Pij * : c[i,j] := $\sum_{k = 0}^{n - 1}$ 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.


Vertikale im Prozessorwürfel zur Aufnahme von a[i,*] bzw. b[*,j]

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) .


prev up inhalt next