Message Passing Interface



Pobieranie 153,63 Kb.
Strona1/7
Data28.12.2017
Rozmiar153,63 Kb.
  1   2   3   4   5   6   7

Message Passing Interface

  • Message Passing Interface

    • Charakterystyka ogólna str. 3

      • Historia powstania MPI

      • Założenia główne

      • Integracja MPI z Fortran 77

      • Integracja MPI z językiem C

    • Komunikacja punkt - punkt str. 4

      • Komunikacja z blokowaniem

      • Tryby komunikacji

      • Komunikacja bez blokowania

      • Finalizowanie nie blokujących operacji odbioru i wysyłania

      • Wielokrotne finalizowanie operacji komunikacji

      • Badanie atrybutów nadchodzącej wiadomości

    • Komunikacja grupowa str. 12

      • Wstęp

      • Broadcast

      • Zbieranie danych z wielu procesów

      • Rozsyłanie danych do wielu procesów

      • Obliczenia globalne

      • Globalne operacje obliczeń zdefiniowane przez użytkownika

    • Grupy i komunikatory - pojęcia podstawowe str. 15

    • Zarządzanie grupami procesów str. 16

    • Intra - komunikatory str. 18

      • Tworzenie komunikatorów

      • Likwidowanie komunikatora

      • Odwoływanie się do komunikatorów

    • Inter - komunikatory str. 20

    • Topologie procesów str. 21

      • Wprowadzenie do mechanizmu topologii

      • Przegląd funkcji obsługujących mechanizm topologii - wstęp

      • Topologia kartezjańska

      • Topologia grafowa

      • Funkcje informacyjne

    • Środowisko systemu MPI str. 25

      • Zmienne definiujące środowisko pracy systemu MPI

      • Obsługa błędów [KSW]


Message Passing Interface:   Charakterystyka ogólna




Historia powstania MPI

    Standard MPI jest używany w wielu klasach maszyn równoległych, w szczególności o pamięci rozproszonej. W założeniu twórców miał on połączyć zalety istniejących systemów message passingu. W procesie standaryzacji udział brała większość producentów maszyn współbieżnych, naukowcy uniwersyteccy, przedstawiciele ośrodków rządowych. W czasie warsztatów w Williamsburgu (Virginia, USA) w dniach 29-30 kwietnia 1992 zostały ustalone podstawowe założenia standardu i uformowała się grupa badawcza mająca kontynuować prace.

    Pierwsza propozycja standardu, znana jako MPI1, została przedłożona w listopadzie 1992 przez Dongarrę, Hempela, Heya i Walkera, a jej korekty ukończono w lutym 1993. Autorzy opisali jedynie konieczne do działania message passingu właściwości; skupili się głównie na komunikacji punkt - punkt. Nie zaproponowali żadnych rozwiązań dla komunikacji grupowej.

    Na spotkaniu w Minneapolis (listopad 1992) zadecydowano o nadaniu procesowi standaryzacyjnemu bardziej formalnego charakteru. Stworzono podgrupy badawcze zajmujące się poszczególnymi aspektami systemu, które przez pierwszych 9 miesięcy 1993 spotykały się co 6 tygodni, aby konsultować wyniki prac. Spotkania i dyskusja prowadzona na specjalnie do tego celu stworzonych listach dyskusyjnych zaowocowały ogłoszeniem w listopadzie 1993 standardu MPI.

    Głównymi zaletami standardu jest przenośność. Udostępnia on zbiór precyzyjnie zdefiniowanych metod, które mogą być efektywnie zaimplementowane. Stał się on punktem wyjściowym do stworzenia praktycznego, przenośnego, elastycznego i efektywnego narzędzia dla message pasingu.

