MPICH
MPICH to darmowa, przenośna implementacja standardu MPI, umożliwiająca komunikację między aplikacjami działającymi równolegle. Jest przeznaczona do użycia na małych klastrach i dostępna na systemach MS Windows oraz Unix. Rozszerzeniem MPICH jest MPICH2, a także MPICH-G2, która wspiera aplikacje w środowiskach gridowych.
Charakterystyka
MPICH zapewnia mechanizmy komunikacji dla obliczeń równoległych. W najnowszej wersji MPICH2 wprowadzono:
- wsparcie dla komunikacji jednostronnej
- rozszerzoną funkcjonalność MPI-IO
Instalacja
Procedura instalacji MPICH:
- Pobierz źródła programu z: mpich.tar.gz.
- Rozpakuj plik: # tar xfz mpich.tar.gz.
- W katalogu /mpich wydaj komendę: # ./configure –prefix=/opt/mpich.
- Kompiluj program: # make.
- Zainstaluj: # make install.
Konfiguracja
W pliku machines.LINUX (katalog: /opt/mpich/share lub wskazany w opcji prefix) dodaj nazwy hostów klastra w formacie:
hostname1:liczba_procesów
Komunikacja Punkt-Punkt
Przykład przesyłania komunikatu między procesami:
#include#include "mpi.h" #define TAG 0 #define COUNT 25 #define SOURCE 0 #define DEST 1 int main(int argc, char *argv[]) { int rank, size; MPI_Status status; char Msg[] = "Komunikat od procesu 0"; char Recv[COUNT]; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if (size > 1) { if (rank == DEST) { MPI_Recv(Recv, COUNT, MPI_CHAR, SOURCE, TAG, MPI_COMM_WORLD, &status); printf("process %d has received: '%s'n", rank, Recv); } else if (rank == SOURCE) { MPI_Send(Msg, COUNT, MPI_CHAR, DEST, TAG, MPI_COMM_WORLD); } } MPI_Finalize(); return 0; }
Komunikacja Grupowa
MPICH udostępnia funkcje do komunikacji z wszystkimi procesami w grupie, takie jak:
- MPI_Bcast: rozsyła komunikat do wszystkich procesów.
- MPI_Scatter: dzieli dane i rozsyła je do procesów.
- MPI_Gather: zbiera dane z procesów.
- MPI_Reduce: wykonuje operacje na danych przesyłanych przez procesy.
Pochodne Typy Danych
W MPI można tworzyć pochodne typy danych, co pozwala na elastyczne przesyłanie danych. Typy te obejmują:
- Contiguous: elementy są kopiami danego typu.
- Vector: elementy z odstępami między sobą.
- Struct: elementy różnych typów z określonymi odstępami.