podstawympi - kamildworak.com fileozuko podstawy mpi kamil dworak 2 / 24. modelseciowy...

24
Podstawy MPI OZUKO Kamil Dworak OZUKO Podstawy MPI Kamil Dworak 1 / 24

Upload: buihuong

Post on 09-Feb-2018

216 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Podstawy MPI

OZUKO

Kamil Dworak

OZUKO Podstawy MPI Kamil Dworak 1 / 24

Page 2: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

MPI (ang. Message Passing Interface)

rozwijany od 1992 (MPI-1). Obecna wersja standardu: MPI-2.2(ponad 500 funkcji),stosowany na komputerach z pamięcią rozproszoną,obliczenia rozproszone realizowane są poprzez przesyłanie wiadomościprzez kanały komunikacyjne. Zadania realizowane są przez odrębneprocesy,ten sam program uruchamiany jest na każdym procesie (SPMD),dobrze współpracuje z interfejsem OpenMP,wykorzystuje się gotowe implementacje standardu MPI (np. MPICH,OpenMPI).

OZUKO Podstawy MPI Kamil Dworak 2 / 24

Page 3: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Model seciowy

Rysunek: Model sieciowy obliczeń równoległych

OZUKO Podstawy MPI Kamil Dworak 3 / 24

Page 4: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Instalacja i konfiguracja MPICH

MPICH: Link do pobrania - wersja zgodna z Visual Studio (x86, 64)

Visual Studio → Project Preferences → Configuration Properties →→ VC ++ Directories → Include Directories → Edit →→ New Line → C : \Program Files\MPICH2\include,

Visual Studio → Project Preferences → Configuration Properties →→ VC ++ Directories → Library Directories → Edit →→ New Line → C : \Program Files\MPICH2\lib,

OZUKO Podstawy MPI Kamil Dworak 4 / 24

Page 5: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Instalacja i konfiguracja MPICH

→ Configuration Properties → C/C ++ → Additional IncludeDirectories → C : \Program Files\MPICH2\include,

→ Configuration Properties → Linker → Additional LibraryDirectories → C : \Program Files\MPICH2\lib,

→ Configuration Properties → Input → Additional Dependencies →→ cxx .lib mpi .lib,

OZUKO Podstawy MPI Kamil Dworak 5 / 24

Page 6: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Instalacja i konfiguracja MPICH

uruchamiamy konsolę (CMD) jako administrator,cd C:\Program Files (x86)\MPICH2\binsmpd -installmpiexec -removempiexec -registerpodać nazwę użytkownika oraz hasło do systemumpiexec -validate // (SUCCESS)

OZUKO Podstawy MPI Kamil Dworak 6 / 24

Page 7: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Uruchomienie programu

mpiexec -n 4 program.exez wykorzystaniem MPIEXEC Wrapper

Rysunek: MPIEXEC Wrapper

OZUKO Podstawy MPI Kamil Dworak 7 / 24

Page 8: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Szkielet (MPI_Init i MPI_Finalize)

#include <iostream>#include <mpi.h>

using namespace std;int main(int argc, char* argv[]) {

// startMPI_Init(&argc, &argv);

// ...

// endMPI_Finalize();system("PAUSE");return 0;

}

OZUKO Podstawy MPI Kamil Dworak 8 / 24

Page 9: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Pierwszy program

#include <iostream>#include <mpi.h>

using namespace std;int main(int argc, char * argv[]) {

int processId;int numberOfProcesses;

MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &numberOfProcesses);MPI_Comm_rank(MPI_COMM_WORLD, &processId);cout << "Proces " << processId << " z " << numberOfProcesses

<< endl;if(processId == 0) cout << "Proces - Zarzadca!" << endl;MPI_Finalize( );return 0;

}

OZUKO Podstawy MPI Kamil Dworak 9 / 24

Page 10: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Wynik działania

Wynik działania powyższego programu

Proces 2 z 4Proces 0 z 4Proces - Zarzadca!Proces 3 z 4Proces 1 z 4

OZUKO Podstawy MPI Kamil Dworak 10 / 24

Page 11: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Konstrukcje

Wszystkie funkcje MPI znajdują się w pliku:

#include <mpi.h>

Nazwy wszystkich funkcji oraz stałych predefiniowanych rozpoczynają sięprzedrostkiem MPI_ np:

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &processId);

MPI_COMM_WORLD - komunikator - umożliwia wymianę wiadomościmiędzy procesami.

OZUKO Podstawy MPI Kamil Dworak 11 / 24

Page 12: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Typy danych

MPI_CHAR MPI_UNSIGNED_CHARMPI_SHORT MPI_UNSIGNED_SHORTMPI_INT MPI_UNSIGNEDMPI_LONG MPI_UNSIGNED_LONGMPI_FLOAT MPI_DOUBLEMPI_LONG_DOUBLE MPI_BYTEMPI_PACKED

Tablica: Typy danych zdefiniowane w blbliotece MPI

OZUKO Podstawy MPI Kamil Dworak 12 / 24

Page 13: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Wysyłanie wiadomości - MPI_Send

Nagłówek funkcji MPI_Send:

int MPI_Send(void* message, int size, MPI_Datatype dataType,int target, int tag, MPI_Comm communicator);

Przykład:

int id;const int N = 10;double variable = 128;int tab[N] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &id);if(id == 0) {

cout << "Master - wysylam dane!" << endl;MPI_Send(&variable, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD);MPI_Send(tab, N, MPI_INT, 2, 10, MPI_COMM_WORLD);

}

OZUKO Podstawy MPI Kamil Dworak 13 / 24

Page 14: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Odbieranie wiadomości - MPI_Reciv

Nagłówek funkcji MPI_Reciv:

