Beispielprogramm
Aufgabe:
Berechnung der Elemente M
ij
der Matrix M
M ist spaltenblockweise verteilt
Rechenzeiten für M
ij
sehr unterschiedlich
Grundstruktur:
berechne zeilenweise die (unbearbeiteten) lokalen Matrixelemente
solange es eine Task gibt, die noch nicht fertig ist:
berechne unbearbeitete Zeilen dieser Task
prüfe die Ergebnismatrix
Beispiel-Ablauf:
Synchronisation:
pro Task eine Integer-Variable
last
enthält Nummer der nächsten zu bearbeitende Zeile
für alle anderen zugänglich
Zugriffe auf
last
werden gelocked
Barrier zwischen
Initialisierung und Rechnung
Rechnung und Check
"Race conditions" bei fehlender Synchronisation, z.B.:
Initialisierung/Rechnung:
Task 1 noch beim Init
Task 0 schon mit der eigenen Rechnung fertig,
holt uninitialisierten last-Pointer von Task 1
Bemerkungen zum Programm (
oneside.c
,
DistMatrix.h
,
DistMatrix.c
)
DistMatrix:
in Spaltenblöcken verteilte Matrix
enthält globale und lokale Dimensionen und Offset
dynamische Erzeugung über
MPI_Alloc_mem
INDEX-Makro
blockDistribute: globaler Index
lokaler Index
lokale Berechnungen:
andere Tasks arbeiten an der eigenen Matrix
hole nächste freie Zeile unter Lock
Lock auch im Abbruchzweig freigeben!
get_next:
läuft zyklisch durch die Nachbar-Tasks
Abbruchbedingung: Ausgangstask erreicht
entfernte Berechnungen:
Indizes auf die besuchte Task beziehen
in globalen Index umrechnen
compute:
nicht-wegoptimierbare Version von
f(x) = x + eps
Rechenaufwand stark schwankend
check:
Peter Junglas 16.2.1999