Wykład 4 Architektura sieci połączeń między procesorami, sterowanie komunikacjami, biblioteki komunikacyjne Spis treści: 1. Statyczne sieci połączeń w systemach równoległych 2. Dynamiczne sieci połączeń w systemach równoległych 3. Komunikacja w systemach komputerowych Hitachi SR2201, SR8000 4. Bilioteka komunikacyjna MPI
Statyczne sieci połączeń w systemach równoległych Statyczne sieci połączeń między elementami systemów równoległych (np. procesorami) charakteryzują się stałymi połączeniami, niemodyfikowalnymi bez fizycznej przebudowy systemu. Istnieje wiele struktur statycznych sieci połączeń: struktura liniowa (potok) (ang. pipeline) matryca (ang. matrix) torus, (ang. torus) struktura pełnych połączeń (ang. complete connection) drzewo (ang. tree) gwiazda (ang. star) pierścień (ang. ring) hipersześcian (ang. hyper-cube).
W strukturze liniowej i matrycowej procesory są połączone ze swoimi sąsiadami w regularnej strukturze na płaszczyźnie. Torus jest strukturą matrycową, w której elementy znajdujące się na brzegach matrycy są połączone w ramach tych samych wierszy i kolumn. W strukturze pełnych połączeń, wszystkie elementy (np. procesory) są ze sobą bezpośrednio połączone.
Struktura liniowa (potokowa) Struktura matrycowa
Struktura pełnych połączeń w systemie równoległym
W strukturze drzewiastej elementy systemu są ustawione w hierarchicznym układzie od korzenia drzewa (ang. root) do tzw. liści (ang. leaves). Wszystkie elementy drzewa (węzły) mogą być procesorami lub tylko liście są procesorami a pozostałe elementy są blokami łączącymi, pośredniczącymi w transmisjach. Z jednego węzła drzewa, w kierunku liści, mogą wychodzić 2 lub więcej zbiorów połączeń do różnych węzłów (po jednym do każdego) mówimy wtedy o drzewie binarnym (ang. binary tree) lub drzewie stopnia k (ang. k-nary tree).
O ile z jednego węzła wychodzi do sąsiedniego węzła więcej niż jedno połączenie, to mamy tzw. grube drzewo (ang. fat tree). Binarne drzewo grube, w którym w kierunku korzenia, liczba połączeń między sąsiednimi węzłami wzrasta dwa razy, zapewnia jednakową przepustowość transmisji między poziomami drzewa. Eliminuje się w ten sposób wadę drzew zwykłych, w których z jednego węzła można w danej chwili realizować tylko po jednej transmisji w obu kierunkach (korzenia i liści), co ogranicza wydajność komunikacji w systemie.
W strukturze hipersześciennej, procesory są połączone w sieć, w której połączenia między procesorami odpowiadają krawędziom binarnego sześcianu n-wymiarowego. Struktura hipersześcienna jest bardzo korzystna, gdyż zapewnia niską średnicę sieci (ang. network diameter) równą wymiarowi sześcianu. Średnicą sieci nazywamy liczbę krawędzi między najbardziej oddalonymi węzłami. Średnica określa liczbę przesłań pośrednich, które trzeba wykonać aby przesłać dane między najbardziej odległymi węzłami sieci połączeń między procesorami. Pod tym względem hipersześciany mają bardzo korzystne własności, zwłaszcza przy dużej liczbie węzłów składowych w sieci, dlatego hipersześcienne struktury połączeń są chętnie stosowane w istniejących systemach.
Hipersześcienna struktura połączeń między procesorami Wymiar sześcianu Liczba węzłów Średnica sieci węzeł (procesor) połączenie węzłów 0 1 0 1 2 1 2 4 2 3 8 3 4 16 4
Dynamiczne sieci połączeń w systemach równoległych Szyny (magistrale) Dynamiczne sieci połączeń między procesorami umożliwiają zmianę rekonfigurację (ang. reconfiguration) struktury połączeń w systemie. Rekonfiguracja połączeń może być dokonana przed lub w trakcie wykonania programu równoległego, stąd mówimy o: statycznej rekonfiguracji połączeń. dynamicznej rekonfiguracji połączeń
Szyna (magistrala) (ang. bus) jest najprostszym typem dynamicznej sieci połączeń. Stanowi ona wspólną drogę przesyłania informacji dla zbioru urządzeń. Urządzeniami podłączonymi do szyny mogą być procesory, pamięci, układy wejścia/wyjścia, jak pokazuje rysunek poniżej. W zależności od rodzaju realizowanych transmisji, mamy: szyny szeregowe (ang. serial bus) szyny równoległe (ang. parallel bus).
Schemat systemu opartego na pojedynczej szynie Procesor 1 Procesor 2 Procesor n Szyna systemowa Pamięć 1 Pamięć 2 Pamięć m We/Wy 1 We/Wy p
Tylko jedno urządzenie podłączone do szyny może nadawać dane. Wiele urządzeń może dane odbierać. Mamy wtedy do czynienia z transmisją typu rozgłaszanie (ang. multicast). Jeśli dane są przeznaczone dla wszystkich urządzeń podłączonych do szyny, to jest to rozgłaszanie pełne (ang. broadcast). Dostęp urządzeń do szyny w celu nadawania musi być zsynchronizowany. Metody synchronizacji dostępu do szyny: metoda krążącego tokenu, przydzielającego prawa nadawania (ang. token method) wykorzystanie arbitra szyny (ang. bus arbiter).
Arbiter szyny odbiera zgłoszenia żądań nadawania od urządzeń. Wybiera jedno z nich np. według priorytetów i wysyła potwierdzenie prawa nadawania. Po nadaniu, arbiter jest zawiadamiany i wybiera następne żądanie. Adres odbiorcy (-ów) jest zwykle podany w nagłówku komunikatu. Specjalne oznaczenie ma rozgłaszanie zupełne. Wszyscy odbiorcy na szynie czytają i dekodują nagłówki. Ci, którzy są wskazani w nagłówku, wczytują dane transmitowane po szynie.
Czas realizacji (ang. latency) związany z transmisją danych można rozłożyć na 3 składniki: wewnętrzny czas realizacji (ang. intrinsic latency) jest to czas reakcji urządzenia (np. szyny, pamięci, kontrolera we/wy0), które wynika ze sposobu działania urządzenia i jest stałe niezależnie od reszty systemu, np. czas dostępu do pamięci, czas realizacji przesłań między urządzeniami (ang. transfer latency), np. czas propagacji sygnałów niosących dane wzdłuż połączeń, opóźnienie (wynikające) z konfliktów dostępu (ang. contention latency), które wynika z wykorzystywania zasobu dzielonego przez wielu użytkowników, np. przy równoczesnym składaniu żądań dostępu do magistrali. Jeżeli rozkład prawdopodobieństw pojawiania się nowych żądań dostępu do urządzenia jest równomierny w czasie, średnie opóźnienie transmisji obsługiwanej z użyciem kolejki żądań może być określone w prosty sposób na podstawie teorii kolejek.
Oznaczmy przez 1 średnią zdolność (czas) spełniania żądań użycia zasobu dzielonego (np. czas transmisji przez szynę) przez 1. Jeśli oznaczymy przez α, średnią częstotliwość napływania żądań dostępu (mierzoną też czasem), gdzie 0 < α <1 to średni czas oczekiwania dla systemu z jednym serwerem jest dany na mocy teorii kolejek przez α 1 a Całkowity czas obsługi żądania jest równy sumie czasu oczekiwania plus czas transmisji czyli α 1 + = 1 α. 1 1 α
Wykres tej wielkości (czyli całkowitego czasu obsługi) w funkcji α. Widzimy, że jeśli napływ żądań obsługi jest zbyt duży, czas między kolejnymi żądaniami jest wyższy niż 0,5 czasu obsługi żądania w zasobie, który jest wykorzystywany np. szynie, to czas obsługi (oczekiwania w kolejce i samej obsługi) np. transmisji, szybko rośnie. Dla napływu żądań wyższego niż 0,9 przepustowości zasobu, czas obsługi przekracza 10 i rośnie już niezwykle szybko.
Przepustowość sieci opartej na szynie może być zwiększona przez wykorzystanie sieci wieloszynowej (ang. multibus network), pokazanej poniżej. W tym przypadku procesory są podłączone do wielu szyn jednocześnie i mogą realizować wiele dostępów do szyny jednocześnie. Schemat systemu opartego na szynie wielokrotnej Procesor 1 Procesor n Szyna systemowa 1 Szyna systemowa 2 Szyna systemowa n Pamięć 1 Pamięć m We/Wy 1 We/Wy p
Przełączniki krzyżowe Przełącznik krzyżowy (ang. crossbar switch) jest układem, który umożliwia realizację wielu połączeń jednocześnie między elementami systemu równoległego. Przełącznik krzyżowy ma pewną liczbę końcówek wejściowych i wyjściowych oraz pewną liczbę końcówek sterujących. W odpowiedzi na rozkazy sterujące, podawane na wejście sterujące, przełącznik realizuje trwałe połączenie określonego wejścia z wyjściem.
Schemat ogólny przełącznika krzyżowego ŁączeWe1 ŁączeWy1 Przełącznik krzyżowy ŁączeWe31 31 ŁączeWy3 1 Sterowanie
Budowa wewnętrzna przełącznika krzyżowego ŁączeWe 0-31 multiplekser 32-do-1 ŁączeWy 0 Rejestr zatrzaskowy (5) multiplekser 32-do-1 ŁączeWy 31 Rejestr zatrzaskowy (5) Sterowanie Rozkazy sterujące Parametry Stany przełącznika
Rozkazy sterujące mogą żądać podania stanu określonych łączy tj. aktualnego połączenia. Przełączniki krzyżowe są budowane w oparciu o układy multiplekserów, sterowane przez rejestry zatrzaskowe, ustawiane przez rozkazy sterujące. Przełączniki krzyżowe realizują pojedyncze połączenia nieblokujące (ang. nonblocking connections), tzn. o ile potrzebne końcówki przełącznika są wolne. Połączenie między nimi, może być zawsze zrealizowane niezależnie od stanu innych połączeń i to dodatkowo podczas transmisji przez inne połączenia. Nieblokujące połączenia są ogromną zaletą przełącznika krzyżowego. Niektóre przełączniki krzyżowe mają możliwość realizacji połączeń typu rozgłaszanie, ale w sposób blokujący inne połączenia. Wada przełączników krzyżowych - rozbudowa przełącznika w sensie zwiększenia liczby realizowanych połączeń (końcówek) jest kosztowna sprzętowo. Dlatego realizuje się przełączniki krzyżowe o liczbie końcówek w granicach 100.
Wielostopniowe sieci łączące Przełączniki o funkcjonalności przełącznika krzyżowego ale zawierające setki końcówek realizuje się stosując technikę wielostopniowych układów łączących. Wielostopniowe sieci łączące (ang. multistage connection network) budowane są w oparciu o warstwowo połączone elementarne przełączniki krzyżowe, zwykle dwuwejściowe. Przełączniki elementarne mogą realizować 4 typy połączeń: na wprost, skrzyżowanie, górne rozgłoszenie. dolne rozgłoszenie Wszystkie przełączniki elementarne są sterowane jednocześnie.
Koszt rozbudowy wielostopniowych sieci łączących jest stosunkowo niski. W sieciach tego typu jednak nie ma pełnej swobody realizacji dowolnych połączeń, przy pewnych już istniejących. Dlatego należą one do typu sieci blokujących (ang. blocking network). Wielostopniowa sieć łącząca dla systemów równoległych - sieć Benesa
Aby uzyskać nieblokujące własności wielostopniowej sieci połączeń, należy wprowadzić znacznie większą nadmiarowość sprzętową (ang. hardware redundancy). Chcąc zbudować nieblokujący wielostopniowy przełącznik n x n, należy, zamiast elementarnych przełączników dwuwejściowych, wprowadzić 3 warstwy przełączników n x m, r x r, oraz m x n, gdzie m 2n 1 a r jest liczbą elementarnych łączników w warstwie 1 i 3. Taki przełącznik został opracowany przez francuskiego matematyka Closa i jest nazywany przełącznikiem Closa (ang. Clos network). Jest on powszechnie stosowany do budowy dużych zintegrowanych przełączników krzyżowych.
Nieblokująca sieć łącząca Closa przełącznik Closa 1 n n x m r x r m x n 1 1 1 1 n 1 n 2 2 2 1 n 1 n r m r 1 n
Pod wwzględem formatu przesylanych danych rozróżniamy: komunikacje (transmisje danych) niepakietowane komunikacje (transmisje danych) pakietowane Przy komunikacji niepakietowanej dane przesyłane są w jednej porcji poprzez połączenie utworzone przed dokonaniem transmisji. Przy komunikacji pakietowanej dane przesyłane są w porcjach zwanych pakietami (ang. data packets lub data packages). Pakiety danych zaopatrzone są w tzw. nagłówki (ang. headers), w których określone są parametry transmisji. Tymi parametrami mogą być : adres odbiorcy, długość pakietu, identyfikator nadawcy inne informacje sterujące.
Przełącznik połączeń dla pakietowanej komunikacji danych nazywa się ruterem (ang. router). Ruter rozpoznaje nagłówek pakietu, który otrzymał, dekoduje go i w zależności od adresu odbiorcy tworzy lub wybiera odpowiednie połączenie w kierunku odbiorcy. Sieć łącząca procesory może być siecią wielowarstwową (and. multilayer network). Dla sieci wielowarstwowej pakiet mogą być zaopatrzone w kilka nagłówków umieszczonych po sobie. Kolejne nagłówki są dekodowane w kolejnych wartach sieci i następnie usuwane z komunikatu.
Komunikacja przez przesyłanie komunikatów może odbywać się zgodnie z: modelem synchronicznym (ang. synchronous communication model) asynchronicznym (ang. asynchronous communication model). Przy modelu synchronicznym, procesy (programy) - nadający i odbierający, synchronizują swoje wykonanie na rozkazach komunikacji w danym kanale. Oznacza to, że proces nadający może nadawać dopiero wtedy, gdy proces odbierający w innym procesorze doszedł do wykonania rozkazu odbierania w tym kanale. Ponieważ komunikacja zachodzi przy wykonaniu rozkazów nadania i odbioru w obydwu procesorach jednocześnie, nie jest potrzebne buforowanie komunikatów i są one przesyłane jakby bezpośrednio z pamięci jednego procesora do pamięci drugiego. Odbywa się to pod kontrolą kontrolerów zewnętrznych łączy komunikacyjnych w obu procesorach.
Przy modelu asynchronicznym, procesy (programy): nadający i odbierający, nie synchronizują wykonania komunikacji w danym kanale. Komunikat jest nadawany do kanału w dowolnej chwili i trafia do bufora dla komunikatów w danym kanale - w kontrolerze łącza po drugiej stronie połączenia między procesorami. Proces odbierający odbiera komunikat odczytując go z bufora danego kanału w dowolnej chwili. Jesli w buforze nie ma jeszcze potrzebnego komunikatu, operacja odczytu jest powtarzana po pewnym odstępie czasu.
System superkomputerowy Hitachi SR2201 Obecnie przedstawiony zostanie zarys architektury wieloprocesorowego systemu superkomputerowego SR2201 firmy Hitachi znajdującego się w PJWSTK. System SR 2201 jest komputerem wieloprocesorowym z rozproszoną pamięcią. System zawiera 16 węzłów procesorowych połączonych 2-wymiarowym przełącznikiem krzyżowym. Węzeł składa się z 32-bitowego procesora typu RISC wyposażonego w lokalną pamięć operacyjną i koprocesor komunikacyjny (NIA Network Interface Adapter), realizujący komunikacje procesora z innymi procesorami. Procesor jest połączony z koprocesorem komunikacyjnym i pamięcią operacyjną poprzez kontroler dostępu do pamięci (SC Storage Controller).
Dwuwymiarowy przełącznik krzyżowy Węzeł procesora 1 Węzeł procesora 2... Węzeł procesora 16 Procesor RISC Koprocesor komunikacyjny (NIA) Kontroler dostępu do pamięci (SC) Lokalna pamięć operacyjna Uproszczony schemat blokowy 16-procesorowego systemu Hitachi SR2201
Procesor systemu, o nazwie HARP1, jest zmodyfikowanym mikroprocesorem RISC firmy Hewlett-Packard HP-RISC 1.1. Procesor jest superskalarny na poziomie 2. Jest wyposażony w dwa potokowe bloki wykonawcze: stało i zmiennoprzecinkowy. Procesor posiada on osobne pamięci podręczne danych i rozkazów poziomu L1 i L2 o pojemności 16 KB i 512 KB, odpowiednio. Pamięć operacyjna jednego procesora liczy 256 MB. Procesory systemu są połączone poprzez dwuwymiarową przełącznicę krzyżową.
300MB/s Przełącznik krzyżowy osi X NIA Procesor 10 10 Przeł. krzyż. osi Y NIA Procesor 11 10 Przeł. krzyż. osi Y NIA Procesor 17 10 Przełącznik krzyżowy osi X NIA NIA NIA Procesor SIOU00 10 Procesor 01 10 Procesor 07 10 Sieć zewnętrzna Macierz dyskowa Schemat podłączenia procesorów do dwuwymiarowej przełącznicy krzyżowej w systemie SR2201 malego rozmiaru.
Przełącznica zbudowana jest z wzajemnie połączonych przełączników krzyżowych, ustawionych w prostokątnym układzie współrzędnych. Na skrzyżowaniach przełączników wstawione są węzły procesorów tak, że koprocesory komunikacyjne tych węzłów (NIA) są podłączone jednocześnie do przełącznika osi X i Y. Procesorom są przypisane numery oznaczające współrzędne tych procesorów w układzie przełączników. Transmisje w takiej sieci połączeń odbywają się poprzez wykorzystanie przełączników wzdłuż osi X, osi Y lub obydwu przełączników w zależności od współrzędnej procesora docelowego. Przejście z jednego przełącznika do drugiego odbywa się poprzez koprocesory komunikacyjne. Przesyłane dane stanowią pakiet opatrzony nagłówkiem. Nagłówek, który jest wysyłany tuż przed danymi, zawiera adres węzła docelowego, wyrażony przez jego współrzędne.
Na podstawie nagłówka tworzone są potrzebne połączenia w przełącznikach krzyżowych i otwierane są potrzebne połączenia w koprocesorach komunikacyjnych. W systemie jest jeden nadzorczy węzeł procesorowy SIOU (od ang. Supervisory Input/Output Unit), który ma połączenie z siecią zewnętrzną, konsolą operatora i pamięcią dyskową systemu. W węźle SIOU rezyduje jądro systemu operacyjnego superkomputera HP Unix, które przechowuje obraz stanu całego systemu. W każdym procesorze rezyduje jądro lokalne, które nadzoruje lokalną pracą procesora. Pamięć dyskowa stanowi macierz dysków sztywnych.
Dla liczby procesorów większej niż 64, przełącznik połączeń ma strukturę trójwymiarowej przełącznicy krzyżowej. Koprocesory komunikacyjne każdego procesora są połączone do 3 przełączników: wzdłuż osi X, Y i Z. Część procesorów znajdująca się na ścianie bocznej, utworzonego w ten sposób prostopadłościanu, jest podłączona do stacji pamięci dyskowych. Węzeł nadzorczy jest podłączony do sieci zewnętrznej.
Schemat podłączenia procesorów do trójwymiarowej przełącznicy krzyżowej w systemie SR2201 LAN
Opisany system może zawierać do 2048 procesorów. System z taką liczbą procesorów, pod nazwą CP-PACS, istnieje w Ośrodku Obliczeniowym dla Fizyki, Uniwersytetu Tsukuba w Japonii.
Następną cechą architekturalną, charakterystyczną dla systemu SR2201, jest komunikacja między procesorami metodą zdalnego DMA (ang. Remote DMA RDMA). Polega ona na tym, że w systemie sprzęgnięto mechanizm translacji adresów wirtualnych z instrukcjami transmisji danych poprzez przełącznicę krzyżową. Osiągnięto automatyczne sprowadzanie danych dla programu, które mają być transmitowane do innego procesora, do rezerwowalnego bufora w pamięci operacyjnej, bezpośrednio używanego przez rozkazy transmisyjne. W ten sposób uniknięto kopiowania danych przez system operacyjny podczas transmisji. Komunikacja RDMA jest wykorzystywana dla wykonywania programów tego komputera w językach C i Fortran, zapewniając bardzo dobre szybkości transmisji dla dużych pakietów danych. Na komunikacji RDMA oparta jest realizacja przenośnej biblioteki komunikacyjnej MPI, wykorzystywanej alternatywnie dla programowania w języku C i Fortran.
System superkomputerowy Hitachi SR8000 Następcą systemu SR2201 jest system SR8000. Struktura systemu SR8000 stanowi rozwinięcie systemu SR2201 w ten sposób, że pojedynczy węzeł w strukturze SR2201 został zastąpiony gronem (klastrem) (ang. cluster) 8 procesorów ze wspólną pamięcią. Podobnie jak SR2201, system SR8000 jest oparty na trójwymiarowej przełącznicy krzyżowej.
Przetwarzanie wielowątkowe z komunikacją przez wspólną pamięć Komunikacja przez przesyłanie komunikatów Trójwymiarowy przełącznik krzyżowy Klaster 1 Mostek PCI Procesor RISC 1 Procesor RISC 8 Sterowanie wymianą danych Procesor komunikacyjny Klaster 2 Klaster n Układy We/Wy Pamięć operacyjna Sieć zewnętrzna Macierz dyskowa Procesor interakcji z operatorem Konsola operatora Schemat blokowy systemu HITACHI SR8000
SR8000 został oparty na znacznie szybszym 64-bitowym procesorze o wydajności 1 GFLOPS (miliardów operacji zmiennoprzecinkowych na sekundę). Znacznie rozszerzono pojemność pamięci podręcznych L1 procesora - do 128 KB. W systemie SR2201, obiektami, którymi zawiaduje system operacyjny były procesy, stanowiące ciągi rozkazów wykonywanych szeregowo w procesorach. Przełączanie procesora między procesami jest kosztowne czasowo, należy bowiem zapamiętać w pamięci kontekst procesu, który traci dostęp do procesora oraz zainstalować w procesorze kontekst procesu, który będzie się wykonywał. Aby umożliwić zrównoleglenie obliczeń wewnątrz procesów przy małym koszcie czasowym przełączania procesora, w SR8000 wprowadzono wątki (ang. thread).
W systemie SR8000 wprowadzono system przetwarzania wielowątkowego (ang. multithreaded processing) wewnątrz klastrów procesorów, o nazwie COMPAS. System ten dokonuje podziału procesów na wątki, rozdziela wątki na procesory klastra i organizuje komunikację między wątkami poprzez wspólne zmienne w pamięci dzielonej. Oprócz systemu komunikacji przez pamięć dzieloną, w systemie SR8000 zrealizowany jest system komunikacji RDMA poprzez wymianę komunikatów przez przełącznik krzyżowy łączący procesory. Na systemie RDMA oparta jest realizacja bilioteki komunikacyjnej dla programowania w języku C i Fortran. System SR8000 może zawierać do 128 klastrów 8-procesorowych, co razem umożliwia wykorzystanie 1024 procesorów w tym systemie. Maksymalna konfiguracja systemu może dostarczyć moc obliczeniową 1024 GFLOPS.
Biblioteka komunikacyjna MPI Biblioteka komunikacyjna MPI (ang. Message Passing Interface) została opracowana w połowie lat 90-tych ubiegłego wieku przez konsorcjum o nazwie MPI Forum, stanowiące grupę specjalistów z USA i Europy. MPI składa się z około 250 funkcji i procedur które można wykorzystać pisząc programy w językach C/C++, Java oraz Fortran. Przykładowe implementacje biblioteki MPI to MPICH, Java MPI oraz OpenMPI. Program z funkcjami biblioteki MPI zakłada działanie równoległych procesów działających na komputerach połączonych za pomocą sieci. Komunikacja pomiędzy procesami MPI odbywa się na zasadzie przesyłania komunikatów. Komunikacja w MPI może zachodzić: a) pomiędzy dwoma procesami i wówczas jest to komunikacja punkt do punktu, b) pomiędzy więcej niż dwoma procesami i jest to komunikacja grupowa.
Programy w MPI uruchamia się po zainstalowaniu biblioteki MPI podając nazwę pliku wykonywalnego programu podstawowego procesu i liczbę kopii procesów, które mają być utworzone (funkcja mpirun lub mpiexec). Podstawowymi pojęciami MPI są komunikat (wiadomość) oraz komunikator. Komunikat (wiadomość) jest zestawem danych zaopatrzonym w pewne informacje sterujące. Komunikator jest to zbiór procesów z pewnym identyfikatorem oraz kontekstem. Komunikaty mogą być wysyłane i odbierane tylko wewnątrz tego samego komunikatora. Informacją sterującą komunikatu jest identyfikator komunikatora oraz numery procesów komunikujących się ze sobą w komunikacji punkt do punktu lub identyfikator zbioru procesów w ramach, którego odbywa się komunikacja grupowa. Po uruchomieniu MPI automatycznie powstaje komunikator o nazwie MPI_COMM_WORLD zawierający wszystkie procesy w programie. Na bazie tego komunikatora można tworzyć mniejsze komunikatory, używane potem selektywnie w programie.
Typy danych komunikatów MPI dla języka C. MPI Datatype Odpowiednik w języku C MPI CHAR signed char MPI SHORT signed short int MPI INT signed int MPI LONG signed long int MPI UNSIGNED CHAR unsigned char MPI UNSIGNED SHORT unsigned short int MPI UNSIGNED unsigned int MPI UNSIGNED LONG unsigned long int MPI FLOAT float MPI DOUBLE double MPI LONG DOUBLE long double Składowe
Komunikacje punkt do punktu Nadanie komunikatu int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ) void *buf [IN] Adres początkowy bufora z danymi. Może to być adres pojedynczej zmiennej lub początek tablicy. int count [IN] Duos bufora buf. Dla pojedynczej zmiennej będzie to wartość 1. MPI Datatype datatype [IN] Typ pojedynczego elementu bufora. int dest [IN] Identyfikator procesu, do którego wysyłany jest komunikat. int tag [IN] Znacznik wiadomości. Używany do rozróżniania wiadomości w przypadku gdy proces wysyła więcej komunikatów do tego samego odbiorcy. MPI Comm comm [IN] Komunikator.
Odbiór komunikatu int MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status ) void *buf [OUT] Adres początkowy bufora do zapisu odebranych danych. Może to być adres pojedynczej zmiennej lub początek tablicy. int count [IN] Maksymalna liczba elementów w buforze buf. MPI Datatype datatype - [IN] Typ pojedynczego elementu bufora. int source [IN] Identyfikator procesu, od którego odbierany jest komunikat. int tag [IN] Znacznik wiadomości. Używany do rozróżniania wiadomości w przypadku gdy proces odbiera więcej komunikatów od tego samego nadawcy. MPI Comm comm [IN] Komunikator. MPI Status *status [OUT] Zmienna, w której zapisywany jest status przesłanej wiadomości.
Wymiana komunikatów z zachowaniem źródeł int MPI_Sendrecv( void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status ) void *sendbuf [IN] Adres początkowy bufora z danymi do wysłania. Może to być adres pojedynczej zmiennej lub początek tablicy. int sendcount [IN] Długość bufora sendbuf. Dla pojedynczej zmiennej będzie to wartość 1. MPI Datatype sendtype [IN] Typ elementów bufora sendbuf. int dest [IN] Identyfikator procesu, do którego wysyłany jest komunikat. int sendtag [IN] Znacznik wiadomości wysyłanej. void *recvbuf [OUT] Adres początkowy bufora do zapisu odebranych danych. Może to być adres pojedynczej zmiennej lub początek tablicy.
int recvcount [IN] Liczba elementów w buforze recvbuf. MPI Datatype recvtype [IN] Typ elementów bufora recvbuf. int source [IN] Identyfikator procesu, od którego odbierany jest komunikat. int recvtag [IN] Znacznik wiadomości odbieranej. MPI Comm comm [IN] Komunikator. MPI Status *status [OUT] Zmienna, w której zapisywany jest status przesłanej wiadomości.
Wymiana komunikatów bez zachowania int MPI_Sendrecv_replace( void *buf, int count, MPI_Datatype datatype, int dest, int sendtag, int source, int recvtag, MPI_Comm comm, MPI_Status *status ) void *buf [IN] Adres początkowy bufora z danymi do wysłania, który jednocześnie jest adresem początkowym bufora do zapisu odebranych danych. Może to być adres pojedynczej zmiennej lub początek tablicy. int count [IN] Duos bufora buf. Dla pojedynczej zmiennej będzie to wartość 1. MPI Datatype datatype [IN] Typ pojedynczego elementu bufora buf. int dest [IN] Identyfikator procesu, do którego wysyłany jest komunikat. int sendtag [IN] Znacznik wiadomości wysyłanej. int source [IN] Identyfikator procesu, od którego odbierany jest komunikat. int recvtag [IN] Znacznik wiadomości odbieranej. MPI Comm comm [IN] Komunikator. MPI Status *status [OUT] Zmienna, w której zapisywany jest status przesłanej wiadomości.
Komunikacje grupowe Rozgłoszenie danych z bufora nadawcy int MPI_Bcast ( void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm ) void *buffer [IN/OUT] Na procesie root, adres początkowy bufora z danymi. Na pozostałych procesach, adres początkowy bufora gdzie dane maja być zapisane. Może to być adres pojedynczej zmiennej lub początek tab icy. int count [IN] Duos bufora buffer. Dla pojedynczej zmiennej będzie to wartość 1. MPI Datatype datatype [IN] Typ pojedynczego elementu bufora. int root [IN] Identyfikator procesu, od którego rozsyłany jest komunikat. MPI Comm comm [IN] Komunikator.
Redukcja wiadomości dla procesu root int MPI_Reduce ( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm ) void *sendbuf [IN] Adres początkowy bufora z danymi do redukcji. Może to być adres pojedynczej zmiennej lub początek tablicy. void *recvbuf [OUT] Adres początkowy bufora do zapisu redukowanych danych. Może to być adres pojedynczej zmiennej lub początek tablicy. Istotny tylko dla procesu root. int count [IN] Duos bufora sendbuf. Dla pojedynczej zmiennej będzie to wartość 1. MPI Datatype datatype [IN] Typ pojedynczego elementu buforów. MPI Op op [IN] Operator redukcji. int root [IN] Identyfikator procesu, do którego dane zostaną zredukowane. MPI Comm comm [IN] Komunikator. Wynik jest umieszczany w pamięci procesu root..
Redukcja wiadomości z kopiami dla wielu procesów int MPI_Allreduce ( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm ) void *sendbuf [IN] Adres początkowy bufora z danymi do wysłania. Może to być adres pojedynczej zmiennej lub początek tablicy. void *recvbuf [OUT] Adres początkowy bufora do zapisu odebranych danych. Może to być adres pojedynczej zmiennej lub początek tablicy. int count [IN] Duos bufora sendbuf. Dla pojedynczej zmiennej będzie to wartość 1. MPI Datatype datatype [IN] Typ pojedynczego elementu buforów. MPI Op op [IN] Operator redukcji. MPI Comm comm [IN] Komunikator. Wynik redukcji jest umieszczany w pamięciach wszystkich procesów komunikatora.
Rozdzielenie danych z zadanego procesu (root) między inne procesy int MPI_Scatter ( void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm ) void *sendbuf [IN] Adres początkowy bufora z danymi do rozdzielenia i rozesłania pomiędzy wszystkie procesy. Ma znaczenie tylko dla procesu root. int sendcnt [IN] Liczba elementów wysłanych do każdego procesu. Ma znaczenie tylko dla procesu root. MPI Datatype sendtype [IN] Typ elementów bufora sendbuf. Ma znaczenie tylko dla procesu root. void *recvbuf [OUT] Adres początkowy bufora do zapisu rozdzielonych danych. int recvcnt [IN] Liczba elementów w recvbuf. MPI Datatype recvtype [IN] Typ elementów bufora recvbuf. int root [IN] Identyfikator procesu, z którego dane zostaną rozdzielone. MPI Comm comm [IN] Komunikator.
Scalanie danych od wielu procesów dla zadanego procesu (root) int MPI_Gather ( void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm ) void *sendbuf [IN] Adres początkowy bufora z danymi przeznaczonymi do zebrania. int sendcnt [IN] Liczba elementów w sendbuf. MPI Datatype sendtype [IN] Typ elementów bufora sendbuf. void *recvbuf [OUT] Adres początkowy bufora do zapisu zebranych danych. Ma znaczenie tylko dla procesu root. int recvcnt [IN] Liczba elementów od pojedynczego procesu. Ma znaczenie tylko dla procesu root. MPI Datatype recvtype [IN] Typ elementów bufora recvbuf. Ma znaczenie tylko dla procesu root. int root [IN] Identyfikator procesu zbierającego dane. MPI Comm comm [IN] Komunikator.
Scalanie danych z wielu procesów dla wszystkich procesów komunikatora int MPI_Allgather ( void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm ) void *sendbuf [IN] Adres początkowy bufora z danymi przeznaczonymi do zebrania. int sendcnt [IN] Liczba elementów w sendbuf. MPI Datatype sendtype [IN] Typ elementów bufora sendbuf. void *recvbuf [OUT] Adres początkowy bufora do zapisu zebranych danych. int recvcnt [IN] Liczba elementów od pojedynczego procesu. MPI Datatype recvtype [IN] Typ elementów bufora recvbuf. MPI Comm comm [IN] Komunikator. Zebrane dane są umieszczane w pamięciach wszystkich procesów komunikatora.