POZNA SUPERCOMPUTING AND NETWORKING. Wprowadzenie do MPI



Podobne dokumenty
Optymalizacja komunikacji w systemach rozproszonych i równoległych

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

Programowanie współbieżne... (4) Andrzej Baran 2010/11

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie Równoległe Wykład 4. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Modele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak dla PR PP

Modele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak

Operacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1

Message Passing Interface

Programowanie w standardzie MPI

Operacje grupowego przesyłania komunikatów

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie współbieżne i rozproszone

Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla

Biblioteki graficzne MPI - MPE

Operacje kolektywne MPI

Programowanie współbieżne... (5)

Łagodne wprowadzenie do Message Passing Interface (MPI)

Rozszerzenia MPI-2 1

Wprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface (część 3) Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie Współbieżne

Miary Wydajności. Efektywność programu równoległego (E) jest definiowana jako stosunek przyśpieszenia do liczby procesorów

Architektury systemów równoległych

Jak wygląda praca na klastrze

Programowanie współbieżne... (6)

Programowanie Równoległe Wykład 6. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

POZNA SUPERCOMPUTING AND NETWORKING. Wtki w MPI. Michał Sajkowski

Komunikacja kolektywna w środowisku MPI

Sposoby przekazywania parametrów w metodach.

Programowanie współbieżne... (12) Andrzej Baran 2010/11


51. Metody komunikacji nieblokującej.

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie współbieżne... (w13)

Programowanie współbieżne WYKŁADY - CZ. 5EX. PRZYKŁAD. LICZBY PIERWSZE. Andrzej Baran

Wprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania. Matematycznego i Komputerowego Uniwersytet Warszawski

... Ireneusz Mrozek. Wydział Informatyki

Weryfikacja oprogramowania, korzystajacego z MPI

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Obliczenia rozproszone z wykorzystaniem MPI

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

Klient-Serwer Komunikacja przy pomocy gniazd

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie współbieżne Wykład 12 MPI c.d. Rafał Skinderowicz

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Algorytmy i Struktury Danych

Podstawy programowania skrót z wykładów:

Architektura sieci połączeń między procesorami, sterowanie komunikacjami, biblioteki komunikacyjne

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Wprowadzenie. System rozproszony jest kolekcją niezależnych, autonomicznych komputerów, które dla użytkownika prezentują się jak jeden komputer.

Pierwsze kroki w środowisku MPI

Część 4 życie programu

Wstęp do programowania

Wywoływanie procedur zdalnych

Język ludzki kod maszynowy

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC

1. Wprowadzenie do C/C++

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1

Wywoływanie procedur zdalnych

5. Model komunikujących się procesów, komunikaty

Zdalne wywoływanie procedur RPC 27. października 2010

Programowanie współbieżne Wykład 11 Wprowdzenie do MPI. Rafał Skinderowicz

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Pobieranie argumentów wiersza polecenia

Systemy rozproszone. Państwowa Wyższa Szkoła Zawodowa w Chełmie. ** Instytut Fizyki Uniwersytet Marii Curie-Skłodowskiej w Lublinie

Programowanie współbieżne... (2)

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wstęp do Programowania, laboratorium 02

PARADYGMATY PROGRAMOWANIA Wykład 4

1. Wprowadzenie do C/C++

Wywoływanie procedur zdalnych

61 Topologie wirtualne

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

I - Microsoft Visual Studio C++

1 Podstawy c++ w pigułce.

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Proces tworzenia programu:

zdefiniowanie kilku grup dyskusyjnych, z których chcemy odbiera informacje, dodawanie, usuwanie lub edycj wczeniej zdefiniowanych grup dyskusyjnych,

Sosnowiec, dn... Imię i nazwisko...

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Systemy Operacyjne - Operacje na plikach

Procedury i funkcje składowane

Temat: Programowanie zdarzeniowe. Zdarzenia: delegacje, wykorzystywanie zdarze. Elementy Windows Application (WPF Windows Presentation Foundation).

Aplikacja Sieciowa wątki po stronie klienta

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Programowanie wspóªbie»ne

Programowanie Rozproszone i Równoległe. Edward Görlich goerlich@th.if.uj.edu.pl

WYKŁAD 10. Wzorce projektowe czynnociowe Command Strategy

Poziom kwalifikacji: I stopnia. Liczba godzin/tydzień: 2W E, 2L PRZEWODNIK PO PRZEDMIOCIE

Kolejne funkcje MPI 1

Transkrypt:

Wprowadzenie do MPI

literatura W. Gropp, E. Lusk, An Introduction to MPI, ANL P.S. Pacheco, A User s Guide to MPI, 1998 Ian Foster, Designing and Building Parallel Programs, Addison-Wesley 1995, http://www-unix.mcs.anl.gov/dbpp/ 2

