Multiplikation zweier Matrizen
loop.h | Definitionen für LOOP |
loop.c | Hauptprogramm |
par_loop.c | parallele Routine |
matrix.h | dynamische Matrizen (Header) |
matrix.c | dynamische Matrizen (Implementierung) |
Datenstruktur Matrix für dynamische Arrays mit effizienter Speicherung
(ohne Spaltenvektor-Pointer)
INDEX-Makro zwar unschön, aber sehr
flexibel: erlaubt zeilen- oder spaltenweises Abspeichern und ersten
Index 0 oder 1.
einfacher Test:
Matrizen A, B so gewählt, daß Spur(C) = 0 und
Spur(A) != 0.
In Anwendungen immer BLAS-Routine (oder LAPACK etc.) für Matrix-Multiplikation verwenden!
Grundstruktur wie beim Einführungsbeispiel PI, aber "Master" arbeitet mit.
Gemeinsame Variable für Threads hier nicht globale Variable, sondern (in Struktur verpacktes) Argument der Thread-Funktion par_loop.
Vorsicht: Jeder Thread muß beim pthread_create einen Pointer auf seinen eigenen Argument-Bereich haben, sonst kann folgende Race-Condition auftreten:
Master Thread 1 ------------------------------------------------------- packe Argument 1 starte Thread 1 Thread 1 startet packe Argument 2 Thread 1 liest seine Argumente - inzwischen schon die für Thread 2!
Trick, um eindeutige Ids 0 .. N-1 für die Threads zu erzeugen:
Jeder bekommt seine Id als Argument myarg_p->myid
Aufteilung der Schleife auf Threads:
Andere Aufteilung der Matrix (z.B. Block statt Streifen) könnte Speicherzugriff (Cache) verbessern.
Lokale Teil-Matrix-Multiplikation natürlich wieder mit BLAS.