MPI_Send - blokowanie do kiedy?

MPI_Send - blokowanie do kiedy?
HU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 40
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?

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 192
1

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

HU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 40
0

Open MPI 1.6 oraz 1.6.5

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 192
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ń.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.