Das ist so ziemlich die Frage. Ich meine, ich weiß, dass mpi_file_write_all die "kollektive" Version ist, aber ich denke, dass mpi_file_write sowieso von mehreren Prozessen gleichzeitig aufgerufen wird. Worin besteht der Unterschied in ihrer Funktionsweise? Vielen Dank.Wie unterscheidet sich mpi_file_write von mpi_file_write_all?
Antwort
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.
- 1. Warum unterscheidet sich {} + [] von ({} + [])?
- 2. Wie unterscheidet sich Hashtable
- 3. Wie unterscheidet sich Gitlab von Github?
- 4. Wie unterscheidet sich << von +?
- 5. GCC: Wie unterscheidet sich März von Mtune?
- 6. Wie unterscheidet sich ArrayListMultimap von LinkedListMultimap?
- 7. Wie unterscheidet sich MegaStore von BigTable?
- 8. Wie unterscheidet sich Gurke von JUnit?
- 9. Wie unterscheidet sich das Armspeichermodell von ia64?
- 10. Farbe von NavBar unterscheidet sich von Hintergrundfarbe
- 11. ProgressDialog Nachrichtentext unterscheidet sich von AlertDialog
- 12. Winforms ComboBox Höhe unterscheidet sich von ItemHeight
- 13. Wie unterscheidet sich das traditionelle Gerätetreiberprogramm?
- 14. Perl Mantisse unterscheidet sich von anderen Doppel
- 15. Identischer Code unterscheidet sich von verschiedenen Quellen
- 16. Warum git AuthorDate unterscheidet sich von CommitDate?
- 17. Tomcat JVM-Version unterscheidet sich von JAVA_HOME
- 18. Wie unterscheidet sich Dispatcher vom Hintergrund-Thread?
- 19. Wie unterscheidet sich die Dichte von ggplot2 von der Dichtefunktion?
- 20. unterscheidet sich von Foo.class.barMethod() und Foo.barMethod()
- 21. Subprozess pid unterscheidet sich von ps output
- 22. Warum unterscheidet sich std :: uint32_t von uint32_t?
- 23. MediaStore.Audio.Albums._ID unterscheidet sich von Song
- 24. php curl - Ergebnis unterscheidet sich von Browser
- 25. Sperrverhalten unterscheidet sich über Netzwerkfreigaben
- 26. Wie unterscheidet sich CurrentControlSet von ControlSet001 und ControlSet002?
- 27. Was ist NaNi und wie unterscheidet es sich von NaN?
- 28. Was macht Predef.locally, und wie unterscheidet es sich von Predef.identity
- 29. Wie sich Responsive Web Development von Progressive Web Development unterscheidet?
- 30. Wie unterscheidet sich ein Client von einem Server-Peer?
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. –
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 –
Danke für die Links ! –