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.