POZNA SUPERCOMPUTING AND NETWORKING. Rozszerzenia standardu MPI: MPI-2

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

Rozszerzenia MPI-2 1

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

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

Łagodne wprowadzenie do Message Passing Interface (MPI)

61 Topologie wirtualne

Sposoby przekazywania parametrów w metodach.

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

Biblioteki graficzne MPI - MPE

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

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

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

Wstęp do MPI-2. Jacek Dziedzic FTiMS, Politechnika Gdańska Gdańsk, Algorytmy rozproszone 2017/2018. v1.14

... Ireneusz Mrozek. Wydział Informatyki

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

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

Część 4 życie programu

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

Problem decyzyjny naley do klasy NP. (Polynomial), jeeli moe by rozwizany w czasie conajwyej wielomianowym przez algorytm A dla DTM.

Algorytmy i Struktury Danych

WYKŁAD 10. Wzorce projektowe czynnociowe Command Strategy

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Bazy danych Podstawy teoretyczne

Wstęp do Programowania, laboratorium 02

Programowanie i struktury danych

Klonowanie MAC adresu oraz TTL

Programowanie Obiektowe

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Proces tworzenia programu:

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

Programowanie aplikacji równoległych i rozproszonych. Wykład 8

ANALIZA NUMERYCZNA. Grzegorz Szkibiel. Wiosna 2014/15

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

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

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

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

geometry a w przypadku istnienia notki na marginesie: 1 z 5

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

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

1. Wprowadzenie do C/C++

Laboratorium 5: Tablice. Wyszukiwanie binarne

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

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

Instrukcja obsługi programu Pilot PS 5rc

Operacje grupowego przesyłania komunikatów

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

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Komunikacja kolektywna w środowisku MPI

Wskaźniki w C. Anna Gogolińska

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

I - Microsoft Visual Studio C++

DYNAMICZNE PRZYDZIELANIE PAMIECI

Instrukcja obsługi dodatku InsERT GT Smart Documents

Architektura, oprogramowanie i uytkowanie klastra PCSS. Marek Zawadzki <mzawadzk@man.poznan.pl>

obsług dowolnego typu formularzy (np. formularzy ankietowych), pobieranie wzorców formularzy z serwera centralnego,

5 Przygotował: mgr inż. Maciej Lasota

Optymalizacja komunikacji w systemach rozproszonych i równoległych

Mikrokontroler ATmega32. Tryby adresowania Rejestry funkcyjne

Wstp. Warto przepływu to

1. Wprowadzenie do C/C++

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

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

SUPLEMENT SM-BOSS WERSJA 6.15

Spis treci. Dzie 1. I Wprowadzenie (wersja 0911) II Dostp do danych biecych specyfikacja OPC Data Access (wersja 0911)

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

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Planowanie adresacji IP dla przedsibiorstwa.

Język C zajęcia nr 11. Funkcje

System Connector Opis wdrożenia systemu

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

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

Wskaźniki. Informatyka

Bazy danych. Zaliczenie. Literatura. Strony WWW. Wykład 1: Wprowadzenie do baz danych. Semestr 1

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

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Argumenty wywołania programu, operacje na plikach

Lab 9 Podstawy Programowania

Wskaźniki. Programowanie Proceduralne 1

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

AltiumLive Dashboard - sownik. AltiumLive Dashboard - Glossary. Language. Contents

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Wprowadzenie do kompilatorów

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Funkcje zawarte w bibliotece < io.h >

Wzorce (szablony) template<class T> {definicja wzorca} lub template<class TypElementu> lub template<class TypElementu1, class TypElementu2>

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

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

Tytuły Wykonawcze. Opis systemu tworzenia dokumentacji TW-1

Programowanie w językach

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

tablica: dane_liczbowe

Projektowanie algorytmów rekurencyjnych

Programowanie wspóªbie»ne

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

.! $ Stos jest list z trzema operacjami: dodawanie elementów na wierzch stosu, zdejmowanie elementu z wierzchu stosu, sprawdzanie czy stos jest pusty.

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

Poradnik korzystania z serwisu UNET: Dostp do poczty elektronicznej ze strony WWW

Transkrypt:

Rozszerzenia standardu MPI: MPI-2

literatura wykład opracowany na podstawie: W. Gropp, E. Lusk, R. Thakur, Using MPI-2, The MIT Press 1999 R. Thakur, Introduction to parallel I/O and MPI-IO, ANL 2

agenda troch historii co nowego w MPI-2 równoległe we/wy zdalne operacje na pamici dynamiczne zarzdzanie procesami co dalej? 3

troch historii 1992 pocztek prac nad MPI 1994 MPI-1 1995 pocztek prac nad MPI-2 1997 MPI-2 4

co nowego jest w MPI-2? wielka trójka: równoległe we/wy zdalne operacje na pamici dynamiczne zarzdzanie procesami oraz: 5

co nowego jest w MPI-2? rozszerzone operacje kolektywne wsparcie dla C++ i Fortran90 współdziałanie midzy jzykami (programowanie w wielu jzykach jednoczenie) zewntrzne interfejsy wtki 6

uruchomienie procesu MPI uyteczn cech MPI-2 jest standardowa metoda uruchomienia programu MPI najprostsz jej wersj jest: uruchamiajca program o nazwie na 16 procesorach 7

uruchomienie procesu MPI to, jak MPI uruchamia programy jest poza specyfikacj MPI, niemniej MPI Forum rekomenduje, aby była jedn z metod uruchamiania programu MPI wybrano, aby unikn konfliktu z rónymi znaczeniami wybór oznacza przenaszalno uruchomienia procesu 8

uruchomienie procesu MPI std w poleceniu to rozmiar oprócz argumentu ma inne argumenty specyfikowane przez MPI:! "! #"! $%! # " oraz & przykłady uruchomienia procesu 9

przykłady uruchomienia procesów MPI ' () uruchomienie procesów zamiast (), ze wzgldu na ograniczenia szeregowania ' * " #&"# $% +"++ & uruchomienie 4 procesów na okrelonej maszynie (#&"#) w katalogu roboczym +"++ & 10

przykłady uruchomienia procesów MPI ' ),) #" # - # " +"++& próba uruchomienia maks 12 procesów na maszynie # w katalogu +"++& ' & & szuka co ma zrobi w pliku & 11

