# Partitioned Global Address Space

Partitioned Global Address Space (PGAS) ist ein Programmiermodell speziell für Mehrprozessorsysteme und massiv parallele Rechner. Dabei wird der globale Adressbereich des Arbeitsspeichers logisch unterteilt. Jeder Prozessor bekommt jeweils einen dieser Adressbereiche als lokalen Speicher zugeteilt. Trotzdem können alle Prozessoren auf jede Speicherzelle zugreifen, wobei auf den lokalen Speicher mit wesentlich höherer Geschwindigkeit zugegriffen werden kann als auf den von anderen Prozessoren.
Ein wichtiger Vorteil der PGAS-Sprachen ist die einfach formulierbare Möglichkeit, große Datenmengen, die von einem einzelnen Prozessor nicht mehr gespeichert werden können, in den verteilten Speichern vieler Prozessoren unterzubringen, ohne dass die einheitliche Datenbeschreibung verloren geht.
Der Programmierer steht vor der Aufgabe, maximale Leistung des Programms durch geeignete Definition und Zuordnung der Programmvariablen zu erzielen. Dabei ist insbesondere eine gleichmäßige Lastverteilung auf alle beteiligten Prozessoren zu achten. Ein nur mit PGAS-Mitteln geschriebenes Programm ist manchmal sehr schwer zu überschauen, da die Zuordnung der Variablen im Programm nicht explizit auftaucht, sondern nur implizit nach festgelegten Regeln erfolgt. Deshalb gibt es in PGAS-Sprachen zusätzliche Möglichkeiten der Synchronisierung der Prozesse.

## Eigenschaften

Ein PGAS-System hat folgende Eigenschaften:
* Es besteht aus einer Menge von Prozessoren mit lokalen Speicher. Teile dieses lokalen Speichers können als privat deklariert werden, so dass sie nicht für andere Prozessoren sichtbar sind
* Es hat einen Mechanismus um wenigstens einen Teil des lokalen Speichers der Prozessoren mit anderen Prozessoren zu teilen. Dies führt zwangsläufig zu Verzögerungen beim Speicherzugriff, abhängig von der Zugriffsmethode und dem Ort an dem die geteilte Speicherzelle liegt
* Jede geteilte Speicherzelle ist mit einem Thread assoziiert (engl. affinity), entweder lokal, so dass der Zugriff schnell erfolgen kann, oder entfernt, so dass der Zugriff länger dauert. Diese Assoziation zeigt sich auch dem Programmierer, so dass dieser performant programmieren kann.

## Programmiersprachen

Alle PGAS-Programmiersprachen enthalten die oben genannten Eigenschaften, auch wenn diese unterschiedlich umgesetzt wurden. Jede Sprache erlaubt es zwischen privatem und geteiltem Speicher zu unterscheiden und außerdem die Assoziation der geteilten Speicherzellen zu bestimmen. Manche PGAS-Sprachen bieten verteilte Schleifen oder spezielle Syntax an, um auf entfernte Daten zuzugreifen.
Die Prozessoren führen normale Threads aus. Die Synchronisierung beim Variablenzugriff erfolgt implizit; explizite Synchronisierung durch den Programmierer ist möglich.
* Unified Parallel C (UPC) hat sich von C abgespalten. Es erweitert C um geteilte Arrays und geteilte Pointer, die den globalen Adressraum adressieren. UPC hat außerdem eine forall-Schleife, die Iterationen abhängig von der Assoziation ausführt.
* Co-array Fortran (CAF) basiert auf Fortran. Es erweitert Fortran-Arrays, so dass auch andere Prozesse auf sie zugreifen können. Eine Variante von Coarray Fortran ist in Fortran 2008 enthalten. Sie ist die einzige PGAS-Sprache, die eine ISO-Zertifizierung erhalten hat.
* Titanium basiert auf Java. Sie bietet SPMD-Parallelismus, Pointer zu geteilten Daten und ein erweitertes Modell für verteilte Arrays.
* Fortress unterstützt parallele Programmierung sowohl für Mehrkernprozessoren als auch für Supercomputer. Fortress hat eine mathematische Syntax, nutzt Parallelismus wann immer möglich und ist eine Framework zur Erstellung von domänenspezifischen Sprachen.
* Chapel wird von der Firma Cray entwickelt. Sie verfolgt folgende vier Ziele: Multithreading, Locality-Awareness, Objektorientierung und generische Programmierung.
* X10 gibt es in zwei Implementierungen, einmal basierend auf Java, einmal basierend auf C++. X10 bietet Task- und Datenparallelismus. Die wesentliche Eigenschaft von X10 ist die asynchrone Taskverwaltung.