MPICH2
| Autor | Argonne National Laboratory |
|---|---|
| Aktualna wersja stabilna | 1.4.1p1 / 2 września 2011; około 14 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
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
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[3] 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[4], close[5], seek[6], read[7].
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[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
- ↑ 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
Linki zewnętrzne
- Specyfikacje MPI. mpi-forum.org. [zarchiwizowane z tego adresu (2006-11-06)].
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.