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
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