Plan wykładu. Programowanie aplikacji równoległych i rozproszonych. Wykład 8 p. Komunikacja typu punkt-punkt. Koncepcja standardu MPI



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

Rozszerzenia MPI-2 1

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

Historia zmian w aplikacji. Rejestr Podmiotów Wykonujących Działalność Leczniczą

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

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

Moduł Pulpit opcji oraz Narzędzia. Opis v 1.0

Komunikacja w sieci Industrial Ethernet z wykorzystaniem Protokołu S7 oraz funkcji PUT/GET

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

Konfiguracja historii plików

Microsoft Management Console

Łagodne wprowadzenie do Message Passing Interface (MPI)

Tematyka i rozwiązania metodyczne kolejnych zajęć lekcyjnych wraz z ćwiczeniami.

DEMERO Automation Systems

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

Konfiguracja programu RMS do współpracy z wagami DIBAL. Programowanie artykułów 3

Zarządzanie projektami. wykład 1 dr inż. Agata Klaus-Rosińska

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

Ćwiczenie nr 2 Zbiory rozmyte logika rozmyta Rozmywanie, wnioskowanie, baza reguł, wyostrzanie

Charakterystyka systemów plików

JTW SP. Z OO. Zapytanie ofertowe. Zakup i dostosowanie licencji systemu B2B część 1

InsERT GT Własne COM 1.0

Systemy mikroprocesorowe - projekt

Instrukcja Obsługi STRONA PODMIOTOWA BIP

PROE wykład 7 kontenery tablicowe, listy. dr inż. Jacek Naruniec

Architektura Systemów Komputerowych. Sterowanie programem skoki Przerwania

Opis programu do wizualizacji algorytmów z zakresu arytmetyki komputerowej

Bazy danych. Andrzej Łachwa, UJ, /15

Jak usprawnić procesy controllingowe w Firmie? Jak nadać im szerszy kontekst? Nowe zastosowania naszych rozwiązań na przykładach.

3S TeleCloud - Aplikacje Instrukcja użytkowania usługi 3S KONTAKTY

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

System Informatyczny CELAB. Przygotowanie programu do pracy - Ewidencja Czasu Pracy

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

Kontrola wytwarzania energii w systemach PV

2) Drugim Roku Programu rozumie się przez to okres od 1 stycznia 2017 roku do 31 grudnia 2017 roku.

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Harmonogramowanie projektów Zarządzanie czasem

Kancelaris - Zmiany w wersji 2.50

Integracja systemów, integracja procesów

Warszawa, dnia 1 października 2013 r. Poz. 783 UCHWAŁA ZARZĄDU NARODOWEGO BANKU POLSKIEGO. z dnia 24 września 2013 r.

Praca na wielu bazach

Rozliczenia z NFZ. Ogólne założenia. Spis treści

Architektura typu klient - serwer. Oprogramowanie systemów równoległych i rozproszonych. Wykład 6. Cechy architektury klient - serwer

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Sieci komputerowe cel

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

Programowanie Podstawowe Informacje

Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych ul. Koszykowa 75, Warszawa

System kontroli wersji SVN

Uniwersytet Warszawski Teoria gier dr Olga Kiuila LEKCJA 5

PERSON Kraków

Funkcje składowe (metody)

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

Warunki Oferty PrOmOcyjnej usługi z ulgą

REGULAMIN KOMISJI ETYKI BANKOWEJ

WYKŁAD 8. Postacie obrazów na różnych etapach procesu przetwarzania

1. Korzyści z zakupu nowej wersji Poprawiono Zmiany w słowniku Stawki VAT Zmiana stawki VAT w kartotece Towary...

WYRAŻENIA REGULARNE I JĘZYK AWK

architektura komputerów w. 6 Pamięć I

Strategia rozwoju kariery zawodowej - Twój scenariusz (program nagrania).

Kurier POCZTEX XL by CTI. Instrukcja

OPIS PRZEDMIOTU ZAMÓWIENIA

Programowanie Zespołowe

Instrukcja zarządzania systemem informatycznym służącym do przetwarzania danych osobowych

