MPI_Send - blokowanie do kiedy?

0

Dokumentacja mówi, że MPI_Send blokuje, dopóki bufor nie będzie wolny. Nie wiem o który bufor chodzi. Mówi 'MPI_Send will not return until you can use the send buffer', ja się pytam kiedy 'send buffer' będzie wolny i od czego to zależy?
Gdzie indziej mówi 'This routine may block until the message is received by the destination process. ' Co to znaczy odebranie przez odbiorce (umiszczenie w jego buforze, żeby mógł sobie kiedy chce odczytać, czy odpalenie MPI_Recv, czy jeszcze coś innego)?
Odpalam MPI_Send z powiedzmy procesu 1 (sender) do procesu 2 (destination). Wysyłam jednego inta albo strukturę z dwoma intami.
Do kiedy MPI_Send blokuje (w praktyce i teoretycznie jak jest różnica)?
a)aż wiadomość znajdzie się w buforze systemowym nadawcy do wysłania
b)aż wiadomość znajdzie się w buforze systemowym odbiorcy, tak, że odbiorca może sobie coś sprawdzić czy ma do odebrania
c)aż odbiorca odpali MPI_Recv
d)co innego
Czy w przypadku a) ten bufor to ten co dotyczy /proc/sys/net/core/wmem_default a przypadku b) ten co dotyczy /proc/sys/net/core/rmem_default?

1

Może od początku: jaką implementację MPI używasz?

0

Open MPI 1.6 oraz 1.6.5

1

O ile wiem, OpenMPI w tych wersjach implementuje MPI 1. Co za tym idzie:

  1. Pojęcie "bufor" odnosi się do fragmentu pamięci, który używasz jawnie w swoim programie do trzymania danych do wysyłki.
  2. Semantyka "blokowania" oznacza, że w momencie, kiedy MPI_Send zwróci kontrolę do programu, możesz z buforem zrobić wszystko - zwolnić, nadpisać nowymi danymi itp. Masz gwarancję, że to, co chciałeś wysłać zostało wysłane, a bufor jest z powrotem do Twojej dyspozycji.

Z obu powyższych: MPI_Send działa analogicznie do send(2) w trybie blokującym, co prowadzi do odpowiedzi (a). Odnośnie jeszcze /proc/sys/net/core/{w,r}mem_default, raczej odniósłbym się do setsockopt z parametrem SO_SNDBUF i SO_RCVBUF. Nie zapominaj, że aplikacja też ma dużą kontrolę nad buforami dla swoich połączeń.

1 użytkowników online, w tym zalogowanych: 0, gości: 1