2012-07-08 10 views
10

Co się stanie, jeśli użyjesz jednej z metod komunikacji MPI, aby ranga komunikowała się ze sobą? Czy istnieje dobrze zdefiniowane zachowanie (na przykład gwarantowane powodzenie lub niepowodzenie), czy też zależy ono od przypadku/innych niekontrolowanych wpływów, czy program będzie nadal działał, czy nie?Czy zachowanie komunikacji MPI o rangi ze sobą jest dobrze zdefiniowane?

Przykładem może być kod dynamiki płynów, gdzie każda ranga określa, które komórki siatki muszą zostać wysłane do sąsiednich rang, aby utworzyć niezbędne halo dla szablonu obliczeniowego. Jeśli symulacja zostanie uruchomiona tylko na jednym poziomie, nie będzie blokowania wysyłania/odbierania samego poziomu 0 (wysyłanie informacji o długości 0).

Odpowiedz

12

Chociaż można uniknąć auto-messaging, jak na odpowiedź Sikterpatt, self-messaging będzie działać i jest częścią standardu MPI. Istnieje nawet zdefiniowany wcześniej komunikator wygody: MPI_COMM_SELF. Tak długo, jak połączenia wysyłania/odbierania nie powodują zakleszczenia (na przykład nie są blokowane połączenia), wysyłanie do siebie jest w porządku. Oczywiście bufory wysyłania i odbioru nie powinny się nakładać.

Zauważ, że z OpenMPI musisz enable the self BTL.


Źródło: MPI 1.1 Section 3.2.4

Source = docelowy jest dozwolone, to jest proces może wysłać wiadomość do siebie. (Nie jest to jednak bezpieczne w przypadku blokowania operacji wysyłania i odbierania opisanych powyżej, ponieważ może to prowadzić do zakleszczenia (patrz punkt 3.5) Semantyka komunikacji punkt-punkt.)

+0

To dobra wiadomość. Czy mógłbyś wskazać rozdział w aktualnym standardzie MPI, który formułuje politykę "wyślij do siebie"? Sam tego szukałem i nie mogłem nic znaleźć. –

+0

Dodałem źródło do odpowiedzi. –

1

W trybie standardowym wysyłanie (tj. MPI_Send()), do implementacji MPI należy określenie, czy buforować wiadomość, czy nie. Rozsądnie jest założyć, że każda implementacja, lub przynajmniej te popularne, rozpoznają wysyłanie do siebie i zdecydują się na buforowanie wiadomości. Wykonanie będzie następnie kontynuowane, a po wykonaniu pasującego odebrania wywołania, wiadomość zostanie odczytana z bufora. Jeśli chcesz być absolutnie pewien, możesz użyć MPI_Bsend(), ale może to być Twoja odpowiedzialność za zarządzanie buforem poprzez MPI_Buffer_attach() i MPI_Buffer_detach().

Jednak idealnym rozwiązaniem dla konkretnego problemu jest użycie MPI_PROC_NULL w argumencie źródło/miejsce docelowe wywołań wysyłania/odbierania, co spowoduje, że Send i Recv zrezygnują z komunikacji i zwrócą się JAK NAJSZYBCIEJ.

Powiązane problemy