parallel programming parallel matrix multiplication klauserc/fs10/pp
TRANSCRIPT
Parallel Programming
Parallel Matrix Multiplication
http://n.ethz.ch/~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
1. NACHBESPRECHUNGÜBUNG 4
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)
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
1,95,2
5,2,1,9
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”
Source Code
2. CONDITION QUEUES & THREAD.JOIN()
Parallel Map
Einagbe:
Liste von Zahlen
Eine Funktion
Ausgabe:
Liste von Zahlen
• 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.
start() barrier()
barrier()
barrier()
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?
4. VORBESPRECHUNG ÜBUNG 5
Parallel Matrix Multiplication
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 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]; } }}
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
C A B
T1 T2 T3 T4 … … Tn
Zwei Threads
Thread #1: Spalten 0 bis n/2
Thread #2: Spalten n/2+1 bis n-1
= x
C A B
T1 T2
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]; } }}
Andere Aspekte
• Aufteilen in Spalten oder Zeilen?
= x
C A B
T1 T2 T3 T4 … … Tn
•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?
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?
FRAGEN?