MPICH2

Z Wikipedii, wolnej encyklopedii
MPICH2
Autor Argonne National Laboratory
Aktualna wersja stabilna 1.4.1p1 / 2 września 2011; ponad 12 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]

  1. mpi2-report.tex. [dostęp 2010-06-23]. [zarchiwizowane z tego adresu (2007-09-21)].
  2. https://svn.mcs.anl.gov/repos/mpi/mpich2/tags/release/mpich2-1.2.1/README.vin
  3. 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.).
  4. 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.).
  5. MPI_File_close(MPI_File *mpi_fh) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
  6. MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence ) function [online], mpi.deino.net [dostęp 2017-11-25] (ang.).
  7. 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.).
  8. 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.).
  9. 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.).
  10. 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.).
  11. 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.).
  12. 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]