równoległe we/wy równoległe we/wy, czasem nazywane MPI-IO, jest inicjatyw IBM, badajc analogi midzy we/wy a przesyłaniem komunikatów zapis do pliku jest analogi nadawania komunikatu do systemu plików odczyt pliku jest analogi odbioru komunikatu z systemu plików 12

równoległe we/wy równoległe we/wy wymaga operacji kolektywnych, definiowania niecigłych bloków danych w pamici i w plikach oraz operacji nieblokujcych czyli tych poj, które pojawiały si ju w MPI 13

równoległe we/wy we/wy w MPI-2 to we/wy w Uniksie plus troch wicej MPI zawiera analogie do operacji open, close, seek, read i write celem we/wy w MPI jest uzyskanie lepszej efektywnoci ni Unix API 14

równoległe we/wy MPI musi dostarczy nastpujce cechy: niecigły dostp do pamici i pliku kolektywne operacje we/wy jawne przesunicia dla uniknicia oddzielnych operacji. nieblokujce we/wy przenona reprezentacja danych wskazówki implementacyjne 15

zdalne operacje na pamici cech charakterystyczn modelu przesyłania komunikatów jest to, e dane s przesyłane z jednej przestrzeni adresowej do drugiej za pomoc pary operacji send/receive odrónia to ten model od modelu współdzielenia pamici, w którym procesy maj dostp do wspólnej puli pamici i mog wprost wykonywa operacje na pamici (ładuj z, zapamitaj do) (load from, store into) 16

zdalne operacje na pamici w MPI-2 zdefiniowano API, który wprowadza elementy modelu współdzielcego pami do rodowiska MPI te operacje nazywaj si jednostronnymi (one-sided) albo zdalnymi operacjami na pamici (remote memory) 17

zdalne operacje na pamici - motywacja zrównowaenie efektywnoci i przenonoci midzy rónymi architekturami: SMPs (shared memory multiprocessors), NUMA (nonuniform memory access), MPPs (distributed memory massively parallel processors), klastrów SMP, sieci heterogenicznych 18

zdalne operacje na pamici - motywacja pozostawienia zasady look and feel z MPI-1 uwzgldnienie koherencji pamici notatnikowej i spójnoci sekwencyjnej oddzielenia synchronizacji od przesyłania danych w celu zwikszenia efektywnoci 19

zdalne operacje na pamici powstałe rozwizanie jest oparte na idei okien zdalnego dostpu do pamici okno zdalnego dostpu do pamici to porcja przestrzeni adresowej kadego procesu, na którym mog by przeprowadzane zdalne operacje przez inne procesy wystpujce w komunikatorze MPI 20

zdalne operacje na pamici wtedy mog na tym oknie by dokonane operacje jednostronne: put, get i accumulate, do zapamitania do, ładowania z i aktualizacji okna wystawionego dla innych procesów wszystkie zdalne operacje na pamici s operacjami nieblokujcymi, std s konieczne operacje synchronizacji do zapewnienia ich zakoczenia 21

zdalne operacje na pamici wiele takich operacji synchronizacji jest zapewnionych, niektóre dla uproszczenia, niektóre dla precyzyjnego sterowania, a niektóre analogiczne do operacji synchronizacji w pamici współdzielonej synchronizacja: rozdział 4 ksiki Using MPI-2 22

dynamiczne zarzdzanie procesami trzecim głównym odstpstwem od modelu MPI-1 jest zdolno procesu MPI do: udziału w tworzeniu nowego procesu MPI ustanowienia komunikacji z procesem MPI, który został uruchomiony oddzielnie 23

dynamiczne zarzdzanie procesami główne problemy, na jakie trafiamy przy projektowaniu API dla dynamicznego zarzdzania procesami: utrzymanie prostoty i elastycznoci współdziałanie z systemem operacyjnym, zarzdc zasobów, i zarzdc procesów w złoonym rodowisku programowym unikanie warunków wycigu, które naraaj na szwank poprawno 24

dynamiczne zarzdzanie procesami kluczem do tej poprawnoci jest to, aby operacje dynamicznego zarzdzania procesami były kolektywne, zarówno midzy procesami tworzcymi nowe procesy, jak pomidzy nowo utworzonymi procesami otrzymane zbiory procesów s reprezentowane w interkomunikatorze 25

dynamiczne zarzdzanie procesami interkomunikator komunikator zawierajcy dwie grupy procesów zamiast jednej dwie rodziny operacji oparte na interkomunikatorach: tworzca nowe procesy, nazywa si rozmnaaniem (spawning) ustalajca komunikacj z ju istniejcymi programami MPI nazywa si łczeniem (connecting) 26

dynamiczne zarzdzanie procesami ta ostatnia pozwala aplikacjom na posiadanie struktury równoległy klient /równoległy serwer szczegóły dynamicznego zarzdzania procesami - rozdział 7 ksiki Using MPI-2 27

dynamiczne zarzdzanie procesami dodatkowe kwestie: rozszerzone operacje kolektywne, dla interkomunikatorów (analogiczne do operacji w MPI-1 dla intrakomunikatorów) obsługa C++ i Fortran90, Fortranu na dwóch poziomach: podstawowym i rozszerzonym mieszane programowanie w wielu jzykach zewntrzne interfejsy do bibliotek itp. wtki 28

MPI-2 przejdziemy teraz do szczegółowego omówienia cech MPI-2 29

równoległe we/wy równoległe we/wy w MPI rozpoczyna si od funkcji znanych uytkownikom klasycznego jzyka we/wy i bibliotek omawiamy równie dodatkowe cechy MPI konieczne dla zapewnienia efektywnoci i przenonoci w tej czci skupimy si na odpowiednikach MPI otwierajcych i zamykajcych plik oraz na odczycie i zapisie cigłego bloku danych z i do pliku 30

równoległe we/wy na tym poziomie, główn cech jak pokaemy jest to, jak MPI moe wygodnie wyrazi równoległo w tych operacjach podamy kilka wariantów prostego przykładu, w którym procesy zapisuj tablic liczb całkowitych do pliku 31

sekwencyjne we/wy w programie MPI MPI nie obsługuje jawnie równoległego we/wy aplikacje MPI realizowały we/wy za pomoc mechanizmów wiadczonych przez system operacyjny jeden proces wykonuje całe we/wy, na zlecenie innych procesów 32

sekwencyjne we/wy w programie równoległym pami procesy plik 33

przykład programu zbiór procesów posiada rozproszon tablic liczb całkowitych, do zapisania do pliku kady proces ma 100 liczb z tej tablicy kółka to procesy, górne prostokty to bloki pamici w kadym procesie, po 100 liczb dolny prostokt to plik do zapisu 34