int MPI_Recv(void* message, int size, MPI_Datatype dataType,int source, int tag, int communicator,MPI_Status* status);

int id;double variable = 128;MPI_Status status;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &id);if(id == 0) { // wysylanie} else if(id == 1) {

double result;MPI_Recv(&result, 1, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD,

&status);cout << "Proces 1: " << result << endl; }

OZUKO Podstawy MPI Kamil Dworak 14 / 24

Page 15: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

MPI_Reciv Status

Status zwracany jako ostatni parametr funkcji MPI_Reciv stanowistrukturę postaci:

typedef struct {int MPI_SOURCE;int MPI_TAG;int MPI_ERROR;

} MPI_Status;

gdzie:- MPI_SOURCE - numer procesu wysyłającego wiadomość,- MPI_TAG - etykieta (znacznik),- MPI_ERROR - kod błędu (jeśli błąd wystąpił).

OZUKO Podstawy MPI Kamil Dworak 15 / 24

Page 16: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Odbieranie wiadomości - MPI_Reciv - tablica

int id;const int N = 10;int tab[N] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };MPI_Status status;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &id);if(id == 0) { // wysylanie} else if(id == 2) {

int result[N];int resultCode = MPI_Recv(arr, N, MPI_INT, 0, 10,

MPI_COMM_WORLD, &status);if(resultCode == MPI_SUCCESS) {

for(int i = 0; i < N; i ++) {result[i] *= result[i];

}// odsylamMPI_Send(result, N, MPI_INT, 0, 10, MPI_COMM_WORLD);

}}OZUKO Podstawy MPI Kamil Dworak 16 / 24

Page 17: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Komunikacja kolektywna - rozgłaszanie MPI_Bcast

Nagłówek funkcji MPI_Bcast:

int MPI_Bcast(void* message, int size, MPI_DatatypedataType, int root, MPI_Comm communicator);

Przykład:

int id, size, a, sum = 0, globalSum;const int N = 1024;int tab[N] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... };MPI_Status status;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &id);MPI_Comm_size(MPI_COMM_WORLD, &size);MPI_Bcast(tab, N, MPI_INT, 0, MPI_COMM_WORLD);// ...

OZUKO Podstawy MPI Kamil Dworak 17 / 24

Page 18: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Komunikacja kolektywna - redukcja MPI_Reduce

Nagłówek funkcji MPI_Reduce:

int MPI_Reduce(void* partOfData, void* globalData, int size,MPI_Datatype dataType, MPI_Op operator, int root,MPI_Comm communicator);

cd.:

x = N / size;start = x * id;end = low + x;for(int i = start; i < end; i ++) {

sum += tab[i];}MPI_Reduce(&sum, &globalSum, 1, MPI_INT, MPI_SUM, 0,

MPI_COMM_WORLD);

if(id == 0) cout << globalSum << endl;

OZUKO Podstawy MPI Kamil Dworak 18 / 24

Page 19: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Operacje dla funkcji MPI_Reduce

MPI_MAX maksimumMPI_MIN minimumMPI_SUM sumaMPI_PROD iloczynMPI_LAND logiczne andMPI_LOR logiczne orMPI_LXOR logiczne xorMPI_BAND bitowy andMPI_XOR bitowy orMPI_BXOR bitowy xorMPI_MAXLOC maksimum i jego lokalizacjaMPI_MIXLOC minimum i jego lokalizacja

Tablica: Operacje dla funkcji MPI_Reduce

OZUKO Podstawy MPI Kamil Dworak 19 / 24

Page 20: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Dodatkowe typy danych

MPI_2INT intMPI_SHORT_INT short i intMPI_LONG_INT long i intMPI_LONG_DOUBLEINT long double i intMPI_FLOAT_INT float i intMPI_DOUBLE_INT double i int

Tablica: Dodatkowe typy danych

OZUKO Podstawy MPI Kamil Dworak 20 / 24

Page 21: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

MPI_Allreduce

Po przeprowadzeniu operacji redukcji wyniki są rozgłaszane dowszystkich procesów.

int MPI_Allreduce(void* partOfData, void* globalData,int size, MPI_Datatype dataType, MPI_Op operator,MPI_Comm communicator);

Przykład:

for(int i = start; i < end; i ++) {sum += tab[i];

}MPI_Reduce(&sum, &globalSum, 1, MPI_INT, MPI_SUM, 0,

MPI_COMM_WORLD);

OZUKO Podstawy MPI Kamil Dworak 21 / 24

Page 22: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Pomiar czasu

Pomiar czasu można dokonać za pomocą funkcji MPI_Wtime():

#include <iostream>#include <mpi.h>

using namespace std;int main(int argc, char * argv[]) {

double start;MPI_Init(&argc, &argv);start = MPI_Wtime();// ...cout << "Diff = " << MPI_Wtime() - start << endl;MPI_Finalize();return 0;

}

OZUKO Podstawy MPI Kamil Dworak 22 / 24

Page 23: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Zalety MPI

Zalety:nieograniczona liczba procesorów,możliwość integracji z OpenMP,biblioteka charakteryzuje się dużą przenośnością (skalowalne programydla różnych zastosowań).

OZUKO Podstawy MPI Kamil Dworak 23 / 24

Page 24: PodstawyMPI - kamildworak.com fileOZUKO Podstawy MPI Kamil Dworak 2 / 24. Modelseciowy Rysunek:Modelsieciowyobliczeńrównoległych OZUKO Podstawy MPI Kamil Dworak 3 / 24. InstalacjaikonfiguracjaMPICH

Wady MPI

Wady:debugging,koszt komunikacji rośnie wraz z liczbą dostępnych procesów,podział danych oraz równomierne zarządzanie pracą spada naprogramistę.

OZUKO Podstawy MPI Kamil Dworak 24 / 24