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

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

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

51. Metody komunikacji nieblokującej.

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

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

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

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

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

Operacje grupowego przesyłania komunikatów

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

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

Operacje kolektywne MPI

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

Klient-Serwer Komunikacja przy pomocy gniazd

Jak wygląda praca na klastrze

tablica: dane_liczbowe

Lab 9 Podstawy Programowania

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

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

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

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

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

IPC: Kolejki komunikatów

Podstawy programowania w języku C++

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

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

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Interfejs MPI. Maciej Kasperski, Rafał Kozik. 16 kwietnia 2008

Rozszerzenia MPI-2 1

Struktury. Przykład W8_1

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Algorytmy równoległe: prezentacja i ocena efektywności prostych algorytmów dla systemów równoległych

Wskaźniki. Programowanie Proceduralne 1

Aplikacja Sieciowa wątki po stronie klienta

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania w języku C++

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

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

61 Topologie wirtualne

Pliki. Informacje ogólne. Obsługa plików w języku C

Stałe, tablice dynamiczne i wielowymiarowe

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

external Data Representation

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Warstwy oprogramowania wejścia/wyjścia

Weryfikacja oprogramowania, korzystajacego z MPI

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

PARADYGMATY PROGRAMOWANIA Wykład 3

System plików warstwa fizyczna

System plików warstwa fizyczna

System plików warstwa fizyczna

Język C zajęcia nr 11. Funkcje

Biblioteka standardowa - operacje wejścia/wyjścia

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania w języku C++

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

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

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

Opis protokołu RPC. Grzegorz Maj nr indeksu:

Wykład 8: klasy cz. 4

Obliczenia rozproszone z wykorzystaniem MPI

Wywoływanie procedur zdalnych

Programowanie w języku C++

Wykład 5: Klasy cz. 3

Programowanie i struktury danych

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Message Passing Interface

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

FAQ: /PL Data: 09/06/2012. Zastosowanie zmiennych Raw Data Type WinCC v7.0

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

Wywoływanie procedur zdalnych

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

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

Dynamiczne struktury danych

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Język C, tablice i funkcje (laboratorium)

Metody Metody, parametry, zwracanie wartości

Wykład 4: Klasy i Metody

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

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

ZASADY PROGRAMOWANIA KOMPUTERÓW

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

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

Podstawy programowania w języku C++

Programowanie 2. Język C++. Wykład 3.

Programowanie w standardzie MPI

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Zmienne i struktury dynamiczne

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Programowanie obiektowe W3

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Transkrypt:

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) np. MPI Irecv, MPI Isend Często zachodzi konieczność wymiany komunikatów między wszystkimi procesami, na przykład: proces główny wysyła do pozostałych procesów dane do obliczeń rozgłaszanie (ang. broadcast) procesy po zakończeniu obliczeń muszą wysłać częściowe wyniki do procesu głównego gromadzenie (ang. gather) danych z wszystkich procesów tylko w jednym procesie każdy proces potrzebuje dane z wszystkich pozostałych procesów połączenie rozgłaszania z gromadzeniem

Komunikacja grupowa MPI udostępnia funkcje do wykonywania komunikacji między wszystkimi procesami wewnątrz komunikatora wygodniejsze w użyciu, niż komunikacja między parami procesów większa efektywność komunikacji niekoniecznie programu Komunikacja grupowa wymaga synchronizacji wszystkich procesów wszystkie procesy muszą osiągnąć ten sam punkt synchronizacji zanim będą mogły kontynuować punktem synchronizacji musi być we wszystkich procesach ta sama operacja (funkcja), by obliczenia mogły być kontynuowane w MPI 3.0 planowane jest dodanie funkcji nieblokujących (asynchronicznych) do komunikacji grupowej

MPI Barrier Do synchronizacji procesów w MPI służy funkcja: MPI Barrier(MPI Comm komunikator) Źródło: http://www.mpitutorial.com/ Jawna synchronizacja stosowana jest zazwyczaj do podziału wykonania programu na sekcje.

Rozgłaszanie Rozgłaszanie proces wysyła kopie danych do pozostałych procesów w obrębie komunikatora Źródło: http://www.mpitutorial.com/ Przydatne przy wysyłaniu przez proces główny parametrów obliczeń lub danych wejściowych do pozostałych procesów

