mpi-io - hochleistungs-ein-/ausgabe · mpi-io quellen mpi-io hochleistungs-ein-/ausgabe michaelkuhn...
TRANSCRIPT
MPI-IO Quellen
MPI-IOHochleistungs-Ein-/Ausgabe
Michael Kuhn
Wissenscha�liches RechnenFachbereich Informatik
Universität Hamburg
2016-05-13
Michael Kuhn MPI-IO 1 / 49
MPI-IO Quellen
1 MPI-IOOrientierungEinführungKonzepte und FunktionalitätLeistungsbetrachtungenSemantikZusammenfassung
2 Quellen
Michael Kuhn MPI-IO 2 / 49
MPI-IO Quellen
Orientierung
E/A-Schichten
Anwendung
Bibliotheken
Speichergerät/-verbund
Paralleles verteiltes Dateisystem
Dateisystem
Leis
tung
sana
lyse
Opt
imie
rung
en
Date
nred
uktio
n
Abbildung: E/A-Schichten
Michael Kuhn MPI-IO 3 / 49
MPI-IO Quellen
Einführung
Überblick
Parallele Anwendungen benötigen häufig Unterstützung fürparallele Ein-/Ausgabe
Serielle E/A ist ein FlaschenhalsNormalerweise kann kein Prozess alle Daten halten
Häufige SzenarienLesen der Eingabedaten
Startbedingungen, größere DatensätzeSchreiben von Ausgabedaten
Ergebnisdaten, Checkpoints
Michael Kuhn MPI-IO 4 / 49
• Serielle E/A führt dazu, dass alle Daten zu einem ausgewähltenProzess gesendet werden müssen, der diese dann in das Dateisystemschreibt. Das Problem verschlimmert sich durch die immer weitersteigenden Prozesszahlen.
MPI-IO Quellen
Einführung
Überblick. . .
MPI-IO bezeichnet den E/A-Teil von MPIWurde mit MPI 2.0 eingeführt (1997)Anwendungen benutzen üblicherweise sowieso MPI
Ist eine sogenannte MiddlewarePopulärste Implementierung: ROMIO
Wird als Teil von MPICH vertriebenUnter anderem in OpenMPI und MPICH-DerivatenNutzt das Abstract-Device Interface for I/O (ADIO)
Alternative Implementierung: OMPIO in OpenMPI
Michael Kuhn MPI-IO 5 / 49
MPI-IO Quellen
Einführung
Überblick. . .
MPI-IO stellt element-orientierten Zugri� bereitIm Gegensatz zum POSIX-Bytestrom
Schnittstelle ist analog zum Nachrichtenaustausch definiertLesen und Schreiben wie Empfangen und SendenKollektive und nicht-blockierende OperationenAbgeleitete Datentypen
MPI-IO wird üblicherweise nicht direkt in Anwendungen genutztIndirekt durch höhere Schichten
Michael Kuhn MPI-IO 6 / 49
MPI-IO Quellen
Einführung
Ausblick
MPI-IO bildet die Basis vieler E/A-BibliothekenHDF und NetCDF nutzen MPI-IO für parallelen Zugri� aufgemeinsame DateienADIOS unterstützt MPI-IO
Gibt höheren Schichten Zugri� auf e�iziente Algorithmen undImplementierungen für parallele E/A
Bibliotheken können sich um ihre eigentliche Aufgabe kümmern
Michael Kuhn MPI-IO 7 / 49
• Über die POSIX-Schnittstelle kann mit HDF/NetCDF nur seriellerZugri� realisiert werden.
• ADIOS erlaubt auch mit dem POSIX-Backend parallelen Zugri�, nutztdann aber keine gemeinsame Datei.
MPI-IO Quellen
Einführung
ROMIO
MPI-IO abstrahiert vom darunter liegenden DateisystemStellt MPI-IO-Syntax und -Semantik bereit
Unterstützte ArchitekturenIBM SP, Intel Paragon, HP Exemplar, SGI Origin2000, Cray T3E,NEC SX-4 etc.
Unterstützte DateisystemeIBM PIOFS, Intel PFS, HP/Convex HFS, SGI XFS, NEC SFS, PVFS,Lustre, NFS, NTFS, Unix-Dateisysteme (UFS) etc.
Michael Kuhn MPI-IO 8 / 49
MPI-IO Quellen
Einführung
ROMIO. . .
Dateisystem-spezifische Module in ADIOPortabilität und höchstmögliche Leistung
Z.B. durch Zugri� auf DateiverteilungsinformationenUnterschiedliche Syntax und Semantik
Generische Optimierungen für parallele E/AInsbesondere bei vielen Prozessen notwendigSpäter: Data Sieving und Two-Phase I/O
Michael Kuhn MPI-IO 9 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Grundlagen
Datei (file)Kollektives Ö�nen durch Prozesse im KommunikatorSequentieller oder wahlfreier Zugri�Sammlung typisierter Daten (Elemente)
Dateizeiger (file pointer)Zeiger innerhalb der DateiProzesse können individuelle oder gemeinsame Dateizeigerhaben
Michael Kuhn MPI-IO 10 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Grundlagen. . .
Elementarer Typ (etype)Einheit mit der auf die Datei zugegri�en wirdKann auch ein abgeleiteter Datentyp sein
Versatz (displacement)Position an der die Dateisicht beginntByte-Position relativ zum Anfang der DateiZ.B. für Header
Michael Kuhn MPI-IO 11 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Grundlagen. . .
Dateityp (file type)Schablone für den Aufbau der DateiBesteht aus elementaren Typen und LöchernWiederholt sich regelmäßig
Dateityp
Elementarer Typ
Loch
…Aufbau
Abbildung: Dateityp
Michael Kuhn MPI-IO 12 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Grundlagen. . .
Dateisicht (file view)Prozessbezogene Sicht auf die DateiFestgelegt durch Versatz, elementaren Typ und Dateityp
Dateityp (Rang 0)
…Aufbau
Dateityp (Rang 1)
Dateityp (Rang 2)
Abbildung: Dateisicht
Michael Kuhn MPI-IO 13 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Grundlagen. . .
Versatz (o�set)Position in der DateiAusgedrückt in Anzahl elementarer TypenRelativ zur aktuellen Dateisicht
Dateigröße (file size)Größe der Datei in Bytes
Michael Kuhn MPI-IO 14 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Grundlagen. . .
Datei-Handle (file handle)Analog zum DateideskriptorWird für fast alle Operationen benötigt
Hinweise (hints)Zusätzliche Informationen für die ImplementierungÜblicherweise zur Leistungssteigerung
Michael Kuhn MPI-IO 15 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Funktionen
Ö�nen einer Dateiint MPI_File_open (MPI_Comm comm, char*filename, int amode, MPI_Info info, MPI_File*fh)Liefert Datei-Handle zurück
Individuellen Dateizeiger setzenint MPI_File_seek (MPI_File fh, MPI_Offsetoffset, int whence)Analog zu lseek
Michael Kuhn MPI-IO 16 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Funktionen. . .
Lesen und Schreiben von Datenint MPI_File_read (MPI_File fh, void* buf,int count, MPI_Datatype datatype,MPI_Status* status)int MPI_File_write (MPI_File fh, void* buf,int count, MPI_Datatype datatype,MPI_Status* status)Analog zu read und write
Schließen der Dateiint MPI_File_close (MPI_File* fh)
Michael Kuhn MPI-IO 17 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Code-Beispiel
1 MPI_File fh;2 MPI_Offset size;3 MPI_Status status;4 char data[42];5 int nbytes;67 memset(data, 23, sizeof(data));8 MPI_File_open(MPI_COMM_WORLD, "/tmp/mpi-io",
↪→ MPI_MODE_RDWR | MPI_MODE_CREATE |↪→ MPI_MODE_DELETE_ON_CLOSE, MPI_INFO_NULL, &fh);
9 MPI_File_write_at(fh, 0, data, sizeof(data), MPI_BYTE,↪→ &status);
10 MPI_Get_count(&status, MPI_BYTE, &nbytes);11 MPI_File_get_size(fh, &size);12 printf("File size is %" PRIdMAX " bytes.\n",
↪→ (uintmax_t)size);13 MPI_File_close(&fh);
Michael Kuhn MPI-IO 18 / 49
MPI-IO Quellen
Konzepte und Funktionalität
MPI_File_open
MPI_File_open ist eine kollektive OperationAlle Prozesse müssen dieselbe Datei ö�nenProzess-lokale Dateien durch MPI_COMM_SELF
Dateiname ist implementierungsabhängigÜblicherweise kann ADIO-Modul angegeben werdenZ.B. pvfs2:/pvfs/path/to/file
Initiale Dateisicht ist ein Bytestrom
Michael Kuhn MPI-IO 19 / 49
MPI-IO Quellen
Konzepte und Funktionalität
MPI_File_open. . .
MPI_File_open bietet mehrere Zugri�smodi (1/2)MPI_MODE_RDONLY: Nur lesenMPI_MODE_RDWR: Lesen und schreibenMPI_MODE_WRONLY: Nur schreibenMPI_MODE_CREATE: Datei erstellen, wenn sie noch nichtexistiertMPI_MODE_EXCL: Fehler zurückgeben, wenn Datei erstelltwerden soll, die bereits existiert
Michael Kuhn MPI-IO 20 / 49
MPI-IO Quellen
Konzepte und Funktionalität
MPI_File_open. . .
MPI_File_open bietet mehrere Zugri�smodi (2/2)MPI_MODE_DELETE_ON_CLOSE: Datei beim SchließenlöschenMPI_MODE_UNIQUE_OPEN: Datei wird nicht parallelwoanders geö�netMPI_MODE_SEQUENTIAL: Datei wird nur sequentiellzugegri�enMPI_MODE_APPEND: Alle Dateizeiger initial ans Ende der Dateisetzen
Modi können teilweise auch kombiniert werden
Michael Kuhn MPI-IO 21 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Positionierung
Es gibt drei Arten der PositionierungIndividuelle DateizeigerGemeinsame DateizeigerExpliziter Versatz
Individuelle DateizeigerProzess-lokaler Dateizeiger wird bei jedem Aufruf verändertAnalog zu read und write
Michael Kuhn MPI-IO 22 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Positionierung. . .
Gemeinsame DateizeigerGlobaler Dateizeiger wird bei jedem Aufruf verändertSyntax: MPI_..._shared und MPI_..._ordered
Expliziter VersatzVersatz wird bei jedem Aufruf angegebenSyntax: MPI_..._atAnalog zu pread und pwrite
Michael Kuhn MPI-IO 23 / 49
MPI-IO Quellen
Konzepte und Funktionalität
MPI_File_seek und MPI_File_seek_shared
MPI_File_seek und MPI_File_seek_shared erlaubendas Setzen des DateizeigersBeide Funktionen unterstützten drei Positionierungsmodi
MPI_SEEK_SET: Dateizeiger wird auf Versatz gesetztMPI_SEEK_CUR: Dateizeiger wird um Versatz erhöhtMPI_SEEK_END: Dateizeiger wird auf das Ende der Datei plusVersatz gesetzt
Der Versatz kann auch negativ sein
Michael Kuhn MPI-IO 24 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Metadatenoperationen
MPI-IO bietet wenige explizite MetadatenoperationenKeine VerzeichnisoperationenErstellen nur über MPI_File_open
Vergrößern und Verkleinern einer DateiMPI_File_set_size und MPI_File_preallocate
Kein Äquivalent zu statNur MPI_File_get_size
Michael Kuhn MPI-IO 25 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Nicht-zusammenhängende Datentypen
MPI-IO unterstützt nicht-zusammenhängende DatentypenZugri� mit einem einzigen E/A-AufrufKomfortfunktion für EntwicklerErlaubt aber auch zusätzliche Optimierungen
Grundsätzlich auch manuell umsetzbarÄhnlich zu readv, writev, aio_read, aio_write undlio_listio
Michael Kuhn MPI-IO 26 / 49
• Mit readv und writev können nicht alle Fälle abgedeckt werden,da immer ein zusammenhängender Bereich in der Datei gelesen bzw.geschrieben wird.
MPI-IO Quellen
Konzepte und Funktionalität
Nicht-zusammenhängende Datentypen. . .
Vektordatentyp unterstützt eine Schrittweiteint MPI_Type_vector (int count, intblocklength, int stride, MPI_Datatypeoldtype, MPI_Datatype* newtype)
Beispiel: Diagonale einer 3x3-Matrix
1 MPI_Type_vector(3, 1, 4, MPI_DOUBLE, &newtype);2 MPI_Type_commit(&newtype);3 MPI_File_write(fh, buffer, 1, newtype, &status);
Listing 1: Nicht-zusammenhängender Vektordatentyp
Michael Kuhn MPI-IO 27 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Nicht-zusammenhängende Datentypen. . .
1 MPI_Type_vector(3, 1, 4, MPI_DOUBLE, &newtype);
1 2 34 5 67 8 9
Abbildung: Nicht-zusammenhängender Vektordatentyp
Michael Kuhn MPI-IO 28 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Kollektive Operationen
MPI-IO unterstützt kollektive E/AAlle Prozesse führen ihre Zugri�e gleichzeitig durchSyntax: MPI_..._allZusätzliche Informationen für eventuelle Optimierungen
Beispiel: Kleine nicht-zusammenhängende Zugri�eJeder Prozess grei� nur auf einen kleinen Bereich zuAlle Prozesse zusammen aber auf die gesamte Datei
Michael Kuhn MPI-IO 29 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Nicht-blockierende Operationen
MPI-IO unterstützt nicht-blockierende E/A-OperationenÜberlappung von E/A und BerechnungAnalog zu nicht-blockierendem NachrichtenaustauschSyntax: MPI_..._i...
Statusüberprüfung mit den Standard-MPI-FunktionenZ.B. MPI_Wait und MPI_Test
Michael Kuhn MPI-IO 30 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Nicht-blockierende Operationen. . .
Split Collectives für nicht-blockierende kollektive E/ASyntax: MPI_..._begin und MPI_..._endAu�eilung dient der Optimierung und besserenImplementierbarkeit
Einige EinschränkungenPro Prozess und Datei nur ein laufender AufrufNicht mit normalen kollektiven Operationen kombinierbarWährenddessen keine anderen kollektiven E/A-OperationenerlaubtDürfen mit Hilfe der blockierenden Operationen implementiertwerden
Michael Kuhn MPI-IO 31 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Gemeinsame Dateizeiger
Gemeinsame Dateizeiger für koordinierten Zugri�Alle Prozesse nutzen denselben DateizeigerZugri�e ändern den Dateizeiger für alle anderen Prozesse
Problematisch e�izient zu implementierenBenötigt irgendeine Form von SperrenSchwierig zu skalieren bei sehr vielen ProzessenNicht von jedem Dateisystem unterstützt
Michael Kuhn MPI-IO 32 / 49
• OrangeFS unterstützt beispielsweise keine gemeinsamen Dateizeiger,da dafür Sperren benötigt würden.
MPI-IO Quellen
Konzepte und Funktionalität
Gemeinsame Dateizeiger. . .
MPI_..._shared für nicht-kollektive OperationenMPI_..._ordered für kollektive Operationen
Wird entsprechend des Ranges ausgeführtMögliche Anwendungsfälle
Gemeinsame ProtokolldateiDaten in Berechnungsreihenfolge in Datei schreiben
Michael Kuhn MPI-IO 33 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Hinweise
Hinweise geben der Implementierung zusätzlicheInformationen
Üblicherweise für OptimierungenBeispiele
Anzahl der Geräte über die eine Datei verteilt werden sollGröße der zu verteilenden BlöckeInformationen über das Datenlayout
Hinweise müssen nicht angegeben werdenKönnen aber auch beliebig durch die Implementierung ignoriertwerden
Michael Kuhn MPI-IO 34 / 49
MPI-IO Quellen
Konzepte und Funktionalität
Datenrepräsentationen
MPI-IO unterstützt mehrere DatenrepräsentationenPortabilität der Daten ein wichtiger Faktor
Drei mögliche Repräsentationennative: Keine Umwandlung der Daten, Speicherung wie imHauptspeicherinternal: Portabel zwischen allen Plattformen, die dieseImplementierung unterstütztexternal32: Portabel zwischen allen Implementierungen undPlattformen, möglicher Präzisions- und Leistungsverlust
Zusätzlich benutzerdefinierte Repräsentationen
Michael Kuhn MPI-IO 35 / 49
MPI-IO Quellen
Leistungsbetrachtungen
Allgemeines
Verwendete Operationen sind maßgeblich für die erreichbareLeistung verantwortlich
Zusammenhängend vs. nicht-zusammenhängendIndividuell vs. kollektiv
Beispiel3x3-Matrix wird von drei Prozessen gelesenJeder Prozess ist für eine Spalte zuständig
Michael Kuhn MPI-IO 36 / 49
MPI-IO Quellen
Leistungsbetrachtungen
Level 0: Individuelle zusammenhängende Zugri�e
1 for (i = 0; i < 3; i++)2 {3 MPI_File_seek(fh, ...);4 MPI_File_read(fh, ..., 1, MPI_DOUBLE, ...);5 }
Listing 2: Level 0
Jeder Prozess führt individuelle Zugri�e ausPro Iteration wird eine Zeile gelesen, allerdings in zufälligerReihenfolge
In jeder Iteration wird ein zusammenhängender Bereich gelesen
Michael Kuhn MPI-IO 37 / 49
MPI-IO Quellen
Leistungsbetrachtungen
Level 1: Kollektive zusammenhängende Zugri�e
1 for (i = 0; i < 3; i++)2 {3 MPI_File_seek(fh, ...);4 MPI_File_read_all(fh, ..., 1, MPI_DOUBLE, ...);5 }
Listing 3: Level 1
Prozesse führen koordiniert kollektive Zugri�e ausPro Iteration wird eine Zeile gelesen
In jeder Iteration wird ein zusammenhängender Bereich gelesen
Michael Kuhn MPI-IO 38 / 49
MPI-IO Quellen
Leistungsbetrachtungen
Level 2: Individuelle nicht-zusammenhängende Zugri�e
1 MPI_Type_vector(3, 1, 3, MPI_DOUBLE, &newtype);2 MPI_Type_commit(&newtype);34 MPI_File_seek(fh, ...);5 MPI_File_read(fh, ..., 1, newtype, ...);
Listing 4: Level 2
Jeder Prozess liest seine nicht-zusammenhängende SpalteJeder Prozess führt individuelle Zugri�e aus
Es werden alle Spalten gelesen, allerdings in zufälligerReihenfolge
Michael Kuhn MPI-IO 39 / 49
MPI-IO Quellen
Leistungsbetrachtungen
Level 3: Kollektive nicht-zusammenhängende Zugri�e
1 MPI_Type_vector(3, 1, 3, MPI_DOUBLE, &newtype);2 MPI_Type_commit(&newtype);34 MPI_File_seek(fh, ...);5 MPI_File_read_all(fh, ..., 1, newtype, ...);
Listing 5: Level 3
Jeder Prozess liest seine nicht-zusammenhängende SpalteProzesse führen koordiniert kollektive Zugri�e aus
Es werden alle Spalten gelesen
Michael Kuhn MPI-IO 40 / 49
MPI-IO Quellen
Leistungsbetrachtungen
Übersicht
Prozesse P0 P1 P2Datei-
inhalt
Level 3
Level 2
Level 1
Level 0
Abbildung: Visualisierung der unterschiedlichen Zugri�slevel [1]Michael Kuhn MPI-IO 41 / 49
MPI-IO Quellen
Semantik
POSIX
POSIX hat strenge KonsistenzanforderungenÄnderungen müssen nach write global sichtbar seinE/A soll atomar geschehen
E�iziente parallele E/A wird dadurch erschwertDaten können nicht beliebig im Cache gehalten werdenAtomarität erfordert Sperren
Michael Kuhn MPI-IO 42 / 49
MPI-IO Quellen
Semantik
Übersicht
MPI-IO hat weniger strikte Anforderungen als POSIXÄnderungen sind nur im aktuellen Prozess sichtbarNicht-überlappende oder nicht-gleichzeitige Operationenwerden korrekt gehandhabt
Erlaubt bessere SkalierbarkeitÄnderungen müssen nicht sofort global sichtbar seinDadurch weniger Aufwand durch Sperren
Michael Kuhn MPI-IO 43 / 49
MPI-IO Quellen
Semantik
Manuelle Synchronisation
1 MPI_File_sync(fh);2 MPI_Barrier(MPI_COMM_WORLD);3 MPI_File_sync(fh);
Listing 6: Sync-Barrier-Sync-Konstrukt
1 Sync transferiert Änderungen ins Dateisystem2 Barrier synchronisiert alle Prozesse3 Sync macht Änderungen im Dateisystem sichtbar
Michael Kuhn MPI-IO 44 / 49
MPI-IO Quellen
Semantik
Atomic-Modus
Atomic-Modus stellt strikere Garantien bereitMPI_File_set_atomicity
Alle Änderungen sind sofort für alle Prozesse im Kommunikatorsichtbar
Ähnlich der POSIX-SemantikWird nicht überall unterstützt
ROMIO unterstützt den Modus, OMPIO nichtErfordert üblicherweise Sperren
Daher nicht in allen Dateisystemen verfügbarZ.B. keine Unterstützung in OrangeFS
Michael Kuhn MPI-IO 45 / 49
• Der Atomic-Modus ist immer noch weniger strikt als POSIX, daÄnderungen nur für Prozesse im gleichen Kommunikator sichtbar seinmüssen.
MPI-IO Quellen
Zusammenfassung
Zusammenfassung
Positionierung Blockierung Individuell Kollektiv
ExpliziterVersatz
Blockierend read_at read_at_allwrite_at write_at_all
Nicht-blockierend& Split Collective
iread_at read_at_all_beginread_at_all_end
iwrite_at write_at_all_beginwrite_at_all_end
IndividuelleDateizeiger
Blockierend read read_allwrite write_all
Nicht-blockierend& Split Collective
iread read_all_beginread_all_end
iwrite write_all_beginwrite_all_end
GemeinsameDateizeiger
Blockierend read_shared read_orderedwrite_shared write_ordered
Nicht-blockierend& Split Collective
iread_shared read_ordered_beginread_ordered_end
iwrite_shared write_ordered_beginwrite_ordered_end
Michael Kuhn MPI-IO 46 / 49
MPI-IO Quellen
Zusammenfassung
Zusammenfassung. . .
MPI-IO analog zu MPI-Kommunikation definiertU.a. mit Unterstützung für abgeleitete Datentypen
Dateien sind eine Abfolge von elementaren DatentypenJeder Prozess hat seine eigene DateisichtMehrere Repräsentationen für Portabilität
Die Positionierung ist explizit, mit individuellen Dateizeigernund mit gemeinsamen Dateizeigern möglichNicht-zusammenhängende und kollektive Operationen könnendie E�izienz erhöhen
Michael Kuhn MPI-IO 47 / 49
MPI-IO Quellen
1 MPI-IOOrientierungEinführungKonzepte und FunktionalitätLeistungsbetrachtungenSemantikZusammenfassung
2 Quellen
Michael Kuhn MPI-IO 48 / 49
MPI-IO Quellen
Quellen I
[1] Rajeev Thakur, William Gropp, and Ewing Lusk. OptimizingNoncontiguous Accesses in MPI-IO. Parallel Computing,28(1):83–105, January 2002.
Michael Kuhn MPI-IO 49 / 49