Założenia główne

      Główne założenia standardu MPI zawrzeć można w następujących punktach:



  • umożliwia efektywną komunikację bez obciążania procesora operacjami kopiowania pamięci

  • może być stosowany w środowisku heterogenicznym

  • udostępnia funkcje dla języków C oraz Fortan 77

  • pozwala na skupienie się na samej komunikacji bez wnikania w szczegóły. Błędy są obsługiwane wewnątrz systemu

  • definiuje interfejs niewiele różniący się od innych standardów, jak PVM, NX, Express itp.

  • udostępnia mechanizmy komunikacji punkt - punkt oraz zbiorowej (grupy procesów)

  • może być używany na wielu platformach, tak równoległych jak i skalarnych, bez większych zmian w sposobie działania

  • semantyka funkcji interfejsu powinna być niezależna od języka

  • interfejs powinien być bezpieczny jeśli chodzi o środowisko wielowątkowe

    Program w MPI składa się z niezależnych procesów operujących na różnych danych (MIMD). Każdy proces wykonuje się we własnej przestrzeni adresowej, aczkolwiek wykorzystanie pamięci współdzielonej też jest możliwe.

Standard nie zabrania, aby poszczególne procesy były wielowątkowe. Nie są też udostępnione mechanizmy związane z rozłożeniem obciążenia pomiędzy poszczególne procesy, z architekturą rozkładu procesorów, z dynamicznym tworzeniem i usuwaniem procesów. Procesy są identyfikowane poprzez ich numer w grupie w zakresie 0 .. groupsize - 1.
 

Integracja MPI z Fortran 77


    Wszystkie funkcje dla języka Fortran 90 są w formacie Fortran 77. Wszystkie nazwy funkcji i stałych pakietu MPI mają przedrostek MPI_, a w nazwach używane są tylko wielkie litery. Ostatnim argumentem metod fortranowych jest kod błędu. Gdy funkcja kończy się pomyślnie, zwraca MPI_SUCCESS. Inne kody błędu są zależne od implementacji.

    Wskaźniki są reprezentowane jako typ INTEGER. Wartości binarne są typu LOGICAL. Elementy tablic są indeksowane od 1.

    Standard funkcji MPI F77, mimo, że nie jest to bezpośrednio zawarte w opisie, jest zgodny ze standardem ANSI Fortran 77. Unless explicitly stated, the MPI F77 binding is consistent with ANSI standard Fortran 77. Jest kilka punktów, w których występują różnice:


  •  identyfikatory MPI są ograniczone do 30, a nie 6 znaczących znaków

  •  funkcja MPI z argumentem choice może być wywoływana z argumentami różnych typów np. MPI_SEND (w przeciwnym razie musiałaby istnieć wersja tej funkcji dla każdego typu danych).

    Definicje funkcji i stałych powinny być zawarte w pliku mpif.h.


 

Integracja MPI z językiem C


    Deklaracje funkcji są w standardzie ANSI C. Wszystkie nazwy mają przedrostek MPI_, predefiniowane stałe są zapisywane wielkimi literami, natomiast nazwy typów i funkcji mają jedną wielką literę po przedrostku. W programie nie należy deklarować funkcji ani zmiennych o nazwie rozpoczynającej się od MPI_.

    Prawie wszystkie funkcje zwracają kod błędu. W przypadku sukcesu jest to MPI_SUCCESS, pozostałe kody błędu są zależne od implementacji. Tablice są indeksowane od 0. Zmienne logiczne są zapisywane jako integer, gdzie 0 - FALSE, pozostałe wartości - TRUE. Argumenty choice są typu void*.

    Definicje funkcji, stałych i typów powinny być zawarte w pliku mpi.h.
 

Message Passing Interface:   Komunikacja punkt - punkt