V. Wymagania dla wsparcia projektu oraz nadzoru eksploatacyjnego... 6

API transakcyjne BitMarket.pl

PRZETWORNIK NAPIĘCIE - CZĘSTOTLIWOŚĆ W UKŁADZIE ILORAZOWYM

enova Workflow Obieg faktury kosztowej

Instrukcja postępowania w celu podłączenia do PLI CBD z uwzględnieniem modernizacji systemu w ramach projektu PLI CBD2

Stanowisko Rzecznika Finansowego i Prezesa Urzędu Ochrony Konkurencji i Konsumentów w sprawie interpretacji art. 49 ustawy o kredycie konsumenckim

Załącznik nr 8. Warunki i obsługa gwarancyjna

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

Wyniki badań dla trasy kolejowej Warszawa - Poznań.

VinCent Office. Moduł Drukarki Fiskalnej

Type ETO2 Controller for ice and snow melting

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Instrukcja obsługi platformy zakupowej e-osaa (klient podstawowy)

Spis treści. Rozdział 1 ewyniki. mmedica - INSTR UKC JA UŻYTKO W NIKA

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

Kopia zapasowa i odzyskiwanie Podręcznik użytkownika

POLITYKA GWARANCJI GRUPY TELE-FONIKA KABLE. 1. Definicje

Akademickie Centrum Informatyki PS. Wydział Informatyki PS

PROGRAMATOR "WinProg-1" Instrukcja obsługi