sekwencyjne we/wy w programie równoległym /* przyklad sekwencyjnego zapisu w Uniksie do wspolnego pliku */ #include mpi.h #include <stdio.h> #define BUFSIZE 100 int main(int argc, char *argv[]) { int i, myrank, numprocs, buf[bufsize] MPI_Status status; FILE *myfile 35

sekwencyjne we/wy w programie równoległym MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); for (i=0; i<bufsize, i++) buf[i] = myrank + BUFSIZE + 1; if myrank!= 0) MPI_Send(buf, BUFSIZE, MPI_INT, 0, 99, MPI_COMM_WORLD); 36

sekwencyjne we/wy w programie równoległym else { myfile = fopen( testfile, w ); fwrite(buf, sizeof(int), BUFSIZE, myfile); for (i=1; i<numprocs; i++) { MPI_Recv(buf, BUFSIZE, MPI_INT, i, 99, MPI_COMM_WORLD, &status); fwrite(buf, sizeof(int), BUFSIZE, myfile); } 37

sekwencyjne we/wy w programie równoległym } fclose(myfile); } MPI_Finalize(); return 0; 38

sekwencyjne we/wy w programie równoległym jest to czsto pierwszy sposób, w jaki we/wy jest realizowane w programie równoległym, jako przeniesienie z programu sekwencyjnego jeeli w programie z poprzedniego slajdu, /, wtedy nie ma adnej operacji komunikacji MPI 39

sekwencyjne we/wy w programie równoległym mona tak zrobi, gdy: maszyna równoległa, na której działa program, moe obsługiwa we/wy tylko z jednego procesu mona uywa zaawansowanych bibliotek we/wy, które nie maj zdolnoci równoległego we/wy powstały jeden plik jest wygodny do obsługi poza programem (0,, ) 40

sekwencyjne we/wy w programie równoległym... mona tak zrobi, gdy: mona zwikszy wydajno, kiedy proces wykonujcy we/wy jest zdolny do zbierania duych bloków danych nie naley tak robi, gdy: brak równoległoci ogranicza efektywno i skalowalno, zwłaszcza wtedy, gdy system plików dopuszcza równoległe fizyczne we/wy 41

równoległe we/wy nie-mpi w programie MPI aby podkreli brak równoległoci, nastpnym krokiem w przejciu od programu sekwencyjnego do równoległego jest pozwolenie kademu procesowi na zapis do oddzielnego pliku, w ten sposób realizujc równoległy transfer danych 42

równoległe we/wy nie-mpi w programie MPI pami procesy pliki 43

równoległe we/wy nie-mpi w programie MPI /* przyklad rownoleglego zapisu w Uniksie do oddzielnych plikow */ #include mpi.h #include <stdio.h> #define BUFSIZE 100 int main(int argc, char *argv[]) { int i, myrank, buf[bufsize]; char filename[128] FILE *myfile 44

równoległe we/wy nie-mpi w programie MPI MPI_Init(&argc,&argv); } MPI_Comm_rank(MPI_COMM_WORLD, &myrank); for (i=0; i<bufsize; i++) buf[i] = myrank * BUFSIZE + i; sprint(filename, testfile.%d, myrank); myfile = fopen(filename, w ); fwrite(buf, sizeof(int), BUFSIZE, myfile); fclose(myfile); MPI_Finalize(); return 0; 45

równoległe we/wy nie-mpi w programie MPI kady proces funkcjonuje niezalenie od innych w odniesieniu do we/wy, std program jest sekwencyjny wzgldem we/wy kady proces otwiera swój plik, zapisuje do niego i go zamyka pliki s oddzielne, co zapewniane jest przez przydział numeru procesu do nazwy pliku 46

równoległe we/wy nie-mpi w programie MPI zalet tego podejcia jest to, e operacje we/wy mog odbywa si równolegle i nadal mog stosowa sekwencyjne biblioteki we/wy, gdy to jest wymagane to podejcie ma jednak wiele wad 47

równoległe we/wy nie-mpi w programie MPI wady s nastpujce: pliki by moe musz by połczone razem, zanim bd wejciem do innej aplikacji moe si zdarzy, e aplikacja, która czyta te pliki, sama jest programem równoległym, i musi by uruchomiona z tak sam liczb procesów 48

równoległe we/wy nie-mpi w programie MPI wady s nastpujce: moe by utrudnione ledzenie zbioru plików jako całej grupy, w celu jego przesuwania, kopiowania albo nadawania moe zmniejszy si efektywno, poniewa poszczególne procesy mog mie swoje dane w małych, cigłych blokach, co powoduje wiele operacji we/wy na niewielkich danych, straty te mog przewysza zyski z równoległoci 49

we/wy MPI do oddzielnych plików jako nasz pierwszy program po prostu przekształcimy poprzedni program do wersji, w której wszystkie operacje we/wy s wykonane za pomoc MPI program ma te same zalety i wady, co poprzednia wersja 50

we/wy MPI do oddzielnych plików /* przyklad rownoleglego zapisu MPI do oddzielnych plikow */ #include mpi.h #include <stdio.h> #define BUFSIZE 100 int main(int argc, char *argv[]) { int i, myrank, buf[bufsize]; char filename[128] MPI_File *myfile 51

we/wy MPI do oddzielnych } plików MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); for (i=0; i<bufsize; i++) buf[i] = myrank * BUFSIZE + i; sprint(filename, testfile.%d, myrank); MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_WRONLY MPI_MODE_CREATE, MPI_INFO_NULL, &myfile); MPI_File_write(myfile, buf, BUFSIZE, MPI_INT, MPI_STATUS_IGNORE); MPI_File_close(&myfile); MPI_Finalize(); return 0; 52

we/wy MPI do oddzielnych plików midzy tymi programami s 4 rónice: deklaracjfile zastpiono przez MPI_File, myfile jest teraz zmienn typu MPI_File, zamiast wskanikiem do obiektu typu FILE funkcj MPI odpowiadajc fopen jest MPI_File_open, pierwszym jej argumentem jest komunikator, który zapewnia, e procesy operujce na pliku nawzajem si znaj i mog si ze sob komunikowa 53

we/wy MPI do oddzielnych plików pierwszym argumentem funkcji MPI_File_open jest komunikator MPI_COMM_SELF, poniewa kady proces otwiera własny plik dla swojego wyłcznego uytku drugim argumentem funkcji jest nazwa pliku trzeci argument, to tryb otwarcia pliku, tworzonego albo nadpisywanego, opisywany flagami, np. MPI_MODE_WRONLY i MPI_MODE_CREATE 54

