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?
0
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:
- Pojęcie "bufor" odnosi się do fragmentu pamięci, który używasz jawnie w swoim programie do trzymania danych do wysyłki.
- 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ń.