literatura J. Dongarra, I. Foster, G. Fox, W. Gropp, K. Kennedy, L. Torczon, A. White, The Sourcebook of Parallel Computing, Morgan Kaufmann 2002 W. Gropp, E. Lusk, T. Sterling, Beowulf Cluster Computing, Second Edition, The MIT Press, 2003 3

literatura W. Gropp, E. Lusk, R. Thakur, Advanced Features of the Message Passing Interface, The MIT Press 1999 W. Gropp, E. Lusk, A. Skjellum, Portable Parallel Programming with the Message Passing Interface, 2nd edition, The MIT Press 1999 4

literatura P.S. Pacheco, Parallel Programming with MPI, Morgan Kaufmann 1996 5

literatura Neil MacDonald, Elspeth Minty, Mario Antonioletti, Joel Malard, Tim Harding, Simon Brown, Writing Message-Passing Parallel Programs with MPI. Course Notes. Edinburgh Parallel Computing Centre, The University of Edinburgh, Epic Version. 1995 http://www.epcc.ed.ac.uk/epic/mpi/notes/mpicourse-epic.book_1.html 6

co to jest przesyłanie komunikatów? przesyłanie komunikatów jest modelem programowania komputerów równoległych z pamici rozproszon kady procesor wykonuje niezaleny proces przestrzenie adresów s rozłczne, nie ma danych współdzielonych, kady proces ma swoj własn pami 7

co to jest przesyłanie komunikatów? komunikacja midzy procesami odbywa si za pomoc wywołania podprogramu procesy nadaj dane do siebie za pomoc przesyłania komunikatów komunikaty maj etykiety pozwalajce je rozrónia (sortowa) komunikaty odbiera si w dowolnej kolejnoci 8

co to jest przesyłanie komunikatów? przesyłanie danych + synchronizacja Proces 0 Proces 1 dane mog nadawa? tak Data Data Data Data Data Data Data dane czas wymaga współpracy nadawcy i odbiorcy współpraca ta nie zawsze jest widoczna w kodzie programu 9

co to jest MPI? MPI = Message Passing Interface interfejs przesyłania komunikatów standard biblioteki przesyłania komunikatów formalna specyfikacja interfejsu nie jest to konkretna implementacja 10

dlaczego MPI? kryzys oprogramowania w przetwarzaniu równoległym kady dostawca daje własny interfejs adnej krytycznej masy uytkowników współdzielenie kodu aplikacje równoległe pod klucz, do natychmiastowego uytku 11

dlaczego MPI? uniwersalny - stosowany na wielu platformach zrozumiały - równoległo i komunikacja s jawne mobilny - powoduje przenaszalno programu wygodny pozwala na zrównoleglenie programu 12

jak to si zaczło? przedtem: oddzielna, inna biblioteka dla kadej platformy PVM niska efektywno 1992 pocztek prac 1994 MPI-1 1997 MPI-2 13

MPI-1 tradycyjne przesyłanie komunikatów funkcje kim jestem i ile jest procesów funkcje nadawania i odbioru komunikatu funkcje rozgłaszania komunikatu funkcje agregacji wyników (redukcji) funkcje komunikacji wszyscy ze wszystkimi 14

zdalna pami równoległe we/wy MPI-2 procesy dynamiczne C++ Fortran 90 funkcja komunikacji jednostronnej get/put wtki 15

gdzie si stosuje MPI? w komputerach równoległych w klastrach w sieciach heterogenicznych 16

co daje MPI? pozwala w łatwy sposób uruchamia programy równoległe zazwyczaj napisane w jzyku C, albo w jzyku Fortran 17

model programowania MPI SPMD Single Program Multiple Data jeden program, wiele danych, kady proces jest taki sam, np. a.out, moe działa na wielu danych MPMD Multiple Program Multiple Data wiele programów, wiele danych, procesy s róne: a.out. b.out, c.out 18

podstawowe 6 funkcji MPI MPI_Init inicjuje obliczenie MPI MPI_Finalize koczy obliczenie MPI MPI_Comm_size podaje liczb procesów MPI_Comm_rank podaje numer mojego procesu MPI_Send nadaje komunikat MPI_Recv odbiera komunikat 19

MPI_Init inicjuje obliczenie MPI, przed t funkcj nie ma adnej innej funkcji MPI MPI_Init (&argc, &argv) 20

MPI_Finalize koczy obliczenie MPI, po tej funkcji nie ma ju adnej innej funkcji MPI MPI_Finalize() 21

MPI_Comm_size podaje liczb procesów MPI_Comm_size(MPI_COMM_WORLD, &size) 22

MPI_Comm_rank podaje numer mojego procesu MPI_Comm_rank(MPI_COMM_WORLD, &rank) 23

MPI_Send nadaje komunikat MPI_Send(void* message, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) 24

MPI_Recv odbiera komunikat MPI_Recv(void* message, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status) 25

#include <stdio.h> #include mpi.h Hello, world! Main(int argc, char** argv) { int my_rank; /* Rank of process */ int p; /* Number of processes */ int source; /* Rank of sender */ int dest; /* Rank of receiver */ int tag = 50 /* Tag for messages */ char message[100];/* Storage for the message */ MPI_Status status;/* Return status for recv */ 26