Podstawa prawna: Ustawa z dnia 15 lutego 1992 r. o podatku dochodowym od osób prawnych (t. j. Dz. U. z 2000r. Nr 54, poz. 654 ze zm.

Stowarzyszenie Lokalna Grupa Działania EUROGALICJA Regulamin Rady

Wykład 4 Wybrane zagadnienia programowania w C++

JĘZYK ROSYJSKI POZIOM ROZSZERZONY

PROGRAM ZAPEWNIENIA I POPRAWY JAKOŚCI AUDYTU WEWNĘTRZNEGO

Chmura obliczeniowa. do przechowywania plików online. Anna Walkowiak CEN Koszalin

Warszawska Giełda Towarowa S.A.

ZESPÓŁ LABORATORIÓW TELEMATYKI TRANSPORTU ZAKŁAD TELEKOMUNIKACJI W TRANSPORCIE

Aneks nr 8 z dnia r. do Regulaminu Świadczenia Krajowych Usług Przewozu Drogowego Przesyłek Towarowych przez Raben Polska sp. z o.o.

Sterownik nagrzewnicy elektrycznej HE

TMW HC912 PROGRAMATOR MIKROKONTROLERÓW MOTOROLA HC912

Plan naprawczy. Sokółka 2006/2007. Opracowanie: Urszula Bronowicz Henryka Sarosiek ElŜbieta Plichta Katarzyna Dykiel Tomasz Mucuś

Instrukcja do Arkusza kosztorysowania sieci klasy NGA na obszarach wymagających wsparcia publicznego.

Kontrola na zakończenie realizacji projektu. Trwałość projektu

Środowiskowe Laboratorium Ciężkich Jonów Uniwersytet Warszawski

3. 4. Szkoła zapewnia warunki do realizacji projektów w ramach posiadanych przez siebie środków.

Transkrypt:

Plan wykładu 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 Koncepcja standardu MPI, jego zalety i wady Komunikacja typu punkt-punkt Komunikacja grupowa Wstęp do standardu MPI-2 Mechanizm komunikacji jednostronnej i jego cechy charakterystyczne Sposoby dynamicznego zarzadzania procesami wprowadzone w standardzie MPI-2 Równoległe operacje wejścia/wyjścia MPI-IO i ich cechy Pozostałe rozszerzenia i modyfikacje wprowadzone w standardzie MPI-2 1/?? Wykład 8 p Koncepcja standardu MPI Komunikacja typu punkt-punkt Standard MPI (Message Passing Interface) definije bibliotekę dla języków C/C++ i Fortran do tworzenia programów równoległych dla modelu z wymiana komunikatów. Program składa się z procesów (zazwyczaj działajacych na różnych jednostkach obliczeniowych - procesorach lub rdzeniach), które komunikuja się przy pomocy komunikatów. Standard MPI został stworzony dla komputerów masywnie równoległych, jednakże w chwili obecnej pozwala na efektywna realizację przetwarzania równoległego na klastrach, a nawet architekturach z pamięcia współdzielona. Zaleta standardu MPI jest wysoka wydajność oraz możliwość efektywnej obługi dużej liczby procesów. Wada jest stosunkowo złożony sposób tworzenia programów równoległych - należy rozdzielić zadania na poszczególne procesy oraz w jawny sposób zadać komunikację pomiędzy nimi. Podstawowym mechanizmem wymiany danych pomiędzy procesami jest komunikacja typu punkt-punkt: nadawca wysyła komunikat do odbiorcy przy pomocy funkcji MPI_Send, odbiorca odbiera komunikat od nadawcy, wykorzystujac do tego celu funkcję MPI_Recv Funkcje MPI_Send/MPI_Recv sa blokujace - procesy czekaja na wykonanie komunikacji. W standardzie MPI udostępniono również komunikację nieblokujac a: MPI_Irecv(...); // inicjalizacja nieblokującego odebrania komunikatau... // wykonanie pracy niezależnej od odbieranych danych MPI_Wait(...); // czekanie na zakończenie komunikacji... // wykonanie pracy, która jest zależna od odebranych danych 3/?? Wykład 8 p

Komunikacja grupowa MPI-2 - nowe elementy Komunikacja grupowa to taka, w której wystepuje grupa procesów. Każdy proces z grupy wywołuje taka sama funkcję. W standardzie MPI zdefiniowano następujace funkcje do komunikacji grupowej: MPI_Barrier - synchronizacja procesów w postaci bramki, MPI_Bcast - rozgłaszanie jeden do wszystkich, MPI_Gather - zbieranie wszyscy do jednego, MPI_Allgather - zbieranie wszyscy do wszystkich, MPI_Scatter - rozpraszanie jeden do wszystkich, MPI_Reduce - redukcja wszyscy do jednego, MPI_Alltoall - rozpraszanie wszyscy do wszystkich, MPI_Allreduce - redukcja połaczona z rozgłaszaniem. W standardzie MPI-2 wprowadzono trzy główne modyfikacje: równoległe wejście/wyjście, komunikacja jednostronna, dynamiczne zarzadzanie procesami. Ponadto w porównaniu do standardu MPI 1.1 uścislono standard MPI, uwzględniono przetwarzanie wielowatkowe, umożliwiono łaczenie modułów w napisanych w różnych językach, dodano rozszerzone operacje komunikacji zbiorowej. 5/?? Wykład 8 p Sprawdzenie wersji MPI Dynamiczne zarzadzanie procesami Poczawszy od wersji 1.2 standardu MPI można przeprowadzić kontrolę wersji używnej biblioteki MPI. Podczas kompilacji można skorzystać z dyrektyw MPI_VERSION i MPI_SUBVERSION, które przechowuja odpowienio liczbę całkowita określajac a numer wersji i podwersji biblioteki MPI: #define MPI_VERSION 2 #define MPI_SUBVERSION 0 Podczas wykonania programu MPI można skorzystać z funkcji MPI_Get_version: int MPI_Get_version( int *version, int *subversion ) version - przez ten argument zostaje zwrócony numer wersji, subversion - pozwala na pobranie numeru podwersji. W standardzie MPI-1 liczba procesorów była statyczna - ustalana w momencie uruchomienia programu i nie mogła zostać zmieniona. W standardzie MPI-2 wspiera dynamiczne zarzadzanie procesami: możliwość tworzenia nowych procesów w trakcie działania programu, jak również ich usuwania, udostępnia mechanizm umożliwiajacy nawiazanie komunikacji pomiędzy nowo utworzonymi procesami, a istniejac a aplikacja MPI, możliwość przesyłania zmiennych typu MPI_Info pomiędzy procesami. udostępnia również mechanizm umożliwiajacy nawiazanie komunikacji pomiędzy dwoma zupełnie odrębnymi aplikacjami MPI (nawet jeżeli jedna nie uruchomiła drugiej). 7/?? Wykład 8 p

Uruchamianie procesów Funkcja MPI_Comm_spawn Aplikacja MPI może utworzyć nowy proces przy wykorzystaniu funkcji MPI_Comm_spawn i MPI_Comm_spawn_multiple będacych interfejsem do zewnętrznego zarzadcy procesów. Funkcja MPI_Comm_spawn umożliwia utworzenie nowych procesów i nawiazanie z nim komunikacji przy pomocy wspólnego komunikatora rodzica i potomka (intercommunicator). Funkcja MPI_Comm_spawn_multiple umożliwia utworzenie procesów wykorzystujacych różne pliki wykonywalne z takimi samymi, lub różnymi argumentami wywołania. Proces jest reprezentowany w MPI przez parę (group, rank), Funkcja MPI_Comm_spawn: int MPI_Comm_spawn(char *command, char *argv[], int maxprocs, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]) Stara się utworzyć maxprocs nowych identycznych kopii programu MPI przekazanego poprzez parametr command z argumentami wywołania znajdujacymi się w argv (może się to nie udać np. z powodu braku wolnych zasobów). Poprzez parametr intercomm zwracany jest inter-komunikator który zawiera procesy rodzica w grupie lokalnej (local group) oraz procesy potomne w grupie zdalnej (remote group). Utworzone procesy maja własny komunikator MPI\_COMM\_WORLD, który jest różny od tego, używanego przez procesy rodziców. 9/?? Funkcja MPI_Comm_get_parent Tworzenie procesów - ograniczenia Funkcja MPI_Comm_get_parent: int MPI_Comm_get_parent(MPI_Comm *parent) Jeżeli proces został stworzony przy pomocy funkcji MPI_Comm_spawn lub MPI_Comm_spawn_multiple funkcja MPI_Comm_get_parent zwraca dowiazanie do komunikatora rodzica (parent intracommunicator), w przeciwnym wypadku zwraca MPI_COMM_NULL. Intra-komunikator jest tworzony w momencie wywołania funkcji MPI_init i jest taki sam, jak intra-komunikator zwracany dla rodzica w momencie tworzenia procesu (zwracany w funkcjach MPI_Comm_spawn i MPI_Comm_spawn_multiple). W chwili tworzenia programu trudno jest założyć, ile procesów może zostać utworzonych (jest do zależne od środowiska w jakim program będzie działał). W zwiazku z tym decyzja o liczbie uruchamianych procesów musi być podjęta w trakcie działania programu (co w wielu wypadkach możne znacznie skomplikować implementację). Można do tego celu wykorzystać funkcję MPI_Comm_get_attr: int size, flag; MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, &size, &flag); gdzie po wykonaniu funkcji: flag - określa, czy MPI obsługuje MPI_UNIVERSE_SIZE, size - to w takim wypadku zwraca liczbę procesów - 1, jakie moga być uruchomione (w przypadku size równego 1 nie może zostać uruchomiony żaden nowy proces). Ponadto ze względu na wydajność lepszym rozwiazaniem jest uruchomienie w momencie startu aplikacji (mpiexec) tyle procesów, ile jest konieczne, zamiast tworzyć je dynamicznie. 11/??

