Najlepsze metody zarządzania siatką w równoległych obliczeniach elementów skończonych?

11

Obecnie opracowuję metodę dekompozycji domen dla rozwiązania problemu rozpraszania. Zasadniczo rozwiązuję iteracyjnie system BVP firmy Helmholtz. Dyskretyzuję równania metodą elementów skończonych na siatkach trójkątnych lub czworościennych. Rozwijam kod w kierunku mojej pracy doktorskiej. Zdaję sobie sprawę z niektórych istniejących bibliotek elementów skończonych, takich jak deal.ii lub DUNE i chociaż uważam, że są one świetne, z inspirującym projektem i interfejsem API, do celów edukacyjnych chciałem opracować od podstaw swoją własną małą aplikację.

Jestem w punkcie, w którym mam uruchomione moje wersje szeregowe i teraz chcę je zrównoleglić. W końcu jedną z mocnych stron ram dekompozycji domen jest formułowanie algorytmów, które są łatwe do zrównoleglenia, przynajmniej w zasadzie. W praktyce jednak należy wziąć pod uwagę wiele szczegółów. Zarządzanie siatką jest jednym z nich. Jeśli aplikacje mają osiągnąć wysoką rozdzielczość przy dobrym skalowaniu do wielu procesorów, replikacja całej siatki na każdym procesorze jest nieefektywna.

Chciałem zapytać programistów, którzy pracują nad podobnymi aplikacjami w środowiskach obliczeniowych o wysokiej wydajności, jak radzą sobie z tym problemem.

Istnieje biblioteka p4est do rozproszonego zarządzania siatką. Nie potrzebuję AMR, więc może to być przesada, ponieważ interesuje mnie tylko stosowanie jednolitych siatek i nie jestem pewien, czy może ulepszyć trójkątne siatki. Mógłbym również po prostu stworzyć jednolitą siatkę, a następnie podać ją do jednego z partycjonerów siatki i wykonać przetwarzanie końcowe danych wyjściowych.

Najprostsze podejście wydaje się tworzyć osobny plik dla każdej partycji zawierający informacje o siatce istotne tylko dla tej konkretnej partycji. Ten plik zostałby odczytany przez pojedynczy procesor, który byłby odpowiedzialny za montaż systemu dyskretnego na tej części siatki. Oczywiście niektóre informacje o połączeniach / sąsiedztwie partycji globalnej również musiałyby być przechowywane w pliku odczytywanym przez wszystkie procesory w celu komunikacji między procesami.

Jakie są inne podejścia? Jeśli niektórzy z was mogliby się podzielić, jakie są najczęściej stosowane metodologie w branży lub rządowe instytucje badawcze związane z obsługą tego problemu? Jestem całkiem nowy w programowaniu równoległego solvera elementów skończonych i chciałem przekonać się, czy właściwie myślę o tym problemie i jak inni do niego podchodzą. Wszelkie porady lub wskazówki do odpowiednich artykułów badawczych będą mile widziane!

Z góry dziękuję!

midurad
źródło
Jeśli szukasz partycjonera siatkowego - METIS byłby dobrym wyborem. Sprawdź także ParMETIS. Zarządzanie siatkami to inna historia, ITAPS iMesh może być rozwiązaniem dla Ciebie. Proszę również sprawdzić odpowiedzi na moje pytanie tutaj: scicomp.stackexchange.com/questions/4750/…
Krzysztof Bzowski
@KrzysztofBzowski: może używałeś również biblioteki szkockiej? Zastanawiałem się, jaka jest różnica między szkocką a metis, jeśli chodzi o elementy skończone. Projekt iMesh wydaje się bardzo interesujący. Przeczytam o tym więcej w ciągu kilku najbliższych dni. Wiem o deal.II i DUNE. Pamiętam, jak jakiś czas temu zaglądałem do openMesh, ale pomyślałem, że łatwiej byłoby zaimplementować funkcjonalność, której potrzebowałem od zera. W przypadku siatek sekwencyjnych w zasadzie dostosowałem strukturę danych pół krawędzi / powierzchni przedstawioną w tym linku do papieru. Dziękujemy!
midurad

Odpowiedzi:

7