Komunikacja z blokowaniem

    Funkcje z blokowaniem nie zwracają wartości dopóki wiadomość nie zostanie odebrana. Składnia operacji wysyłania z blokowaniem jest następująca:

    MPI_SEND(buf, count, datatype, dest, tag, comm)
    [ IN buf] bufor wejściowy (choice)
    [ IN count] ilość elementów w buforze (nieujemny integer)
    [ IN datatype] typ danych elementu w buforze (handle)
    [ IN dest] identyfikator adresata (integer)
    [ IN tag] typ wiadomości (integer)
    [ IN comm] komunikator (handle)

    Bufor buf zawiera ilość count elementów typu datatype. Wielkość części danych wiadomości jest specyfikowana w ilości elementów, a nie w ilości wysyłanych bajtów, co pozwala na uniezależnienie się od architektury.

    Oprócz części z danymi, wiadomości zawiera określoną liczbę pól, jak:


  • source - nadawca wiadomości - pole automatycznie uzupełniane w funkcji send()

  • destination - adresat wiadomości

  • tag - typ wiadomości - przybiera wartości od 0 do UB (UB nie mniejsze od 32767)

  • communicator - komunikator - każdy communicator odpowiada oddzielnemu „uniwersum" komunikacji - wiadomości z różnych komunikatorów nie interferują; wiadomość odbiera się w tym samym komunikatorze, w którym została nadana. Specyfikuje on grupę procesów, które do niego należą. Procesy w komunikatorze identyfikowane są numerami. MPI udostępnia predefiniowany komunikator MPI_COMM_WORLD. Pozwala on na komunikację ze wszystkimi procesami, które włączyły się do systemu MPI od jego uruchomienia.

    Składnia operacji odbierającej wiadomość z blokowaniem jest następująca:

    MPI_RECV (buf, count, datatype, source, tag, comm, status)
    [ OUT buf] początek bufora (choice)
    [ IN count] liczba elementów w buforze (integer)
    [ IN datatype] typ odbieranych elementów (handle)
    [ IN source] identyfikator nadawcy (integer)
    [ IN tag] typ wiadomości (integer)
    [ IN comm] komunikator (handle)
    [ OUT status] status (Status)

    Długość części danych odbieranej wiadomości musi być mniejsza lub równa od wielkości bufora. W przypadku gdy długość danych jest krótsza od bufora, pozostałe pola nie są nadpisywane.

    Aby odebrać wiadomość od dowolnego należącego do tego samego komunikatora można użyć jako argumentu source wartości MPI_ANY_SOURCE. Podobnie z typem wiadomości: możliwe jest zstosowanie MPI_ANY_TAG, aby odebrać wiadomość dowolnego typu.

    Proces może wysłać wiadomość do samego siebie, aczkolwiek jest to niebezpieczne, gdyż może prowadzić do zakleszczenia (ang. deadlock).

    W języku C status jest strukturą o dwu podstawowych polach: MPI_SOURCE oraz  MPI_TAG, i może zawierać pola dodatkowe. W Fortranie status jest tablicą typu INTEGER o wielkości MPI_STATUS_SIZE. Zmienna status zawiera informację o długości wiadomości. Można ją uzyskać za pomocą funkcji MPI_GET_COUNT zadeklarowanej jak poniżej:

    MPI_GET_COUNT(status, datatype, count)


    [ IN status] zmienna status zwrócona przez funkcję MPI_RECV (Status)
    [ IN datatype] typ danych elementów wiadomości (handle)
    [ OUT count] ilość elementów w wiadomości (integer)

    Poniższy przykład ilustruje użycie opisanych metod.

    #include "mpi.h"
    main( argc, argv )
    int argc;
    char **argv;
    {
        char message[20];
        int myrank;
        MPI_Status status;
        MPI_Init( &argc, &argv );
        MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
        if (myrank == 0)    /* jeśli mój numer to 0 wysyłam dane */
        {
            strcpy(message,"Hello, there");
            MPI_Send(message, strlen(message), MPI_CHAR, 1, 99, MPI_COMM_WORLD);
        }
        else                /* jeśli mój numer to 1 odbieram dane */
        {
            MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
            printf("received : %s", message);
        }
        MPI_Finalize();
    }



  1   2   3   4   5   6   7


©operacji.org 2017
wyślij wiadomość

    Strona główna