Das Programm verwendet zum Parallelisieren SPMD und Threads.
Das Programm verwendet zum Parallelisieren SPMD und Threads.
## Datendekomposition
Jeder Bildpunkt braucht seine Nachbarn zur iterativen Berechnung, also müssen die Strukturen bei dem "verteilten Speicher" Modell möglichst gut erhalten bleiben. Bei der threadparallelen Verarbeitung ist besonders darauf zu achten, das der Zugriff auf gemeinse Variable performant funktioniert. Cache Verdrängung ist ein zusätzlicher Bedenkpunkt.
## SPMD
## SPMD
Das Programm läuft mehrfach. Die Prozesse kommunizieren dabei über Nachrichten. Das Test-Programm läuft lediglich auf einem Rechner. Eine rein thread-basierte Parallelisierung mit gemeinsamen Speicher wäre hier performanter.
Das Programm läuft mehrfach. Die Prozesse kommunizieren dabei über Nachrichten. Das Test-Programm läuft lediglich auf einem Rechner. Eine rein thread-basierte Parallelisierung mit gemeinsamen Speicher wäre hier performanter.
Jede Instanz kann sich selbst eindeutig identifizieren. Dies kann genutzt werden um Datenmengen (gleichmäßig) zuzuordnen. Die Matrix wird schachbrett-artig auf die Prozesse aufgeteilt.
Es kommt MPI als Cluster-Library zum Einsatz.
## Threads
## Datenparallelisierung
nach PPkonzepte.pdf 3-21
### Datendekomposition
Jeder Bildpunkt kann parallel berechnet werden.
### Kommunikation
Jeder Bildpunkt muss bei jeder Iteration mit seinen Nachbarn kommunizieren, also müssen die Strukturen bei dem "verteilten Speicher" Modell möglichst gut erhalten bleiben. Bei der threadparallelen Verarbeitung ist besonders darauf zu achten, das der Zugriff auf gemeinse Variable performant funktioniert. Cache Verdrängung ist ein zusätzlicher Bedenkpunkt.
### Agglomeration
Bildpunkte werden zu Teilfeldern zusammengefasst. Jeder Prozessor übernimmt exakt ein Teilfeld. Es wird solange iteriert bis alle Teilfelder fertig sind. Um möglichst wenig Kommunikation an den Kanten zu erzeugen, wird die Matrix schachbrett-artig in Teilfelder geteilt.
Durch
Durch
...
@@ -19,50 +34,46 @@ Anzahl der Prozesse in 1. Dimension = (Anzahl der Prozesse)/(Anzahl der Prozesse
...
@@ -19,50 +34,46 @@ Anzahl der Prozesse in 1. Dimension = (Anzahl der Prozesse)/(Anzahl der Prozesse
können die Kantenlängen minimiert werden. Dadurch wird der Payload der Nachrichten und folglich die Latenz verringert.
können die Kantenlängen minimiert werden. Dadurch wird der Payload der Nachrichten und folglich die Latenz verringert.
Es kommt MPI als Cluster-Library zum Einsatz.
Innerhalb eines Teilfeldes werden die Bildpunkte auf Threads aufgeteilt. Hier ist der Zugriff auf alle Bildpunkte gleich teuer. Zur Synchronisation von maxdiff wird das reduction-Feature von OpenMP genutzt. Dabei hält jeder Thread eine Kopie und nur zum Abschluss muss synchronisiert werden.
Zur Abbildung der Nachbarschaften bietet MPI u.a. kartesische Gitter. Durch Hilfsfunktionen kann leicht mit Nachbarn Daten ausgetauscht werden. Die Funktion `Create_MPI_Cart_Cluster` erlaubt das Neu-Anordnen von Ranks. Dadurch können Nachbarn auch physikalisch nah gekoppelt werden. Da das Programm allerdings nur auf einem Rechner läuft, sind alle Prozesse eng gekoppelt; eine Neu-Anordnung ist dadurch nicht notwending.
## Threads
### Mapping
Zur Abbildung der Nachbarschaften bietet MPI u.a. kartesische Gitter. Durch Hilfsfunktionen kann leicht mit Nachbarn Daten ausgetauscht werden. Die Funktion `Create_MPI_Cart_Cluster` erlaubt das Neu-Anordnen von Ranks. Dadurch können Nachbarn auch physikalisch nah gekoppelt werden. Da das Programm allerdings nur auf einem Rechner läuft, sind alle Prozesse eng gekoppelt; eine Neu-Anordnung ist dadurch nicht notwending.
## Messungen
## Messungen
Innere Schleife
### Problemgröße 4096 x 4096
4096x4096
P: 8 T: 2 B: 128
#### Prozesse: 1
init: 0.0655639172
Threads: 48
iterate 26.5077140331
total: 26.5732779503
P: 16 T: 2 B: 128
init: 0.2023320198
iterate 135.5007259846
total: 135.7030580044
init: 0.0172390938
Thread: 24
iterate 11.4972770214
total: 11.5145161152
P: 32 T: 2 B: 128
init: 0.2041509151
iterate 135.3141219616
total: 135.5182728767
init: 0.0220100880
Threads: 4
iterate 13.2383890152
total: 13.2603991032
P: 32 disablled OpenMP
init: 0.1982460022
iterate 134.8806080818
total: 135.0788540840
init: 0.0144450665
Threads: 1
iterate 11.0444979668
total: 11.0589430332
P: 1 48 512
init: 0.2125899792
iterate 145.0294249058
total: 145.2420148849
init: 0.2176799774
iterate 127.5701329708
total: 127.7878129482
## Auswertung
## Auswertung
OpenMP bringt erstaunlich wenig
Die Parallelisierung bringt einen
\ No newline at end of file
Eine ungewöhnliche Beobachtung ist, dass bei nur 1. Prozess kein Performanz-Gewinn durch mehrere Threads erzielt wird.