Parallel Matrix Multiplication Parallel Programming Parallel Matrix Multiplication http://n.ethz.ch/~klauserc/FS10/PP/
Übersicht Nachbesprechung der Übung 4 Übungsaufgaben zu Condition Queues und Thread.join() K-Best Measurement Vorbesprechung der Übung 5
1. Nachbesprechung Übung 4
Korrekt, oder? Vorsicht mit = und == if(condition) besser als if(condition == true) if(!condition) besser als if(condition == false) public synchronized int read() throws BufferEmptyException { if(isEmpty = true) { throw new BufferEmptyException(); } else { isEmpty = false; return data; }
Diskussion Ist die parallele Version schneller? Wieviele Threads liefern die beste Performance? Was ist der Einfluss von CPU- Modell/CPU-Taktfrequenz?
Paralleles Mergesort 5,2,1,9 5,2 1,9 5 2 1 9
Paralleles Mergesort „fork-join” 5,2,1,9 5,2 1,9 1 9 5 2 1,9 2,5 run() { … } 1 9 5 2 = start() = join() 1,9 2,5 1,2,5,9
Source Code
2. Condition Queues & Thread.Join()
Parallel Map Einagbe: Ausgabe: Liste von Zahlen Eine Funktion Ausgabe: Wir nehmen Fliesskommazahlen (double) und (Math.sqrt(x))
Barrier Einzelne Threads dürfen erst forfahren wenn alle anderen an der selben Stelle angelangt sind Kann effizienter sein als fork-join. barrier() barrier() barrier() start() barrier() join()
3. K-Best Measurement
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?
Parallel Matrix Multiplication 4. Vorbesprechung Übung 5
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
Parallele Matrixmultiplikation Welche Operationen können parallel ausgeführt werden? = x C A B
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 k = 0; k < n; k++) { c[i][j] += a[i][k]*b[k][j];
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
Parallele Matrixmultiplikation Jeder Thread berechnet „seinen Teil“ der Ausgabematrix C. Teile C auf in Spalten = x T1 T2 T3 T4 … … Tn C A B
Zwei Threads Thread #1: Spalten 0 bis n/2 Thread #2: Spalten n/2+1 bis n-1 = x T1 T2 C A B
Zwei Threads Thread 1 Thread 2 for(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 2 for(k = n/2+1; k < n; k++) {
Andere Aspekte Aufteilen in Spalten oder Zeilen? T1 T2 T3 T4 … … Tn = x C A B
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++) {
Performance-Messung n t 1 2 4 8 16 32 … 512 n ≔ Matrixgrösse 100 × 200 500 ⋮ 10´000 n ≔ Matrixgrösse t ≔ Anzahl Threads Frage: Wieviele Threads sind optimal?
Fragen?