Hello, world! MPI_Init(&argc, &argv) MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &p); if (my_rank!=0) { sprintf(message, Greetings from process %d!, my_rank); dest = 0; /* Use strlen(message)+1 to include \0 */ MPI_Send(message, strlen(message)+1, MPI_CHAR,dest, tag, MPI_COMM_WORLD); 27

Hello, world! }else {/* my_rank == 0 */ } for (source = 1; source < p; source++) { } MPI_Recv(message, 100, MPI_CHAR, source, tag, MPI_COMM_WORLD, &status); printf( %s\n, message); MPI_Finalize(); } /* main */ 28

Hello, world! po skompilowaniu programu i uruchomieniu w dwóch procesach, wywietlany jest tekst: Greetings from process 1! po uruchomieniu w 4 procesach, wywietla si tekst: Greetings from process 1! Greetings from process 2! Greetings from process 3! 29

zasady uruchamiania programu Hello, world! pod warunkiem, e uruchamiamy jeden proces na kadym procesorze, obowizuj nastpujce zasady: uytkownik wydaje polecenie do systemu operacyjnego, umieszczajce kopi programu wykonywalnego na kadej maszynie kady procesor rozpoczyna wykonywanie programu róne procesy mog wykonywa róne instrukcje przeskakujc w programie, kolejno procesów okrelaj ich numery 30

zasady uruchamiania programu Hello, world! program ten stosuje paradygmat Single Program Multiple Data uzyskujemy efekt rónych programów uruchamianych na rónych procesorach poprzez skakanie w jednym programie zgodnie z numerami procesów instrukcje wykonywane przez proces 0 s inne od instrukcji wykonywanych przez inne procesy, nawet gdy wszystkie procesy wykonuj ten sam program 31

ogólne zasady dot. programów MPI kady program musi zawiera dyrektyw preprocesora: #include "mpi.h plik ten zawiera definicje, makra i prototypy funkcji konieczne dla kompilacji programu MPI 32

ogólne zasady dot. programów MPI przed wywołaniem dowolnej innej funkcji MPI naley wywoła funkcj MPI_Init, i to tylko raz jej argumentami s wskaniki do parametrów funkcjimain, tzn.argc i argv pozwalaj one systemom na wykonanie specjalnego programu inicjujcego, pozwalajcego na wykorzystanie biblioteki MPI 33

ogólne zasady dot. programów MPI po zakoczeniu korzystania programu z biblioteki MPI, program wywołuje MPI_Finalize to czyci nigdy nie odebrane odbiory typowy program MPI ma nastpujc struktur: 34

struktura typowego programu MPI... #include mpi.h main(int argc, char** argv) {... MPI_Init(&argc, &argv);... MPI_Finalize();... } 35

informacja o innych procesach MPI ma funkcj MPI_Comm_Rank, która zwraca numer procesu w drugim argumencie: int MPI_Comm_rank(MPI_Comm comm, int rank) pierwszy argument to komunikator jest to zbiór procesów, które mog midzy sob nadawa komunikaty zazwyczaj jest to predefiniowany komunikator MPI_COMM_WORLD, zawierajcy wszystkie procesy, kiedy rozpoczyna si wykonywanie programu 36

liczba procesów wykonujcych program wiele konstrukcji programowych zaley od liczby procesów wykonujcych program MPI daje funkcjmpi_comm_size, która to zapewnia. Jej pierwszym argumentem jest komunikator, zwraca liczb procesów komunikatora jako drugi argument: int MPI_Comm_size(MPI_Comm comm, int size) 37

przesyłanie komunikatu przesyłanie komunikatu realizuj dwie funkcje: MPI_Send i MPI_Recv MPI_Send nadaje komunikat do wskazanego procesu MPI_Recv odbiera komunikat od procesu aby to si udało, system musi dołczy pewn informacj do nadawanych danych, informacja ta tworzy kopert komunikatu 38

koperta komunikatu koperta zawiera: numer procesu odbiorcy numer procesu nadawcy etykiet (tag) komunikator elementy te moe wykorzysta proces odbiorcy do rozrónienia midzy przychodzcymi komunikatami 39

koperta komunikatu argument source mona uy do rozrónienia komunikatów odebranych od rónych procesów tag do rozrónienia komunikatów odebranych od tego samego procesu komunikatory s szczególnie wane, gdy oddzielne moduły programu s napisane niezalenie. Komunikator pozwala stworzy zbiór procesów korzystajcych z danego narzdzia (np. liniowego solvera przy rozwizywaniu równa róniczkowych) 40

MPI_Send składnia: int MPI_Send(void* message, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) 41

MPI_Recv składnia: int MPI_Recv(void* message, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status) 42