Master - przykład Worker - przykład #include "mpi.h" #include <iostream> int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); MPI_Comm everyone; MPI_Comm_spawn("worker", MPI_ARGV_NULL, 2, MPI_INFO_NULL, 0, MPI_COMM_SELF, &everyone, MPI_ERRCODES_IGNORE); MPI_Finalize(); return 0; } #include "mpi.h" #include <iostream> int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); MPI_Comm parent; MPI_Comm_get_parent(&parent); if (parent == MPI_COMM_NULL) std::cerr << "Error - Brak rodzica!"; int size; MPI_Comm_remote_size(parent, &size); if (size!= 1) std::cerr << "Error - Cos poszlo nie tak"; MPI_Finalize(); return 0; } 13/?? Funkcja MPI_Comm_spawn Funkcja MPI_Comm_spawn_multiple int MPI_Comm_spawn(char *command, char *argv[], int maxprocs, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]) command - nazwa programu, z którego będa tworzone nowe procesy, argv - argumenty wywołania, jakie będa przekazane do tworzonych procesów, maxprocs - maksymalna liczba tworzonych procesów, info - zbiór par (klucz, wartość) informujacych system gdzie i jak maja zostać utworzone nowe procesy, root - identyfikator procesu tworzace procesy potomne, comm - intra-komunikator zawierajacy grupę utworzonych procesów, intercomm - inter-komunikator będacy uchwytem pomiędzy oryginalna grupa procesów, a grupa nowoutworzonych procesów, array_of_errcodes - tablica błędów o rozmiarze maxprocs (po jednym kodzie dla każdego procesu). 15/?? int MPI_Comm_spawn_multiple(int count, char *array_of_commands[], char **array_of_argv[], int array_of_maxprocs[], MPI_Info array_of_info[], int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]) count - liczba komend (rozmiar talicy array_of_commands), array_of_commands - tablica z nazwami programów, z których będa tworzone nowe procesy, array_of_argv - tablica z argumentami wywołania, jakie będa przekazane do tworzonych procesów, array_of_maxprocs - maksymalna liczba tworzonych procesów dla poszczególnych komend, array_of_info - tablica zbiórów par (klucz, wartość) informujacych system gdzie i jak maja zostać utworzone nowe procesy, root - identyfikator procesu tworzace procesy potomne, comm - intra-komunikator zawierajacy grupę utworzonych procesów, intercomm - inter-komunikator będacy uchwytem pomiędzy oryginalna grupa procesów, a grupa nowoutworzonych procesów, array_of_errcodes - tablica błędów o rozmiarze maxprocs (po jednym kodzie dla każdego procesu).

