2013-06-12 19 views
5

Jeśli chodzi o MPI_Isend, standard MPI mówi: "Niezablokowane wysyłanie wywołania wskazuje, że system może rozpocząć kopiowanie danych z bufora wysyłania." Nadawca nie powinien uzyskiwać dostępu do żadnej części bufora wysyłania po wywołaniu niezawierającej operacji wysyłania, aż do wysłania kończy. " (http://www.mpi-forum.org/docs/mpi-11-html/node46.html)OK, aby wielokrotnie wywoływać MPI_Isend na jednym buforze?

Czy odwołanie do bufora wysyłania w innym poleceniu wysyłania jest ok, czy jest zawarte w "dostęp do dowolnej części bufora wysyłania"?

Innymi słowy, czy poniższy kod C dla nadawcy jest prawidłowy?

MPI_Request req[2]; 
MPI_Status statuses[2]; 
... 
MPI_Isend(buf, type, count, dest0, tag, comm, &req[0]); 
MPI_Isend(buf, type, count, dest1, tag, comm, &req[1]); 
MPI_Waitall(2, req, statuses); 
+0

Zgaduję, tutaj, dlatego nie jest to pełna odpowiedź, że to, czego naprawdę nie chcesz robić, to modyfikowanie zawartości bufora źródłowego lub odczytanie zawartości bufora docelowego przed wysyłanie jest zakończone. Więc dla mnie to, co robisz, wygląda dobrze. Ale proszę, sprawdź. Nie wierz mi na słowo. –

+0

@ bob.sacamento Oczywiście, to prawda. I wiem, że mój kod byłby poprawny dla implementacji MPI, której używam (spojrzał na kod źródłowy), ale chciałbym wiedzieć, czy jest to poprawne zgodnie ze Standardem, tj. Działałoby przy każdej poprawnej implementacji MPI. –

Odpowiedz

2

Standard MPI pozwala na tego rodzaju użytkowanie.

Jeśli jest więcej "garstki" szeregów, które wymagają tego samego bufora, lub jeśli ten wzorzec komunikacji będzie powtórzony więcej niż "garść" razy ... to tworzenie komunikatora z odpowiednimi stopniami i używanie MPI_Bcast byłoby lepsze.

EDIT:

Aby wyjaśnić moją własną odpowiedź. Standard MPI 2.0 wyraźnie zabrania tego rodzaju użytkowania. Ograniczeniem było przyjęcie Fortran. Standard MPI 2.1 lub 2.2 zawierał "wyjaśnienie", że to ponowne wykorzystanie bufora wysyłkowego w wielu licencjach było dozwolone. Zobacz rozdział 16.2.2 normy MPI 2.2, aby uzyskać więcej informacji.

+1

Dzięki. Ta sekcja Standardu MPI 2.2 była pouczająca. –

1

Właśnie konsultacji z MPI 3.0 Standard i znaleźć następujące informacje:

nonblocking wyślij wezwanie wskazuje, że system może rozpocząć kopiowanie danych z bufora wysyłania. Nadawca nie powinien modyfikować żadnej części bufora wysyłania po wywołaniu nieblokującej operacji wysyłania , dopóki nie zakończy się wysyłanie.

Jednak ja bardzo niedawno uczestniczył tutorial MPI 3.0 podane przez niektórych twórców standardu i to zostało wspomniane, że w zależności od implementacji MPI (MPICH, LAM, itd.), Może być niebezpieczne aby uzyskać dostęp do bufora używanego w niezablokowanym połączeniu komunikacyjnym, ponieważ bufor może być modyfikowany z procedury Isend przed zakończeniem wysyłania. Innymi słowy, może nie być zagwarantowane, że bufor w drugim pliku MPI_Isend jest taki sam jak bufor w pierwszym wysyłaniu. Aby to ustalić na pewno, sprawdziłbym twój kod źródłowy implementacji.

+0

Hmmmm, tego się obawiałem. Czy Standard określa, że ​​bufory wysyłania w momencie zakończenia wysyłania muszą być "zwrócone" do aplikacji niezmodyfikowanej, czy mogą być modyfikowane? Po prostu nie widzę, jak rozsądna implementacja przyniosłaby korzyść przez faktyczną modyfikację bufora wysyłania. –

+1

Nie chodzi o to, że implementacja koniecznie zmodyfikuje bufor, ale musi się upewnić, że bufor nie zostanie zmieniony podczas kopiowania/wysyłania. –