next up previous contents
Next: Message-Passing-Programmierung Up: Programmierung der SPP Previous: Allgemeines

Shared-Memory-Programmierung

Die Convex-Fortran- und C-Compiler erzeugen bei der Optimierung mit -O3 automatisch parallelen Code. Dabei werden allerdings nur bestimmte Arten von Schleifen parallelisiert, indem mehrere Threads erzeugt werden, die die Schleife aufteilen. Alle Daten werden defaultmäßig im globalen Speicher untergebracht, so daß sie von allen Hypernodes aus erreichbar sind, wenn auch ggf. mit niedrigerer Performance.

Mit Hilfe von Compiler-Direktiven kann man dem Compiler Hinweise geben, welche Schleifen parallelisiert werden können. Außerdem kann man manuell die Zuordnung von Daten zu Speicherbereichen verändern und sogar explizit Tasks definieren, die direkt einzelnen Threads zugeordnet werden. Schließlich gibt es die Möglichkeit, verschiedene Synchronisationsmechanismen zwischen Threads zu definieren.

Aus Programmierer-Sicht umfaßt das Speicher-Modell folgende Elemente:

thread private lokale Daten für einen Thread
node private lokale Daten in einem Node
near shared global, aber im anfordernden Node abgelegt
far shared global, in 4kB-Blöcken durch alle Nodes verteilt
block shared global, ein großer Block pro Node

Möchte man noch weitergehende Kontrolle, kann man, statt mit Direktiven zu arbeiten, direkt Routinen aus der Thread-Bibliothek CPSlib aufrufen, die die üblichen Thread-Management- und Synchronisations-Funktionen zur Verfügung stellt.



rztms 26.2.96