Ich habe eine Anwendung, die trivial parallelisiert werden kann, deren Leistung jedoch weitgehend E / A-gebunden ist. Die Anwendung liest ein einzelnes Eingabearray, das in einer Datei gespeichert ist, die normalerweise 2 bis 5 GB groß ist (ich erwarte jedoch, dass diese Zahl in Zukunft zunimmt). Eine typische Berechnung wendet dieselbe Operation auf jede Zeile oder Spalte dieses Arrays an. Bei rechenintensiven Vorgängen ist die Skalierung auf ca. 100 Prozessoren sehr gut, bei langsameren Vorgängen dominieren E / A und die damit verbundene Kommunikation (NFS-Zugriff) und ich kann nicht mehr als einige Prozessoren effizient einsetzen.
Was sind effiziente und tragbare (idealerweise tragbare) Optionen für eine solche Situation? Paralleles HDF5 scheint vielversprechend. Hat jemand echte Erfahrungen damit?
Wäre MPI-I / O eine Prüfung wert? Kann es mit einem bestimmten Dateilayout effizient funktionieren oder muss ich alles anpassen?
quelle
Antworten:
Parallele E / A-Vorgänge können in diesem Fall hilfreich sein. Wenn Sie jedoch (von Natur aus ziemlich serielles) NFS zum Bereitstellen Ihrer Dateien verwenden, wird dies möglicherweise nicht den gewünschten Effekt erzielen - es wird einen seriellen Engpass geben Fileserver und Hunderte von Prozessen, die Anfragen an den einzelnen Server stellen, werden Ihnen nicht die hundertfache Beschleunigung eines einzelnen Prozesses bringen. Trotzdem könnte es bis zu einem gewissen Punkt helfen, zumal es sich so anhört, als würde der Engpass eher lesen als schreiben, und es wird eine große Verbesserung sein, wenn Ihr System auf ein vollständig paralleles Dateisystem aktualisiert wird.
MPI-IO ist sehr niedrig; Es lohnt sich, etwas darüber zu verstehen, um zu wissen, was mit parallelem HDF5, NetCDF4 oder ADIOS "unter der Haube" vor sich geht . Die Verwendung selbst eignet sich jedoch nur für Binärrohdaten , bei denen die Struktur zum Zeitpunkt der Kompilierung bekannt ist. HDF5 und NetCDF4 sind viel flexibler.
Beachten Sie, dass ich, wenn Ihre Daten relativ einfach sind - z. B. wenn es sich bei den Big-Data-Strukturen hauptsächlich um n-dimensionale Arrays oder Vektoren handelt - NetCDF4 (ebenfalls parallel und auf HDF5 basierend) anstelle von HDF5 empfehle. es ist bedeutend einfacher zu bedienen. HDF5 ist komplizierter und ermöglicht im Gegenzug für diese Komplexität sehr komplizierte Datenmodelle. Wenn Sie diese Funktion jedoch nicht benötigen, können Sie schneller mit NetCDF4 beginnen.
In unserem Zentrum gibt es eine Nachmittags- und eine Tagesklasse für parallele E / A, in der wir über die Grundkonzepte MPI-IO, HDF5 und NetCDF4 sprechen. Die Folien finden Sie hier .
quelle
Wir bekommen eine gute Skalierung auf den gesamten XT6 bei ORNL mit MPI / IO, um Vektoren auszugeben. Hier ist der Code . Die E / A-Subsysteme vieler Computer sind nicht für massive Parallelität ausgelegt. Ich denke, @Dan ist richtig, dass ich versuchen würde, die E / A durch das Schreiben von nur wenigen Schritten oder einer anderen Agglomerationsstrategie zu minimieren.
Was das flexible und skalierbare Schreiben von Ausgaben anbelangt , so habe ich Erfahrung mit XDMF , das durch große parallele Binärschreibvorgänge mit HDF5 (wie PETSc VecView ) in Verbindung mit einer kleinen Menge seriell geschriebenen XML-Codes zur Beschreibung des Layouts erzielt werden kann . Dies kann von Visualisierungspaketen wie Paraview oder MayaVi2 gelesen werden . Eine andere Möglichkeit, dies zu tun, ist die Verwendung des VTK-Formats mit angehängten Binärdaten. Dies setzt jedoch voraus, dass Sie alles wissen, was Sie im Voraus schreiben möchten.
quelle
Ich gehe davon aus, dass Ihr Skalierbarkeitsproblem mit der Ausgabe und nicht mit der Eingabe zusammenhängt. Die parallele Eingabe ist recht einfach - jede CPU öffnet die NetCDF-Eingabedatei und liest den Teil des Arrays, der zu ihrer Kachel gehört (es kann eine Begrenzung geben, wie viele Leser dieselbe NetCDF-Datei öffnen können, ich bin mir jedoch nicht sicher ). Die parallele Ausgabe ist problematischer.
Was ich gerade mache ist nicht ganz optimal, funktioniert aber erstmal. Ich sammle das Ganze auf einer CPU und mache die serielle Ausgabe. In der Zwischenzeit warten andere Spieler, bis der Schreiber fertig ist. Das hat bei mir gut funktioniert, weil ich es geschafft habe, die Berechnung über das Ausgangsverhältnis ziemlich hoch zu halten - daher wäre die Skalierbarkeit für weit über 200 CPUs gut. Dies ist jedoch nicht die Lösung, nach der Sie suchen.
Eine andere Lösung schlug Yann vor: Schreiben Sie seriell in N Dateien und lassen Sie die Kacheln von einer Drohnen-CPU zu einem Stück zusammenfügen - sofern RAM dies zulässt.
Abgesehen von den in den vorherigen Antworten vorgeschlagenen parallelen E / A-Bibliotheken sollten Sie sich auch mit Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf befassen, da Sie bereits mit NetCDF und MPI vertraut sind. Ich habe es in der Praxis nicht verwendet, aber ich habe vor, in diese Richtung zu gehen, wenn ich mit Sammel- und Serien-E / A gegen die Wand stoße.
quelle