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ę!
Odpowiedzi:
Jeśli nie używasz AMR i nie chcesz skalować poza rdzenie 1K-4K, po prostu zrób to.
Pozycja 0 odczytuje całą siatkę i dzieli ją na partycje za pomocą METIS / Scotch itp. (Uwaga: Jest to operacja szeregowa).
Ranga 0 przesyła informacje o podziale elementu / węzła na wszystkie pozostałe szeregi i zwalnia pamięć (używaną do przechowywania siatki)
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).
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 .
źródło
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.
źródło
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,
źródło