Mam aplikację, która może być trywialnie zrównoleglona, ale jej działanie jest w dużej mierze zależne od operacji we / wy. Aplikacja odczytuje pojedynczą tablicę wejściową przechowywaną w pliku, który zwykle ma rozmiar 2-5 GB (ale spodziewam się, że liczba ta wzrośnie w przyszłości). Typowe obliczenia stosują tę samą operację do każdego wiersza lub kolumny tej tablicy. W przypadku operacji o dużym obciążeniu procesora uzyskuję bardzo dobre skalowanie do około 100 procesorów, ale w przypadku wolniejszych operacji dominują operacje we / wy i związana z nimi komunikacja (dostęp do systemu plików NFS) i nie mogę efektywnie używać więcej niż kilku procesorów.
Jakie są wydajne i przenośne (najlepiej przenośne) opcje w takiej sytuacji? Równoległy HDF5 wydaje się obiecujący. Czy ktoś ma z tym prawdziwe doświadczenie?
Czy MPI-I / O byłoby czymś wartym uwagi? Czy może efektywnie współpracować z danym układem plików, czy też muszę wszystko dostosowywać?
źródło
Odpowiedzi:
Równoległe operacje we / wy mogą ci w tym pomóc, ale jeśli używasz (z natury dość seryjnego) NFS do obsługi plików, to nie będzie to miało pełnego efektu, jaki możesz chcieć - będzie szeregowe wąskie gardło na serwer plików i posiadanie setek procesów wysyłających żądania do pojedynczego serwera nie da ci czynników przyspieszających setki robienia tego za pomocą jednego procesu. Może to jednak pomóc w tym, że wydaje się, że wąskim gardłem jest czytanie, a nie pisanie, i będzie to znaczna poprawa, jeśli twój system zostanie uaktualniony do w pełni równoległego systemu plików.
MPI-IO ma bardzo niski poziom; warto coś o tym wiedzieć, aby wiedzieć, co się dzieje „pod maską” z równoległymi HDF5, NetCDF4 lub ADIOS , ale używanie go samemu jest naprawdę odpowiednie tylko dla surowych danych binarnych, gdzie struktura jest dobrze znana w czasie kompilacji. HDF5 i NetCDF4 są znacznie bardziej elastyczne.
Zauważ, że jeśli twoje dane są stosunkowo proste - np. Struktury dużych zbiorów danych to głównie n-wymiarowe tablice lub wektory - zalecam NetCDF4 (który jest również równoległy i oparty na HDF5) niż HDF5; jest znacznie łatwiejszy w użyciu. HDF5 jest bardziej skomplikowany, aw zamian za tę złożoność pozwala na bardzo skomplikowane modele danych. Ale jeśli jest to funkcja, której nie potrzebujesz, rozpoczęcie pracy w NetCDF4 jest szybsze.
W naszym centrum mamy popołudniową i całodniową klasę na temat równoległych operacji we / wy, gdzie rozmawiamy o podstawowych koncepcjach, MPI-IO, HDF5 i NetCDF4; slajdy można znaleźć tutaj .
źródło
Otrzymujemy dobre skalowanie do całego XT6 w ORNL przy użyciu MPI / IO do wektorów wyjściowych. Oto kod . Podsystemy We / Wy dla wielu maszyn nie są zaprojektowane do masowej równoległości, więc myślę, że @Dan ma rację, że starałbym się zminimalizować We / Wy tylko pisząc co kilka kroków lub inną strategię aglomeracji.
O ile elastycznie zapisuję dane wyjściowe w skalowalny sposób, mam doświadczenie z XDMF , co można uzyskać dzięki dużym równoległym zapisom binarnym za pomocą HDF5 (jak PETSc VecView ) w połączeniu z niewielką ilością kodu XML napisanego szeregowo, aby opisać układ. Można to odczytać za pomocą pakietów wizualizacji, takich jak Paraview lub MayaVi2 . Innym sposobem na to jest użycie formatu VTK z dołączonymi danymi binarnymi, jednak wymaga to znajomości wszystkiego, co chcesz napisać z góry.
źródło
Zakładam, że twój problem ze skalowalnością jest związany z danymi wyjściowymi, a nie danymi wejściowymi. Równoległe wprowadzanie danych jest raczej proste - to, co robię, polega na tym, że każdy procesor otwiera wejściowy plik NetCDF i odczytuje część tablicy należącą do jego kafelka (może istnieć ograniczenie liczby czytników, którzy mogą otworzyć ten sam plik NetCDF, ale nie jestem pewien ). Wyjścia równoległe są bardziej problematyczne.
To, co robię obecnie, nie jest do końca optymalne, ale na razie działa. Zbieram całość na jednym procesorze i robię wyjście szeregowe. W międzyczasie inni gracze czekają, aż pisarz skończy. Działa to dla mnie dobrze, ponieważ udało mi się utrzymać dość wysoki stosunek obliczeń do wydajności - więc skalowalność byłaby dobra dla ponad 200 procesorów. Ale to nie jest rozwiązanie, którego szukasz.
Innym rozwiązaniem jest to, co zasugerował Yann - zapisywanie szeregowo do plików N i procesor drona montuje kafelki w jeden kawałek - jeśli pozwala na to pamięć RAM.
Oprócz równoległych bibliotek we / wy sugerowanych w poprzednich odpowiedziach, możesz również zajrzeć do Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , ponieważ już dobrze znasz NetCDF i MPI. Nie użyłem tego w praktyce, ale planuję iść w tym kierunku, kiedy uderzę w ścianę zbieraniem + szeregowymi I / O.
źródło