MPI_Send i MPI_Recv tre komunikatu jest zapamitana w bloku pamici wskazanym argumentem message argumentycount i datatype pozwalaj systemowi okreli koniec komunikatu ilo miejsca przydzielona w buforze odbiorczym nie musi odpowiada dokładnie iloci miejsca w odbieranym komunikacie 43

MPI_Send i MPI_Recv proces odbierajcy nie musi zna dokładnego rozmiaru odbieranego komunikatu, jak zabraknie miejsca, wystpi błd przepełnienia argumenty dest i source to numery procesu obierajcego i nadajcego istnieje dzika karta dla dowolnego procesu nadajcego, stała zdefiniowana w MPI_ANY_SOURCE 44

MPI_Send i MPI_Recv MPI posiada dwa mechanizmy przeznaczone do podziału przestrzeni komunikatów: s to etykiety tag i komunikatory comm etykieta tag jest typuint istnieje dzika karta dla etykiety, jest to MPI_ANY_TAG, stosowana przezmpi_recv nie stosuje si dzikiej karty dla komunikatora czyli argument comm, jaki stosuje proces nadajcy w MPI_Send, musi by identyczny z argumentem comm, jaki stosuje proces odbierajcy w MPI_Recv 45

MPI_Send i MPI_Recv argument status wmpi_recv, zwraca informacj o danych, które włanie odebrano odwołuje si on do rekordu, który ma dwa pola, jednosource i drugietag na przykład, jeeli ródłem przy odbiorze jestmpi_any_source, wtedy status zawiera numer procesu nadajcego komunikat 46

komunikacja kolektywna załómy, e program działa na 8 procesorach wszystkie procesy rozpoczynaj wykonywanie programu prawie jednoczenie jednak po wykonaniu podstawowych zada (wywoła MPI_Init, MPI_Comm_Size i MPI_Comm_rank), proces 0 zbiera dane wejciowe, a procesy od 1 do 7 s bezczynne, czekajc na dane od procesu 0 naley to zmieni, wprowadzajc komunikacj o strukturze drzewiastej 47

komunikacja kolektywna jak rozdziela dane? Jak dzieli zadania bardziej równomiernie midzy procesy? naturalnym rozwizaniem jest struktura drzewiasta procesów, z 0 jako korzeniem 48

struktura drzewiasta procesów 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 49

w 1 etapie, 0 nadaje dane do 4 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 50

w drugim etapie, 0 nadaje dane do 2, a 4 nadaje dane do 6 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 51

w 3 etapie, 0 nadaje do 1,2 nadaje do 3, 4 nadaje do 5, a 6 nadaje do 7 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 52

komunikacja o strukturze drzewiastej w ten sposób zredukowano pocztkowe rozdzielanie danych z 7 etapów do 3 etapów w ogólnoci, jeeli mamy p procesów, procedura ta pozwala rozdziela dane wejciowe w log 2 (p) etapach, zamiast w p-1 etapów dla duego p, s to due oszczdnoci 53

rozgłaszanie wzorzec komunikacji, angaujcy wszystkie procesy w komunikatorze, jest komunikacj kolektywn czyli komunikacja kolektywna zazwyczaj angauje wicej ni dwa procesy rozgłaszanie jest komunikacj kolektywn, w której jeden proces nadaje te same dane do kadego procesu 54

rozgłaszanie w MPI int MPI_Bcast(void* message, int count, MPI_Datatype datatype, int root, MPI_Comm comm) nadaje kopi danych w message z procesu root do kadego procesu w komunikatorze comm powinien by wywołany przez wszystkie procesy w komunikatorze z tymi samymi argumentami dla root i comm skutkiem tego, komunikat rozgłaszania nie moe by odbierany przez MPI_Recv 55

rozgłaszanie w MPI parametry count i datatype maj te same funkcje co w MPI_Send i MPI_Recv: okrelaj rozmiar komunikatu jednak inaczej ni w funkcjach od punktu do punktu, MPI wymaga, aby w komunikacji kolektywnej, count i datatype były takie same we wszystkich procesach w komunikatorze przyczyna jest taka, e w pewnych operacjach kolektywnych, jeden proces moe odbiera dane od wielu innych procesów, i aby program mógł okreli, ile danych odebrano, potrzebuje całej tablicy statusów zwrotnych 56

redukcja w fazie sumowania wyników proces 0 ma znowu mnóstwo pracy moemy t prac rozdzieli przez odwrócenie strzałek w drzewie, moemy podzieli zadanie obliczenia sumy midzy poszczególne procesy 57

redukcja 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 58

redukcja w pierwszym etapie proces 1 nadaje swój wynik oblicze do procesu 0, proces 3 nadaje swój wynik do procesu 2, proces 5 nadaje swój wynik do procesu 4, a proces 7 nadaje swój wynik do procesu 6 nastpnie proces 0 dodaje swój wynik do wyniku procesu 1, proces 2 dodaje swój wynik do wyniku procesu 3, itd. 59

redukcja 0 0 4 0 2 4 6 0 1 2 3 4 5 6 7 60