Jeśli nie używasz AMR i nie chcesz skalować poza rdzenie 1K-4K, po prostu zrób to.

  1. Pozycja 0 odczytuje całą siatkę i dzieli ją na partycje za pomocą METIS / Scotch itp. (Uwaga: Jest to operacja szeregowa).

  2. Ranga 0 przesyła informacje o podziale elementu / węzła na wszystkie pozostałe szeregi i zwalnia pamięć (używaną do przechowywania siatki)

  3. Wszystkie szeregi odczytują posiadane przez siebie węzły / elementy (w tym węzły-widma) z tego samego pliku wejściowego (Uwaga: 2000 rang uzyskujących dostęp do tego samego pliku wejściowego może brzmieć wolno, ale nie jest w praktyce, chociaż może to być złe dla systemu plików, ale wtedy robią to tylko raz).

  4. Wszystkie rangi muszą utworzyć mapowania węzła / elementu / dof od lokalnego do globalnego w celu zastosowania BC i złożenia macierzy oraz zmiany numeracji węzłów.

Po tym, jak wszystko zostanie powiedziane i zrobione, wszystkie dane w rankingu będą lokalne, więc powinieneś być w stanie dobrze skalować (pod względem pamięci). Robię to wszystko w około 100 liniach (patrz linie 35-132 tutaj ) w moim małym kodzie.

Teraz, jeśli twoja siatka jest zbyt duża (np.> 100-250 milionów elementów), że nie możesz jej podzielić za pomocą METIS na jednym węźle i potrzebujesz ParMETIS / PT-Scotch, musisz wykonać dodatkową pracę, dzieląc ją równolegle przed wszystkimi rdzeniami / szeregi mogą to przeczytać. W takim scenariuszu może być łatwiej utrzymać fazę partycjonowania oddzieloną od głównego kodu ze względów logistycznych.

Biblioteki Btw AMR zwykle nie obsługują tets. Również PETSc jest dobrym wyborem do zrównoleglania twojego kodu.

Edycja: Zobacz także tutaj i tutaj .

stali
źródło
Dziękujemy za udostępnienie kodu! Najprawdopodobniej wybiorę trasę wskazaną powyżej. Wydaje się to najmniej skomplikowane i już mam pomysł, jak sobie z tym poradzić. Ponadto będzie to dobre ćwiczenie w programowaniu MPI. Wspomniałeś, że biblioteki AMR zwykle nie obsługują tets. Czy to dlatego, że naiwne udoskonalenie, powiedzmy, że cztero-trójkątne oczka może prowadzić do złej jakości siatki? Udoskonalenie quadów wydaje się łatwe, ale podzielenie tet na cztery wydaje się trudne, jeśli chce się zachować jakość. Czy może istnieje opakowanie C ++ dla PETSc? Mogę używać C, ale C ++ byłoby lepsze.
midurad
@midurad Jeśli wolisz C ++ niż C, powinieneś rozważyć Trilinos, czyli bibliotekę C ++ porównywalną z PETSc. Ponadto Trilinos ma pakiet (Zoltan), którego można używać do wykonywania partycjonowania siatki.
Dr_Sam
@midurad Jeśli używasz PETSc, potrzebujesz tylko kilku połączeń MPI. Udoskonalenie tetów powinno być łatwe, ale radzenie sobie (efektywnie) z powiązanymi dynamicznymi strukturami danych może wymagać refleksji i pracy. Powinieneś być w stanie używać PETSc z C ++, ale biorąc pod uwagę twoje wymagania, libmesh może być realną opcją (myślę, że obsługuje AMR i tets).
stali
Dziękuję wszystkim za informację. To było bardzo pomocne.
midurad
2

To może nie być dla ciebie zaskoczeniem, biorąc pod uwagę, że opracowuję umowę. II, ale oto moja perspektywa: kiedy rozmawiam ze studentami, zwykle mówię im, aby na początku opracowali własny prototyp, aby mogli zobaczyć, jak to się robi. Ale potem, kiedy mają już coś małego do roboty, zmuszam ich do korzystania z biblioteki, która pozwala im pójść o wiele dalej, ponieważ nie muszą wymyślać koła w zasadzie z każdym krokiem.

