Programowanie Równoległe i Rozproszone
III rok Informatyka WSZiB
Część 3 - Komunikacja nieblokująca
- Zadanie: Zwiększyć wydajność programu life poprzez wykonywanie komunikacji i obliczeń jednocześnie.
- Zamienić komunikację z blokującej na nieblokującą w następujący sposób:
Pierwsze wywołanie funkcji MPI_Sendrecv() zmienić na MPI_Send,
MPI_Irecv, a pózniej
MPI_Wait. Drugą funkcję MPI_Sendrecv() zmienić na MPI_Isend, MPI_Recv i
MPI_Wait.
- Wykonywanie obliczeń jednocześnie z komunikacją:
- Zamienic wszystkie pozostale wywolania na nieblokujace
- Po zainicjalizowaniu nieblokującej komunikacji procesy obliczają "życie" w wierszach "wewnętrznych" od 2 do K-1,
- Wykonują operację oczekiwania na odebranie którejkolwiek z zakładek funkcją MPI_Waitany,
- Obliczają "życie" w wierszu 1 lub K-tym w zależności od tego, która komunikacja została zakończona w wyniku MPI_Waitany()
- Oczekują na odebranie drugiej zakładki
- Dokonują obliczenia "życia" w wierszu 1 lub K-tym (w zależności, która zakładka została odebrana)
- Przy pomocy MPI_Waitall() zapewniamy, ze komunikacja Isend sie zakonczyla.
Wskazówka:
Potrzebne będą dwie dwuelementowe tablice typu MPI_Request, jedna dla operacji Isend i druga dla operacji Irecv. W tych tablicach przechowywane będą uchwyty służące do zakończenia operacji nieblokujących. Tablice uchwytów przekazywane będą do funkcji MPI_Wait*.
- Przeprowadzić pomiar czasu spędzonego w głównej pętli algorytmu w każdym procesie. Pomiar czasu w MPI.
Marcin Radecki
|