pamięć współdzielona, MPI i systemy kolejkowania

Moja aplikacja unix / windows C++ jest już równoległa przy użyciu MPI: zadanie jest podzielone na N procesorów i każdy kawałek jest wykonywany równolegle, dość wydajny, bardzo dobre skalowanie prędkości, zadanie jest zrobione dobrze.

Ale niektóre dane są powtarzane w każdym procesie i ze względów technicznych nie można ich łatwo podzielić na MPI (...). Na przykład:

  • 5 Gb danych statycznych, dokładnie to samo ładowane dla każdego procesu
  • 4 Gb danych, które mogą być dystrybuowane w MPI, tym więcej Procesory są używane, mniejszy jest ten na procesor RAM.

Przy zadaniu 4 CPU oznaczałoby to co najmniej obciążenie 20GB RAM, większość pamięci "zmarnowana", to jest okropne.

Myślę, że używając pamięci współdzielonej, aby zmniejszyć całkowite obciążenie," statyczny " fragment byłby ładowany tylko raz na komputer.

Więc główne pytanie brzmi:

  • Czy Jest jakiś standardowy sposób MPI na dzielenie pamięci na węźle? jakaś łatwo dostępna + darmowa biblioteka ?

    • Jeśli nie, chciałbym użyj boost.interprocess i użyj wywołań MPI do dystrybucji identyfikatorów lokalnej pamięci współdzielonej.
    • Pamięć dzielona będzie odczytywana przez "lokalnego mistrza" na każdym węźle i dzielona tylko do odczytu. Nie ma potrzeby jakiegokolwiek semafora / synchronizacji, ponieważ nie zmieni się.
  • Jakiś hit wydajności lub szczególne problemy, na które należy uważać?

    • (nie będzie żadnych "ciągów" lub zbyt dziwnych struktur danych, wszystko można sprowadzić do tablic i struktury pointers)
  • Zadanie zostanie wykonane w systemie kolejkowania PBS (lub SGE), w przypadku nieczystego zakończenia procesu zastanawiam się, czy te będą czyścić pamięć współdzieloną specyficzną dla węzła.

  • Author: Blklight, 2009-12-26

    8 answers

    [3]} coraz powszechniejszym podejściem w High Performance Computing (HPC) są hybrydowe programy MPI / OpenMP. Czyli masz N procesów MPI, a każdy proces MPI ma wątki m. Takie podejście dobrze odwzorowuje klastry składające się z węzłów wieloprocesorowych pamięci współdzielonej.

    Zmiana na taki hierarchiczny schemat równoległości wymaga oczywiście pewnych mniej lub bardziej inwazyjnych zmian, OTOH jeśli zostanie wykonana prawidłowo, może zwiększyć wydajność i skalowalność kodu oprócz zmniejszenia pamięci zużycie replikowanych danych.

    W zależności od implementacji MPI, możesz lub nie możesz wykonywać wywołań MPI ze wszystkich wątków. Jest to określone przez argumenty required i provided funkcji MPI_Init_Thread (), którą należy wywołać zamiast MPI_Init (). Możliwe wartości to

    { MPI_THREAD_SINGLE}
        Only one thread will execute. 
    { MPI_THREAD_FUNNELED}
        The process may be multi-threaded, but only the main thread will make MPI calls (all MPI calls are ``funneled'' to the main thread). 
    { MPI_THREAD_SERIALIZED}
        The process may be multi-threaded, and multiple threads may make MPI calls, but only one at a time: MPI calls are not made concurrently from two distinct threads (all MPI calls are ``serialized''). 
    { MPI_THREAD_MULTIPLE}
        Multiple threads may call MPI, with no restrictions. 
    

    Z mojego doświadczenia wynika, że nowoczesne implementacje MPI, takie jak Open MPI, obsługują najbardziej elastyczny MPI_THREAD_MULTIPLE. Jeśli używasz starszych bibliotek MPI lub jakiejś specjalistycznej architektury, możesz gorzej.

    Oczywiście, nie musisz robić wątków z OpenMP, to po prostu najpopularniejsza opcja w HPC. Możesz użyć np. biblioteki wątków Boost, Biblioteki Intel TBB lub prostych wątków pthreads lub Windows.

     8
    Author: janneb,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-01-06 01:07:39

    Nie pracowałem z MPI, ale jeśli jest tak jak inne biblioteki IPC, które widziałem, że ukrywają, czy inne wątki / procesy / cokolwiek są na tych samych lub różnych maszynach, to nie będzie w stanie zagwarantować współdzielonej pamięci. Tak, może obsługiwać pamięć współdzieloną między dwoma węzłami na tej samej maszynie, jeśli ta maszyna sama dostarczyła pamięć współdzieloną. Ale próba dzielenia pamięci między węzłami na różnych maszynach byłaby w najlepszym razie bardzo trudna, ze względu na złożone problemy związane z spójnością. Spodziewałbym się tego. po prostu być niezrealizowanym.

    W praktyce, jeśli chcesz dzielić pamięć między węzłami, najlepiej zrobić to poza MPI. nie sądzę, że musisz używać pamięci dzielonej w stylu boost.interprocess, ponieważ nie opisujesz sytuacji, w której różne węzły dokonują drobnych zmian w pamięci dzielonej; jest to albo tylko do odczytu, albo partycja.

    Odpowiedzi Johna i deusa mówią, jak mapować plik, czyli zdecydowanie to, co chcesz zrobić dla 5 Gb (giga bit ?) dane statyczne. Dane na procesor brzmią tak samo, a do każdego węzła wystarczy wysłać wiadomość z informacją, którą część pliku powinien pobrać. System operacyjny powinien zadbać o mapowanie pamięci wirtualnej do pamięci fizycznej do plików.

    Co do sprzątania... Zakładam, że nie robi to żadnego czyszczenia pamięci współdzielonej, ale mmapPliki ed powinny być oczyszczone, ponieważ pliki są zamknięte (co powinno zwolnić ich mapowania pamięci), gdy proces jest oczyszczony. Nie mam idea jakie zastrzeżenia CreateFileMapping itd. mam.

    Rzeczywista "pamięć dzielona" (tzn. boost.interprocess) nie jest czyszczona, gdy proces umiera. Jeśli to możliwe, polecam spróbować zabić proces i zobaczyć, co zostało.

     7
    Author: Mike D.,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2009-12-27 07:21:27

    Z MPI - 2 masz RMA (remote memory access) poprzez funkcje takie jak MPI_Put i MPI_Get. Korzystanie z tych funkcji, jeśli Twoja instalacja MPI je obsługuje, z pewnością pomoże Ci zmniejszyć całkowite zużycie pamięci programu. Koszt jest dodatkowa złożoność w kodowaniu, ale to część zabawy programowania równoległego. Z drugiej strony, utrzymuje cię w domenie MPI.

     2
    Author: High Performance Mark,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2012-10-11 12:50:53

    Niewiele wiem o Unixie i nie wiem czym jest MPI. Ale w systemie Windows To, co opisujesz, jest dokładnie dopasowane do obiektu mapowania plików.

    Jeśli te dane są osadzone w Twoim .EXE lub A.DLL, że ładuje, to będzie automatycznie współdzielone między wszystkimi procesami. Przerwanie procesu, nawet w wyniku awarii, nie spowoduje żadnych wycieków ani niepublikowanych blokad danych. jednak 9Gb .dll brzmi trochę niepewnie. Więc to pewnie nie działa na ty.

    Możesz jednak umieścić swoje dane w pliku, a następnie CreateFileMapping i MapViewOfFile na nim. Mapowanie może być tylko odczytywane, a całość lub część pliku można odwzorować w pamięci. Wszystkie procesy będą współdzielić strony, które są mapowane tym samym podstawowym obiektem CreateFileMapping. dobrą praktyką jest zamykanie widoków unmap i zamykanie uchwytów, ale jeśli tego nie zrobisz, system operacyjny zrobi to za Ciebie podczas rozdzierania.

    Zauważ, że jeśli nie używasz x64, nie będziesz w stanie zmapować pliku 5Gb do jednego widoku (lub nawet 2GB pliku, 1Gb może działać). Ale biorąc pod uwagę, że mówisz o tym, że to już działa, zgaduję, że jesteś już tylko x64.

     0
    Author: John Knoeller,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2009-12-26 21:27:09

    Jeśli przechowujesz dane statyczne w pliku, możesz użyć mmap na Unixie, aby uzyskać losowy dostęp do danych. Dane będą wysyłane w momencie, gdy potrzebujesz dostępu do określonego bitu danych. Wszystko, co musisz zrobić, to nałożyć dowolne struktury binarne na dane Pliku. Jest to uniksowy odpowiednik wymienionych powyżej CreateFileMapping i MapViewOfFile.

    Nawiasem mówiąc glibc używa mmap, gdy ktoś wywołuje malloc, aby zażądać więcej niż Strony danych.

     0
    Author: doron,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2009-12-26 22:50:34

    Miałem kilka projektów z MPI w SHUT.

    Jak wiem, Istnieje wiele sposobów na dystrybucję problemu za pomocą MPI, może znajdziesz inne rozwiązanie, które nie wymaga współdzielenia pamięci, mój projekt polegał na rozwiązaniu równania 7,000,000 i zmiennej 7,000,000

    Jeśli możesz wyjaśnić swój problem, postaram się ci pomóc

     0
    Author: amir beygi,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2009-12-28 19:28:53

    Natknąłem się na ten problem w małych kiedy używałem MPI kilka lat temu.

    Nie jestem pewien, czy SGE rozumie pliki mapowane pamięcią. Jeśli rozprowadzasz przeciwko gromadzie beowulf, podejrzewam, że będziesz miał problemy ze spójnością. Czy mógłby Pan porozmawiać trochę o swojej architekturze wieloprocesorowej?

    Moim szkicowym podejściem byłoby stworzenie architektury, w której każda część danych jest własnością zdefiniowanego procesora. Będą dwa wątki: jeden wątek to MPI dwukierunkowy rozmówca i jeden wątek do obliczenia wyniku. Zauważ, że MPI i wątki nie zawsze grają ze sobą dobrze.

     0
    Author: Paul Nathan,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-01-06 01:15:56

    MPI-3 oferuje okna pamięci współdzielonej (patrz np. MPI_Win_allocate_shared()), które umożliwiają korzystanie z pamięci współdzielonej na węźle bez żadnych dodatkowych zależności.

     0
    Author: Patrick Sanan,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2018-03-26 06:50:10