Projektziele
Die Mehrzahl heutiger HPC Anwendungen wird unter Verwendung der Industriestandards OpenMP und MPI in einem bulk synchronous Ausführungsmodell erstellt. Dieser Ansatz hat sich in der Vergangenheit bei statisch partitionierten Problemdomänen oftmals als hochgradig effizient erwiesen, ist jedoch für zukünftige HPC-Systeme, die durch Heterogenität und dynamische Variabilität ausgezeichnet sein werden, nicht mehr adäquat und bedarf zumindest einer Erweiterung.
Variabilität zeigt sich bereits heute im Turbo-Boost Modus moderner CPUs, wo einzelne Cores eigenständig ihre Taktrate je nach thermischen Erfordernissen, möglicher Leistungsaufnahme und Stromstärke regulieren. Für die Zukunft ist davon auszugehen, dass sich dieser Trend durch weitere Faktoren noch deutlich verschärfen wird. Rechenknoten mit vielschichtigen Speicherarchitekturen unterschiedlicher Ausprägung (High-Bandwidth RAM, NVRAM, DRAM) und heterogenen Rechenkernen sowie transiente Fehler und Variabilität in der Vernetzung mehrerer Rechenknoten tragen zu einer hochgradig komplexen Systemarchitektur bei. Dies wird dazu führen dass es für eine Anwendung unerläßlich ist, die Fähigkeit zu besitzen sich dynamisch und reaktiv an die sich ändernden Gegebenheiten anzupassen.
Um existierende und neu zu entwickelnde Anwendungen mit der Fähigkeit auszustatten sich reaktiv gegenüber dynamisch variabler Hardware zu verhalten, sind zumindest drei Bausteine erforderlich: Eine taskbasierte Ausführungsumgebung, eine Überwachungskomponente zur Ermittlung der aktuellen Ausführungsbedingungen und eine Analysekomponente zur Datenaufbereitung und -auswertung.
Ziel von Chameleon ist die Entwicklung einer taskbasierten Programmierumgebung für reaktive HPC Anwendungen. Reaktiv bedeutet hier, dass Programmierer ihre Anwendungen auf sich verändernde Hardware Bedingungen reagieren lassen können. bietet dafür drei Komponenten, die im Zusammenspiel mit etablierten Standards wie MPI und OpenMP die Entwicklung von reaktiven Anwendungen erlauben:
Eine taskbasierte Ausführungsumgebung, die einer Anwendung erlaubt auch über Knotengrenzen hinweg Lastungleichgewichte und Wartezeiten an globalen Synchronisationspunkten besser tolerieren zu können. In Anbetracht der großen Anzahl existierender Anwendungen in C/C++ und Fortran, soll keine völlig neue Sprache oder Spracherweiterung erfordern, sondern eine taskbasierte Ausführungsumgebung nur auf Grundlage und durch Erweiterung der etablierten Standards MPI und OpenMP realisieren.
Eine Komponente zur Leistungs-Introspektion, die der Anwendung bzw. dem Laufzeitsystem ermöglicht, die eigenen dynamischen Ausführungseigenschaften (vor allem bzgl. Leistungseinbußen) zu ermitteln, um geeignete Gegenmaßnahmen zur Laufzeit treffen zu können. Während aus dem Bereich der Post-Mortem Leistungsanalyse zahlreiche ausgereifte Methoden und Werkzeuge existieren, die zur Ermittlung der Leistungseigenschaften von Anwendungen herangezogen werden können, verwenden Anwendungen oft einfache und ungenaue Timer oder andere unausgereifte ad-hoc Methoden. Die Komponente zur Leistungs-Introspektion soll hier Techniken und Werkzeuge, die ursprünglich für die Leistungsanalyse entwickelt wurden, für Anwendungen direkt zugänglich machen.
Eine Analysekomponente, die gemessene Daten und Laufzeitinformation zu einem kohärenten Bild zusammenführt und zur einfacheren Entscheidungsfindung aufbereitet. Entscheidungen, etwa ob eine Neu-Partitionierung von Datenstrukturen vorgenommen wird, oder ob Tasks migriert werden, sollen dabei nicht automatisch fallen sondern ausschließlich auf Veranlassung der Anwendung. Die Analysekomponente stellt der Anwendung dazu Methoden und Dienste bereit um diese Entscheidungen fällen zu können.