we/wy MPI do oddzielnych plików czwarty argument,mpi_info_null, to warto domylna argumentuinfo funkcji MPI_File_open ostatnim argumentem jest adres zmiennej MPI_File, któr wypełnia funkcja MPI_File_open operacja ta zwraca jako warto funkcji kod powrotu, czyli MPI_SUCCESS, czego nie badamy 55

we/wy MPI do oddzielnych plików nastpn funkcj wykonujc we/wy w tym programie jest: MPI_File_write(myfile, buf, BUFSIZE, MPI_INT, MPI_STATUS_IGNORE); jest tu analogia midzy we/wy, a przesyłaniem komunikatów, dane do zapisu s opisywane trójk(address, count, datatype), czyli w taki sam sposób, jak komunikat w MPI-1 56

we/wy MPI do oddzielnych plików sposób opisu bufora do zapisu albo odczytu ma te same zalety, co w przesyłaniu komunikatów pozwala na dowoln dystrybucj niecigłych danych w pamici zapisanych jednym wywołaniem typ danych pozwala na zastosowanie transformacji przy zapisie albo odczycie w rodowisku heterogenicznym 57

we/wy MPI do oddzielnych plików kocowy argument to status, tego samego typu, co zwracany przezmpi_recv MPI-2 podaje, aby zamiast argumentu statusu, przekaza dowolnej funkcji MPI specjaln wartompi_status_ignore, w ten sposób mówic implementacji MPI, aby nie zajmowała si statusem, gdy i tak jest ignorowany to rozwizanie poprawia efektywno 58

we/wy MPI do oddzielnych plików na koniec, MPI_File_close(&myfile); zamyka plik, przekazujc adres pliku myfile 59

we/wy MPI do jednego pliku zmodyfikujemy teraz nasz przykład, tak aby procesy współdzieliły jeden plik, zamiast zapisywa do oddzielnych plików, pokaemy jak to realizuje MPI eliminuje to niewygod posiadania wielu plików, a pozostawia zalet zwikszonej efektywnoci zapewnianej przez równoległo 60

we/wy MPI do jednego pliku /* przyklad rownoleglego zapisu MPI do jednego pliku */ #include mpi.h #include <stdio.h> #define BUFSIZE 100 int main(int argc, char *argv[]) { int i, myrank, buf[bufsize]; MPI_File thefile; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 61

we/wy MPI do jednego pliku for (i=0; i<bufsize; i++) buf[i] = myrank * BUFSIZE + i; } MPI_File_open(MPI_COMM_WORLD, testfile, MPI_MODE_CREATE MPI_MODE_WRONLY, MPI_INFO_NULL, &thefile); MPI_File_set_view(thefile, myrank * BUFSIZE * sizeof(int), MPI_INT, MPI_INT, native, MPI_INFO_NULL); MPI_File_write(thefile, buf, BUFSIZE, MPI_INT, MPI_STATUS_IGNORE); MPI_File_close(&thefile); MPI_Finalize(); return 0; 62

we/wy MPI do jednego pliku midzy tym programem, a poprzednim, s nastpujce rónice: argumentem funkcji MPI_File_open jest teraz MPI_COMM_WORLD, zamiast MPI_COMM_SELF, oznacza to, e wszystkie procesy razem otwieraj jeden plik taka operacja komunikatora nazywana jest operacj kolektywn 63

we/wy MPI do jednego pliku sposobem na zapis współdzielonego pliku jest danie kademu procesowi dostpu do czci pliku: 64

we/wy MPI do jednego pliku cz pliku, która jest widziana przez pojedynczy proces, jest zwana widokiem pliku, i jest ustawiona dla kadego procesu wywołaniem MPI_File_set_view MPI_File_set_view(thefile, myrank * BUFSIZE * sizeof(int), MPI_INT, MPI_INT, native, MPI_INFO_NULL); pierwszy argument to nazwa pliku thefile 65

we/wy MPI do jednego pliku drugi argument to przesunicie (w bajtach) w pliku, w którym zaczyna si widok pliku z danego procesu - mnoymy tutaj rozmiar zapisywanych danych przez numer procesu myrank * BUFSIZE * sizeof(int) std widok pliku z kadego procesu rozpoczyna si w odpowiednim miejscu w pliku jest to argument typu MPI_Offset 66

we/wy MPI do jednego pliku trzeci argument to etype widoku, okrela on jednostk danych w pliku, tutaj jest nim MPI_INT czwarty argument, filetype, słuy do opisu danych niecigłych w pliku. Poniewa tutaj nie ma adnych danych niecigłych, stosujemy etype MPI_INT pity argument to reprezentacja danych w pliku, native oznacza, e dane w pliku s takie same jak dane w pamici 67

we/wy MPI do jednego pliku nie ma wtedy konwersji, jest precyzja, std efektywno inne reprezentacje to:internal i external32, które zapewniaj przenono midzy komputerami o rónych architekturach ostatni argument to obiekt info, który jest ignorowany: MPI_INFO_NULL 68

we/wy MPI do jednego pliku teraz kady proces ma swój własny widok pliku, a operacja zapisu jest taka sama jak poprzednio: MPI_File_write(thefile, buf, BUFSIZE, MPI_INT, MPI_STATUS_IGNORE); ale poniewa MPI_File_open okrelił MPI_COMM_WORLD jako komunikator, a MPI_File_set_view dał kademu procesowi odmienny widok pliku, wtedy operacja zapisu przebiega równolegle 69

we/wy MPI do jednego pliku - wersja Fortran 90 przedstawimy ostatni program w wersji na jzyk Fortran standard MPI-2 ma dwa poziomy wsparcia Fortranu: podstawowy i rozszerzony poziom podstawowy wymaga, aby plik mpif.h był wany zarówno w formacie dla dowolnego ródła i jak i ustalonego ródła (działa dla kompilatora Fortran 90 i 77) 70

we/wy MPI do jednego pliku - wersja Fortran 90 poziom rozszerzony wymaga zastosowania modułu MPI, i zastpuje linimpif.h przezuse mpi MPI_Offset w jzyku C jest zastpiony w Fortranie przez typ INTEGER(kind=MPI_OFFSET_KIND) 71