redukcja w drugim etapie proces 2 nadaje sum wyników do procesu 0, proces 6 nadaje sum wyników do procesu 4 proces 0 sumuje swój wynik z sum wyników od procesu 2 proces 4 sumuje swój wynik z sum wyników otrzyman od procesu 6 61

redukcja w trzecim etapie proces 4 nadaje swoj sum (wyniki od procesów 4, 5, 6 i 7) do procesu 0 proces 0 dodaje swoj sum (wyniki od procesów 0, 1, 2 i 3) do sumy otrzymanej od procesu 4 62

redukcja pojawia si pytanie, czy struktura drzewiasta optymalnie wykorzystuje topologi maszyny? to zaley od maszyny, najlepiej to sprawdzi, uruchamiajc MPI obliczenie sumy globalnej jest przykładem klasy komunikacji kolektywnej, zwanej operacj redukcji 63

operacja redukcji w tej operacji wszystkie procesy w komunikatorze wnosz dane, które s przekształcane za pomoc operacji binarnej (dodawanie, max, min, logiczne and) funkcja MPI wykonujca operacj redukcji to: 64

operacja redukcji int MPI_Reduce(void* operand, void* result, int count, MPI_Datatype datatype, MPI_Op op, in root, MPI_Comm comm) MPI_Reduce przekształca argumenty operacji zapamitane w *operand stosujc operacj op i zapamituje wynik w *result w procesie root zarówno operand jak i count odnosz si do lokalizacji pamici okrelanej przez count i typ datatype 65

operacja redukcji MPI_Reduce musi by wywołane przez wszystkie procesy w komunikatorze comm, acount, datatype, i op musz by takie same w kadym procesie 66

operacja redukcji na przykład: int MPI_Reduce(&integral, &total, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); co odpowiada składni: int MPI_Reduce(void* operand, void* result, int count, MPI_Datatype datatype, MPI_Op op, in root, MPI_Comm comm) 67

inne funkcje komunikacji kolektywnej MPI_Barrier MPI_Gather MPI_Scatter MPI_Allgather MPI_Allreduce 68

funkcja MPI_Barrier int MPI_Barrier(MPI_Comm comm) MPI_Barrier zapewnia mechanizm synchronizacji wszystkich procesów w komunikatorze comm kady proces blokuje si (pauzuje) dopóki kady proces w komunikatorze comm nie wywoła MPI_Barrier 69

funkcja MPI_Gather int MPI_Gather(void* send_buf, int send_count, MPI_Datatype send_type, void* recv_buf, int recv_count, MPI_Datatype recv_type, int root, MPI_Comm comm) kady proces wcomm nadaje zawarto bufora send_buf do procesu o numerze root proces root konkatenuje odebrane dane w porzdku okrelanym przez numery procesów w buforze recv_buf, tzn. po danych od procesu 0 s dane od procesu 1, a nastpnie dane od procesu 2, itd. argumenty recv s istotne tylko w procesie root argument recv_count wskazuje liczb elementów odebranych od kadego procesu 70

funkcja MPI_Scatter int MPI_Scatter(void* send_buf, int send_count, MPI_Datatype send_type, void* recv_buf, int recv_count, MPI_Datatype recv_type, int root, MPI_Comm comm) proces o numerze root rozsyła zawarto bufora send_buf midzy procesami zawarto bufora send_buf jest podzielona na p segmentów, z których kady składa si z send_count elementów pierwszy segment przekazany jest do procesu 0, drugi do procesu 1, itd. argumenty send s istotne jedynie w procesie root 71

funkcja MPI_Allgather int MPI_Allgather(void* send_buf, int send_count, MPI_Datatype send_type, void* recv_buf, int recv_count, MPI_Datatype recv_type, int root, MPI_Comm comm) zbiera zawarto kadego bufora send_buf w kadym procesie efekt jest taki sam, jak sekwencji p wywoła MPI_Gather, z których kade ma inny proces jako root 72

funkcja MPI_Allreduce MPI_Allreduce(void* operand, void* result, int count, MPI_Datatype datatype, MPI_Op op, in root, MPI_Comm comm) zapamituje wynik operacji redukcjiop w buforze result kadego procesu 73

grupowanie danych dla komunikacji nadawanie komunikatu jest kosztown operacj, std im mniej komunikatów nadanych, tym lepsza efektywno programu w naszym przykładzie programu trapezowego, komunikaty s przesyłane oddzielnie (za pomoc MPI_Send i MPI_Recv, albo za pomoc MPI_Bcast) 74

grupowanie danych dla komunikacji MPI zapewnia trzy mechanizmy do grupowania pojedynczych elementów danych w jeden komunikat, s to: parametr count do rónych podprogramów wyprowadzane typy danych MPI_Pack/MPI_Unpack 75