Komunikacja jednostronna Operacje w komunikacji jednostronnej W ramach standard MPI-1 udostępnione zostały mechanizmy komunikacji dwustronnej (nadawca i odbiorca jawnie uczestnicza w komunikacji): jeden proces wysyła komunikat (rodzina funkcji MPI_send), drugi proces odbiera komunikat (rodzina funkcji MPI_recv). W standardzie MPI-2 rozszerzono mechanizmy komunikacji poprzez dodanie trybu pamięci zdalnej RMA (Remote Memory Access) - jeden proces definiuje wszystkie parametry komunikacji (zarówno zwiazane z wysyłaniem danych, jak i ich odbieraniem). Komunikacja jednostronna wymaga jawnego użycia specjalnych funkcji synchronizujacych (w przypadku trybu blokujacego w MPI-1 synchronizacja była realizowana w sposób niejawny). W MPI-2 wprowadzono trzy operacje komunikacji jednostronnej: MPI_Put (remote write) - zapisywanie danych, MPI_Get (remote read) - pobieranie danych, MPI_Accumulate (remote update) - modyfikacja danych (np. sumowanie). 17/?? Okno dostępu do pamięci Zapis danych Aby można było wykorzystać operacje komunikacji jednostronnej należy utworzyć tzw. okno dostępu do pamięci. Tworzenie okna polega na wydzieleniu fragmentu już zaalokowanej pamięci procesu, do której będa miały dostęp inne procesy w trybie RMA. Utworzenie okna dostępu do pamięci jest operacja komunikacji zbiorowej. Do tego celu służy funkcja MPI_Win_create: int MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win) Tworzone jest okno o rozmiarze size, zaczynajace się od base. Zwracany jest obiekt win, który jest wykorzystywany w operacjach komunikacyjnych. Do usunięcia utworzonego okna służy funkcja MPI_Win_free. Funkcja służac a do zapisywania danych do pamięci innego procesu jest funkcja MPI_Put: int MPI_Put(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win) Proces zapisuje do pamięci procesu target_rank dane o rozmiarze origin_count znajdujace się pod adresem origin_addr. Dane zostaja umieszczone w pamięci procesu docelowego pod adresem określonym przez okno win oraz przesunięciem target_disp. 19/??