we/wy MPI do jednego pliku - wersja Fortran 90! Rownolegly zapis MPI do jednego pliku w Fortranie PROGRAM main use mpi integer ierr, i, myrank, BUFSIZE, thefile parameter (BUFSIZE=100) integer buf(bufsize) integer(kind=mpi_offset_kind) disp call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr) do i = 0, BUFSIZE buf(i) = myrank * BUFSIZE + i enddo 72

we/wy MPI do jednego pliku - wersja Fortran 90 call MPI_FILE_OPEN(MPI_COMM_WORLD, 'testfile', & MPI_MODE_WRONLY + MPI_MODE_CREATE, & MPI_INFO_NULL, thefile, ierr) call MPI_TYPE_SIZE(MPI_INTEGER, intsize) disp = myrank * BUFSIZE * intsize call MPI_FILE_SET_VIEW(thefile, disp, MPI_INTEGER, & MPI_INTEGER, 'native', & MPI_INFO_NULL, ierr) call MPI_FILE_WRITE(thefile, buf, BUFSIZE, MPI_INTEGER, & MPI_STATUS_IGNORE, ierr) call MPI_FILE_CLOSE(thefile, ierr) call MPI_FINALIZE(ierr) END PROGRAM main 73

odczyt pliku przez dowoln liczb procesów jedn z zalet równoległego we/wy do jednego pliku jest moliwo natychmiastowego odczytu pliku równolegle przez dowoln liczb procesów pokaemy teraz program, niezaleny od liczby procesów, które go uruchomi 74

odczyt pliku przez dowoln liczb procesów jest znany całkowity rozmiar pliku i s ustawione widoki pliku dla rónych procesów, tak, e kady ma w przyblieniu t sam ilo do odczytu jest tutaj jedna funkcja, której jeszcze nie znamy: MPI_File_get_size 75

odczyt pliku przez dowoln liczb procesów MPI_File_get_size (thefile, &thefile) pierwszym argumentem jest plik do otwarcia, drugim adres pola, do którego zapisuje si rozmiar pliku w bajtach MPI definiuje nowy typ MPI_Offset, który jest wystarczajco duy do zmieszczenia rozmiaru pliku 76

odczyt pliku przez dowoln liczb procesów jedn rónic midzy zapisem i odczytem jest to, e przy odczycie nie zawsze wiadomo, jak duo danych jest do odczytu chocia moemy to obliczy, kademu procesowi pozwalamy wyda to samo wywołanie MPI_File_read i przekaza adres rzeczywistego MPI_Status zamiast MPI_STATUS_IGNORE 77

odczyt pliku przez dowoln liczb procesów wtedy, tak jak w przypadku MPI_Recv, moemy uympi_get_count aby znale jak wiele wystpie danego typu danych przeczytano jeeli było mniej ni liczba danych elementów, wtedy osiga si koniec pliku 78

odczyt pliku przez dowoln liczb procesów /* równolegly MPI odczyt pliku przez dowoln liczb procesów */ #include mpi.h #include <stdio.h> int main(int argc, char *argv[]) { int myrank, numprocs, bufsize, *buf, count; MPI_File thefile; MPI_Status status MPI_Offset filesize; 79

odczyt pliku przez dowoln MPI_Init(&argc, &argv); liczb procesów MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_File_open(MPI_COMM_WORLD, testfile, MPI_MODE_RDONLY, MPI_INFO_NULL, &thefile); MPI_File_get_size(thefile, &filesize); /* w bajtach */ filesize = filesize /size(int); /* w liczbie ints */ bufsize = filesize / numprocs + 1;/*lokalna liczba do odczytu */ buf = (int *) malloc (bufsize + sizeof(int)); 80

odczyt pliku przez dowoln liczb procesów } MPI_File_set_view(thefile, myrank * bufsize * sizeof(int)), MPI_INT, MPI_INT, native, MPI_INFO_NULL); MPI_File_read(thefile, buf, bufsize, MPI_INT, &status); MPI_Get_count(&status, MPI_INT, &count); printf( process %d read %d ints\n, myrank, count); MPI_File_close(&thefile); MPI_Finalize(); return 0; 81

odczyt pliku przez dowoln liczb procesów przyczyn zastosowania bufsize = filesize / numprocs + 1; jest przypadek, gdy filesize < numprocs bez +1 wszystkie procesy odczytaj zero elementów, przy tej definicji bufsize, cały plik bdzie odczytany wad jest nieoptymalna liczba elementów, gdy filesize jest parzycie podzielny przez numprocs 82

odczyt pliku przez dowoln liczb procesów wersja C++ zastosowano tu nastpujce cechy wiza C++: wikszo obiektów MPI (grupy, komunikatory, pliki, dania, statusy) to obiekty C++ funkcja MPI zwizana z obiektem staje si metod na tym obiekcie, np. MPI_Send(..., comm) staje si metod na komunikatorze: comm.send(...) 83

odczyt pliku przez dowoln liczb procesów wersja C++ zastosowano tu nastpujce cechy wiza C++ (c.d): obiekty nie bdce składnikami innych obiektów istniej w przestrzeni nazw MPI, np. MPI_COMM_WORLD staje si MPI::COMM_WORLD, a stała MPI_INFO_NULL staje si MPI::INFO_NULL funkcje tworzce obiekty zwracaj obiekt jako warto zwrotn zamiast zwracania kodu błdu, np. MPI::File::Open zwraca obiekt typu MPI::File 84

odczyt pliku przez dowoln liczb procesów wersja C++ zastosowano tu nastpujce cechy wiza C++ (c.d): funkcje, które w C zwracaj warto w argumencie, tu zwracaj jako warto funkcji stosuje si sposób obsługi błdów, stosowany w C++. Domylna obsługa błdów to MPI::ERRORS_ARE_FATAL, ale mona j zmieni na: MPI::ERRORS_THROW_EXCEPTIONS 85

odczyt pliku przez dowoln liczb procesów wersja C++ zwrómy uwag na dwie wersje MPI::Init ta nowa, bez argumentów: MPI_Init() pozwala na przekazanie (NULL, NULL) do funkcji C: MPI_Init zamiast (&argc, &argv) 86

odczyt pliku przez dowoln liczb procesów wersja C++ /* równolegly MPI odczyt z jednego pliku, w C++ */ #include <iostream.h> #include mpi.h int main(int argc, char *argv[]) { intbufsize, *buf, count; char filename[128] MPI::Status status; MPI::Init(); int myrank = MPI::COMM_WORLD.Get_rank(); 87