parametrcount zauwa, e funkcje MPI_Send i MPI_Recv, MPI_Bcast i MPI_Reduce maj argumenty count i datatype te parametry pozwalaj uytkownikowi grupowa dane majce ten sam typ podstawowy w jeden komunikat warunkiem jest, aby dane były zapamitane w cigłych lokacjach pamici elementy tablicy s pamitane w cigłych lokacjach pamici, moemy wic przesła np. podzbiór tablicy 76

przykład przesłania podzbioru tablicy float vector[100] int tag, count, dest, source; MPI_Status status; int p; int my rank;... 77

przykład przesłania podzbioru tablicy if (my_rank == 0) {... /* Initialize vector and send */ tag = 47; count = 50; dest = 1; MPI_Send(vector + 50, count, MPI_FLOAT, dest, tag,mpi_comm_world); 78

przykład przesłania podzbioru tablicy }else {/*my_rank == 1 */ } tag = 47 count = 50; source = 0 MPI_Recv(vector+50, count, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status); 79

parametrcount to nie pomaga w programie trapezowym dane a, b, n nie s pamitane w cigłych lokacjach pamici nawet gdy deklarujemy po kolei: float a; float b: int n; i deklarujemy n jako float 80

wyprowadzane typy danych konstruktory wyprowadzanych typów danych: gdy róne typy danych: MPI_Type_Struct gdy równe typy danych: MPI_Type_contiguous MPI_Type_vector MPI_Type_indexed 81

MPI_Pack/MPI_Unpack MPI_Pack - jawne zapamitanie danych niecigłych MPI_Unpack kopiowanie danych z bufora cigłego do niecigłych lokacji pamici 82

komunikator mechanizm pozwalajcy traktowa podzbiór procesów jako komunikacyjny wszechwiat dwa typy komunikatorów: intra-komunikator (kolekcja procesów nadajcych komunikaty midzy sob i zaangaowanych w komunikacj kolektywn), np. MPI_COMM_WORLD inter-komunikator do nadawania komunikatów midzy procesami nalecymi do rónych intrakomunikatorów dalej mówimy jedynie o intra-komunikatorach 83

intra-komunikator minimalny intra-komunikator składa si z grupy i kontekstu grupa to uporzdkowany zbiór procesów kiedy grupa składa si z p procesów, kady proces ma unikalny numer, od 0 do p-1 kontekst: etykieta systemowa przydzielona do grupy na procesy w komunikatorze mona nałoy topologi (schemat adresacji) 84

prosty program MPI w jzyku C #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); printf( "Hello, world!\n" ); MPI_Finalize(); return 0; } 85

uwagi o programie MPI w jzyku C musi by zawarty mpi.h funkcje MPI zwracaj albo kod błdu albo MPI_SUCCESS 86

prosty program MPI w jzyku Fortran program main use MPI integer ierr call MPI_INIT( ierr ) print *, 'Hello, world!' call MPI_FINALIZE( ierr ) end 87

uwagi o programie MPI w jzyku Fortran musi by zawartympif.h, albo zastosowany moduł MPI w MPI-2 wszystkie wywołania MPI s do podprogramów, z miejscem na kod zwrotu w ostatnim argumencie 88

uruchamianie programów MPI standard MPI-1 nie specyfikuje, jak uruchamia program MPI uruchamianie zalene od implementacji MPI, wymaga skryptów, argumentów, i zmiennych rodowiskowych standard MPI-2 zaleca stosowanie mpiexec <args>, ale nie jest to obowizujce 89

uzyskanie informacji o rodowisku pytania o rodowisko: jak wiele procesów bierze udział w obliczeniach? którym jestem procesem? odpowiedzi za pomoc funkcji: MPI_Comm_size podaje liczb procesów MPI_Comm_rank podaje numer procesu wywołujcego (midzy 0 a size-1) 90

lepsza wersja programu MPI Hello w jzyku C #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { int rank, size; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); printf( "I am %d of %d\n", rank, size ); MPI_Finalize(); return 0; } 91

lepsza wersja programu MPI Hello w jzyku Fortran program main use MPI integer ierr, rank, size call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, size, ierr ) print *, 'I am ', rank, ' of ', size call MPI_FINALIZE( ierr ) end 92

nadawanie i odbiór w MPI powinnimy okreli szczegóły operacji nadawania i odbioru w MPI: Proces 0 Proces 1 Send(data) Receive(data) 93

nadawanie i odbiór w MPI szczegóły te dotycz tego: jak opisa dane? jak si identyfikuje procesy? jak odbiorca rozpozna komunikaty? kiedy te operacje s zakoczone? 94

pojcia podstawowe procesy mog tworzy grupy kady komunikat jest nadawany w pewnym kontekcie i powinien by odbierany w takim samym kontekcie grupa + kontekst = komunikator proces jest identyfikowany przez numer (rank) w grupie zwizanej z komunikatorem 95

pojcia podstawowe istnieje komunikator domylny, którego grupa zawiera wszystkie procesy pocztkowe, zwanympi_comm_world 96