Odczyt danych Funkcja MPI_Accumulate Funkcja służac a do odczytywania danych z pamięci innego procesu jest funkcja MPI_Get: int MPI_Get(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win) Proces pobiera z pamięci procesu target_rank dane, które zostaja umieszczone w buforze origin_addr. Zapisywanych jest origin_count elementów typu origin_datatype. Dane zostaja pobrane z pamięci procesu target_rank spod adresu określonego przez poczatek okna win i przesunięcia target_disp. Po wykonaniu operacji MPI_Get należy wykonać operację synchronizacji. Korzystanie z lokalnego bufora origin_addr należy odłożyć aż do zakończenia synchronizacji. Funkcja MPI_Accumulate wykonuje określona operację (np. sumowanie) na zawartości lokalnego i docelowego bufora: int MPI_Accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win) Wynik operacji op wykonanej na lokalnym (origin_addr) i docelowym (określonym przez target_disp i win) buforze jest zapisywany w pamięci zdalnej. Można wykonywać wiele operacji akumulacji w tym samym czasie przez różne procesy korzystajac z tego samego bufora docelowego. 21/?? Synchronizacja Funkcja MPI_Win_fence Synchronizację RMA można podzielić na: z udziałem procesu zdalnego (active target), tylko z udziałem procesów źródłowych (passive target). Funkcja MPI_Win_fence synchronizuje wszystkie operacje RMA wykonywane na danym oknie dostępu do pamięci: int MPI_Win_fence(int assert, MPI_Win win) win - okno, którego operacje będa synchronizowane, assert - umożliwia przekazanie wskazówek optymalizacyjnych. Jest operacja typu active target. 23/??

Pozostałe sposoby synchronizacji Funkcja MPI_Win_create Poniższe funkcje umożliwiaja ograniczenie synchronizacji do minimum - jedynie pary procesów korzystajacych ze wspólnej pamięci uczestnicza w synchronizacji: MPI_Win_start, MPI_Win_wait, MPI_Win_post, MPI_Win_complete. Analogicznie, jak w przypadku modelu programowania z pamięcia współdzielona udostępniono funkcje, umożliwiajace procesowi zablokowanie korzystania z okna w danym czasie innym procesom (mechanizm zamków, rygli). Sa to operacje typu passive target: MPI_Win_lock, MPI_Win_unlock. int MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win) base - adres, od którego będzie zaczynało się okno, size - rozmiar okna w bajtach, disp_unit - jednostka (czynnik skalujacy) do przesunięcia w bajtach, info - uchwyt do danych informacyjnych, comm - procesy wchodzace w skład tej grupy będa mogły korzystać z utworzonego okna pamięci, win - zwracany obiekt okna, wykorzystywany następnie w operacjach komunikacji jednostronnej. 25/?? Funkcja MPI_Win_free Funkcja MPI_Put Funkcja MPI_Win_free usuwa obiekt okna dostępu do pamięci. Usuwanie obiektu okna może być wykonywane tylko po ukończonej synchronizacji. int MPI_Win_free(MPI_Win *win) win - uchwyt do okna, które będzie usuwane. int MPI_Put(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win) origin_addr - adres poczatkowy bufora źródłowego, origin_count - liczba elementów bufora źródłowego, origin_datatype - typ elementu bufora źródłowego, target_rank - identyfikator procesu, w którym będa zapisywane dane, target_disp - przesunięcie względem poczatku okna obszaru do którego będa zapisywane dane, target_count - liczba elementów bufora docelowego, target_datatype - typ elementu bufora docelowego, win - uchwyt do wcześniej utworzonego okna wykorzystywanego do komunikacji. 27/??