odczyt pliku przez dowoln liczb procesów wersja C++ int numprocs = MPI::COMM_WORLD.Get_size(); MPI::File thefile = MPI::File::Open(MPI::COMM_WORLD, testfile, MPI::MODE_RDONLY, MPI::INFO_NULL); MPI::Offset filesize = thefile.get_size(); //w bajtach filesize = filesize / sizeof(int); //w liczbie ints bufsize = filesize / numprocs + 1; //lokalna liczba do //odczytu buf = (int *) malloc (bufsize * sizeof(int)); thefile.set_view(myrank * bufsize * sizeof(int)), MPI_INT, MPI_INT, native, MPI::INFO_NULL); 88

odczyt pliku przez dowoln liczb procesów wersja C++ } thefile.read(buf, bufsize, MPI_INT, status); count = status.get_count(mpi_int); cout << proces << myrank << read << << count << ints << endl; thefile.close(); MPI::Finalize(); return 0; 89

inne sposoby zapisu do pliku współdzielonego zastosowalimy wczeniej (slajd 65), MPI_File_set_view aby pokaza, jak mona poinstruowa wiele procesów, aby współdzieliły jeden plik w MPI jest wiele sposobów na uzyskanie tego samego celu 90

inne sposoby zapisu do pliku współdzielonego MPI_File_seek pozwala wielu procesom, aby ustawiły si na okrelone przesunicie w bajtach (byte offset), czyli przesunły wskanik do pliku, przed rozpoczciem odczytu albo zapisu (analogia do lseek w Uniksie) dla wikszej efektywnoci, operacje seek i read mog by połczone w jedn funkcj: MPI_File_read_at, podobnie jest z funkcj MPI_File_write_at 91

inne sposoby zapisu do pliku współdzielonego jeszcze jeden wskanik do pliku, zwany współdzielonym wskanikiem do pliku jest współdzielony midzy procesami nalecymi do komunikatora, przekazanego wczeniej do MPI_File_open takie funkcje, jak MPI_File_write_shared, uzyskuj dostp do danych z biecej lokalizacji współdzielonego wskanika do pliku, a nastpnie zwikszaj ten wskanik o wielko tych danych wykorzystanie: zapis logu przez wiele procesów 92

zdalny dostp do pamici MPI-2 uogólnia cisły model przesyłania komunikatów, realizowany przez MPI-1 zapewnia bezporedni dostp z jednego procesu do czci pamici innego procesu operacje to realizujce to:get, put i accumulate, zwane s operacjami zdalnego dostpu do pamici (remote memory access, RMA) pokaemy prosty przykład RMA 93

zdalny dostp do pamici charakterystyczn cech modelu przesyłania komunikatów oblicze równoległych jest to, e dane s przesuwane z przestrzeni adresowej jednego procesu do przestrzeni adresowej drugiego procesu, jedynie za pomoc kooperatywnej pary operacji nadawania i odbioru 94

zdalny dostp do pamici te same operacje, które przesuwaj (move) dane, wykonuj jednoczenie konieczn synchronizacj kiedy operacja odbioru si koczy, odebrane dane s gotowe do wykorzystania w procesie odbiorczym MPI-2 nie realizuje rzeczywistego modelu z pamici współdzielon, niemniej jednak RMA daje wiele z jego elastycznoci przesuwanie danych moe w całoci inicjowa jeden proces, std taka operacja nazywa si jednostronn (one sided) 95

zdalny dostp do pamici na dodatek synchronizacja, wymagana dla zakoczenia operacji przesuwania danych, jest oddzielona od jednostronnej inicjacji tej operacji operacje RMA w MPI-2 obejmuj mały, ale istotny zbiór operacji przesuwania danych, i stosunkowo złoony zbiór operacji synchronizacji tutaj rozpatrzymy jedynie najprostsz posta synchronizacji 96

zdalny dostp do pamici naley zauway, e operacje RMA nie dajadnej szczególnej gwarancji efektywnoci w stosunku do operacji nadawania i odbioru s zaprojektowane do pracy w rodowisku z pamici współdzielon jak i bez niej ich główn zalet jest efektywno w projektowaniu algorytmów, powstałe programy s przenone na róne implementacje MPI 97

zdalny dostp do pamici główny pomysł: okna pamici w cisłym przesyłaniu komunikatów, bufory nadawczo/odbiorcze okrelone przez typy danych MPI odpowiadaj tym porcjom przestrzeni adresowej procesu, które s eksportowane do innych procesów (przy operacji nadawania) albo s dostpne do zapisu przez inne procesy (przy operacji odbioru) 98

zdalny dostp do pamici w MPI-2, to pojcie pamici komunikacyjnej, jest uogólnione na pojcie okna zdalnego zapisu do pamici kady proces moe wyznaczy porcje swojej przestrzeni adresowej dostpne dla innych procesów zarówno przy odczycie jak i zapisie 99

zdalny dostp do pamici operacje odczytu i zapisu, wykonywane przez inne procesy s nazywane operacjami zdalnego dostpu do pamiciget iput trzeci rodzaj operacji to accumulate odnosi si ona do aktualizacji lokacji zdalnej pamici, na przykład dodawania do niej jakiej wartoci 100

zdalny dostp do pamici okno w MPI-2 odnosi si do porcji pamici jednego procesu, któr on przedkłada do rozproszonego obiektu, zwanego obiektem okna w ten sposób obiekt okna składa si z wielu okien, z których kade składa si z lokalnych obszarów pamici przedłoonych do innych procesów za pomoc kolektywnej funkcji tworzenia okna 101

zdalny dostp do pamici zbiór procesów moe mie wiele obiektów okna okno przedłoone obiektowi okna przez zbiór procesów moe si zmienia z procesu na proces pokaemy teraz obiekt okna utworzony przez okna przedłoone przez dwa procesy 102

zdalny dostp do pamici proces 0 proces 1 get Put okno RMA obiekt okna okno RMA lokalna przestrze adresowa 103

zdalny dostp do pamici operacje put i get, przesuwajce dane do i ze zdalnej pamici innego procesu, s nieblokujce wymagana jest oddzielna operacja synchronizacji do ich zakoczenia rozwamy prosty przykład 104

zdalny dostp do pamici przedstawimy program cpi, wyliczajcy warto liczby π za pomoc całkowania numerycznego w wersji oryginalnej, bez RMA, proces 0 pyta uytkownika o liczb przedziałów do wykorzystania w całkowaniu, i stosuje MPI_Bcast do nadania tej liczby do innych procesów kady proces wylicza sum czciow, suma całkowita jest uzyskana przez dodanie sum czciowych operacjmpi_reduce 105

