Programowanie równoległe - pracownia nr 1

Celem ćwiczenia jest zapoznanie się z kompilacją programów równoległych oraz z użyciem najprostszych instrukcji MPI. W zależności od preferowanego języka programowania, ćwiczenie można wykonywać w wersji C lub fortranowskiej. Z powodu czasowej niedostępności komputerów CI TASK wskutek ich przenoszenia do nowego pomieszczenia, “klastrem” użytym w ćwiczeniu są połączone siecią komputery znajdujące się w sali 402 o nazwach mmxy gdzie x i y są cyframi dziesiętnymi.

Studenci i doktoranci: kody źródłowe oraz wydruk wyników (najlepiej w postaci tar.gz) proszę wysłać mailem na adres adam@chem.univ.gda.pl; będzie to sprawozdanie z tej pracowni. Czas: do 17 marca 2008.

Przygotowanie do wykonania ćwiczenia:

Z katalogu  etoh.chem.univ.gda.pl:/big/staff/adam/MPI proszę skopiować (używając np. mc lub polecenia cp –r ) na swój katalog domowy podkatalog Cw1 (osoby nie posiadające kont na komputerze etoh.chem.univ.gda.pl jego kopię w postaci tar.gz mogą pobrać stąd). W katalogu Cw1 znajdują się dwa podkatalogi: C oraz F77 zawierające źródła programów odpowiednio w C i Fortranie 77.

Do zmiennej path dodać katalog /big/appl/mpich-1.2.7p1/bin. Można to zrobić lokalnie wykonując polecenie

 

set path = ($path /big/appl/mpich-1.2.7p1/bin)

 

wtedy ustawienie będzie ważne tylko w sesji odpowiadającej okienku z którego wpisano polecenie albo (lepiej) dopisując  /big/appl/mpich-1.2.7p1/bin do zmiennej path we właściwym pliku konfiguracyjnym (.cshrc, .tcshrc) na swoim katalogu domowym.

Kompilacja:

Przy użyciu skryptu mpicc lub mpif77 skompilować odpowiednią wersję programów hello i sendrecv, z utworzeniem modułów wykonywalnych o takich nazwach. Uruchomić programy na dwóch procesorach pod mpirun.

Modyfikacja programu hello

Zmodyfikować program hello w ten sposób, aby przy uruchomieniu go na N procesorach (o numerach 0, 1, 2, ..., N-1) tylko procesor nr 0 pisał informację o liczbie procesorów a każdy pozostały podawał tylko swój rząd (numer). Skompilować i uruchomić program.

Ping-pong:

Wykorzystując jako przykład źródło programu sendrecv napisać program, który “odbija” liczbę całkowitą pomiędzy dwoma procesorami określoną liczbę razy. Skompilować i uruchomić program na dwóch procesorach.

Dla zainteresowanych: Do programu można dodać instrukcję pomiaru czasu przesyłania wiadomości (MPI_Wtime) i wydrukować całkowity czas zużuty na przesłanie pakietów. Można poeksperymentować z zależnością czasu przesyłania od długości i typu danych.

Pierścień:

Wykorzystując jako przykład źródło programu sendrecv napisać program, w którym w układzie procesorów 0, 1, ..., N-1:

  1. Każdy procesor najpierw wysyła swój numer do prawego sąsiada, przy czym dla procesora N-1 prawym sąsiadem jest procesor 0.
  2. Następnie każdy procesor przyjmuje wiadomość (liczbę całkowitą) od lewego sąsiada (dla procesora 0 lewym sąsiadem jest procesor N-1), zapamiętuje go i wysyła do prawego sąsiada.
  3. Każdy procesor powtarza punkt 2 aż wróci do niego jego własny numer.
  4. Każdy procesor sumuje wszystkie otrzymane liczby i drukuje wynik.

Skompilować i uruchomić program interaktywnie na dwóch, czterech i ośmiu procesorach.