Jaka jest semantyka Bcast, gdy liczba procesów podczas tego wywołania jest inna niż liczba procesów odradzanych na początku obliczenia?

Muszę poradzić sobie z sytuacją, w której użytkownik określa zbyt wiele procesów, które są niezbędne do wykonania obliczeń. Na przykład, użytkownik może zdecydować się na odrodzenie 16 procesów za pomocą mpirun, kiedy potrzebuję tylko 12, aby podzielić problem między procesy. Poradzę sobie z tą sytuacją porównując PID do 12 i kończenie procesów za pomocą MPI_Finalize, gdy PID jest zbyt wysoki. Myślę, że powoduje to zakleszczenie w mojej aplikacji, ponieważ Bcast chce wysłać do wszystkich procesów?

Jak sobie z tym poradzić? Czy powinienem po prostu wywoływać Bcast we wszystkich procesach, ale po prostu zignorować dane wyjściowe w niektórych?

1
jsmith 10 czerwiec 2011, 01:06

2 odpowiedzi

Najlepsza odpowiedź

Biorąc pod uwagę, że otrzymujemy, co można uznać za nieprawidłowe dane wejściowe od użytkownika, czy naprawdę musimy kontynuować wykonywanie programu po uświadomieniu sobie tego? Czy nie lepiej wyświetlać użytkownikowi komunikat o błędzie informujący, że zażądano nieprawidłowej liczby procesów, a także informujący użytkownika o dozwolonym interwale (np. „Zażądano 16 procesów, jednak maksymalna liczba procesów to 12 , program zostanie teraz zamknięty").

W przeciwnym razie, jeśli nie jest to możliwe w Twojej sytuacji, rozdział 6 „Grupy, konteksty, komunikatory i buforowanie” i/lub rozdział 10 „Tworzenie i zarządzanie procesami” na stronie Dokumentacja MPI 2.2 może być pomocna. Prawdopodobnie istnieje inna, łatwiejsza do odczytania dokumentacja dostępna gdzieś indziej, ale przynajmniej to początek.

2
cic 10 czerwiec 2011, 13:24
To jest problem z pracą domową, specyfikacja nie była jasna w tym konkretnym przypadku :)
 – 
jsmith
10 czerwiec 2011, 15:21
Co rozumiesz przez „ten konkretny przypadek”? Czy masz na myśli pierwsze pytanie "Jaka jest semantyka Bcast, gdy liczba procesów ...."?
 – 
cic
10 czerwiec 2011, 15:32

Podczas uruchamiania programu każdy proces powinien przyjrzeć się swojej randze (od MPI_Comm_rank), całkowitej liczbie procesów (od MPI_Comm_size(MPI_COMM_WORLD)) oraz liczbie, której faktycznie potrzebuje obliczenia. Niech rangi poniżej numeru, którego potrzebujesz, utworzy nowy komunikator, którego będziesz faktycznie używać do swojej pracy, a wszystkie pozostałe stopnie po prostu zadzwoń do MPI_Finalize.

1
Phil Miller 12 czerwiec 2011, 22:47