Funkcja MPI_Get Funkcja MPI_Accumulate int MPI_Get(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win) origin_addr - adres poczatkowy bufora docelowego, origin_count - liczba elementów bufora docelowego, origin_datatype - typ elementu bufora docelowego, target_rank - identyfikator procesu, z pamięci którego będa odczytywane dane, target_disp - przesunięcie względem poczatku okna obszaru, z którego będa odczytywane dane, target_count - liczba elementów bufora źródłowego, target_datatype - typ elementu bufora źródłowego, win - uchwyt do wcześniej utworzonego okna wykorzystywanego do komunikacji. int MPI_Accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win) origin_addr - adres poczatkowy bufora źródłowego, origin_count - liczba elementów bufora źródłowego, origin_datatype - typ elementu bufora źródłowego, target_rank - identyfikator procesu, w którym będa zapisywane dane, target_disp - przesunięcie względem poczatku okna obszaru do którego będa zapisywane dane, target_count - liczba elementów bufora docelowego, target_datatype - typ elementu bufora docelowego, op - typ operacji - moga być wykorzystywane te same operacje, co w przypadku MPI_Reduce: MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD, MPI_LAND, MPI_BAND, MPI_LOR, MPI_BOR, MPI_LXOR, MPI_BXOR, MPI_MAXLOC, MPI_MINLOC, win - uchwyt do wcześniej utworzonego okna wykorzystywanego do komunikacji. 29/?? Sekwencyjne wejście/wyjście Proste rozwiazanie równoległego we/wy Procesy wysyłaja dane do procesu 0, który zapisuje je do pliku Najprostsze rozwiazanie równoległe - każdy proces posiada własny plik, z którego czyta i zapisuje dane. Zaletami sa pełna równoległość oraz duża wydajność. Wadami - obsługa wielu małych plików oraz problemy przy korzystaniu z plików dla innej liczby procesów. 31/??

Równoległe we/wy - motywacja Równoległe we/wy - prosty przykład Sekwenyjne we/wy jest proste, ale charakteryzuje się niska wydajnościa, w przypadku gdy jeden proces korzysta z jednego pliku lub problemami zwiazanymi z zarzadzeniem wieloma plikami, w przypadku gdy każdy proces wykorzystuje swój własny plik. Istnieje wiele aplikacji, które wymagaja aby: był możliwy równoległy dostęp do jednego pliku przez wiele procesów, dostęp mógł być realizowany jednocześnie, procesy mogły odczytywać te same dane, tworzony był pojedynczy plik, ze względu na konieczność współpracy z innymmi narzędziami. Rozwiazaniem jest równoległe wejście/wyjście. Każdy proces odczytuje lub zapisuje dane korzystajac ze wspólnego pliku z/do przydzielonego mu fragmentu pliku. 33/?? Otwarcie i zamknięcie pliku Indywidualne pozycje pliku Do otwarcia pliku służy polecenie MPI_File_open: int MPI_File_open(MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *fh) Otwiera plik o nazwie filename na wszystkich procesach z komunikatora comm. Jest operacja kolektywna - wszystkie procesy z grupy comm musza wywołać funkcję MPI_File_Open z takimi samymi wartościami amode i filename. Do zamknięcia pliku służy polecenie MPI_File_close: int MPI_File_close(MPI_File *fh) Zamykany jest wcześniej otwarty plik, na który wskazuje uchwyt fh. Przy zamykaniu pliku wykonywana jest synchronizacja. MPI obsługuje jedna pozycję pliku (przesunięcie względem poczatku pliku) dla procesu i uchwytu do pliku. Każdy proces może ustawić swoja pozycję pliku w taki sposób, aby czytał lub zapisywał przydzielony mu fragment pliku. Do ustawienia lokalnej pozycji pliku służy funkcja MPI_File_seek: int MPI_File_seek(MPI_File fh, MPI_Offset offset, int whence) Modyfikuje lokalna pozycję pliku zwiazanego z uchwytem fh w następujacy sposób: MPI_SEEK_SET - pozycja pliku jest ustawiana na offset, MPI_SEEK_CUR - pozycja pliku jest zwiększana o offset, MPI_SEEK_END - pozycja pliku jest ustawiana na koniec pliku i dodawany jest do niej offest (w takim przypadku offset powinien mieć wartość ujemna). 35/??