typy danych MPI dane w komunikacie nadawanym albo odbieranym s opisane trójk (address, count, datatype) typ danych MPI jest rekursyjnie zdefiniowany przez: predefiniowanie odpowiadajce typowi danych w jzyku programowania, np. MPI_INT, MPI_DOUBLE_PRECISION cigł tablic bloku typów danych 97

etykiety MPI komunikaty maj etykiety nadawane przez uytkownika etykieta (tag) jest liczb całkowit, umoliwiajc identyfikacj komunikatu w procesie odbiornika odbiornik moe zrezygnowa z identyfikacji komunikatu podajc MPI_ANY_TAG zamiast etykiety 98

podstawowa operacja blokujcego nadawania MPI_SEND (start, count, datatype, dest, tag, comm) start, count, datatype opisuj bufor komunikatów dest opisuje proces docelowy, jest on numerem tego procesu w komunikatorze, okrelonym przez comm 99

podstawowa operacja blokujcego nadawania po powrocie z tej funkcji, dane s dostarczane do systemu, a bufor si zwalnia do ponownego wykorzystania komunikat wcale nie musi by odebrany przez proces docelowy 100

podstawowa operacja blokujcego odbioru MPI_RECV (start, count, datatype, source, tag, comm, status) czeka a zostanie odebrany z systemu komunikat pasujcy do nadawcy source i etykiety tag 101

podstawowa operacja blokujcego odbioru source jest rang w komunikatorze okrelonym przezcomm, albo dowolnym nadawc wskazanym przez MPI_ANY_SOURCE status zawiera dalsze informacje odbiór mniejszej iloci danych typu datatype ni licznik count jest poprawny, wikszej jest błdem 102

odzyskiwanie dalszej informacji status jest struktur danych przydzielon w programie uytkownika w jzyku C: int recvd_tag, recvd_from, recvd_count; MPI_Status status; MPI_Recv(..., MPI_ANY_SOURCE, MPI_ANY_TAG,..., &status ) recvd_tag = status.mpi_tag; recvd_from = status.mpi_source; MPI_Get_count( &status, datatype, &recvd_count ); 103

odzyskiwanie dalszej informacji status jest struktur danych przydzielon w programie uytkownika w jzyku Fortran: integer recvd_tag, recvd_from, recvd_count integer status(mpi_status_size) call MPI_RECV(..., MPI_ANY_SOURCE, MPI_ANY_TAG,.. status, ierr) tag_recvd = status(mpi_tag) recvd_from = status(mpi_source) call MPI_GET_COUNT(status, datatype, recvd_count, ierr) 104

prosty przykład w Fortranie program main use MPI integer rank, size, to, from, tag, count, i, ierr integer src, dest integer st_source, st_tag, st_count integer status(mpi_status_size) double precision data(10) 105

prosty przykład w Fortranie call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, size, ierr ) print *, 'Process ', rank, ' of ', size, ' is alive' dest = size - 1 src = 0 106

prosty przykład w Fortranie if (rank.eq. 0) then do 10, i=1, 10 data(i) = i 10 continue 107

prosty przykład w Fortranie call MPI_SEND( data, 10, MPI_DOUBLE_PRECISION, + dest, 2001, MPI_COMM_WORLD, ierr) else if (rank.eq. dest) then tag = MPI_ANY_TAG source = MPI_ANY_SOURCE call MPI_RECV( data, 10, MPI_DOUBLE_PRECISION, + source, tag, MPI_COMM_WORLD, + status, ierr) 108

prosty przykład w Fortranie call MPI_GET_COUNT( status, MPI_DOUBLE_PRECISION, st_count, ierr ) st_source = status( MPI_SOURCE ) st_tag = status( MPI_TAG ) print *, 'status info: source = ', st_source, + ' tag = ', st_tag, 'count = ', st_count endif call MPI_FINALIZE( ierr ) end 109

dlaczego typy danych? poniewa wszystkie dane s etykietowane przez typ, implementacja MPI obsługuje komunikacj pomidzy procesami na maszynach o rónych reprezentacjach pamici i o rónych długociach elementarnych typów danych, czyli komunikacj heterogeniczn 110

dlaczego typy danych? specyfikacja układu danych w pamici zorientowanych na aplikacj zmniejsza ilo kopiowa z pamici do pamici pozwala zastosowa specjalistyczny sprzt do i rozdzielania i zbierania danych 111

etykiety czasowe separacja komunikatów zwykle jest uzyskiwana za pomoc etykiet czasowych to wymaga, aby biblioteki były wiadome etykiet czasowych pochodzcych z innych bibliotek mona to pokona za pomoc dzikich etykiet czasowych etykiety czasowe definiowane przez uytkownika dla zorganizowania aplikacji 112

konteksty róni si od etykiet czasowych niedopuszczalne s dzikie etykiety czasowe s przydzielane dynamicznie przez system, kiedy biblioteka ustanawia komunikator dla samej siebie nowe komunikatory tworzone za pomoc MPI_COMM 113

