Wprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania. Matematycznego i Komputerowego Uniwersytet Warszawski
|
|
- Patryk Stankiewicz
- 6 lat temu
- Przeglądów:
Transkrypt
1 Wprowadzenie do MPI Matematycznego i Komputerowego Uniwersytet Warszawski Maciej Cytowski m.cytowski@icm.edu.pl Maciej Szpindler m.szpindler@icm.edu.pl Wprowadzenie do MPI 1
2 Podziękowania Pomysły i przykłady zaczerpnięte z materiałów szkoleniowych HLRS, Rolf Rabenseifner Wykorzystane materiały z Biuletynu KDM (ICM) /01/15
3 Środowisko szkoleniowe Konta: kdmszk01,, kdmszk10 (lub własny login) Hasło: zapisane na tablicy Komputer obliczeniowy: nostromo, hydra Sposób logowania: 1. Logowanie na komputerach w laboratorium. 2. ssh login.icm.edu.pl 3. Zgodnie z poleceniem zadaniowym. Materiały szkoleniowe: Wprowadzenie do MPI 2014/01/15 3
4 Plan Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point, zadanie ping_pong Komunikacja nieblokująca, zadanie ring Typy danych MPI, zadanie ring_derived Konstrukcja wirtualnych topologii w MPI, zadanie ring_cart Komunikacja grupowa, zadanie ring_coll MPI-2 oraz MPI-3 przegląd, zadania mpi_ver i ring_dgraph Podsumowanie Wprowadzenie do MPI 2014/01/15 4
5 Wstęp Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 5
6 Wstęp: różne pojęcia równoległości Różne podejścia do sprzętowego zrównoleglenia przetwarzania Wektoryzacja (pipelining) na poziomie procesora Duplikacja jednostek przetwarzania np. FPU na poziomie procesora Wiele wątków (multi/hyper-threading) na poziomie procesora Wiele rdzeni (multi-core) na poziomie procesora Wiele procesorów (ccnuma*) na poziomie systemu (pojedynczego komputera) Bardzo wiele procesorów (klastry serwerów, MPP**) Implikacje Wielowątkowość/procesorowość, wspólny dostęp do pamięci --programowanie w modelu pamięci współdzielonej Klastry, sieć procesorów, pamięć rozproszona -- programowanie w modelu pamięci rozproszonej 6 *cache coherent Non-Uniform Memory Access ** Masively Parallel Processing 2014/01/15
7 Wstęp: model pamięci współdzielonej Wszystkie procesory współdzielą tą samą przestrzeń adresową Dostęp do pamięci może być Jednorodny (UMA) np. BlueGene/Q Niejednorodny (ccnuma) większość klastrów Dziś większość komputerów zawiera kilka rdzeni (UMA) Lub nawet kilka procesów wielordzeniowych (ccnuma) /01/15
8 Wstęp: model pamięci rozproszonej Poszczególne procesory (węzły) posiadają prywatną pamięć i są połączone siecią Komunikacja odbywa się poprzez jawną wymianę danych przez sieć Dziś większość klastrów posiada węzły wieloprocesorowe (ccnuma) Dwa typy równoległości: rozproszona między węzłami sieci, współdzielona w ramach jednego węzła /01/15
9 sieć komputerowa Wstęp: modele programowania Pamięć współdzielona (Shared Memory) OpenMP Dyrektywy kompilatora Standard Biblioteki wielowątkowe programowanie z użyciem wątków Pthreads, TBB, Shmem Pamięć rozproszona (Distributed Memory) CPU CPU pamięć CPU CPU CPU CPU pamięć pamięć MPI Message Passing Interface CPU pamięć Biblioteka do wymiany komunikatów przez sieć CPU pamięć PGAS (Partitioned Global Address Space) UPC Co-array Fortran CPU CPU pamięć pamięć Global Arrays CPU co-array pamięć CPU pamięć /01/15
10 Wstęp: strategie zrównoleglania obliczeń Zrównoleglenie może dotyczyć Pamięci Procesora Strategie dekompozycji obliczeń Podział zadań pomiędzy procesory (task model) Podział danych pomiędzy rozproszoną pamięć (data decomposition) Wymaga to zapewnienia Komunikacja między procesorami Synchronizacji pamięci /01/15
11 MPI - Podstawy Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 11
12 Message Passing Interface - Podstawy Biblioteka MPI Model równoległości w MPI Komunikator Pobieranie informacji z komunikatora Startowanie i zamykanie sesji MPI Komunikaty Podstawowe typy danych w MPI Przesyłanie wiadomości Wprowadzenie do MPI 2014/01/15 12
13 13 Podstawy: Biblioteka MPI MPI - Message Passing Interface Biblioteka do tworzenia programów równoległych zgodna ze standardem MPI Standard ustala MPI-Forum Pracuje natywnie z C,C++,Fortranem Faktyczny standard programowania w oparciu o wymianę komunikatów MPI-1 (Wersje 1.1, 1.2) wprowadza około 150 funkcji MPI-2 (Wersje 2.1, 2.2) rozszerzona o nową funkcjonalność, razem ponad 500 funkcji MPI-3 (Wersja 3.0) Składa się z zestawu procedur i funkcji Najnowsza wersja standardu: Różne implementacje MPICH OpenMPI Intel MPI, HP MPI, IBM PE komercyjne implementacje Wprowadzenie do MPI 2014/01/15 13
14 Podstawy: model równoległości Założenia Pamięć jest rozproszona, prywatna dla każdego procesu Procesy wymieniają się komunikatami Jawna równoległość Model procesowy Proces odpowiada fizycznej jednostce obliczeniowej Program składa się z procesów podprogramów działających na poszczególnych procesorach Typowo model SPMD Single Program Multiple Data Ten sam podprogram pracuje na każdym procesorze Napisany w tradycyjnym języku + wywołania biblioteki MPI Model MIMD mniej popularny, ale również wspierany Wprowadzenie do MPI 2014/01/15
15 Podstawy: model SPMD SPMD Single Program Multiple Data Model zakładający dekompozycje danych Każdy proces (podprogram) wykonują identyczny zestaw operacji ale na innym zbiorze danych Wymaga dekompozycji problemu na szereg identycznych podproblemów Najpopularniejszy model zrównoleglania dla MPI /01/15
16 Podstawy: komunikator Podstawowa struktura programu równoległego używającego MPI Komunikator zbiór procesów mogących się wzajemnie komunikować W ramach komunikatora każdy proces otrzymuje unikalny identyfikator (numer) tzw. rank Informacja o komunikatorze zawarta jest w zmiennej typu MPI_COMM W czasie inicjacji programu biblioteka tworzy domyślny komunikator o nazwie MPI_COMM_WORLD zawierający wszystkie dostępne procesy Programista może definiować własne komunikatory zawierające podzbiory procesów Wprowadzenie do MPI 2014/01/15 16
17 Podstawy: pobieranie informacji z komunikatora Liczba (np) dostępnych procesów w ramach komunikatora MPI_Comm_size(MPI_COMM_WORLD, &np) Numer (rank) mojego procesu MPI_Comm_rank(MPI_COMM_WORLD,&rank) C: (Uwaga Fortran) rank = 0,..., np 1 int MPI_Comm_size ( MPI_Comm comm, int *np ); int MPI_Comm_rank ( MPI_Comm comm, int *rank ); Fortran: CALL MPI_COMM_SIZE ( integer comm, integer np, integer ierror ) CALL MPI_COMM_RANK ( integer comm, integer rank, integer ierror ) Wprowadzenie do MPI 2014/01/15 17
18 Podstawy: startowanie i zamykanie sesji Wywołania wszelkich funkcji i procedur biblioteki MPI muszą znajdować się pomiędzy instrukcjami: MPI_Init(&argc, &argv) Inicjuje działanie biblioteki i domyślnego komunikatora (sesję) MPI_Finalize(void) Kończy działanie sesji MPI Funkcje Init i Finalize muszą być wywołane przez wszystkie procesy w ramach sesji C: int MPI_Init ( int *argc, int **argv ); int MPI_Finalize ( ); Fortran: CALL MPI_INIT( integer ierror ) CALL MPI_FINALIZE ( integer ierror ) Wprowadzenie do MPI 2014/01/15 18
19 Podstawy: komunikaty Komunikat paczka danych przesyłana pomiędzy procesami przez łącze / sieć łącząca procesory w ramach komunikatora Paczka składa się z ustalonej liczby elementów określonego typu Aby przesłać paczkę należy zdefiniować: Komunikator Identyfikator (rank) procesu wysyłającego Identyfikator (rank) procesu odbierającego Adres źródłowy i adres docelowy Typ i wielkość danych przesyłanych w paczce Komunikator Nadawca Adres Typ i rozmiar Etykieta Odbiorca Adres /01/ Wprowadzenie do MPI 19
20 Podstawy: podstawowe typy danych MPI definiuje własne typy danych, które powinny być odpowiednikami typów w C Dodatkowo MPI_BYTE oraz MPI_PACKED Typ MPI Typ języka C Typ MPI Typ Fortran MPI_CHAR signed char MPI_INTEGER INTEGER MPI_SHORT signed short int MPI_REAL REAL MPI_INT MPI_LONG MPI_UNSIGNED_CHAR signed int signed long int unsigned char MPI_DOUBLE_PRECISION MPI_COMPLEX DOUBLE PRECISION COMPLEX MPI_UNSIGNED_SHORT unsigned short int MPI_LOGICAL LOGICAL MPI_UNSIGNED unsigned int MPI_CHARACTER CHARACTER(1) MPI_UNSIGNED_LONG unsigned long int MPI_FLOAT float MPI_DOUBLE double 20 MPI_LONG_DOUBLE long double Wprowadzenie do MPI 2014/01/15
21 Podstawy: przesyłanie komunikatów Podstawowa metoda przesłania komunikatu pomiędzy dwoma procesami Nadawca wywołuje funkcję Send Odbiorca wywołuje funkcję Receive Poszczególne komunikaty odróżnia etykieta (tag) MPI_Send / MPI_Recv to funkcje blokujące tzn. blokują dalsze wykonanie programu do czasu zakończenia komunikacji Wprowadzenie do MPI 2014/01/15 21
22 Podstawy: wysyłanie wiadomości buf adres tablicy zawierającej wiadomość długości count, zawierającej elementy typu datatype dest numer (rank) procesu odbierającego w ramach komunikatora comm tag etykieta wiadomości C: int MPI_Send ( void *buf, int count, MPI_Datatype datatype, \ int dest, int tag, MPI_Comm comm ); Fortran: CALL MPI_SEND ( <type> buf, integer count, integer datatype, integer dest, integer tag, integer comm, integer ierror ) Wprowadzenie do MPI 2014/01/15 22
23 Podstawy: odbieranie wiadomości buf adres tablicy zawierającej wiadomość długości count, zawierającej elementy typu datatype source numer (rank) procesu wysyłającego w ramach komunikatora comm status zawiera informacje o komunikacji (struktura zawierająca MPI_SOURCE i MPI_TAG) Jedynie wiadomość o zgodnej etykiecie (tag) zostanie odebrana C: int MPI_Recv ( void *buf, int count, MPI_Datatype datatype, \ int source, int tag, MPI_Comm comm, \ MPI_Status *status); Fortran: CALL MPI_RECV ( <type> buf, integer count, integer datatype, integer source, integer tag, integer comm, integer status, integer ierror ) Wprowadzenie do MPI 2014/01/15 23
24 Zadanie 1 POWITANIE 2014/01/15 24 Wprowadzenie do MPI
25 Pierwszy program Zadanie: wyróżniony proces (0) odbiera i wypisuje komunikaty wysyłane przez pozostałe procesy (1,2,,n) w ramach komunikatora n recv & write send /01/ Wprowadzenie do MPI 25
26 Pierwszy program: pliki nagłowkowe C: Pliki nagłówkowe #include <mpi.h> Fortran 90: use mpi Fortran 77: include mpif.h Wprowadzenie do MPI 2014/01/15 26
27 Pierwszy program: inicjalizacja MPI C: Wspólna część programu int main(int argc, char** argv) { int numranks, src, dest, myrank; int tag = 1; char mes[50]; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Comm_size(MPI_COMM_WORLD, &numranks); MPI_Finalize(); } return 0; Wprowadzenie do MPI 2014/01/15 27
28 Pierwszy program: proces 0 Część programu wykonywana przez proces odbierający (0) C: for (src = 1; src < numranks; src++) { MPI_Recv(mes, 50, MPI_CHAR, src, tag, \ MPI_COMM_WORLD, &status); } printf("%s\n", mes); Wprowadzenie do MPI 2014/01/15 28
29 Pierwszy program: pozostałe procesy 2,, n Część programu wykonywana przez pozostałe procesy C: sprintf(mes, "Halo, tu proces %d", myrank); dest = 0; MPI_Send(mes, strlen(mes) + 1, MPI_CHAR, dest, tag, \ MPI_COMM_WORLD); Wprowadzenie do MPI 2014/01/15 29
30 Pierwszy program: kompletny program int main(int argc, char** argv) { Kompletny program int numranks, src, dest, myrank; int tag = 1; char mes[50]; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Comm_size(MPI_COMM_WORLD, &numranks); } if ( myrank!= 0 ) { sprintf(mes, "Halo, tu proces %d", rank); dest = 0; MPI_Send(mes, strlen(mes) + 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); } else { } for (src = 1; src < numranks; src++) { MPI_Recv(mes, 50, MPI_CHAR, src, tag, MPI_COMM_WORLD, &status); printf("%s\n", mes); } MPI_Finalize(); return 0; Wprowadzenie do MPI 2014/01/15 30
31 Jak uruchomić pierwszy program? Zaloguj się do sieci ICM, zgodnie z instrukcją. Klaster hydra Zgodnie z kolejnym slajdem (interaktywnie) Tak jak na BlueGene (poprzez system kolejkowy) BlueGene nostromo Tylko poprzez system kolejkowy Logowanie: ssh nostromo Wylogowanie: exit /01/15
32 Pierwszy program: kompilacja i uruchomienie Ustawienie środowiska >> module load hydra-sl6 >> srun --pty bash -l >> module load mpi/mpich TYLKO HYDRA Kompilacja >> mpicc powitanie.c Uruchomienie >> mpiexec -np 4./a.out TYLKO HYDRA /01/ Wprowadzenie do MPI 32
33 Uruchomienie w systemie kolejkowym Definicja zadania dla systemu kolejkowego (skrypt kolejowy SLURM) powitanie.sl: #!/bin/csh #SBATCH --time=00:10:0 #SBATCH --nodes=1 #SBATCH --job-name=powitanie #SBATCH --output= powitanie.out" #SBATCH --error= powitanie.err" #SBATCH --account=szkolenia srun --ntasks-per-node 4./a.out Wstawienie zadania do kolejki >> sbatch powitanie.sl Wprowadzenie do MPI 2014/01/15 33
34 Uruchomienie w systemie kolejkowym (2) Ustawienie środowiska >> module load mpi/xl TYLKO NOSTROMO Kompilacja >> mpicc powitanie.c Przygotowanie skryptu kolejkowego Wstawienie zadania do kolejki >> sbatch --reservation szkolenie powitanie.sl /01/ Wprowadzenie do MPI 34
35 Pierwszy program: kolejność komunikatów Załóżmy, że zamiast odbierać komunikaty od procesów o numerach 1,,numranks-1 kolejno odbieramy od dowolnego procesu, który w danym momencie nadaje komunikat: C: for (src = 1; src < numranks; src++) { MPI_Recv(mes, 50, MPI_CHAR, MPI_ANY_SOURCE, tag, \ MPI_COMM_WORLD, &status); } printf("%s\n", mes); Wprowadzenie do MPI 2014/01/15 35
36 Komunikacja dwustronna Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 37
37 Komunikacja point-to-point Najprostsza forma komunikacji Proces wysyła komunikat do innego wybranego procesu Różne tryby komunikacji point-to-point (blokującej) Standardowa - MPI_Send Synchroniczna - MPI_Ssend Asynchroniczna / buforowana - MPI_Bsend Ready send - MPI_Rsend różnią się tym jak restrykcyjna ma być synchronizacja Wszystkie powyższe tryby są blokujące wysyłanie kończy się w momencie gdy użytkownik może bezpiecznie odczytać i modyfikować bufor wejściowy (tablicę zawierającą komunikat) Odbieranie MPI_Recv działa ze wszystkimi trybami wysyłania Wprowadzenie do MPI 2014/01/15 38
38 Komunikacja point-to-point : tryby wysyłania komunikatów Tryb wysyłania Synchroniczny MPI_Ssend Standardowy MPI_Send Działanie Pełna synchronizacja, nie zakłada wcześniejszego wywołania MPI_Recv, zakończy wykonanie, gdy odbiorca rozpocznie odbieranie Wysyłanie blokujące, biblioteka decyduje o użyciu wewnętrznego bufora Buforowany MPI_Bsend Ready send MPI_Rsend Korzysta z bufora użytkownika, nie wymaga wcześniejszego wywołanie MPI_Recv, zakończy wykonanie po umieszczeniu wiadomości w buforze Zakłada wcześniejsze wywołanie MPI_Recv Wprowadzenie do MPI 2014/01/15 39
39 40 Komunikacja point-to-point : tryby wysyłania komunikatów (2) Generyczny MPI_Send Biblioteka MPI zadecyduje o trybie wysyłki Zapewnia minimalny czas transferu Wysyłanie buforowane MPI_Bsend Wymaga zapewnienia przez użytkownika bufora odpowiedniej wielkości MPI_Buffer_attach tworzy bufor, MPI_Buffer_detach zwalnia bufor W przypadku przepełnienia bufora nastąpi błąd Niskie opóznienie kosztem przepustowości Synchroniczne wysyłanie MPI_Ssend Ryzyko zakleszczenia Najlepsza przepustowość kosztem opóźnień lub przestojów Ready send MPI_Rsend Zakończy się błędem, jeżeli nie wystąpi wcześniej odpowiednie wywołanie MPI_Recv Niebezpieczne dla poprawności, nie zalecane do użycia Potencjalnie najszybsze Wprowadzenie do MPI 2014/01/15 40
40 Komunikacja wieloznaczna Odbiorca może odbierać komunikaty w niezdefiniowanej kolejności Od dowolnego odbiorcy (rank): MPI_ANY_SOURCE Z dowolną etykietą (tag): MPI_ANY_TAG Faktyczny identyfikator nadawcy / tag odbiorca może odczytać z parametru status zwracanego przez MPI_Recv MPI_Probe pozwala na uzyskanie informacji o komunikacie bez odbierania go (przed wywołaniem MPI_Recv), informacja zwracana jest poprzez parametr status C: int MPI_Probe (int source, int tag, MPI_Comm comm, \ MPI_Status *status); Fortran: CALL MPI_PROBE (INTEGER SOURCE, TAG, COMM, STATUS(MPI_STATUS_SIZE), IERROR) /01/15
41 Zadanie 2 PING_PONG 2014/01/15 42
42 Program ping pong Zadanie: dwa procesy komunikują się naprzemiennie. Pierwszy proces (0) wysyła wiadomość (np. liczbę 1) do drugiego procesu (1). Następnie wiadomość jest odsyłana z powrotem. Schemat powtarzamy kilkakrotnie. send recv 0 1 recv send /01/15
43 Program ping pong (2) Użyj trybu MPI_Ssend C: MPI_Ssend(&snd_buf, 1, MPI_INT, dest, ping_tag, \ MPI_COMM_WORLD); MPI_Recv(&rcv_buf, 1, MPI_INT, source, pong_tag, \ MPI_COMM_WORLD, &stat); Co można zaobserwować? Jak sobie z tym poradzić? /01/15
44 Komunikacja nieblokująca Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 45
45 Blokada (deadlock) 0 Wywołuje: MPI_Ssend i czeka aż odbiorca (1) rozpocznie odbieranie 1 Wywołuje: MPI_Ssend i czeka aż odbiorca (2) rozpocznie odbieranie 46 Nikt nie odbiera! Komunikacja odbywa się w trybie blokującym Ssend czeka na rozpoczęcie odbierania (Recv) Rozwiązanie Wywołać Send/Recv naprzemiennie Użyć funkcji MPI_Sendrecv Użyć komunikacji nieblokującej 2014/01/15
46 Komunikacja nieblokująca zwróć wykonanie do procesu od razu i pozwól na wykonywanie innej pracy w dalszej części proces powinien sprawdzić (test) lub poczekać (wait) na zakończenie operacji nieblokującej są to operacje wymagane operacja nieblokująca + następująca po niej od razu operacja wait = operacja blokująca stosowane w celu uniknięcia impasów (blokad, z ang. deadlocks) oraz bezczynności Wprowadzenie do MPI 2014/01/15 47
47 Komunikacja nieblokująca (2) 48 Komunikacja realizowana w 3 krokach: 1. inicjalizacja nieblokującej komunikacji natychmiast zwraca wykonanie do procesu nazwa funkcji rozpoczyna się od MPI_I (immediate) 2. wykonanie pracy, obliczenia, inna komunikacja 3. czekanie na zakończenie komunikacji nieblokującej Nieblokujące wysłanie: MPI_Isend( ) //wykonanie pracy MPI_Wait( ) Nieblokujący odbiór: MPI_Irecv( ) //wykonanie pracy MPI_Wait( ) Wprowadzenie do MPI 2014/01/15 48
48 Komunikacja nieblokująca: wysłanie C: int MPI_Isend( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Wait ( MPI_Request *request, MPI_Status *status ); Fortran: CALL MPI_ISEND( choice buf, integer count, integer datatype, integer dest, integer tag, integer comm, integer request, integer ierror ) CALL MPI_WAIT( integer request, integer status(mpi_status_size), integer ierror ) 49 UWAGA: buf nie powinien być używany pomiędzy Isend a operacją wait Isend + Wait następujące bezpośrednio po sobie jest równoważne odpowiedniemu trybowi blokującemu Wprowadzenie do MPI 2014/01/15 49
49 Komunikacja nieblokująca: odbiór C: int MPI_Irecv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Wait ( MPI_Request *request, MPI_Status *status ); Fortran: CALL MPI_ISEND( choice buf, integer count, integer datatype, integer source, integer tag, integer comm, integer request, integer ierror ) CALL MPI_WAIT( integer request, integer status(mpi_status_size), integer ierror ) UWAGA: buf nie powinien być używany pomiędzy Irecv a operacją wait Wprowadzenie do MPI 2014/01/15 50
50 Komunikacja nieblokująca: uwaga na Fortran! Kompilatory Fortran wykorzystują intensywną optymalizację (tzw. Register Optimization) zmieniająca kod programu bez naszej wiedzy Kod: CALL MPI_IRECV( buf,, request, ierror) CALL MPI_WAIT(request, status, ierror ) WRITE(*,*) buf Może zostać zamieniony na: CALL MPI_IRECV( buf,, request, ierror) registera = buf CALL MPI_WAIT(request, status, ierror ) WRITE(*,*) registera Potencjalne źródło błędów trudnych do wykrycia Rozwiązanie: wywołać MPI_Get_address(buf, ) bezpośrednio po MPI_Wait /01/15
51 Komunikacja nieblokująca: synchronizacja Oczekiwanie na zakończenie operacji nieblokujących: z użyciem blokującej funkcji MPI_Wait z użyciem pętli, w której sprawdzamy wartość flagi zwróconej z wywołania funkcji MPI_Test (flag == 1 lub.true.) C: int MPI_Wait ( MPI_Request *request, MPI_Status *status ); int MPI_Test ( MPI_Request *request, int *flag, MPI_Status *status); Fortran: CALL MPI_WAIT( integer request, integer status(mpi_status_size), integer ierror ) CALL MPI_TEST( integer request, integer flag, integer status(mpi_status_size), integer ierror) Wprowadzenie do MPI 2014/01/15 52
52 Komunikacja nieblokująca: request handles Zmienne typu MPI_Request (Fortran - Integer) służą do synchronizacji komunikacji nieblokującej Muszą być zmiennymi lokalnymi Wartość zmiennej typu request jest generowana przez nieblokująca funkcję komunikacyjną używana i zwalniana przesz funkcję MPI_Wait /01/15
53 Komunikacja nieblokująca i blokująca Wysyłanie i obieranie może być blokujące lub nieblokujące Blokujące wysyłanie może być użyte z nieblokującym odbieraniem i viceversa Nieblokujące wysyłanie może używać trybów analogicznych do blokującego Generyczne MPI_Isend Synchroniczne MPI_Issend Buforowane MPI_Ibsend Ready send MPI_Irsend W każdym z tych trybów sterowanie jest zwracane od razu (immediate) do programu Operacja nieblokująca i bezpośrednio następujące wait jest równoważne analogicznej operacji blokującej /01/15
54 Komunikacja nieblokująca: wiele komunikatów Kilka funkcji operujących na grupie komunikacji nieblokujących: poczekaj na zakończenie lub sprawdź status jednej wiadomości z grupy: int MPI_Waitany(int count,mpi_request array_of_requests[],int *index, MPI_Status *status ) int MPI_Testany(int count,mpi_request array_of_requests[],int *index, int *flag, MPI_Status *status ) poczekaj na zakończenie lub sprawdź status wszystkich wiadomości z grupy: int MPI_Waitall(int count,mpi_request array_of_requests[],mpi_status array_of_statuses[] ) int MPI_Testall(int count,mpi_request array_of_requests[],int *flag, MPI_Status array_of_statuses[] ) poczekaj na zakończenie lub sprawdź status tylu wiadomości ile jest możliwe: int MPI_Waitsome(int incount,mpi_request array_of_requests[],int *outcount,int array_of_indices[],mpi_status array_of_statuses[]) int MPI_Testsome(int incount,mpi_request array_of_requests[],int *outcount,int array_of_indices[],mpi_status array_of_statuses[]) Wprowadzenie do MPI 2014/01/15 55
55 Zadanie 3 KOMUNIKACJA W PIERŚCIENIU PROCESÓW 2014/01/15 56
56 Program ring Zadanie: Procesy 0,1,,n komunikują się kolejno przesyłając sobie swój rank z zapętleniem (n-ty wysyła do 0-wego). snd_buf snd_buf 1 rcv_buf rcv_buf Następnie zapamiętują otrzymaną wartość. 0 sum 2 Wymianę powtarzają n-razy za każdym razem sumując otrzymaną wartość z poprzednio zapamiętaną. Wskazówka dla numerowania odbiorców/nadawców: 3 dest = (myrank+1) % numranks; source = (myrank-1+numranks) % numranks; /01/15
57 Typy danych w MPI Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 58
58 Typy danych w MPI Typy określają sposób ułożenia przesyłanych i odbieranych wiadomości w pamięci int MPI_Isend(&buf,1,MPI_FLOAT,0,tag,MPI_COMM_WORLD,&req); Rozróżniamy: typy podstawowe zdefiniowane w ramach biblioteki MPI MPI_CHAR, MPI_SHORT, MPI_INT, MPI_LONG, MPI_UNSIGNED_CHAR, MPI_UNSIGNED_SHORT, MPI_UNSIGNED, MPI_UNSIGNED_LONG, MPI_FLOAT, MPI_DOUBLE, MPI_LONG_DOUBLE, MPI_BYTE typy upakowane, specyfikowane przez MPI_PACKED typy definiowalne, np. wektory, struktury, inne Wprowadzenie do MPI 2014/01/15 59
59 Typy danych: typy podstawowe Typ MPI Typ języka C Typ MPI Typ Fortran MPI_CHAR signed char MPI_INTEGER INTEGER MPI_SHORT signed short int MPI_REAL REAL MPI_INT signed int MPI_DOUBLE_PRECISION DOUBLE PRECISION MPI_LONG signed long int MPI_COMPLEX COMPLEX MPI_UNSIGNED_CHAR unsigned char MPI_LOGICAL LOGICAL MPI_UNSIGNED_SHORT unsigned short int MPI_CHARACTER CHARACTER(1) MPI_UNSIGNED unsigned int MPI_BYTE MPI_UNSIGNED_LONG unsigned long int MPI_PACKED MPI_FLOAT float MPI_DOUBLE double MPI_LONG_DOUBLE long double MPI_BYTE 60 MPI_PACKED Wprowadzenie do MPI 2014/01/15 60
60 Typy danych: typy MPI Typ danych wyspecyfikowany w komendzie send powinien dokładnie odpowiadać typowi wyspecyfikowanemu w komendzie recv MPI_BYTE = 8 znaków binarnych MPI_PACK umożliwia pakowanie elementów różnych typów do jednego bufora MPI_PACK może również reprezentować dowolny typ danych Jeśli nasza wiadomość nie jest tablicą elementów określonego typu, tylko niejednorodną wiadomością zawierająca np. dwie liczby całkowite i tablicę liczb zmiennoprzecinkowych, wówczas musimy skorzystać z jednego z dwóch mechanizmów tworzenia takich wiadomości: pakowanie danych tworzenie własnych typów danych MPI Wprowadzenie do MPI 2014/01/15 61
61 Typy danych: Pakowanie danych MPI udostępnia możliwość przesłania bufora pamięci zawierającego spakowane elementy różnych typów Przesłanie takiego elementu wykonujemy przy użyciu typu MPI_PACKED Aby wykorzystać ten mechanizm należy: Spakować dane za pomocą funkcji MPI_PACK Przesłać bufor pamięci za pomocą komendy send Odebrać bufor pamięci za pomocą komendy recv Rozpakować dane za pomocą komendy MPI_UNPACK Rozwiązanie dosyć wygodne, ale związane z kopiowaniem danych do nowego miejsca w pamięci Wprowadzenie do MPI 2014/01/15 62
62 Typy danych: Pakowanie danych (2) C: int MPI_Pack ( void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, int outcount, int *position, MPI_Comm comm ) Fortran: CALL MPI_PACK(choice inbuf, integer incount, integer datatype, choice outbuf, integer outsize, integer position, integer comm, integer ierror) 63 Pakowanie danych do bufora inkrementalne dodawanie elementów do bufora pakowanie do bufora o nazwie outbuf i rozmiarze outcount, począwszy od pozycji position, danych w liczbie incount pochodzących z bufora inbuf o typie datatype dodatkowo istnieje możliwość skorzystania z grup komunikatorów (np. grup odpowiadających architekturom procesorów) argument position musi zostać przekazany przez adres, gdyż zwracane jest na nim pozycja w buforze wyjściowym po dodaniu nowego elementu (w bajtach) Wprowadzenie do MPI 2014/01/15 63
63 Typy danych: Pakowanie danych (3) Aby przygotować bufor wyjściowy odpowiedniej wielkości możemy wpierw sprawdzić wymagany rozmiar za pomocą funkcji MPI_Pack_Size Funkcja ta zapisuje pod zmienną size ilość bajtów potrzebną do upakowania incount elementów typu datatype C: int MPI_Pack_size (int incount, MPI_Datatype datatype, MPI_Comm comm,int *size ) Fortran: CALL MPI_PACK_SIZE(integer incount, integer datatype, integer comm, integer size, integer ierror) Do rozpakowania danych z przesłanego bufora możemy użyć funkcji MPI_Unpack C: int MPI_Unpack ( void *inbuf, int insize, int *position,void *outbuf, int outcount, MPI_Datatype datatype,mpi_comm comm ) Fortran: CALL MPI_UNPACK(choice inbuf, integer insize, integer position, choice outbuf, integer outcount, integer datatype, integer comm, integer ierror) Wprowadzenie do MPI 2014/01/15 64
64 Typy danych: przykład pakowania danych C: int position, i, j, a[2]; char buff[1000];... MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { position = 0; MPI_Pack(&i, 1, MPI_INT, buff, 1000, &position, MPI_COMM_WORLD); MPI_Pack(&j, 1, MPI_INT, buff, 1000, &position, MPI_COMM_WORLD); MPI_Send( buff, position, MPI_PACKED, 1, 0, MPI_COMM_WORLD); } else /* RECEIVER CODE */ MPI_Recv( a, 2, MPI_INT, 0, 0, MPI_COMM_WORLD) } /01/ Wprowadzenie do MPI 65
65 Typy danych: definiowalne typy MPI MPI umożliwia nam definiowanie 3 rodzajów własnych typów: typy reprezentujące ciągły fragment pamięci zawierający elementy tego samego typu MPI_Type_Contiguous typy będące wektorami elementów danego typu, które nie reprezentują ciągłego fragmentu pamięci MPI_Type_Vector typy będące strukturami zawierającymi elementy różnych typów, które niekoniecznie reprezentują ciągły fragment pamięci MPI_Type_Struct Wprowadzenie do MPI 2014/01/15 66
66 Typy danych: ciągłe fragmenty pamięci Najprostszy definiowalny typ danych MPI stary typ nowy typ C: int MPI_Type_contiguous(int count,mpi_datatype oldtype, MPI_Datatype *newtype); Fortran: CALL MPI_TYPE_CONTIGUOUS(integer count, integer oldtype, integer newtype, integer ierror) Wprowadzenie do MPI 2014/01/15 67
67 Typy danych: typ wektorowy Używane jeśli interesujące nas wektory danego typu nie reprezentują ciągłego fragmentu pamięci, np. pomiędzy nimi znajdują się elementy, które nie powinny być przesłane/odebrane blocklength = 3 elementy na blok stride= 4 (co ile występuje nowy element) count = 3 bloki C: int MPI_Type_vector(int count,int blocklength,int stride, MPI_Datatype oldtype,mpi_datatype *newtype); Fortran: CALL MPI_TYPE_VECTOR(integer count, integer blocklength, integer stride, integer oldtype, integer newtype, integer ierror) Wprowadzenie do MPI 2014/01/15 68
68 Typy danych: struktury Używane do przesyłania struktur zawierających elementy różnego typu, które niekoniecznie reprezentują ciągły fragment pamięci addr0 MPI_INT MPI_DOUBLE Count = 2 Array_of_blocklengths = {3,3} Array_of_displacements = {0,addr1-addr0} Array_of_types = {MPI_INT,MPI_DOUBLE} blok 0 blok 1 addr1 przerwa, np. jeśli wymagane jest uliniowienie co 8 bajtów C: int MPI_Type_struct(int count,int *array_of_blocklengths, MPI_Aint *array_of_displacements,mpi_datatype *array_of_types, MPI_datatype *newtype); Fortran: CALL MPI_TYPE_STRUCT(integer count, integer array_of_blocklengths(*), integer array_of_displacements(*), integer array_of_types(*), integer newtype, integer ierror) Wprowadzenie do MPI 2014/01/15 69
69 Typy danych: struktury (2) Aby obliczyć przemieszczenie potrzebne są nam adresy poszczególnych bloków Możemy do tego celu użyć funkcji MPI MPI-1 C: int MPI_Address(void* location,mpi_aint *address); Fortran: CALL MPI_ADDRESS(choice location, integer address, integer ierror) Usunięte w MPI-3 MPI-2 C: int MPI_Get_address(void *location, MPI_Aint *address); Fortran: CALL MPI_GET_ADDRESS(choice location(*), integer (KIND=MPI_ADDRESS_KIND) address, integer ierror) Wprowadzenie do MPI 2014/01/15 70
70 Typy danych: zatwierdzenie nowego typu Zanim użyjemy nowego typu danych MPI, musimy go zatwierdzić za pomocą komendy MPI_TYPE_COMMIT Musi być to wykonane tylko raz dla każdego procesu MPI C: int MPI_Type_commit(MPI_Datatype *datatype); Fortran: CALL MPI_TYPE_COMMIT(integer datatype, integer ierror) Wprowadzenie do MPI 2014/01/15 71
71 Zadanie 3* PRZESYŁANIE STRUKTUR DANYCH 2014/01/15 72
72 FORTRAN Program ring_derived Zadanie: Zmodyfikuj program ring wprowadzając typ danych strukturę W nowym typie prześlij wartość całkowitą (jak wcześniej) i analogiczną wartość jako zmienną rzeczywistą snd_buf 0 snd_buf 1 rcv_buf sum rcv_buf 2 Wskazówka, użyj: call MPI_Type_create_struct( ) call MPI_Type_commit( ) Pamiętaj o: call MPI_Get_address( ) /01/15
73 Wirtualne topologie Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 74
74 Wirtualne topologie Wirtualne topologie to mechanizm pozwalający nazywać procesy w komunikatorze w sposób, który lepiej pasuje do schematu komunikacji pomiędzy procesami Wirtualnych topologii użyjemy na przykład jeśli obliczenia wykonywane są na dwuwymiarowej siatce i każdy proces komunikuje się tylko i wyłącznie ze swoimi najbliższymi sąsiadami w siatce 75 Topologia kartezjańska (periodyczna siatka dwuwymiarowa) 2014/01/ Wprowadzenie do MPI 75
75 Wirtualne topologie (2) Za mechanizmem wirtualnych topologii kryje się czysta arytmetyka liczb całkowitych Zyski ze stosowania tego mechanizmu: Prostszy kod Zmienne odwzorowujące schemat komunikacji umożliwia lepsza wydajność podpowiadamy bibliotece jak wygląda schemat komunikacji Nowa topologia tworzy nowy komunikator MPI zapewnia funkcje mapowania indeksów w celu obliczenia numeru procesu na podstawie nazewnictwa stosowanego w topologii w celu obliczenia współrzędnych w topologii na podstawie numeru procesu (topologia kartezjańska) Wprowadzenie do MPI 2014/01/15 76
76 Wirtualne topologie: rodzaje Topologie kartezjańskie Każdy proces jest połączony z sąsiadami w wirtualnej siatce Brzegi mogą być periodyczne (cykliczne, z zapętleniem) lub bez Procesy są identyfikowane współrzędnymi kartezjańskimi w formie (x1,x2, ) Topologie grafowe Dowolne grafy Dwie formy GRAPH (MPI-1) DIST_GRAPH (skalowalna wersja MPI-2.2 i MPI-3) /01/15
77 Wirtualne topologie: topologie kartezjańskie Utworzenie nowego komunikatora o topologii kartezjańskiej ndims wymiar topologii kartezjańskiej (1 pierścień, 2 cylinder lub siatka 2D, 3 torus lub siatka 3D) dims tablica definiująca liczbę procesów w każdym wymiarze periods tablica definiująca czy siatka zawiera zapętlenia w każdym z wymiarów reorder czy pozwalamy na zmianę numerów procesów w nowym komunikatorze C: int MPI_Cart_create ( MPI_Comm comm_old, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm_cart ) Fortran: CALL MPI_CART_CREATE(INTEGER COMM_OLD,INTEGER NDIMS,INTEGER DIMS(*), INTEGER PERIODS(*),INTEGER REORDER,INTEGER COMM_CART,INTEGER IERROR) Wprowadzenie do MPI 2014/01/15 78
78 Wirtualne topologie: mapowanie procesów C: int MPI_Cart_coords ( MPI_Comm comm, int rank, int maxdims, int *coords ) Fortran: CALL MPI_CART_COORDS(INTEGER COMM,INTEGER RANK,INTEGER MAXDIMS, INTEGER COORDS(*),INTEGER IERROR) rank - numer procesu maxdims - rozmiar tablicy coords. Funkcja zapisuje do tablicy coords współrzędne procesu o numerze rank C: int MPI_Cart_rank( MPI_Comm comm,int *coords,int *rank ) Fortran: CALL MPI_CART_RANK(INTEGER COMM,INTEGER COORDS(*),INTEGER RANK, INTEGER IERROR) 79 Funkcja zapisuje pod adresem rank numer procesu o współrzędnych określonych w tablicy coords Wprowadzenie do MPI 2014/01/15 79
79 Wirtualne topologie: procesy sąsiednie Znajdowanie sąsiadów w topologii kartezjańskiej C: int MPI_Cart_shift ( MPI_Comm comm, int direction, int displ, int *source, int *dest ) Fortran: CALL MPI_CART_SHIFT(INTEGER COMM,INTEGER DIRECTION,INTEGER DISP, INTEGER RANK_SOURCE,INTEGER RANK_DEST,INTEGER IERROR) Funkcja ta przesuwa numer lokalnego procesu wzdłuż wyspecyfikowanego wymiaru, w celu wygenerowania numerów procesów źródłowego i docelowego Numer źródła otrzymany jest poprzez odjęcie displ od n-tej współrzędnej lokalnego procesu, gdzie n równe jest direction. Numer docelowego procesu otrzymywany jest poprzez dodawanie disp do n-tej współrzędnej. Współrzędne numerowane są od zera /01/ Wprowadzenie do MPI 80
80 Wirtualne topologie: procesy sąsiednie (2) Jeśli topologia nie jest periodyczna w wybranym wymiarze, to przy wyliczeniach sąsiadów procesorów brzegowych zostanie zwrócona wartość MPI_PROC_NULL MPI_PROC_NULL jest także poprawnym identyfikatorem (rank) odbiorcy lub nadawcy przy komunikacji W takim przypadku komunikacja nie następuje ale może to znacznie uprościć kod (nie wymaga odróżniania przypadków na brzegu siatki) /01/15
81 Wirtualne topologie: podziały kartezjańskie Podział siatki na przekroje wzdłuż wybranego wymiaru Każdy przekrój tworzy nowy komunikator W ramach każdego przekroju można wykonać dedykowaną komunikację kolektywną (następny rozdział) /01/15
82 Wirtualne topologie: podziały kartezjańskie (2) C: int MPI_Cart_sub ( MPI_Comm comm_cart, int* remain_dims, MPI_Comm* comm_sub) Fortran: CALL MPI_CART_SUB(INTEGER COMM_CART,INTEGER REMAIN_DIMS(*),INTEGER COMM_SLICE,INTEGER IERROR) Tworzy podzbiór siatki (nowy komunikator o topologii kartezjańskiej) Nowy komunikator zawierający przekroje siatki dla wymiarów odpowiadających elementom tablicy remain_dims (1 ten wymiar pozostaje w nowym komunikatorze, 0 ten wymiar nie uczestniczy w nowym komunikatorze) /01/15
83 Wirtualne topologie: topologie grafowe MPI_Graph_create tworzy graf na podstawie pełnej informacji o wierzchołkach i krawędziach C: int MPI_Graph_create(MPI_Comm comm_old, int nnodes, \ const int index[], const int edges[], int reorder, \ MPI_Comm *comm_graph) Fortran: CALL MPI_GRAPH_CREATE(INTEGER COMM_OLD,INTEGER NNODES,INTEGER INDEX(*),INTEGER EDGES(*),LOGICAL REORDER,INTEGER COMM_GRAPH,INTEGER IERROR) Stopień wierzchołka i-tego to: index[i] - index[i-1], lista sąsiadów: edges[j], dla index[i-1] j index[i]-1; dla i = 1,.., nnodes-1; wierzchołek 0-owy ma stopień index[0] i sąsiadów edges[j], dla 0 j index[0]-1 (dotyczy C) Przykład: 84 Wierzchołek (proces) Sąsiedzi 0 1, , 2 nnodes = 4 index = 2, 3, 4, 6 edges = 1, 3, 0, 3, 0, /01/15
84 Wirtualne topologie: topologie grafowe (2) MPI_Dist_graph_create tworzy graf na podstawie informacji z każdego wierzchołka niezależnie (od MPI-2.2) C: int MPI_Dist_graph_create(MPI_Comm comm_old, int n, int sources[], \ int degrees[], int destinations[], int weights[], MPI_Info info, \ int reorder, MPI_Comm *comm_dist_graph) Fortran: CALL MPI_DIST_GRAPH_CREATE(INTEGR COMM_OLD,INTEGER N,INTEGER SOURCES(*),INTEGER DEGREES(*),INTEGER DESTINATIONS(*),INTEGER WEIGHTS(*),INTEGER INFO,LOGICAL REORDER,INTEGER COMM_DIST_GRAPH, INTGER IERROR) Każdy wierzchołek jest opisany uporządkowanym zbiorem krawędzi (source,destination) o n sąsiadujących krawędziach z tablicy sources. Dla każdego sąsiada nieujemna liczba wierzchołków jest zawarta w tablicy destinations (patrz standard MPI-3). To operacja grupowa, wykonywana przez wszystkie procesy w komunikatorze comm_old /01/15
85 Wirtualne topologie: topologie grafowe (3) MPI_Dist_graph_create pozwala tworzyć bardzo duże grafy nie obciążając pamięci Przykład: (niejednoznaczny) Proces Sąsiedzi n sources degrees destinations weights 0 1, , 3 1, , ,2 1, 1 Dla grafu bez wag można użyć zmiennej specjalnej MPI_UNWEIGHTED we wszystkich procesach z grupy Dla wierzchołka o n równym 0 w grafie z wagami użyć można MPI_WEIGHTS_EMPTY /01/15
86 Zadanie 4 PIERŚCIEŃ W TOPOLOGII KARTEZJAŃSKIEJ 2014/01/15 87
87 Zadanie: Program ring_cart Zmodyfikuj program ring wprowadzając nowy komunikator dla jednowymiarowego pierścienia Sąsiadów znajdź za pomocą MPI_Cart_shift snd_buf 0 snd_buf 1 rcv_buf sum rcv_buf 2 Wskazówka ndims = 1; dims = numranks; periods = 1; reorder = 1; /01/15
88 Komunikacja grupowa Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 89
89 Komunikacja grupowa (kolektywna) Komunikacja grupowa, czyli taka, w której uczestniczy grupa procesów MPI Dana funkcja wywoływana jest przez wszystkie procesy w komunikatorze W MPI wyróżniamy następujące typy komunikacji grupowej: Bariera synchronizacyjna operacja Broadcast nadaj wiadomość wielu procesom operacja typu rozrzuć (z ang. scatter) operacja typu zbierz (z ang. gather) operacja wszyscy do wszystkich operacja redukcji (np. globalna suma, globalne maksimum,..) Wprowadzenie do MPI 2014/01/15 90
90 Komunikacja grupowa: bariera synchronizacyjna C: int MPI_Barrier(MPI_Comm comm); Fortran: CALL MPI_BARRIER(integer comm, integer ierror) Zwykle bariera nie jest potrzebna, gdyż odpowiednia synchronizacja powinna być zapewniona na bazie interfejsu przesyłania komunikatów Może być używana do: debugowania programów równoległych profilingu programów równoległych synchronizacji do operacji I/O Wprowadzenie do MPI 2014/01/15 91
91 Komunikacja grupowa: Broadcast Operacja polegająca na rozesłaniu tej samej wiadomości do wszystkich procesów grupy C: int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm); Fortran: CALL MPI_BCAST(choice buffer, integer count, integer datatype, integer root, integer comm, integer ierror) Wprowadzenie do MPI 2014/01/15 92
92 Komunikacja grupowa: Scatter Operacja polegająca na rozesłaniu przez proces root wektora sendbuf podzielonego na kawałki sendcount do procesów w grupie (również do siebie) C: int MPI_Scatter(void* sendbuf,int sendcount,mpi_datatype sendtype,void* recvbuf, int recvcount,mpi_datatype recvtype,int root,mpi_comm comm); Fortran: CALL MPI_SCATTER(choice sendbuf, integer sendcount, integer sendtype, choice recvbuf, integer recvcount, integer recvtype, integer root, integer comm, integer ierror) Wprowadzenie do MPI 2014/01/15 93
93 Operacja odwrotna do scatter, czyli zebranie kawałków wektora z procesorów w grupie i zapisanie ich w buforze wybranego procesora Komunikacja grupowa: Gather C: int MPI_Gather(void* sendbuf,int sendcount,mpi_datatype sendtype, void* recvbuf,int recvcount,mpi_datatype recvtype,int root, MPI_Comm comm); Fortran: CALL MPI_GATHER(choice sendbuf, integer sendcount, integer sendtype, choice recvbuf, integer recvcount, integer recvtype, integer root, integer comm, integer ierror) Wprowadzenie do MPI 2014/01/15 94
94 Komunikacja grupowa: wszyscy do wszystkich Każdy z procesów wysyła do procesu i-tego sendcount kolejnych elementów typu sendtype, poczynając od elementu i*sendtype tablicy sendbuf C: int MPI_Alltoall( void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm ) Fortran: CALL MPI_ALLTOALL(choice sendbuf, integer sendcount, integer sendtype, choice recvbuf, integer recvcount, integer recvtype, integer comm, integer ierror) Wprowadzenie do MPI 2014/01/15 95
95 Komunikacja grupowa: operacja redukcji Służy do wykonywania globalnej operacji na elementach procesów należących do grupy Operacja typu: d 0 od 1 od 2 o od n-1 d i to dane w procesie o numerze i (skalar lub wektor) o to pewna zdefiniowana operacja Istnieje możliwość skorzystania z gotowych definicji operacji takich jak suma czy maksimum Istnieje możliwość zdefiniowania własnych operacji funkcją MPI_Op_create(..) Wprowadzenie do MPI 2014/01/15 96
96 Komunikacja grupowa: przykład globalna suma Chcemy dokonać sumowania pewnej wartości zawartej w inbuf po wszystkich procesach w grupie Użyjemy operacji MPI_SUM Wynik ma zostać zwrócony na resultbuf C: int MPI_Reduce( &inbuf, &resultbuf, 1, MPI_INT, MPI_SUM, root, MPI_COMM_WORLD ); Fortran: CALL MPI_REDUCE( inbuf, resultbuf, 1, MPI_INTEGER, MPI_SUM, root, MPI_COMM_WORLD, ierror) 97 Dostępna jest również operacja MPI_ALLREDUCE (bez parametru root), która jest połączeniem operacji Reduce i Broadcast zwraca wynik w każdym procesie Wprowadzenie do MPI 2014/01/15 97
97 Komunikacja grupowa: dostępne operacje redukcji Nazwa operacji MPI_MAX MPI_MIN MPI_SUM MPI_PROD MPI_LAND MPI_BAND MPI_LOR MPI_BOR MPI_LXOR MPI_BXOR MPI_MAXLOC MPI_MINLOC Funkcja Maksimum Minimum Suma Iloczyn Logiczna koniunkcja Koniunkcja binarna Logiczna alternatywa Alternatywa binarna Logiczna alternatywa wykluczająca Binarna alternatywa wykluczająca Maksimum i jego pozycja Minimum i jego pozycja Wprowadzenie do MPI 2014/01/15 98
98 Zadanie 5 KOMUNIKACJA GRUPOWA W PIERŚCIENIU 2014/01/15 99
99 Program ring_coll Zadanie: Zmodyfikuj program ring wprowadzając komunikację kolektywną z użyciem funkcji MPI_Allreduce /01/15
100 Przykład: prosta kwadratura Całkowanie metodą prostokątów następującego wzoru: 1,2 4 1 n x 0 i i ( ) n h 1 0,8 0,6 0,4 0, /01/ Wprowadzenie do MPI 101
101 Przykład: prosta kwadratura #include "mpi.h" #include <stdio.h> #include <math.h> int main( int argc, char *argv[] ){ int n, nl, myid, numprocs, i; double PI25DT = ; double mypi, pi, h, sum, x; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); n = 4096; nl = n/numprocs; h = 1.0 / (double) n; sum = 0.0; for (i = myid*nl; i <= (myid+1)*nl; i ++) { 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 wynosi %.16f\n",pi); MPI_Finalize(); return 0; 102 } 2014/01/ Wprowadzenie do MPI 102
102 MPI-2 oraz MPI-3 Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 103
103 MPI-2 oraz MPI-3 przegląd Funkcjonalności MPI-2 Dynamiczne tworzenie i zarządzanie procesami Komunikacja jednostronna RMA (Remote Memory Access) MPI_Put, MPI_Get do zdalnego dostępu do pamięci innego procesu MPI I/O Równoległy dostęp do plików Integracja procesów MPI i wątków (w szczególności OpenMP) Funkcjonalności MPI-3 Nieblokująca komunikacja grupowa Komunikacja grupowa z sąsiadami Rozszerzona komunikacja jednostronna, m.in. o obsługę pamięci współdzielonej /01/15
104 MPI i wątki Standard MPI-3 określa wszyskie funkcje MPI jako thread-safe Operacje blokujące blokują wykonanie tylko wywołującego wątku Specjalna forma inicjalizacji MPI zalecana przy użyciu wątków C: int MPI_Init_thread (int *argc, char ***argv, int required, \ int *provided) Fortran: CALL MPI_INIT(INTEGER REQUIRED, INTEGER PROVIDED, INTEGER IERROR) Argument required określa pożądany poziom współpracy biblioteki z wątkami, faktyczny poziom wsparcia zwraca provided MPI_THREAD_SINGLE tylko jeden wątek per proces (brak wsparcia) MPI_THREAD_FUNNELED tylko jeden wątek w ramach procesu używa MPI MPI_THREAD_SERIALIZED tylko jeden wątek jednocześnie używa MPI MPI_THREAD_MULTIPLE pełne wsparcie dla wątków, bez ograniczeń /01/15
105 Zadanie 6 PIERŚCIEŃ JAKO GRAF 2014/01/15 106
106 Program ring_dgraph Zadanie: Zmodyfikuj program ring reprezentując pierścień jako graf skierowany Użyj topologii MPI_Dist_Graph Użyj operacji grupowej z sąsiadami do wymiany komunikatów Wskazówka n = 1; 3 sources = myrank; degrees = 1; destinations = (myrank+1) % numranks; MPI_Dist_graph_create(MPI_COMM_WORLD, n, &sources, °rees,\ &destinations, MPI_UNWEIGHTED, MPI_INFO_NULL, reorder, &comm_dist_graph); Proces Sąsiedzi n sources degrees destinations , /01/15
107 Dodatek: jak sprawdzić wersję biblioteki MPI Operacje typu sparse-collectives dostępne są od wersji MPI-3 Aby sprawdzić dostępną wersję (którą wersję standardu używana biblioteka MPI spełnia) można użyć: Funkcji MPI_Get_version C: int MPI_Get_version(int *version, int *subversion) Fortran: CALL MPI_GET_VERSION(INTEGER VERSION,INTEGER SUBVERSION,INTEGER IERROR) Makra kompilatora MPI_VERSION const int ver = MPI_VERSION; /01/15
108 Podsumowanie Wstęp Message Passing Interface podstawy Pierwszy program Komunikacja point-to-point Komunikacja nieblokująca Typy danych MPI Konstrukcja wirtualnych topologii w MPI Komunikacja grupowa MPI-2 oraz MPI-3 przegląd Podsumowanie Wprowadzenie do MPI 2014/01/15 109
109 Komunikacja point-to-point Nieomówione zagadnienia MPI_Sendrecv i MPI_Sendrecv_replace MPI_Iprobe, MPI_Request_free, MPI_Cancel Komunikacja grupowa MPI_Alltoall, MPI_Scan i MPI_Exscan MPI_Gatherv, Scatterv, Allgatherv, Alltoallv, Alltoallv Wirtualne topologie MPI_Dims_create, MPI_Graph_neighbors, MPI_Graph_neighbors_count MPI_Dist_graph_create_adjacent, MPI_Dist_graph_neighbors Stałe specjalne MPI i predefiniowane zmienne, zmienne środowiskowe Współpraca z wątkami MPI_Is_thread_main, MPI_Query_thread MPI-2 i MPI-3 Wiele innych /01/15
110 Podsumowanie MPI jako narzędzie tworzenia zrównoleglonych programów Podstawy użycia, tworzenia prostych programów z wykorzystaniem Komunikacji point-to-point blokującej i nieblokującej Komunikacji grupowej (kolektywnej) Wirtualnych topologii Typy danych w MPI i podstawowe użycie Materiał obejmował tylko podstawową funkcjonalność MPI-1 Kilka przykładów nowości z MPI-2 i MPI-3 Zadania pozwalające na pierwsze kroki w zrównoleglaniu własnych programów /01/15
111 Powiązane szkolenia Podstawy systemu kolejkowego SLURM Uruchamianie i optymalizacja obliczeń na systemie IBM Blue Gene/Q systemie_ibm_blue_gene/q MPI dla zaawansowanych (?) W przypadku zainteresowania tematem MPI-2 i MPI /01/15
112 Dziękujemy za uwagę Wprowadzenie do MPI 113
Wprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski http://www.icm.edu.
Wprowadzenie do MPI Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski http://www.icm.edu.pl Maciej Cytowski m.cytowski@icm.edu.pl Maciej Szpindler m.szpindler@icm.edu.pl
Programowanie Równoległe Wykład 4. 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 Jak używać w MPI? Donald Knuth: We should forget about small efficiencies, say about 97% of
Wprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski
Wprowadzenie do MPI Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski http://www.icm.edu.pl Maciej Cytowski m.cytowski@icm.edu.pl Maciej Szpindler m.szpindler@icm.edu.pl
Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe Wykład 5 MPI - Message Passing Interface Maciej Matyka Instytut Fizyki Teoretycznej Dorobiliśmy się strony WWW www.ift.uni.wroc.pl/~koma/pr/index.html MPI, wykład 2. Plan: - komunikacja
Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1
Programowanie w modelu przesyłania komunikatów specyfikacja MPI Krzysztof Banaś Obliczenia równoległe 1 Model przesyłania komunikatów Paradygmat send receive wysyłanie komunikatu: send( cel, identyfikator_komunikatu,
Programowanie Równoległe Wykład 5. MPI - Message Passing Interface (część 3) Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe Wykład 5 MPI - Message Passing Interface (część 3) Maciej Matyka Instytut Fizyki Teoretycznej MPI, wykład 3. Plan: - wirtualne topologie - badanie skalowanie czasu rozwiązania
Programowanie współbieżne... (4) Andrzej Baran 2010/11
Programowanie współbieżne... (4) Andrzej Baran 2010/11 LINK: http://kft.umcs.lublin.pl/baran/prir/index.html Przykład Zaczniemy od znanego już przykładu: Iloczyn skalarny różne modele Programowanie współbieżne...
Programowanie w standardzie MPI
Programowanie w standardzie MPI 1 2 Podstawy programowania z przesyłaniem komunikatów Model systemu równoległego w postaci p procesów, każdy z nich z własną przestrzenią adresową, nie współdzieloną z innymi
Kolejne funkcje MPI 1
Kolejne funkcje MPI 1 Przypomnienie: sieci typu mesh (Grama i wsp.) 2 Topologie MPI Standard MPI abstrahuje od topologii systemu wieloprocesorowego. Sposób uruchamiania aplikacji (mpirun) nie jest częścią
Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla
Tryby komunikacji między procesami w standardzie Message Passing Interface Piotr Stasiak 171011 Krzysztof Materla 171065 Wstęp MPI to standard przesyłania wiadomości (komunikatów) pomiędzy procesami programów
Operacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1
Operacje grupowego przesyłania komunikatów Krzysztof Banaś Obliczenia równoległe 1 Operacje grupowego przesyłania komunikatów Operacje, w ramach których ten sam komunikat lub zbiór komunikatów przesyłany
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 dla PR PP MPP - Cechy charakterystyczne 1 Prywatna, wyłączna przestrzeń adresowa.
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 Środowisko przesyłania komunikatów MPI Rodzaje procedur: blokujące nieblokujące Tryby przesyłania
Modele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak
Modele programowania równoległego Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak MPP - Cechy charakterystyczne 1 Prywatna - wyłączna przestrzeń adresowa. Równoległość
Programowanie Równoległe Wykład 6. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe Wykład 6 MPI - Message Passing Interface Maciej Matyka Instytut Fizyki Teoretycznej Dorobiliśmy się strony WWW Za tydzień 1. wykład z CUDY (Z. Koza) www.ift.uni.wroc.pl/~koma/pr/index.html
Operacje grupowego przesyłania komunikatów
Operacje grupowego przesyłania komunikatów 1 Operacje grupowego przesyłania komunikatów Operacje, w ramach których ten sam komunikat lub zbiór komunikatów przesyłany jest pomiędzy więcej niż dwoma procesami
Łagodne wprowadzenie do Message Passing Interface (MPI)
Łagodne wprowadzenie do Message Passing Interface (MPI) Szymon Łukasik Zakład Automatyki PK szymonl@pk.edu.pl Szymon Łukasik, 8 listopada 2006 Łagodne wprowadzenie do MPI - p. 1/48 Czym jest MPI? Własności
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 MPI dynamiczne zarządzanie procesami MPI 2 umożliwia dynamiczne zarządzanie procesami, choć
Operacje kolektywne MPI
Operacje kolektywne MPI 1 Operacje kolektywne Do tej pory w operacje przesyłania komunikatu miały charakter punkt-punkt (najczęściej pomiędzy nadawcą i odbiorcą). W operacjach grupowych udział biorą wszystkie
Message Passing Interface
Message Passing Interface Interfejs programowania definiujący powiązania z językami C, C++, Fortran Standaryzacja (de facto) i rozszerzenie wcześniejszych rozwiązań dla programowania z przesyłaniem komunikatów
Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1
Programowanie w modelu przesyłania komunikatów specyfikacja MPI Krzysztof Banaś Obliczenia równoległe 1 Środowisko przesyłania komunikatów MPI Rodzaje procedur: blokujące nieblokujące Tryby przesyłania
Programowanie współbieżne i rozproszone
Programowanie współbieżne i rozproszone WYKŁAD 2 Jan Kazimirski 1 MPI 1/2 2 Dlaczego klastry komputerowe? Wzrost mocy obliczeniowej jednego jest coraz trudniejszy do uzyskania. Koszt dodatkowej mocy obliczeniowej
51. Metody komunikacji nieblokującej.
51. Metody komunikacji nieblokującej. Funkcje nieblokujace różnia sie od wersji blokujacych przedrostkiem I (immediate) w nazwie oraz jednym dodatkowym argumentem: request, który jest używany do sprawdzenia,
Jak wygląda praca na klastrze
Jak wygląda praca na klastrze Upraszczając nieco sprawę można powiedzieć, że klaster to dużo niezależnych komputerów (jednostek) połączonych mniej lub bardziej sprawną siecią. Często poszczególne jednostki
Interfejs MPI. Maciej Kasperski, Rafał Kozik. 16 kwietnia 2008
16 kwietnia 2008 Wprowadzenie Co to jest MPI? Plan prezentacji: co to jest MPI? komunikatory i grupy procesów; przesyłanie komunikatów; komunikacja kolektywna; wirtualne topologie;. Co to jest MPI? Wstęp
Programowanie współbieżne... (6)
Programowanie współbieżne... (6) Andrzej Baran 2010/11 LINK: http://kft.umcs.lublin.pl/baran/prir/index.html Powtórzenie. Proste operacje MPI MPI_send, MPI_recv,...! Programowanie współbieżne... 2 Send-receive
61 Topologie wirtualne
61 Topologie wirtualne pozwalają opisać dystrybucję procesów w przestrzeni z uwzględnieniem struktury komunikowania się procesów aplikacji między sobą, umożliwiają łatwą odpowiedź na pytanie: kto jest
Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz
Programowanie równoległe i rozproszone Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz 23 października 2009 Spis treści Przedmowa...................................................
Rozszerzenia MPI-2 1
Rozszerzenia MPI-2 1 2 Dynamiczne tworzenie procesów Aplikacja MPI 1 jest statyczna z natury Liczba procesów określana jest przy starcie aplikacji i się nie zmienia. Gwarantuje to szybką komunikację procesów.
Programowanie współbieżne... (5)
Programowanie współbieżne... (5) Andrzej Baran 2010/11 LINK: http://kft.umcs.lublin.pl/baran/prir/index.html 6 FUNKCJI Proste programy MPI można pisać używając tylko 6 funkcji Programowanie współbieżne...
Programowanie Współbieżne
Programowanie Współbieżne MPI ( główne źródło http://pl.wikipedia.org/wiki/mpi) 1 Historia Początkowo (lata 80) różne środowiska przesyłania komunikatów dla potrzeb programowania równoległego. Niektóre
5. Model komunikujących się procesów, komunikaty
Jędrzej Ułasiewicz str. 1 5. Model komunikujących się procesów, komunikaty Obecnie stosuje się następujące modele przetwarzania: Model procesów i komunikatów Model procesów komunikujących się poprzez pamięć
http://www.mcs.anl.gov/research/projects/mpi/standard.html
z przedmiotu, prowadzonych na Wydziale BMiI, Akademii Techniczno-Humanistycznej w Bielsku-Białej. MPI czyli Message Passing Interface stanowi specyfikację pewnego standardu wysokopoziomowego protokołu
Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie
Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1 Metodologia programowania równoległego Przykłady podziałów zadania na podzadania: Podział ze względu na funkcje (functional
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Programowanie współbieżne Wykład 11 Wprowdzenie do MPI. Rafał Skinderowicz
Programowanie współbieżne Wykład 11 Wprowdzenie do MPI Rafał Skinderowicz Programowanie dla modelu z rozproszoną pamiecią Niezależne strumienie instrukcji wykonywane na (być może) oddalonych fizycznie
Obliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz
Obliczenia równoległe i rozproszone Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz 15 czerwca 2001 Spis treści Przedmowa............................................
Nowoczesne technologie przetwarzania informacji
Projekt Nowe metody nauczania w matematyce Nr POKL.09.04.00-14-133/11 Nowoczesne technologie przetwarzania informacji Mgr Maciej Cytowski (ICM UW) Lekcja 2: Podstawowe mechanizmy programowania równoległego
Architektury systemów równoległych
Architektury systemów równoległych 1 Architektury systemów z pamięcią wspólną Architektury procesorów Procesory wielordzeniowe Procesory graficzne Akceleratory Procesory hybrydowe Architektury systemów
Programowanie współbieżne... (12) Andrzej Baran 2010/11
Programowanie współbieżne... (12) Andrzej Baran 2010/11 LINK: http://kft.umcs.lublin.pl/baran/prir/index.html Dekompozycja danych. Wejście. rank 0 rank 1 rank 2 A B C A B C A B C indata indata indata wejście
Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie
PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie współbieżne... (w13)
PARADYGMATY I JĘZYKI PROGRAMOWANIA Programowanie współbieżne... (w13) Treść 2 Wstęp Procesy i wątki Szybkość obliczeń prawo Amdahla Wyścig do zasobów Synchronizacja i mechanizmy synchronizacji semafory
Miary Wydajności. Efektywność programu równoległego (E) jest definiowana jako stosunek przyśpieszenia do liczby procesorów
Miary Wydajności Czas wykonania równoległego (Tpar) jest czasem pomiędzy momentem rozpoczęcia obliczeń do momentu gdy ostatni procesor zakończy obliczenia Przyspieszenie (S) jest definiowane jako stosunek
IPC: Kolejki komunikatów
IPC: Kolejki komunikatów Systemy Operacyjne 2 laboratorium Mateusz Hołenko 7 listopada 2011 Plan zajęć 1 Mechanizmy IPC kolejki komunikatów pamięć współdzielona semafory 2 Kolejki komunikatów kolejka komunikat
Architektura sieci połączeń między procesorami, sterowanie komunikacjami, biblioteki komunikacyjne
Wykład 4 Architektura sieci połączeń między procesorami, sterowanie komunikacjami, biblioteki komunikacyjne Spis treści: 1. Statyczne sieci połączeń w systemach równoległych 2. Dynamiczne sieci połączeń
Programowanie współbieżne Wykład 12 MPI c.d. Rafał Skinderowicz
Programowanie współbieżne MPI c.d. Rafał Skinderowicz Komunikacja grupowa Poprzednio rozważaliśmy komunikację między parami procesów synchroniczna (blokująca) np. MPI Recv, MPI Send asynchroniczna (nieblokująca)
Jak ujarzmić hydrę czyli programowanie równoległe w Javie. dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski
Jak ujarzmić hydrę czyli programowanie równoległe w Javie dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski Prawo Moore a Ekonomicznie optymalna liczba tranzystorów w układzie scalonym zwiększa się
Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach
Laboratorium Systemów Operacyjnych Ćwiczenie 4. Operacje na plikach Wykonanie operacji wymaga wskazania pliku, na którym operacja ma zostać wykonana. Plik w systemie LINUX identyfikowany jest przez nazwę,
Programowanie procesorów graficznych GPGPU
Programowanie procesorów graficznych GPGPU 1 GPGPU Historia: lata 80 te popularyzacja systemów i programów z graficznym interfejsem specjalistyczne układy do przetwarzania grafiki 2D lata 90 te standaryzacja
Weryfikacja oprogramowania, korzystajacego z MPI
Weryfikacja oprogramowania, korzystajacego z MPI Krzysztof Nozderko kn201076@students.mimuw.edu.pl 23 maja 2005 Wprowadzenie Równoległe obliczenia olbiczenia naukowców sa często bardzo kosztowne obliczeniowo
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Wstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
16. Taksonomia Flynn'a.
16. Taksonomia Flynn'a. Taksonomia systemów komputerowych według Flynna jest klasyfikacją architektur komputerowych, zaproponowaną w latach sześćdziesiątych XX wieku przez Michaela Flynna, opierająca się
1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.
1. Pierwszy program // mój pierwszy program w C++ #include using namespace std; cout
Systemy rozproszone. Państwowa Wyższa Szkoła Zawodowa w Chełmie. ** Instytut Fizyki Uniwersytet Marii Curie-Skłodowskiej w Lublinie
Systemy rozproszone Rafał Ogrodowczyk *, Krzysztof Murawski **,*, Bartłomiej Bielecki * * Katedra Informatyki Państwowa Wyższa Szkoła Zawodowa w Chełmie ** Instytut Fizyki Uniwersytet Marii Curie-Skłodowskiej
Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int
Algorytmy Równoległe i Rozproszone Część VI - Systemy rozproszone, podstawowe pojęcia
Algorytmy Równoległe i Rozproszone Część VI - Systemy rozproszone, podstawowe pojęcia Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@kaims.pl Oficjalna strona wykładu http://www.kaims.pl/
Wywoływanie procedur zdalnych
Wywoływanie procedur zdalnych Mechanizm wywołania main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces (int pid){ int stat; stat
Wywoływanie procedur zdalnych
Mechanizm wywołania Wywoływanie procedur zdalnych main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) int zabij_proces (int pid){ int stat; stat = kill(pid,
Aplikacja Sieciowa wątki po stronie klienta
Aplikacja Sieciowa wątki po stronie klienta Na ostatnich zajęciach zajmowaliśmy się komunikacją pomiędzy klientem a serwerem. Wynikiem naszej pracy był program klienta, który za pomocą serwera mógł się
Zdalne wywoływanie procedur RPC
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces
Zdalne wywoływanie procedur RPC
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int
Algorytmy i Struktury Danych
POLITECHNIKA KRAKOWSKA - WIEiK KATEDRA AUTOMATYKI i TECHNIK INFORMACYJNYCH Algorytmy i Struktury Danych www.pk.edu.pl/~zk/aisd_hp.html Wykładowca: dr inż. Zbigniew Kokosiński zk@pk.edu.pl Wykład 12: Wstęp
Programowanie współbieżne... (2)
Programowanie współbieżne... (2) Andrzej Baran 2010/11 LINK: http://kft.umcs.lublin.pl/baran/prir/index.html Prawo Amdahla - powtórka Wydajność E = S/n (na procesor). Stąd S = En E 1 f + 1 f n 1 fn+1 f
Język C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
2 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania
Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
Język ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Programowanie aplikacji równoległych i rozproszonych. Wykład 8
Wykład 8 p. 1/?? Programowanie aplikacji równoległych i rozproszonych Wykład 8 Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Plan wykładu
Programowanie współbieżne i rozproszone
Programowanie współbieżne i rozproszone WYKŁAD 3 Jan Kazimirski 1 Literatura 2 MPI 2/2 3 Komunikacja blokująca Funkcja MPI_Recv działa w trybie blokującym Powrót z MPI_Recv nastąpi dopiero po odebraniu
76.Struktura oprogramowania rozproszonego.
76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie
Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1
Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1 Wprowadzenie Procesory graficzne GPU (Graphics Processing Units) stosowane są w kartach graficznych do przetwarzania grafiki komputerowej
Temat 1: Podstawowe pojęcia: program, kompilacja, kod
Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,
Klient-Serwer Komunikacja przy pomocy gniazd
II Klient-Serwer Komunikacja przy pomocy gniazd Gniazda pozwalają na efektywną wymianę danych pomiędzy procesami w systemie rozproszonym. Proces klienta Proces serwera gniazdko gniazdko protokół transportu
Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych
Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2013/14 Znajdowanie maksimum w zbiorze
Opis protokołu RPC. Grzegorz Maj nr indeksu:
Opis protokołu RPC Grzegorz Maj nr indeksu: 236095 1 Streszczenie Niniejszy dokument opisuje specyfikację protokołu RQP (Remote Queues Protocol). W jego skład wchodzą: opis celów protokołu; opis założeń
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Wywoływanie procedur zdalnych
Mechanizm wywołania Wywoływanie procedur zdalnych main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces (int pid){ int stat; stat
RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )
III RPC Zdalne wywoływanie procedur (ang. Remote Procedure Calls ) 1. Koncepcja Aplikacja wywołanie procedury parametry wyniki wykonanie procedury wynik komputer klienta komputer serwera Zaletą takiego
PRiR dla maszyn DM i sieci komputerowych. (PRiR, wykład 5)
PRiR dla maszyn DM i sieci komputerowych (PRiR, wykład 5) 1 Program na dziś (?) Wprowadzenie Mechanizm gniazdek Interfejs MPI Koncepcja i zasady Komunikatory i grupy Tryby komunikacji Własne typy danych
Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.
Struktura programu Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem. W ostatnich latach najbardziej używanym stylem oprogramowania
utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,
Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz
Języki i metodyka programowania. Wprowadzenie do języka C
Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia
Podstawy programowania komputerów
Podstawy programowania komputerów Wykład 14: Programowanie współbieżne w C Definicja programowania współbieżnego Programowanie współbieżne jest tworzeniem programów, których wykonanie powoduje uruchomienie
Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1
Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij proces (int pid){ int stat; stat = kill(pid,
Wykład 1. Systemy przekazywania wiadomości z założeniem bezbłędności działania
Mariusz Juszczyk 16 marca 2010 Seminarium badawcze Wykład 1. Systemy przekazywania wiadomości z założeniem bezbłędności działania Wstęp Systemy przekazywania wiadomości wymagają wprowadzenia pewnych podstawowych
Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie
Język C, tablice i funkcje (laboratorium, EE1-DI)
Język C, tablice i funkcje (laboratorium, EE1-DI) Opracował: Tomasz Mączka (tmaczka@kia.prz.edu.pl) Wstęp (tablice) Tablica to uporządkowany ciąg elementów tego samego typu, zajmujących ciągły obszar pamięci.
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
Optymalizacja komunikacji w systemach rozproszonych i równoległych
Optymalizacja komunikacji w systemach rozproszonych i równoległych Szkolenie PCSS, 16.12.2001 literatura W. Gropp, E. Lusk, An Introduction to MPI, ANL P.S. Pacheco, A User s Guide to MPI, 1998 Ian Foster,
Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++
Podstawy Informatyki Inżynieria Ciepła, I rok Wykład 10 Kurs C++ Historia Lata 70-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard
Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1
Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej Krzysztof Banaś Obliczenia równoległe 1 Model równoległości danych Model SPMD (pierwotnie dla maszyn SIMD) Zrównoleglenie
Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Podział programu na moduły
Materiały Podział programu na moduły Informatyka Szczegółowe informacje dotyczące wymagań odnośnie podziału na moduły: http://www.cs.put.poznan.pl/wcomplak/bfiles/c_w_5.pdf Podział programu na moduły pozwala
Część 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
5 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 5 1/6 Język C Instrukcja laboratoryjna Temat: Funkcje, parametry linii poleceń, typ wyliczeniowy. 5 Przygotował: mgr inż. Maciej Lasota 1) Parametry linii poleceń. Język C oprócz wprowadzania