zdalny dostp do pamici w wersji jednostronnej tego programu, proces 0 zapamituje warto przeczytan od uytkownika do swojej czci okna obiektu RMA, skd inne procesy mog po prostu j pobra (get) po obliczeniu sumy czciowej, wszystkie procesy dodadz swoje wyliczenia do wartoci w innym obiekcie okna, za pomoc accumulate synchronizacj załatwi nam najprostsza z operacji synchronizacji okna, czyli fence 106

zdalny dostp do pamici pocztek programu, zawiera ustawianie obiektu okna (druga cz to ptla główna) tutaj kady obiekt okna zawiera jedynie pojedyncz liczb w pamici procesu 0 obiekty okna s reprezentowane przez zmienne typu MPI_Win w jzyku C potrzebujemy dwa dwa obiekty okna, poniewa s tu dwa typy danych, mamy liczb integerni doublepi, do których wszystkie procesy maj oddzielny dostp 107

zdalny dostp do pamici utworzenie pierwszego okna, dokonane na procesie 0, wyglda nastpujco: MPI_Win_create(&n, sizeof(int), 1, MPI_INFO_NULL, MPI_COMM_WORLD, &nwin); to jest odwzorowane na inne procesy za pomoc: MPI_Win_create(MPI_BOTTOM, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &nwin); 108

zdalny dostp do pamici wywołanie na procesie 0 musi by odwzorowane na inne procesy, nawet wtedy, gdy nie przedkładaj one adnej pamici obiektowi okna, poniewa MPI_Win_create jest operacj kolektywn na komunikatorze, podanym jako ostatni argument komunikator ten wyznacza, które procesy bd mogły mie dostp do obiektu okna 109

zdalny dostp do pamici pierwsze dwa argumenty MPI_Win_create to adres i długo okna lokalnej pamici w bajtach, w ten sposób proces wywołujcy jest podatny na operacje put i get z innych procesów tutaj jest to jedna liczba całkowita n w procesie 0 i nie ma adnej pamici w innych procesach, co jest oznaczone długoci 0 110

zdalny dostp do pamici stosujemy MPI_BOTTOM jako adres, poniewa jest to adres poprawny, a my chcemy podkreli, e te procesy nie przedkładajadnych lokalnych okien do tworzonego obiektu okna nastpnym argumentem jest jednostka przesunicia (displacement unit), wykorzystana do okrelenia przesunicia (offset) w pamici w oknach 111

zdalny dostp do pamici tutaj kady obiekt okna zawiera tylko jedn zmienn, do której mamy dostp z przesuniciem 0, std jednostka przesunicia nie jest wana, podajemy 1 bajt czwarty argument to MPI_Info, stosowany do optymalizacji operacji RMA, tutaj jest MPI_INFO_NULL 112

zdalny dostp do pamici pity argument to komunikator, okrelajcy zbiór procesów majcych dostp do pamici, nalecych do obiektu okna MPI zwraca obiekt MPI_Win jako ostatni argument po pierwszym wywołaniu MPI_Win_create, kady proces ma dostp do danych w nwin (zawierajcych jedn liczb całkowitn), za pomoc operacji put i get do zapamitania i odczytu, aaccumulate do aktualizacji 113

zdalny dostp do pamici nie musimy pozyskiwaadnej specjalnej pamici dla okna, stosujemy zmienn programow n w procesie 0 czasem mona pozyskiwa tak pami za pomocmpi_alloc_mem, ale tego tu nie pokazujemy drugie wywołanie MPI_Win_create w kadym procesie jest podobne do pierwszego, i tworzy obiekt okna piwin, dajcy kademu procesowi dostp do zmiennej pi w procesie 0, gdzie całkowita warto π jest sumowana 114

zdalny dostp do pamici fragment programu ustawiania obiektu okna /* obliczanie pi za pomoc całkowania numerycznego, wersja RMA */ #include mpi.h #include <math.h> int main(int argc, char *argv[]) { int n, myid, numprocs, i; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x; MPI_Win nwin, piwin; 115

zdalny dostp do pamici fragment programu ustawiania obiektu okna MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); if (myid == 0) { MPI_Win_create(&n, sizeof(int), 1, MPI_INFO_NULL, MPI_COMM_WORLD, &nwin); MPI_Win_create(&pi, sizeof(double), 1, MPI_INFO_NULL, MPI_COMM_WORLD, &piwin); } 116

zdalny dostp do pamici fragment programu ustawiania obiektu okna else { } MPI_Win_create(MPI_BOTTOM, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &piwin); MPI_Win_create(MPI_BOTTOM, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &piwin); 117

zdalny dostp do pamici główna ptla programu obliczania π za pomoc całkowania numerycznego, w wersji RMA, której kada iteracja zawiera: prob procesu 0 do uytkownika o podanie liczby przedziałów równoległe obliczanie wydrukowanie aproksymacji liczby π przez proces 0 ptla si koczy, gdy uytkownik wpisuje 0 118

zdalny dostp do pamici proces o niezerowym numerze pobiera (get) wartonbezporednio z obiektu okna, bez adnej jawnej akcji ze strony procesu 0, nadajcej t warto jednak przed wywołaniem MPI_Get, czy innej funkcji komunikacji RMA, naley wywoła specjaln funkcj synchronizacji, MPI_Win_fence, aby rozpocz tzw. epok dostpu RMA (RMA access epoch) 119

zdalny dostp do pamici naley wyranie podkreli, e funkcja MPI_Barrier nie moe by stosowana w celu osignicia synchronizacji wymaganej przez RMA MPI zapewnia w tym celu trzy specjalne mechanizmy, oprócz MPI_Win_fence, s to: locks (blokady, zatrzaski) oraz skalowalna, niekolektywna wersja MPI_Win_fence 120

zdalny dostp do pamici operacja fence, (płot), jest wywołana przez funkcjmpi_win_fence, i ma dwa argumenty: argument kontroli (assertion), do optymalizacji, tutaj jest nim 0 okno, na którym jest wykonana operacja fence MPI_Win_fence moe by rozumiane jako bariera, oddzielajca lokalne operacje na oknie od zdalnych operacji na oknie 121