Czytanie z pliku Zapis do pliku Do czytania z pliku można wykorzystać funkcje MPI_File_read: int MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) Odczytuje count elementów typu datatype z pliku określonego przez uchwyt fh do bufora buf poczawszy od aktualnej lokalnej pozycji pliku. Wersja grupowa funkcji MPI_File_read jest funkcja MPI_File_read_all: int MPI_File_read_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) Zapis do pliku można zrealizować przy pomocy funkcji MPI_File_write: int MPI_File_write(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) Zapisuje count elementów typu datatype do pliku określonego przez uchwyt fh z bufora buf poczawszy od aktualnej lokalnej pozycji pliku. Wersja grupowa funkcji MPI_File_write jest funkcja MPI_File_write_all: int MPI_File_write_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) 37/?? Operacje nieblokujace Inne rodzaje operacji plikowych Istnieja nieblokujace wersje operacji do odczytu i zapisu: int MPI_File_iread(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Request *request) int MPI_File_iwrite(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Request *request) Oczekiwanie na zakończenie operacji na pliku może być zrealizowane przez funkcje MPI_Wait przy wykorzystaniu parametru request (podobnie, jak w przypadku nieblokujacego odebrania komunikatu). Wykorzystywane sa one najczęściej do nałożenia w czasie obliczeń i operacji plikowych. W standardzie MPI zdefiniowano znacznie więcej funkcji i sposobów realizacji operacji na plikach, np: Funkcje czytajace i zapisujace dane z/do pliku z określeniem od którego miejsca w pliku dane maja być pobierane/zapisywane: MPI_File_read_at i MPI_File_write_at. Funkcje realizujace zapis/odczyt przy wykorzystaniu wspólnej pozycji pliku (pozycja pliku jest współdzielona przez wszystkie procesy z komunikatora comm podanego w funkcji MPI_File_open): MPI_File_read_shared i MPI_File_write_shared oraz ich odpowiedniki grupowe MPI_File_read_ordered i MPI_File_write_ordered. Inne funkcje. 39/??

Funkcja MPI_File_Open Funkcja MPI_File_delete Do otwarcia pliku służy funkcja MPI_File_Open: int MPI_File_open(MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *fh) comm - intra-komunikator - wszystkie procesy wchodzace w skład tego komunikatora będa miały dostęp do pliku, filename - nazwa otwieranego pliku, amode - tryb dostępu do pliku (MPI_MODE_RDONLY - tylko do odczytu, MPI_MODE_RDWR - do odczytu i zapisu, MPI_MODE_WRONLY - tylko do zapisu, MPI_MODE_CREATE - tworzy plik jeżeli nie istnieje, MPI_MODE_EXCL - bład, jeżeli plik już istnieje, MPI_MODE_DELETE_ON_CLOSE - usunięcie pliku przy zamknięciu, MPI_MODE_SEQUENTIAL - dostęp do pliku może być tylko sekwencyjny, MPI_MODE_APPEND - wszystkie wskażniki do pliku sa ustawiane na koniec pliku), info - obiekt info, fh - uchwyt do pliku, Do usunięcia pliku służy funkcja MPI_File_Delete: int MPI_File_delete(char *filename, MPI_Info info) filename - nazwa usuwanego pliku, info - obiekt info, Jeżeli plik nie istnie zgłaszany jest bład (MPI_ERR_NO_SUCH_FILE). 41/?? Funkcja MPI_File_write_at Funkcja MPI_File_read_at int MPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) fh - uchwyt do pliku, do którego będa zapisywane dane, offset - przesunięcie względem poczatku pliku określajace, od którego miejsca będa zapisywane dane, buf - bufor z którego będa pobierane dane do zapisu, count - liczba zapisywanych elementów, datatype - typ zapisywanych elementów, status - obiekt statusu. int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) fh - uchwyt do pliku, z którego będa odczytywane dane, offset - przesunięcie względem poczatku pliku określajace, od którego miejsca będa odczytywane dane, buf - bufor, do którego będa zapisywane dane odczytane z pliku, count - liczba odczytywanych elementów, datatype - typ odczytywanych elementów, status - obiekt statusu. 43/??