MPICH2
Autor | Argonne National Laboratory |
---|---|
Aktualna wersja stabilna | 1.4.1p1 / 2 września 2011; ponad 13 lat temu |
System operacyjny | GNU/Linux Windows FreeBSD Solaris Mac OS X |
Rodzaj | biblioteka |
Licencja | własnościowa, freeware |
Strona internetowa |
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[1]. Biblioteka udostępnia interfejs dla języków programowania C, C++ oraz Fortran.
Instalacja i konfiguracja
[edytuj | edytuj kod]Najnowszą wersję biblioteki można pobrać ze strony domowej projektu. Instalacja w środowisku GNU/Linux przedstawiona jest w dokumentacji biblioteki[2]. 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
[edytuj | edytuj kod]Kompilacja
[edytuj | edytuj kod]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
[edytuj | edytuj kod]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
[edytuj | edytuj kod]Zarządzanie procesami/zadaniami
[edytuj | edytuj kod]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[3] służącą do uruchomienia dodatkowych procesów w ramach działającego już zadania.
Równoległe I/O
[edytuj | edytuj kod]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[4], close[5], seek[6], read[7].
Zdalne operacje na pamięci
[edytuj | edytuj kod]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[8] 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[9] – pobranie bufora do przestrzeni procesu ze zdalnego procesu.
- Put[10] – zapisanie bufora do pamięci zdalnego procesu.
- Accumulate[11] – 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[12].
Przypisy
[edytuj | edytuj kod]- ↑ mpi2-report.tex. [dostęp 2010-06-23]. [zarchiwizowane z tego adresu (2007-09-21)].
- ↑ https://svn.mcs.anl.gov/repos/mpi/mpich2/tags/release/mpich2-1.2.1/README.vin
- ↑ MPI_Comm_spawn(char *command, char *argv[], int maxprocs, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_File_open(MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *mpi_fh ) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_File_close(MPI_File *mpi_fh) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence ) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_File_read(MPI_File mpi_fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status ) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win ) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_Get(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win )... [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_Put(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win )... [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_Accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op... [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
- ↑ MPI_Win_fence(int assert, MPI_Win win) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
Bibliografia
[edytuj | edytuj kod]Linki zewnętrzne
[edytuj | edytuj kod]- Specyfikacje MPI. mpi-forum.org. [zarchiwizowane z tego adresu (2006-11-06)].