zdalny dostp do pamici operacja fence moe równie oddziela dwa zbiory operacji zdalnych, czego tu nie pokazujemy tutaj MPI_Win_fence(0, nwin); oddziela przydział wartoci n od operacji zdalnych, takich jak: MPI_Get(&n, 1, MPI_INT, 0, 0, 1, MPI_INT, nwin); 122

zdalny dostp do pamici MPI_Get(&n, 1, MPI_INT, 0, 0, 1, MPI_INT, nwin); naley o tej licie argumentów myle jak o parze receive/send, których argumenty s w jednym wywołaniu w jednym procesie get jest jak receive, bufor odbiorczy jest okrelony w stylu MPI przez trójk: &n, 1, MPI_INT, czyli adres, licznik, typ danych 123

zdalny dostp do pamici MPI_Get(&n, 1, MPI_INT, 0, 0, 1, MPI_INT, nwin); potem jest numer procesu docelowego, czyli procesu, do którego pamici chcemy si dosta, jest nim 0, poniewa wszystkie procesy z wyjtkiem procesu 0 chc si tam dosta 124

zdalny dostp do pamici MPI_Get(&n, 1, MPI_INT, 0, 0, 1, MPI_INT, nwin); nastpne trzy argumenty: 0, 1, MPI_INT, definiuj bufor nadawczy w oknie, w stylu MPI, czyli: adres, licznik, typ danych tutaj adresem jest przesunicie w zdalnej pamici w procesie docelowym, jest nim 0, poniewa jest to jedyna warto w oknie, a przesunicie od pocztku okna to 0 125

zdalny dostp do pamici MPI_Get(&n, 1, MPI_INT, 0, 0, 1, MPI_INT, nwin); ostatni argument (nwin) to obiekt okna operacje RMA tylko inicjuj przesunicie danych, nie ma gwarancji, e jak wraca MPI_Get, to dane s pobrane do zmiennej n czyli MPI_Get jest operacj nieblokujc aby zapewni, e operacja si zakoczyła, trzeba ponownie wywołampi_win_fence 126

zdalny dostp do pamici nastpny fragment ptli głównej dotyczy sumy czciowejmypi w kadym procesie, włczajc proces 0 uzyskujemy aproksymacj π pozwalajc kademu procesowi na aktualizacj wartoci pi w obiekcie okna, poprzez dodanie do niej swojej wartoci mypi 127

zdalny dostp do pamici wpierw wywołujemy kolejne MPI_Win_fence, tym razem na obiekcie okna piwin, aby rozpocz kolejn epok dostpu RMA nastpnie wykonujemy operacjaccumulate MPI_Accumulate(&mypi, 1, MPI_DOUBLE, 0, 0, 1, MPI_DOUBLE, MPI_SUM, piwin); pierwsze trzy argumenty &mypi, 1, MPI_DOUBLE okrelaj lokaln warto stosowan do aktualizacji (jej adres, licznik, typ danych) 128

zdalny dostp do pamici MPI_Accumulate(&mypi, 1, MPI_DOUBLE, 0, 0, 1, MPI_DOUBLE, MPI_SUM, piwin); czwartym argumentem jest numer procesu docelowego, tutaj 0 kolejne trzy argumenty: 0, 1, MPI_DOUBLE, okrelaj warto aktualizowan w postaci (przesunicie, licznik, typ danych) nastpnie jest operacja stosowana do aktualizacji, jest nimpi_sum 129

zdalny dostp do pamici MPI_Accumulate(&mypi, 1, MPI_DOUBLE, 0, 0, 1, MPI_DOUBLE, MPI_SUM, piwin); ten argument jest podobny do argumentuop wmpi_reduce, rónic jest to, e w MPI_Accumulate mona stosowa jedynie wczeniej zdefiniowane operacje redukcji MPI tutaj kady proces dodaje swoj wartomypi do pi, std stosujemy operacjmpi_sum ostatni argument to obiekt okna, na którym dokonuje si aktualizacji, czyli piwin 130

zdalny dostp do pamici poniewa MPI_Accumulate jest funkcj nieblokujc, wywołujemympi_win_fence w celu zakoczenia operacji nastpnie drukujemy wynik z procesu 0 jeeli proces 0 nie stosujempi_accumulate, lecz pi += mypi, program da złe wyniki program koczy si uwolnieniem obiektów okna, za pomocmpi_win_free, kolektywnej operacji na tym samym komunikatorze, który wystpował w MPI_Win_create 131

zdalny dostp do pamici główna ptla programu obliczania π za pomoc całkowania numerycznego, wersja RMA while (1) { if (myid == 0) { printf( Wprowadz liczbe przedzialow: (0 konczy petle) ); fflush(stdout); scanf( %d,&n); pi = 0.0; } MPI_Win_fence(0, nwin); 132

zdalny dostp do pamici główna ptla programu obliczania π za pomoc całkowania numerycznego, wersja RMA if (myid!= 0) MPI_Get(&n, 1, MPI_INT, 0, 0, 1, MPI_INT, nwin); MPI_Win_fence(0, nwin); if (n == 0) break; else { h = 1.0 / (double) n; sum = 0.0; 133

zdalny dostp do pamici główna ptla programu obliczania π za pomoc całkowania numerycznego, wersja RMA 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_Win_fence( 0, piwin); MPI_Accumulate(&mypi, 1, MPI_DOUBLE, 0, 0, 1, MPI_DOUBLE, MPI_SUM, piwin); MPI_Win_fence(0, piwin); 134

zdalny dostp do pamici główna ptla programu obliczania π za pomoc całkowania numerycznego, wersja RMA } if (myid == 0) printf( pi jest w przyblizeniu %.16f, blad wynosi %.16f\n, pi, fabs(pi PI25DT)); } } MPI_Win_free(&nwin); MPI_Win_free(&piwin); MPI_Finalize(); return 0; 135

dynamiczne zarzdzanie procesami MPI-1 nie pozwala na dynamiczne zarzdzanie procesami MPI-2 realizuje to za pomoc funkcji MPI_Comm_spawn, która jest kolektywn operacj na rozmnaajcych si procesach (zwanych parents, rodzicami) i równie kolektywna przy wywołaniach MPI_Init w procesach rozmnaanych (zwanych children, dziemi) 136

podsumowanie omówilimy tutaj podstawowe kwestie dotyczce nastpujcych rozszerze standardu MPI: równoległe we/wy zdalne operacje na pamici oczywicie temat ten nie został w pełni wyczerpany oddzielnego potraktowania wymaga dynamiczne zarzdzanie procesami 137