MPI Bcast W MPI rozgłaszanie realizowane jest za pomocą funkcji: MPI Bcast(void *data, int count, MPI Datatype datatype, int root, MPI Comm comm) Zarówno proces nadawca, jak i procesy odbiorcy wywołują tę samą metodę, różnica jest w znaczeniu parametrów data w procesie nadawcy wsk. bufora z danymi do wysłania w procesie odbiorcy wsk. bufora na rozgłaszane dane count rozmiar danych do wysłania datatype typ wysyłanych danych, np. MPI DOUBLE root identyfikator (ranga) procesu rozgłaszającego comm komunikator, może być MPI COMM WORLD Wykonanie rozgłaszania powoduje niejawną synchronizację procesów

MPI Bcast uwagi Wykonanie funkcji MPI Bcast jest w przybliżeniu równoważne wykonaniu poniższej naiwnej implementacji: void my bcast(void* data, int count, MPI Datatype datatype, int root, MPI Comm comm) { int proc rank, proc num; MPI Comm rank(comm, &proc rank); MPI Comm size(comm, &proc num); if (proc rank == root) { // proces rozgłaszający for (int i = 0; i < proc num; i++) { if (i!= proc rank) { MPI Send(data, count, datatype, i, 0, communicator); } } } else { // proces odbiorca, odbierz dane od nadawcy (root) MPI Recv(data, count, datatype, root, 0, communicator, MPI STATUS IGNORE); } }

MPI Bcast uwagi Przedstawiona implementacja jest bardzo nieefektywna dla n procesów proces nadawca musi wysłać n 1 komunikatów Na szczęście można zrobić to znacznie szybciej, zgodnie z porządkiem drzewiastym Źródło: http://www.mpitutorial.com/ Teraz pojedynczy proces musi wysłać, co najwyżej O(log n) komunikatów

MPI Bcast przykład Rozgłaszanie dla macierzy dynamicznej najłatwiej wykonać umieszczając ją w spójnym obszarze pamięci. const int N = 10; int *bufor = new int[n*n]; if (proc id == 0) { int **m = new int*[n]; // inicjuj macierz for (int i = 0; i < N; i++) { m[i] = bufor + i * N; for (int j = 0; j < N; j++) m[i][j] = (i+1) * (j+1); // przykł. zawartość } } MPI Bcast(bufor, N*N, MPI INT, 0, MPI COMM WORLD); if (proc id!= 0) { int **m = new int*[n]; // poskładaj macierz for (int i = 0; i < N; i++) m[i] = bufor + i * N; // teraz można wykonywać operacje na elementach m[i][j] }

Źródło: https://computing.llnl.gov/ MPI Scatter Czasem zachodzi potrzeba wysłania do wszystkich procesów różnych porcji danych tego samego rodzaju, np. wierszy macierzy służy do tego funkcja MPI Scatter

MPI Scatter efektywność Scatter 1 4*p Krok 0. 1 2 2*p 2*p Krok 1. 1 3 2 4 p p p p Krok 2. 1 5 3 6 2 7 4 8 Krok 3. Źródło: MIT OpenCourseWare Podobnie jak MPI Bcast operacja MPI Scatter wykonywana jest efektywnie, tak by zaangażować w rozsyłanie danych jak najwięcej procesów.

Źródło: https://computing.llnl.gov/ MPI Gather Odwrotnością funkcji MPI Scatter jest funkcja MPI Gather, która polega na zebraniu przez jeden proces danych od pozostałych procesów

MPI Allgather Jeżeli każdy proces ma uzyskać dostęp do danych wszystkich procesów, to odpowiednią metodą jest MPI Allgather Źródło: https://computing.llnl.gov/

Operacje redukcji MPI udostępnia możliwość efektywnego wykonywania operacji redukcji, tj. łącznej operacji dwuargumentowej na zbiorze danych rozproszonych między procesami w komunikatorze: MPI Reduce(void *sendbuf, void *recvbuf, int count, MPI Datatype datatype, MPI Op op, int root, MPI Comm comm) Zdefiniowane są następujące rodzaje operacji (MPI Op): MPI MAX, MPI MIN, MPI MAXLOC, MPI MINLOC MPI SUM, MPI PROD MPI LAND, MPI BAND, MPI LOR, MPI BOR, MPI LXOR, MPI BXOR MPI MINLOC i MPI MAXLOC zwracają odpowiednio minimaklną i maksymalną wartość odraz indeks (rangę) procesu, który je posiada

MPI Reduce Prosty przykład sumowania liczb: Źródło: https://computing.llnl.gov/

MPI Reduce W ogólnym przypadku zadana operacja wykonywana jest na wszystkich elementach podanych tablic. Przed MPI_Reduce inbuf result a b c d e f g h i j k l m n o Po MPI_Reduce a b c d e f g h i j k l m n o root = 1 a @ d @ g @ j @ m gdzie @ oznacza wykonywaną operację Źródło: MIT OpenCourseWare Analogicznie do operacji rozgłaszania, wykonanie redukcji wymaga O(log n) etapów komunikacji

Przykład zliczanie liczb pierwszych int n, proc id, proc num; MPI Comm size(mpi COMM WORLD,&proc num); MPI Comm rank(mpi COMM WORLD,&proc id); if (proc id == 0) printf("podaj n: "); scanf("%d",&n); MPI Bcast(&n, 1, MPI INT, 0, MPI COMM WORLD); double start = MPI Wtime(); int sum = proc id == 0? 1 : 0; for (int i = 2*(proc id + 1)+1; i <= n; i += 2*proc num) { if (is prime(i)) sum++; } double koniec = MPI Wtime(); int wynik = 0; MPI Reduce(&sum, &wynik, 1, MPI INT, MPI SUM, 0, MPI COMM WORLD); if (proc id == 0) { printf("jest %d liczb pierwszych <= %d", wynik, n); printf("czas obliczen: %.2lf sek.", koniec - start); }

MPI Allreduce Możliwe jest również wykonywanie operacji redukcji dla wszystkich procesów jednocześnie za pomocą: MPI Allreduce(void *sendbuf, void *recvbuff, int count, MPI Datatype datatype, MPI Op op, MPI Comm comm) Przed MPI_Allreduce inbuf result a b c d e f g h i j k l m n o Po MPI_Allreduce a b c d e f g h i j k l m n o a @ d @ g @ j @ m gdzie @ oznacza wykonywaną operację Źródło: MIT OpenCourseWare

MPI Reduce scatter Jak nazwa wskazuje polega na wykonaniu: operacji redukcji na tablicach (wektorach) wszystkich procesów w komunikatorze (reduce) rezultat dzielony jest na rozłączne fragmenty rozsyłane do poszczególnych procesów (scatter)

MPI Alltoall Ciekawą operacją jest MPI Alltoall, która polega na wysłaniu przez każdy proces unikalnej porcji danych do wszystkich pozostałych procesów n(n 1) operacji wysyłania komunikatów Źródło: https://computing.llnl.gov/

Operacje prefiksowe Operacje prefiksowe realizowane są przez funkcję MPI Scan(void *sendbuf, void *recvbuf, int count, MPI Datatype type, MPI Op op, MPI Comm comm) Polegają na wykonaniu częściowej redukcji Proces i otrzymuje wynik redukcji dla danych procesów o indeksach (rangach) od 0 do i Proces o najwyższej randze ma wynik dla wszystkich danych Funkcja obsługuje takie operatory, jak MPI Reduce

MPI Scan przykład Źródło: https://computing.llnl.gov/

Trwała komunikacja W przypadku częstej komunikacji, np. w pętli, można uniknąć narzutu czasowego związanego z inicjowaniem operacji komunikacji za pomocą utworzenia trwałego żądania komunikacyjnego (ang. persistent communication request) półkanał komunikacyjny Oszczędność wynika z przypisania parametrów operacji na stałe do żądania MPI Send init(buf, count, datatype, dest, tag, comm, request) tworzy trwałe żądanie wysłania MPI Recv init(buf, count, datatype, source, tag, comm, request) tworzy trwałe żądanie odbierania Parameter request pełni podobną rolę jak w operacjach MPI Irecv oraz MPI Isend

Trwała komunikacja scenariusz zastosowania 1. Utworzenie trwałego żądania za pomocą MPI Send init lub MPI Recv init 2. Zainicjowanie operacji wysłania / odbioru za pomocą MPI Start 3. Czekanie na zakończenie zainicjowanej operacji za pomocą MPI Wait lub MPI Waitall 4. Usunięcie żądania za pomocą MPI Request free Kroki 2. i 3. powtarzane są tyle razy, ile komunikatów ma zostać wysłanych / odebranych

Trwała komunikacja przykład MPI Request req[2]; MPI Recv init(buf1, count,type,src,tag,comm,&req[0]); MPI Send init(buf2, count,type,src,tag,comm,&req[1]); const int N = 100000; for (i=1; i < N; i++) { MPI Start(&req[0]); MPI Start(&req[1]); MPI Waitall(2,req,status); obliczenia(buf1, buf2); } MPI Request free(&req[0]); MPI Request free(&req[1]);

Definiowanie nowych typów danych Typy danych zdefiniowane w MPI pozwalają na łatwą wymianę tablic złożonych z elementów jednego z podstawowych typów, np. MPI INT W programach często zachodzi konieczność wymiany złożonych danych różnego typu 1. Można wysyłać kolejno składowe w osobnych operacjach niewygodne i wolne 2. Można zdefiniować własny typ dla przesyłanych danych znacznie wygodniejsze 3. Można stosować pakowanie i rozpakowywanie do i z bufora

Definiowanie nowych typów danych c.d. MPI udostępnia funkcje umożliwiające zdefiniowanie nowych typów danych należących do jednej z kategorii: Elementarne typy danych zdefiniowane w języku programowania Ciągłe tablice Wektory tablice, w których kolejne elementy oddzielone są separatorem o określonym rozmiarze Indeksowane podobnie jak wektor, ale adresy kolejnych elementów podawane są jawnie Strukturalne najbardziej ogólne, umożliwia przesyłanie struktur (struct) z języka C

Definiowanie nowych typów danych c.d. blklen =2 count = 3 elementy stride=5, el. wektora zajmuje 5 jednostek Wektor (z separatorami) v_blk_len[0]=3 v_blk_len[1]=2 v_blk_len[2]=1 count = 3 bloki v_disp[0]=0 v_disp[1]=5 w elementach v_disp[1]=12 T. indeksowany v_blk_len[0]=2 v_blk_len[1]=3 v_blk_len[2]=4 count = 3 bloki type[0] type[1] type[2] v_disp[0] v_disp[1] w bajtach v_disp[2] Strukturalny

Definiowanie nowych typów przykład typedef struct { float wartosc; char id; } Pomiar; int v blk len[2] = { 1, 1 }; // dł. bloków MPI Datatype v types[2] = { MPI FLOAT, MPI CHAR }; Pomiar pom; // ustal adresy kolejnych pól struktury MPI Aint v addr[3]; MPI Address(&pom, &v addr[0]); MPI Address(&(pom.wartosc), &v addr[1]); MPI Address(&(pom.id), &v addr[2]); // na ich podstawie wyznacz przesunięcia pól MPI Aint v disp[2] = { v addr[1] - v addr[0], v addr[2] - v addr[1] }; // zdefiniuj typ MPI Datatype pomiar type; MPI Type struct(2, v blk len, v disp, v types, &pomiar type); MPI Type commit(&pomiar type);

Definiowanie nowych typów przykład, c.d. const int N = 10; Pomiar pomiary[n]; if (proc id == 0) { for (int i = 0; i < N; ++i) { pomiary[i].wartosc = 1 + i; pomiary[i].id = A + i; } } MPI Bcast(pomiary, N, pomiar type, 0, MPI COMM WORLD); if (proc id!= 0) { for (int i = 0; i < N; i++) { cout << pomiary[i].wartosc << ", " << pomiary[i].id << endl; } }

Grupowanie danych Definiowanie własnych typów danych wymaga dodatkowego nakładu pracy, który warto ponieść w przypadku częstej wymiany komunikatów o tej samej strukturze W przypadku, gdy wymiana danych złożonych pojawia się w jednym miejscu programu można skorzystać z możliwości przesyłania danych zgrupowanych (spakowanych) Wszystkie dane muszą zostać zapisane w ciągłym obszarze pamięci

Grupowanie danych funkcje int MPI Pack(void *pack data, int in count, MPI Datatype datatype, void *buffer, int size, int *position ptr, MPI Comm comm) Bufor pack data powinien zawierać in count elementów typu datatype. Parametr position ptr zawiera adres początkowy w buforze wyjściowym buffer i po wykonaniu funkcji jego wartość jest uaktualniana (dodawana jest długość zapisanych danych) Parametr size określa rozmiar obszaru pamięci wskazywanego przez buffer. int MPI Unpack(void buffer, int size, int position ptr, void *unpack data, int count, MPI Datatype datatype, MPI Comm comm) Funkcja rozpakowuje count elementów typu datatype ze zmiennej buffer począwszy od pozycji position do obszaru pamięci wskazywanego przez unpack data i odpowiednio uaktualnia zmienną position.

Grupowanie danych przykład float a, b; int l; char buffer[100]; int pos; // Proces wysyłający dane pos=0; MPI Pack(&a, 1, MPI FLOAT, buffer, 100, &pos, MPI COMM WORLD); MPI Pack(&b, 1, MPI FLOAT, buffer, 100, &pos, MPI COMM WORLD); MPI Pack(&l, 1, MPI INT, buffer, 100, &pos, MPI COMM WORLD); MPI Bcast(buffer, 100, MPI PACKED, root, MPI COMM WORLD);... // Proces odbierający dane MPI Bcast(buffer, 100, MPI PACKED, root, MPI COMM WORLD); pos=0; MPI Unpack(buffer, 100, &pos, &a, 1, MPI FLOAT, MPI COMM WORLD); MPI Unpack(buffer, 100, &pos, &b, 1, MPI FLOAT, MPI COMM WORLD); MPI Unpack(buffer, 100, &pos, &l, 1, MPI INT, MPI COMM WORLD);

Równoległe I/O MPI udostępnia również szereg funkcji do wykonywania operacji wejścia/wyjścia w sposób równoległy (i rozproszony) Program może jednocześnie zapisywać i odczytywać dany plik za pośrednictwem funkcji MPI-IO Wymaga równoległego systemu plików (ang. parallel file system) modułowy, rozproszony; Przykłady: Lustre, IBM GPFS, PanFS Alternatywy dla MPI-IO: Wyznaczony proces zajmuje się odczytem / zapisem do pliku i rozsyłaniem oraz gromadzeniem danych Każdy proces korzysta z odrębnego pliku

Równoległe I/O c.d. Funkcje do obsługi I/O zostały zaimplementowane dopiero w MPI 2.0 Zalety równoległego I/O, to: zwiększona wydajność zunifikowany dostęp do plików, podobnie jak w przypadku programu sekwencyjnego ułatwia przetwarzanie plików z wynikami obliczeń Stosowanie sekwencyjnego I/O wymaga dodatkowo kopiowania plików między węzłami obliczeniowymi każdy proces zapisuje do lokalnego systemu plików MPI-IO udostępnia mechanizmy do: synchronizacji plików między serwerami oraz ich kopiowania nieciągłego sposobu wykonywania operacji na pliku za pomocą widoków (ang. file views)

Równoległe I/O przykład MPI File fh; MPI Status status; MPI Comm rank(mpi COMM WORLD, &rank); MPI Comm size(mpi COMM WORLD, &nprocs); bufsize = FILESIZE/nprocs; nints = bufsize/sizeof(int); MPI File open(mpi COMM WORLD, "/home/datafile", MPI MODE RDONLY, MPI INFO NULL, &fh); MPI File seek( fh, rank*bufsize, MPI SEEK SET); MPI File read( fh, buf, nints, MPI INT, &status); MPI File close(&fh);

Równoległe I/O File View etype = MPI_DOUBLE_PRECISION Przykład dla 4 proc. przesunięcia Ten sam widok (View) we wszystkich procesach, ale różne przesunięcia proc0 proc 1 proc 2 proc 3 Plik na dysku

Równoległe I/O File View #define N 100 // nowy typ danych - tablicowy MPI Datatype arraytype; MPI Offset disp; MPI Type contiguous(n, MPI INT, &arraytype); MPI Type commit(&arraytype); disp = rank * sizeof(int) * N; // przesunięcie etype = MPI INT; MPI File open(mpi COMM WORLD, "/home/datafile", MPI MODE CREATE MPI MODE RDWR, MPI INFO NULL, &fh); MPI File set view(fh, disp, MPI INT, arraytype, "native", MPI INFO NULL); MPI File write( fh, buf, N, MPI INT, MPI STATUS IGNORE);