2011-11-29 8 views
5

Pracuję z programami MPI na superkomputerze SMP. Chciałbym określić, które procesy współużytkują ten sam węzeł, na przykład ustawiając klucz całkowitoliczbowy, który jest równy we wszystkich procesach w tym samym węźle i różni się między węzłami. Celem byłoby wówczas użycie tego klucza do podzielenia komunikatora i posiadanie pod-komunikatorów gromadzących tylko procesy w tym samym węźle.MPI: pobieranie liczby węzłów (nie procesów) w komunikatorze

więc funkcja będzie wyglądać

int identify_node(MPI_Comm* comm); // returns a key characterizing a node 

Zakładając prostą dystrybucję procesów jak 0,1,2,3, 4,5,6,7 na node_1 na node_2 itp jest to kwestia prostej formuły, ale chciałbym osiągnąć ten sam wynik bez założenia na temat dystrybucji.

Mam pomysł, jak to zrobić, używając MPI_Get_Processor_name: obliczając skrót nazwy i zakładając, że żadne dwa nazwiska nie otrzymają tego samego skrótu (nie podoba mi się to, ponieważ jeśli pewnego dnia mam dwie nazwy z tym samym hash, trudno będzie śledzić problem) lub użyć jakiegoś algorytmu uzgodnień pomiędzy procesami (który - jeszcze nie wiem).

Jak byś to zrobił (sprawnie, jeśli to możliwe)?

Matthieu

Odpowiedz

3

Masz rację, że założenie o podziale byłoby nierozsądne, ponieważ stopień zmiana kolejności jest rzeczywiście up-and-coming technika zwiększania wydajności kosztem tej prawidłowości.

Dobry algorytm mieszający dla wartości zwracanej MPI_Get_processor_name powinien być całkiem bezpieczny, ale jeśli chcesz sprawdzić dwukrotnie, zawsze możesz zebrać rzeczywiste nazwy w każdej grupie, używając MPI_Gatherv i porównać je bezpośrednio.

Wygląda na to, że this question rozwiązuje te same problemy.

+0

Dziękuję, pytanie, o którym wspomniałeś, jest rzeczywiście bardzo bliskie. Myślę, że zrobię to, co radzisz: uzyskaj skrót nazwy procesora, a następnie wykonaj drugą kontrolę z MPI_Gatherv. – sunmat

Powiązane problemy