operacje zbiorowe w MPI operacje zbiorowe s wywoływane przez wszystkie procesy w komunikatorze MPI_BCAST rozsyła dane z jednego procesu korzenia do wszystkich innych procesów w komunikatorze MPI_REDUCE łczy dane ze wszystkich procesów w komunikatorze i zwraca do jednego procesu w wielu algorytmach numerycznych operacje SEND/RECEIVE s zastpowane przez operacje BCAST/REDUCE 114

przykład PI w Fortranie program main use MPI double precision PI25DT parameter (PI25DT = 3.141592653589793238462643d0) double precision mypi, pi, h, sum, x, f, a integer n, myid, numprocs, i, ierr c function to integrate f(a) = 4.d0 / (1.d0 + a*a) call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) 10 if ( myid.eq. 0 ) then write(6,98) 98 format('enter the number of intervals: (0 quits)') read(5,99) n 99 format(i10) endif 115

przykład PI w Fortranie call MPI_BCAST( n, 1, MPI_INTEGER, 0, + MPI_COMM_WORLD, ierr) c check for quit signal if ( n.le. 0 ) goto 30 c calculate the interval size h = 1.0d0/n sum = 0.0d0 do 20 i = myid+1, n, numprocs x = h * (dble(i) - 0.5d0) sum = sum + f(x) 20 continue mypi = h * sum c collect all the partial sums call MPI_REDUCE( mypi, pi, 1, MPI_DOUBLE_PRECISION, + MPI_SUM, 0, MPI_COMM_WORLD,ierr) 116

przykład PI w Fortranie c node 0 prints the answer if (myid.eq. 0) then write(6, 97) pi, abs(pi - PI25DT) 97 format(' pi is approximately: ', F18.16, + ' Error is: ', F18.16) endif goto 10 30 call MPI_FINALIZE(ierr) end 117

przykład PI w jzyku C #include "mpi.h" #include <math.h> int main(int argc, char *argv[]) { int done = 0, n, myid, numprocs, i, rc; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, a; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); while (!done) { if (myid == 0) { printf("enter the number of intervals: (0 quits) "); scanf("%d",&n); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) break; 118

przykład PI w jzyku C } h = 1.0 / (double) n; sum = 0.0; for (i = myid + 1; i <= n; i += numprocs) { x = h * ((double)i - 0.5); sum += 4.0 / (1.0 + x*x); } mypi = h * sum; MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (myid == 0) printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); } MPI_Finalize(); return 0; 119

alternatywny zbiór funkcji w uproszczonym MPI MPI_INIT MPI_FINALIZE MPI_COMM_SIZE MPI_COMM_RANK MPI_BCAST MPI_REDUCE 120

ródła zakleszcze nadaj duy komunikat od procesu 0 do procesu 1 jeeli u odbiorcy jest zbyt mało pamici, operacjasend musi czeka, a uytkownik zwolni miejsce w pamici za pomoc operacji receive 121

ródła zakleszcze co si stanie, kiedy: Process 0 Process 1 Send(1) Recv(1) Send(0) Recv(0) tak wymian okrela si jako niebezpieczn, poniewa zaley ona od dostpnoci buforów w systemie 122

rozwizanie problemu niebezpiecznej wymiany staranniejsze uporzdkowanie operacji: Process 0 Send(1) Recv(1) Process 1 Recv(0) Send(0) 123

rozwizanie problemu niebezpiecznej wymiany zastosowanie operacji nieblokujcej Process 0 Isend(1) Irecv(1) Waitall Process 1 Isend(0) Irecv(0) Waitall 124

przenone rodowisko MPI MPICH efektywna przenona implementacja MPI działa na MPP, klastrach i w heterogenicznych sieciach stacji roboczych 125

przenone rodowisko MPI w celu jego postawienia, skompilowania, uruchomienia i dokonania analizy działania, naley wykona polecenia: configure make mpicc -mpitrace myprog.c mpirun -np 10 myprog upshot myprog.log 126

rozszerzenia MPI dynamiczne zarzdzanie procesami dynamiczny start procesu dynamiczne nawizanie połcze komunikacja jednostronna put/get inne operacje równoległe we/wy 127

rozszerzenia MPI cechy MPI-2 dania uogólnione wizania dla C++ i Fortranu 90 kwestie współpracy midzy jzykami 128

kiedy stosowa MPI? dla przenoszalnoci i efektywnoci przy nieregularnych strukturach danych budujc narzdzia dla innych (biblioteki) przy zarzdzaniu pamici dla kadego procesu 129

kiedy nie stosowa MPI? gdy rozwizanie (biblioteka) ju istnieje wymaga tolerancji na błdy przetwarzanie rozproszone (CORBA, DCOM) 130

wnioski rodowisko przetwarzania równoległego współpracuje w celu rozwoju normy dla bibliotek MPI jest wiele implementacji, prawie na wszystkie platformy podzbiory MPI s łatwe do nauczenia i wykorzystania jest wiele materiałów nt. MPI 131