W twoim przypadku już widziałeś, jak zaimplementować prosty solver Helmholtza. Ale spędzisz kolejne 6 miesięcy, pisząc kod niezbędny do zrobienia tego równolegle, spędzisz kolejne 3 miesiące, jeśli chcesz użyć bardziej skomplikowanych geometrii. Spędzisz jeszcze 6 miesięcy, jeśli chcesz wydajnego solvera. Przez cały ten czas piszesz kod, który został już napisany przez kogoś innego, co w pewnym sensie nie zbliża cię do tego, co naprawdę musisz zrobić dla swojego doktoratu: opracuj coś nowego, co nie było wykonane przed. Jeśli pójdziesz tą drogą, spędzisz 2-3 lata swojego doktoratu, robiąc to, co inni, a może 1 rok, robiąc coś nowego.

Alternatywą jest to, że spędzasz teraz 6 miesięcy na uczeniu się jednej z istniejących bibliotek, ale potem będziesz miał 2-3 lata, w których naprawdę robisz nowe rzeczy, rzeczy, w których co drugi tydzień możesz wejść do biura doradcy i pokazać mu / jej coś, co jest naprawdę nowe, działa na ogromnie dużych skalach lub jest po prostu bardzo fajne pod innymi względami. Myślę, że prawdopodobnie już wiesz, dokąd z tym zmierzam.

Wolfgang Bangerth
źródło
3
Szczere pytanie, skoro masz wyraźną władzę w tym zakresie: kto napisze następną generację ram takich jak deal.ii, jeśli nikt z obecnych upraw doktorantów nie rozwiąże takich problemów? Widzimy już problematyczną tendencję przybywania doktorantów, którzy nigdy nawet nie skompilowali programu. Trochę mnie niepokoi fakt, że przeciętne umiejętności tworzenia kodu wydają się stale spadać wśród naukowców zajmujących się obliczeniami.
Aureliusz
1
To uczciwe pytanie. Potrzebujesz absolwentów tak samo upartych i upartych jak ja :-) Ale moja odpowiedź brzmi: tylko dlatego, że prawdopodobnie potrzebujemy kilku osób, które to robią, to nie znaczy, że powinniśmy zachęcać wszystkich do powtarzania lat życia co inni już wdrożyli.
Wolfgang Bangerth
2
Tak, w porządku. IMO, jedyną największą rzeczą, która powstrzymywała świat badań CFD przez ostatnie 20 lat, był brak talentu inżynierii oprogramowania i odrzucenie nowoczesnych praktyk oprogramowania przez szarych brody. Poza ramami, tak wielu doktorantów jest powstrzymywanych przez zły, stary kod i niezdolność do szybkiego zbudowania złożonego oprogramowania potrzebnego do nowoczesnych metod numerycznych na nowoczesnym sprzęcie.
Aureliusz
Nie zgadzam się z oświadczeniem o siwobrodych (choć moje również robi się szare…). Ale widzą również, że musisz wybierać między niegrzecznymi starszymi kodami lub wymyślać koło, gdy masz nowego studenta. Bardzo niewiele osób może cieszyć się sukcesem dzięki oprogramowaniu, które piszą (obecny autor nie wytrzymuje), a nie chcesz wysyłać obiecujących studentów na tę drogę, jeśli nie wiesz, że mogą zrobić z tego karierę.
Wolfgang Bangerth
0

To nie jest pełna odpowiedź.

W przypadku implementacji równoległych metod dekompozycji domen napotkałem pewne komplikacje. Po pierwsze, można użyć wielu procesorów dla jednej subdomeny lub nakarmić jeden procesor wieloma subdomenami i można zaimplementować oba paradygmaty. Po drugie, podstrukturalna forma metod dekompozycji domen wymaga oddzielenia powierzchni, krawędzi, wierzchołków subdomen (nie elementu). Nie sądzę, że te komplikacje są łatwo uwzględnione w zarządzaniu równoległymi siatkami. Sytuacja staje się prostsza, jeśli weźmiesz pod uwagę jeden procesor dla jednej subdomeny i użycie nakładającej się metody RAS / RASHO. Nawet w takim przypadku lepiej byłoby samodzielnie zarządzać układem równoległym,

Hui Zhang
źródło