MPICH2 – biblioteka, która implementuje standard MPI w wersji drugiej, dodając nowe funkcje, jak np. dynamiczna obsługa procesów, równoległe I/O oraz operacje na zdalnej pamięci. Biblioteka udostępnia interfejs dla języków programowania C, C++ oraz Fortran. Instalacja i konfiguracja Najnowszą wersję biblioteki można pobrać ze strony domowej projektu. Instalacja w środowisku GNU/Linux przedstawiona jest w dokumentacji bibliotekihttps://svn.mcs.anl.gov/repos/mpi/mpich2/tags/release/mpich2-1.2.1/README.vin. Do poprawnej pracy niezbędny jest interpreter języka Python, gdyż wiele narzędzi w bibliotece zostało zaimplementowane w tym języku. Dla ułatwienia pracy można dodać ścieżkę, w której zainstalowano MPICH2, do zmiennej PATH: export PATH=/usr/local/mpich2/bin:$PATH

W MPICH2 pojawia się menedżer procesów mpd (domyślny menedżer procesów), który jest odpowiedzialny za komunikację w klastrze oraz uruchamianie zadań na zdalnych serwerach. Aby uruchomić mpd, należy w katalogu domowym utworzyć plik .mpd.conf, który będzie zawierał poniższą definicję. MPD_SECRETWORD=losowyciągznakow Należy ustawić uprawnienia do pliku tak, aby był do odczytu tylko dla właściciela. chmod 600 ~/.mpd.conf Aby uruchomić mpd na wielu serwerach, najłatwiej jest wykorzystać skrypt mpdboot. Argumenty, które musimy podać, to plik z listą serwerów, na których uruchomić daemona. Opcjonalnie możemy podać liczbę serwerów z listy, na których należy go uruchomić. [user@blade02 ~]$ cat machines blade03 blade04 blade05 [user@blade02 ~]$ mpdboot -n 4 --file=./machines Do sprawdzenia, czy mpd został poprawnie uruchomiony, należy wykorzystać skrypt mpdtrace. [user@blade02 ~]$ mpdtrace blade02 blade03 blade04 blade05 Wyświetli on listę serwerów, na których będą wykonywane zadania. Można też przetestować komunikację za pomocą polecenia mpdringtest [user@blade02 ~]$ mpdringtest 100 time for 100 loops = 0.10592007637 seconds [user@blade02 ~]$

Uruchamianie programów Kompilacja Kompilacja jest podobna do tej znanej z MPICH. [user@blade02 mpich]$ mpicc example.c -o example [user@blade02 mpich]$ ls [user@blade02 mpich]$ example example.c Uruchomienie W MPICH2 pojawia się nowe narzędzie mpiexec (mpirun znany z MPICH jest linkiem symbolicznym do mpiexec) służące do wykonywania zadań. [user@blade02 ~]$ mpiexec -n 6 hostname blade04 blade03 blade05 blade04 blade02 blade02 [user@blade02 ~]$ Powyższe uruchomi polecenie hostname w sześciu kopiach na serwerach w pierścieniu.

Zmiany w porównaniu do MPICH Zarządzanie procesami/zadaniami W MPICH2 mamy narzędzie do zarządzania zadaniami w klastrze. Polecenie mpdlistjobs wyświetla aktualnie przetwarzane zadania w klastrze, a mpdkilljob może zakończyć działanie podanego zadania. [user@blade02 ~]$ nohup mpiexec -n 2 sleep 100 >/dev/null 2>/dev/null & [user@blade02 ~]$ mpdlistjobs jobid = 14@blade02_48009 jobalias = username = user host = blade02 pid = 24958 sid = 24957 rank = 0 pgm = sleep

jobid = 14@blade02_48009 jobalias = username = user host = blade04 pid = 611 sid = 610 rank = 1 pgm = sleep [user@blade02 ~]$ mpdkilljob 14@blade02_48009 [user@blade02 ~]$ mpdlistjobs [user@blade02 ~]$ mpd umożliwia też wysłanie sygnału do wszystkich procesów dla danego zadania. [user@blade02 ~]$ mpiexec -n 2 perl -e 'use POSIX; system(„hostname -s”); $SIG{INT} = sub { print „Hello World\n"; }; pause(); ' blade02 blade04 Hello World Hello World W drugiej konsoli wydano poniższe polecenia. [user@blade02 ~]$ mpdlistjobs jobid = 32@blade02_48009 jobalias = username = user host = blade02 pid = 25213 sid = 25212 rank = 0 pgm = perl

jobid = 32@blade02_48009 jobalias = username = user host = blade04 pid = 1654 sid = 1653 rank = 1 pgm = perl

[user@blade02 ~]$ mpdsigjob SIGINT -j 32@blade02_48009

MPICH2 udostępnia funkcję MPI_Comm_spawn służącą do uruchomienia dodatkowych procesów w ramach działającego już zadania.

Równoległe I/O Procesy w uruchomionych zadaniach często potrzebują równoczesnego dostępu do zapisu lub odczytu danych. W MPICH2 pojawiła się obsługa I/O podobna do wysyłania (zapis do pliku na zdalnym serwerze) i odbierania (odczyt z pliku) komunikatów. Każdy z procesów może mieć dostęp do wybranej części pliku. MPICH2 definiuje podstawowe funkcje wejścia-wyjścia: open, close, seek, read.

Zdalne operacje na pamięci W MPICH2 pojawiła się możliwość operacji na obszarach pamięci procesów uruchomionych na innych komputerach w ramach tego samego zadania. Jest to uogólnienie modelu przesyłania komunikatów zdefiniowanego w MPI1. Współdzielenie pamięci odbywa się przez definiowanie okien (zakresów pamięci), czyli buforów, na których przeprowadzane są operacje. Funkcja MPI_Win_create definiuje nowe okno, które jest dostępne do zapisu i/lub odczytu przez inny proces lub grupę procesów. Dostępne są operacje: Get – pobranie bufora do przestrzeni procesu ze zdalnego procesu. Put – zapisanie bufora do pamięci zdalnego procesu. Accumulate – aktualizacja pamięci w przestrzeni adresowej innego procesu. Wszystkie operacje na zdalnej pamięci są asynchroniczne, więc należy zadbać o synchronizację. Służy do tego funkcja MPI_Win_fence.

Przypisy

Bibliografia MPICH2 User's Guide (en)

Linki zewnętrzne

Kategoria:Biblioteki programistyczne Kategoria:Programowanie równoległe