2016-07-27 15 views

Antwort

5

Funktionell gibt es in den meisten praktischen Situationen wenig Unterschied. Wenn Ihr IO mit mpi_file_write_all() korrekt funktioniert, sollte es mit mpi_file_write() funktionieren, es sei denn, Sie machen etwas sehr Kompliziertes. Die Umkehrung ist nicht streng zutreffend, aber in den meisten realen Situationen, die ich gesehen habe, wo alle Prozesse einfache reguläre IO-Muster zur gleichen Zeit machen, funktioniert mpi_file_write_all(), wenn mpi_file_write() funktioniert.

Wie auch immer, der Punkt ist, dass wenn Sie mpi_file_write() aufrufen, die IO-Bibliothek diese IO-Anfrage dort verarbeiten muss und dann nicht davon ausgehen kann, dass andere Prozesse auch IO ausführen. Bei allen außer den einfachsten parallelen Dekompositionen umfassen die Daten eines einzelnen Prozesses keinen einzigen zusammenhängenden Teil der Datei. Als Ergebnis führt jeder Prozess eine große Anzahl kleiner E/A-Transaktionen durch (Schreiben, Suchen, Schreiben, Suchen, ...), was in einem parallelen Dateisystem sehr ineffizient ist. Schlimmer noch, es sperrt wahrscheinlich die Datei, während sie IO ausführt, um andere Prozesse zu stoppen, die das beeinflussen, was sie tut, damit IO über Prozesse hinweg serialisiert werden kann.

Mit write_all() hat die IO-Bibliothek eine globale Sicht und weiß, was jeder Prozess macht. Erstens ermöglicht dies die Reorganisation der Daten, so dass jeder Prozess einen einzigen großen Datenblock zum Schreiben in die Datei hat. Zweitens kann es, da es die Kontrolle über alle Prozesse hat, vermeiden, die Datei zu sperren, da es sicherstellen kann, dass Schreibvorgänge nicht in Konflikt stehen.

Für einfache regelmäßige Muster, z.B. ein großes 3D-Array, das über ein 3D-Raster von Prozessen verteilt ist, habe ich massive Unterschiede zwischen den kollektiven und nicht-kollektiven Ansätzen auf einem Cray mit einem Lustre-Dateisystem gesehen. Der Unterschied kann Gigabytes/Sekunde vs. Zehn Megabyte/Sekunde betragen.

PS Ich gehe hier davon aus, dass das Muster viele Prozesse sind, die Daten in eine einzige gemeinsame Datei schreiben. Zum Lesen sollte es auch eine Verbesserung geben (eine kleine Anzahl von großen zusammenhängenden Lesevorgängen), aber vielleicht nicht so dramatisch, wie das Sperren von Dateien zum Lesen nicht erforderlich ist.

+0

Ja, das Muster enthält viele Prozesse, die in eine gemeinsame Datei schreiben. Danke für die Erklärung. Ich sehe definitiv große Zuwächse in der Leistung mit write_all. Schön zu verstehen warum. Ist das irgendwo öffentlich dokumentiert? Konnte von nichts viel finden. –

+1

Meine Erklärung basiert hauptsächlich auf einigen einfachen Benchmarks (siehe "Leistung von Parallel IO auf ARCHER" unter http://www.archer.ac.uk/documentation/white-papers/) und dann mit lokalen Cray-Mitarbeitern zu versuchen und zu versuchen verstehe was vor sich ging. Es gibt eine Reihe nützlicher Links am Ende dieser Seite: https://www.rc.colorado.edu/support/examples-and-tutorials/parallel-io-on-janus-lustre.html –

+0

Danke für die Links ! –

Verwandte Themen