parallel programming parallel matrix multiplication klauserc/fs10/pp

25
Parallel Programming Parallel Matrix Multiplication http://n.ethz.ch/~klauserc/ FS10/PP/

Upload: aldo-nase

Post on 06-Apr-2015

113 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Parallel Programming

Parallel Matrix Multiplication

http://n.ethz.ch/~klauserc/FS10/PP/

Page 2: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Übersicht

1. Nachbesprechung der Übung 4

2. Übungsaufgaben zu Condition Queues und Thread.join()

3. K-Best Measurement

4. Vorbesprechung der Übung 5

Page 3: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

1. NACHBESPRECHUNGÜBUNG 4

Page 4: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Korrekt, oder?

public synchronized int read() throws BufferEmptyException

{if(isEmpty = true) {

throw new BufferEmptyException();} else {

isEmpty = false;return data;

}}

•Vorsicht mit = und ==•if(condition) besser als if(condition == true)•if(!condition) besser als if(condition == false)

Page 5: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Diskussion

• Ist die parallele Version schneller?

• Wieviele Threads liefern die beste Performance?

• Was ist der Einfluss von CPU-Modell/CPU-Taktfrequenz?

Page 6: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Paralleles Mergesort

5 2 1 9

1,95,2

5,2,1,9

Page 7: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Paralleles Mergesort5,2,1,9

5,2

5

2,5

1,2,5,9

2 91

1,9

1,9

= start()

= join()

run() {

}

„fork-join”

Page 8: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Source Code

Page 9: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

2. CONDITION QUEUES & THREAD.JOIN()

Page 10: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Parallel Map

Einagbe:

Liste von Zahlen

Eine Funktion

Ausgabe:

Liste von Zahlen

• Wir nehmen Fliesskommazahlen (double) und (Math.sqrt(x))

Page 11: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Barrier

• Einzelne Threads dürfen erst forfahren wenn alle anderen an der selben Stelle angelangt sind

• Kann effizienter sein als fork-join.

start() barrier()

barrier()

barrier()

barrier()

join()

Page 12: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

3. K-BEST MEASUREMENT

Page 13: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

K-Best Measurement

Aus n Messungen, nimmt man die k besten Werte.

Wenn sie von einander mehr als ε relative Abweichung haben verwirft man die gesamte Messreihe

Sonst nimmt man das Arithmetische Mittel der k besten Werte als Resultat.

• Wieso reicht eine einzelne Messung nicht?

• Wieso reicht das arithmetische Mittel vieler Messungen nicht?

• Wieso ist K-Best sinnvoll?

Page 14: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

4. VORBESPRECHUNG ÜBUNG 5

Parallel Matrix Multiplication

Page 15: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Matrix-Multiplikation

Gegeben: Matrizen

Gesucht: Matrixprodukt

wobei

Die Matrizen sind „voll besetzt“

„Dünn besetzte“ Matrizen haben viele Nullelemente. Nur die Nicht-Nullelemente werden gespeichert (platzsparend aber kompliziert

Page 16: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Parallele Matrixmultiplikation

• Welche Operationen können parallel ausgeführt werden?

= x

C A B

Page 17: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Matrixmultiplikation programmieren

Random rand = new Random();double[][] a = new double[n][n];double[][] b = new double[n][n];double[][] c = new double[n][n];

for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { a[i][j] = rand.nextDouble(); b[i][j] = rand.nextDouble(); c[i][j] = 0.0; }}

for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(int k = 0; k < n; k++) { c[i][j] += a[i][k]*b[k][j]; } }}

Page 18: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Parallele Matrixmultiplikation

Aufteilung der Daten, basierend auf

Eingabematrix A?

Eingabematrix B?

Ausgabematrix C?

• Alle Threads können aus A und B lesen

C zwischen den Threads aufteilen

• Vorteil: Kein synchronized nötig.

= x

C A B

Page 19: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Parallele Matrixmultiplikation

Jeder Thread berechnet „seinen Teil“ der Ausgabematrix C.

Teile C auf in Spalten

= x

C A B

T1 T2 T3 T4 … … Tn

Page 20: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Zwei Threads

Thread #1: Spalten 0 bis n/2

Thread #2: Spalten n/2+1 bis n-1

= x

C A B

T1 T2

Page 21: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Zwei ThreadsThread 1for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(k = 0; k < n/2; k++) { c[i][j] += a[i][k]*b[k][j]; } }}

Thread 2for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(k = n/2+1; k < n; k++) { c[i][j] += a[i][k]*b[k][j]; } }}

Page 22: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Andere Aspekte

• Aufteilen in Spalten oder Zeilen?

= x

C A B

T1 T2 T3 T4 … … Tn

Page 23: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

•Reihenfolge der Schleifen?for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(int k = 0; k < n; k++) { c[i][j] += a[i][k]*b[k][j]; } }}

•Oder?for(int k = 0; i < n; i++) { for(int i = 0; j < n; j++) { for(int j = 0; k < n; k++) { c[i][j] += a[i][k]*b[k][j]; } }}

•Oder?

Page 24: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

Performance-Messungn t 1 2 4 8 16 32 … 51

2100 ×

200 ×

500

10´000

n ≔ Matrixgrösset ≔ Anzahl Threads

Frage: Wieviele Threads sind optimal?

Page 25: Parallel Programming Parallel Matrix Multiplication klauserc/FS10/PP

FRAGEN?