Úvod do MPI. Úvod do MPI Operace send a recieve Blokující a neblokující posílání zpráv Blokující posílání zpráv Neblokující posílání zpráv

Podobné dokumenty
Programování založené na posílání zpráv

Základní komunikační operace

MPI Message Passing Interface. Charakteristika

Proč potřebujeme komunikátory? - pokrač. Týden 4 Programování zasíláním zpráv (MP) - programování v MPI - počítání na svazcích stanic

Ústav technické matematiky FS ( Ústav technické matematiky FS ) / 35

Pokročilé architektury počítačů

1 Rozdělení paralelních úloh z hlediska jejich

Paralelní algoritmy --- Parallel Algorithms

Paralelní programování

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

1.1 Příkazy pro kolektivní komunikaci (pokračování)

Transformace digitalizovaného obrazu

SUPERPOČÍTAČE DANIEL LANGR ČVUT FIT / VZLÚ

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Cvičení předmětu MI-PAR P. Tvrdík, I. Šimeček, M. Šoch

Motivace. Software. Literatura a odkazy

Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Základní datové struktury

Teoretická informatika Tomáš Foltýnek Paralelní programování

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Operační systémy. Cvičení 4: Programování v C pod Unixem

Přehled paralelních architektur. Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Práce se soubory. Základy programování 2 Tomáš Kühr

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Operační systémy. Cvičení 3: Programování v C pod Unixem

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

Paralelní LU rozklad

IB109 Návrh a implementace paralelních systémů. Kolektivní komunikační primitava. RNDr. Jiří Barnat, Ph.D.

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Obecné výpočty na GPU v jazyce CUDA. Jiří Filipovič

Šablony, kontejnery a iterátory

Základy programování (IZP)

C++ 0x aka C++11. Základním kamenem je třída std::thread

Základy programování (IZP)

Základy programování (IZP)

PROGRAMOVÁNÍ V C++ CVIČENÍ

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Profilová část maturitní zkoušky 2017/2018

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Pokročilé architektury počítačů

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

OPS Paralelní systémy, seznam pojmů, klasifikace

1 Nejkratší cesta grafem

Základní principy konstrukce systémové sběrnice - shrnutí. Shrnout základní principy konstrukce a fungování systémových sběrnic.

Procesy a vlákna (Processes and Threads)

Paralelizace neuronových sítí Parallelization of Neural Networks

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Univerzita Jana Evangelisty Purkyně v Ústí nad Labem. Přírodovědecká fakulta

Protokol S-BUS pro MORSE Popis protokolu

TG Motion verze 4 Modul Virtuální PLC návod k obsluze

PROTOKOL RDS. Dotaz na stav stanice " STAV CNC Informace o stavu CNC a radiové stanice FORMÁT JEDNOTLIVÝCH ZPRÁV

Paralelní a distribuované výpočty (B4B36PDV)

Analýza aplikačních protokolů

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Fakulta informačních technologií

TG Motion verze 4 Modul Virtuální PLC návod k obsluze

11MAMY LS 2017/2018. Úvod do Matlabu. 21. února Skupina 01. reseni2.m a tak dále + M souborem zadané funkce z příkladu 3 + souborem skupina.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Paralelní a distribuované výpočty (B4B36PDV)

Vícevláknové programování na CPU: POSIX vlákna a OpenMP I. Šimeček

Operační systémy 2: Zápočtové úkoly

Algoritmizace a programování

Paralelní a distribuované výpočty (B4B36PDV)

Računalniške delavnice FMF: Delavnica MPI

Základy informatiky. 2. Přednáška HW. Lenka Carr Motyčková. February 22, 2011 Základy informatiky 2

Paralelní výpočetní jádro matematického modelu elektrostatického zvlákňování

Management procesu II Mgr. Josef Horálek

Paralelní programování

cv3.tex. Vzorec pro úplnou pravděpodobnost

Metody připojování periferií

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Paralelní a distribuované výpočty (B4B36PDV)

Úvod do OpenMP. Jiří Fürst

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Ukázka zkouškové písemka OSY

Paralelní výpočty ve finančnictví

IUJCE 07/08 Přednáška č. 1

1 Příkazy MPI REDUCE a MPI ALLREDUCE

Paralelní a distribuované výpočty (B4B36PDV)

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

Paralelní programování

Profilová část maturitní zkoušky 2013/2014

Distribuované systémy a výpočty

Úvod do programování. Lekce 1

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Real Time programování v LabView. Ing. Martin Bušek, Ph.D.

VzorTest-1. Prohlídka náhledu

Standardní algoritmy vyhledávací.

Řízení IO přenosů DMA řadičem

Matematika v programovacích

Přednáška. Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Aplikace metody BDDC

Spojová implementace lineárních datových struktur

Programování v C++, 2. cvičení

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Transkript:

Úvod do MPI Úvod do MPI Operace send a recieve Blokující a neblokující posílání zpráv Blokující posílání zpráv Neblokující posílání zpráv Komunikační operace All-to-all broadcast/all-to-all reduction All-reduce a Prefix-sum Scatter/Gather All-to-all personalized communication Circular shift Programování s MPI

Úvod do MPI Programování architektur založených na posílání zpráv: výpočet se skládá ze skupiny procesů běžících na jednotlivých procesorech synchronizace probíhá pomocí posílání zpráv to je vhodné pouze pro nepříliš úzce synchronní výpočty

Standard MPI Standard pro posílání zpráv - MPI = Message Passing Interface Dostupné implementace OpenMPI - http://www.open-mpi.org/ LAM-MPI - http://www.lam-mpi.org/ MPICH - http://www-unix.mcs.anl.gov/mpi/mpich/ Intel, HP,... Zdroje na internetu: http://www-unix.mcs.anl.gov/mpi/ Wikipedia

Základ kódu pro MPI 1 # include <mpi. h> 2 3 i n t main ( i n t argc, char argv [ ] ) 4 { 5 M P I _ I n i t ( argc, argv ) ; 6 7... 8 9 MPI_Finalize ( ) ; 10 } Funkce MPI_Init a MPI_Finalize musí být volány právě jednou a všemi procesy. Vrácená hodnota by měla být MPI_SUCCES.

Komunikační skupiny Komunikační skupiny určují, které procesy se budou účastnit zvolené operace. Jde o tzv. COMMUNICATORS s typem MPI_Comm. Všechny běžící procesy jsou obsaženy ve skupině MPI_COMM_WORLD.

Informace o procesech Počet procesů (size) v dané skupině lze zjistit pomocí: 1 i n t MPI_Comm_size ( MPI_Comm comm, i n t size ) ; Identifikační číslo procesu (rank) vůči dané skupině lze zjistit pomocí: 1 i n t MPI_Comm_rank ( MPI_Comm comm, i n t rank ) ;

Operace send a recieve Jde o základní operace pro odeslání a přijetí jedné zprávy. send( void *sendbuf, int nelems, int dest) sendbuf - ukazatel na pole dat, jež mají být odeslána nelems - počet prvků pole dest - ID procesu/uzlu, kterému mají být data zaslána receive( void *recvbuf, int nelems, int source) recvbuf - ukazatel na pole, do nějž mají být přijatá data uložena nelems - počet prvků, které budou přijaty source - ID procesu/uzlu, od kterého mají být data načtena

Operace send a recieve Příklad: P 1 P 2 a=100; send(&a,1,2); receive( &a,1,1); a=0; printf("%d",a); Jaký výsledek vypíše proces P 2?

Operace send a recieve Příklad: P 1 P 2 a=100; send(&a,1,2); receive( &a,1,1); a=0; printf("%d",a); Jaký výsledek vypíše proces P 2? Výsledek je 100 nebo 0.

Operace send a recieve sít ové rozhraní může využívat DMA a pracovat nezávisle na CPU pokud má P 2 zpoždění ve zpracování kódu, mohou být data z P 1 odeslána až po provedení příkazu a=0; na P 1 tím pádem bude procesu P 2 odesláno číslo 0

Blokující a neblokující posílání zpráv Existují dva způsoby posílání zpráv: blokující funkce send nevrátí řízení programu, dokud to není sémanticky bezpečné neblokující komunikační funkce vrací řízení programu dříve, než je to sémanticky bezpečné

Blokující posílání zpráv Blokující posílání zpráv je možné provést dvěma způsoby: bez bufferu s bufferem

Blokující posílání zpráv bez bufferu odesílatel pošle požadavek k příjemci odesílatel potvrdí ve chvíli, kdy ve zpracování kódu dospěje k místu pro příjetí zprávy následně dojde k přenosu dat

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) čas

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) send SEND REQUEST čas

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) send SEND REQUEST čas SEND OK receive

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) send SEND REQUEST IDLE čas SEND OK TRANSFER receive

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) čas

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) čas send SEND REQUEST

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) čas send SEND REQUEST SEND OK receive

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) čas send SEND REQUEST SEND OK TRANSFER receive

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) čas

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) receive čas

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) receive čas send SEND REQUEST

Blokující posílání zpráv bez bufferu P 1 (send) P 2 (receive) receive IDLE čas send SEND REQUEST SEND OK TRANSFER

Blokující posílání zpráv bez bufferu Možnost deadlocku: P 1 P 2 send(&a,1,2); send( &a,1,1); receive(&b,1,2); receive( &b,1,1 ); oba procesy posílají send request a oba pak čekají na potvrzení send ok

Blokující posílání zpráv s bufferem snažíme se odstranit nutnost čekání na SEND OK při volání funkce send se data kopírují do pomocného bufferu program pak může okamžitě pokračovat přenos dat může proběhnout bez účasti CPU na straně příjemce se data také kopírují do pomocného bufferu někdy je buffer jen na jedné straně

Blokující posílání zpráv s bufferem čekání odesílajícího procesu se podařilo zredukovat přibyla ale režie nutná při kopírování dat z/do bufferů pokud jsou procesy často synchronizovány, může být komunikace bez bufferů efektivnější pokud se buffery zaplní, dochází k čekání také příjem je vždy blokující nesmí se pokračovat dál, dokud nejsou data zkopírována z bufferu příjemce

Blokující posílání zpráv s bufferem Možnost deadlocku: P 1 P 2 receive(&b,1,2); receive( &b,1,1 ); send(&a,1,2); send( &a,1,1); oba procesy čekají na příjem zprávy

Neblokující posílání zpráv komunikační funkce vrací řízení programu dříve, než je to sémanticky bezpečné programátor musí sám ohlídat, zda již byla data přenesena mezi tím ale může zpracovávat jiný kód, který napracuje s posílanými daty existují funkce, které řeknou, zda již komunikace úspěšně proběhla i neblokující komunikace může používat buffery

Funkce send a receive v MPI 1 i n t MPI_Send ( void buf, i n t count, 2 MPI_Datatype datatype, i n t dest, 3 i n t tag, MPI_Comm comm ) ; 1 i n t MPI_Receive ( void buf, i n t count, 2 MPI_Datatype datatype, i n t source, 3 i n t tag, MPI_Comm comm, 4 MPI_Status s t a t u s ) ; buf ukazatel na pole dat typu datatype o velikosti count datatype může být: MPI_CHAR, MPI_INT, MPI_FLOAT, MPI_DOUBLE,... dest ID příjemce source ID odesílatele tag určuje typ zprávy comm udává komunikační skupinu

Struktura MPI_Status 1 typedef struct MPI_Status 2 { 3 i n t MPI_SOURCE; 4 i n t MPI_TAG ; 5 i n t MPI_ERROR; 6 } ; MPI_SOURCE = odesílatel MPI_SOURCE = typ zprávy MPI_ERROR = chybové hlášení

Funkce send a receive v MPI U odesílatele i příjemce musí být count, datatype a tag stejné. Funkce 1 i n t MPI_Get_count ( MPI_Status status, 2 MPI_Datatype datatype, 3 i n t count ) ; udává skutečný počet přijatých dat. obě funkce jsou vždy blokující send může být implementováno bufferově (nelze s tím počítat, pozor na deadlock)

Funkce send a receive v MPI Příklad s deadlockem: 1 i n t a [ 10 ], b [ 10 ], myrank ; 2 MPI_Status s t a t u s ; 3... 4 MPI_Comm_rank ( MPI_COMM_WORLD, &myrank ) ; 5 i f ( myrank == 0 ) 6 { 7 MPI_Send ( a, 10, MPI_INT, 1, 1, MPI_COMM_WORLD) ; 8 MPI_Send ( b, 10, MPI_INT, 1, 2, MPI_COMM_WORLD) ; 9 } 10 else i f ( myrank == 1 ) 11 { 12 MPI_Recv ( b, 10, MPI_INT, 0, 2, MPI_COMM_WORLD) ; 13 MPI_Recv ( a, 10, MPI_INT, 0, 1, MPI_COMM_WORLD) ; 14 }

Funkce send a receive v MPI Příklad bez deadlocku: 1 i n t a [ 10 ], b [ 10 ], myrank ; 2 3 MPI_Status s t a t u s ; 4... 5 MPI_Comm_rank ( MPI_COMM_WORLD, &myrank ) ; 6 7 i f ( myrank == 0 ) 8 { 9 MPI_Send ( a, 10, MPI_INT, 1, 1, MPI_COMM_WORLD) ; 10 MPI_Send ( b, 10, MPI_INT, 1, 2, MPI_COMM_WORLD) ; 11 } 12 else i f ( myrank == 1 ) 13 { 14 MPI_Recv ( a, 10, MPI_INT, 0, 1, MPI_COMM_WORLD) ; 15 MPI_Recv ( b, 10, MPI_INT, 0, 2, MPI_COMM_WORLD) ; 16 }

Simultání send a receive v MPI Za účelem zabránění deadlocku je často lepší použít funkce pro simultání send/receive. 1 i n t MPI_Sendrecv ( void sendbuf, i n t sendcoutn, 2 MPI_Datatype senddatatype, i n t dset, 3 i n t sendtag, void recvbuf, 4 i n t recvcount, MPI_Datatype recvdatatype, 5 i n t source, i n t recvtag, 6 MPI_Comm comm, MPI_Status s t a t u s ) 1 i n t MPI_Sendrecv_replace ( void buf, i n t count, 2 MPI_Datatype datatype, i n t dest, 3 i n t sendtag, i n t source, 4 i n t recvtag, MPI_Comm comm, 5 MPI_Status s t a t u s ) V případě MPI_Sendrecv_replace jsou odeslaná data přepsána přijatými.

Neblokující send a receive v MPI 1 i n t MPI_Isend ( void buf, i n t count, 2 MPI_Datatype datatype, i n t dest, 3 i n t source, i n t tag, 4 MPI_Comm comm, MPI_Request request ) 1 i n t MPI_Irecv ( void buf, i n t count, 2 MPI_Datatype datatype, i n t source, 3 i n t tag, MPI_Comm comm, 4 MPI_Request request ) 5 } Obě funkce vracejí řízení programu dříve, než jsou data skutečně přenesena. request - slouží k ověření, zda byla data již přenesena

Neblokující send a receive v MPI Funkce pro ověření stavu přenosu dat při neblokujícím send a receive. 1 i n t MPI_Test ( MPI_Request request, 2 i n t f l a g, 3 MPI_Status s t a t u s ) 1 i n t MPI_Wait ( MPI_Request request, 2 MPI_Status s t a t u s ) MPI_Test vrací v proměnné flag nenulovou hodnotu, pokud již operace skončila MPI_Wait čeká na ukončení operace

Komunikační operace jde o komunikační vzory, které se v paralelním programování vyskytují velice často komunikující procesy mohou běžet na jednom nebo i na více výpočetních uzlech jejich speciální implementace má následující výhody zjednodušuje práci programátora mohou využívat hardwarovou podporu dané paralelní architektury udržují aktivní sít ové spojení komunikační sítě tím vlastně několik malých zpráv "shlukuje do jedné" k většině těchto operací existují i operace duální, které "běží v opačném směru"

One-to-all broadcast/all-to-one reduction One-to-all broadcast jeden proces má identická data o velikosti m a rozešle je všem ostatním používá se např. při rozesílání konfigurančích parametrů

One-to-all broadcast/all-to-one reduction All-to-one reduction každý proces má data o velikosti m a obecně jsou různá (různé hodnoty) data jsou poslána jednomu procesu a současně sloučena dohromady pomocí nějaké asociativní operace do velikosti m Příklad: Máme 100 reálných čísel umístěných na 100 procesech (každý proces má jedno reálné číslo). Výsledkem redukce je součet všech čísel a výsledek má proces číslo 0.

One-to-all broadcast/all-to-one reduction M 1 2 3 p 1 2 3 p Před Po

One-to-all broadcast/all-to-one reduction M 1 2 3 p 1 2 3 p Před One-to-all broadcast Po

One-to-all broadcast/all-to-one reduction M M M M M 1 2 3 p 1 2 3 p Před Po

One-to-all broadcast/all-to-one reduction M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Po Před

One-to-all broadcast/all-to-one reduction M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Po All-to-one reduction Před

One-to-all broadcast/all-to-one reduction p i=1 M i 1 2 3 p 1 2 3 p Po Před

One-to-all broadcast/all-to-one reduction - příklad vstupní vektor P 1 P 2 P 3 P 4 P 1 P 6 P 11 P 16 P 5 P 2 P 7 P 8 P 9 P 10 P 3 P 12 P 13 P 14 P 15 P 4 P 1 P 2 P 3 P 4 výstupní vektor

One-to-all broadcast/all-to-one reduction - příklad vstupní vektor P 1 P 2 P 3 P 4 One-to-all broadcast P 1 P 6 P 11 P 16 P 5 P 2 P 7 P 8 P 9 P 10 P 3 P 12 P 13 P 14 P 15 P 4 P 1 P 2 P 3 P 4 výstupní vektor

One-to-all broadcast/all-to-one reduction - příklad vstupní vektor P 1 P 2 P 3 P 4 Výpočet P 1 P 6 P 11 P 16 P 5 P 2 P 7 P 8 P 9 P 10 P 3 P 12 P 13 P 14 P 15 P 4 P 1 P 2 P 3 P 4 výstupní vektor

One-to-all broadcast/all-to-one reduction - příklad vstupní vektor P 1 P 2 P 3 P 4 P 1 P 6 P 11 P 16 P 5 P 2 P 7 P 8 P 9 P 10 P 3 P 12 P 13 P 14 P 15 P 4 All-to-one reduction P 1 P 2 P 3 P 4 výstupní vektor

One-to-all broadcast/all-to-one reduction Realizace v případě sítě typu kruh 8 7 6 5 One-to-all broadcast 1 2 3 4

One-to-all broadcast/all-to-one reduction Realizace v případě sítě typu kruh 8 7 6 5 One-to-all broadcast 1 2 3 4

One-to-all broadcast/all-to-one reduction Realizace v případě sítě typu kruh 8 7 6 5 One-to-all broadcast 1 2 3 4

One-to-all broadcast/all-to-one reduction Realizace v případě sítě typu kruh 8 7 6 5 One-to-all broadcast 1 2 3 4

One-to-all broadcast/all-to-one reduction Realizace v případě sítě typu kruh 8 7 6 5 One-to-all broadcast 1 2 3 4

One-to-all broadcast/all-to-one reduction Realizace v případě sítě typu kruh 8 7 6 5 One-to-all broadcast 1 2 3 4

One-to-all broadcast/all-to-one reduction Realizace v případě sítě typu lineární řetězec je stejná jako u kruhu. poslední spoj nebyl potřeba Realizace v případě ortogonální sítě: nejprve se provede one-to-all broadcast podél jedné souřadnice, následně podél další

One-to-all broadcast/all-to-one reduction v MPI One-to-all broadcast 1 i n t MPI_Bcast ( void buf, i n t count, MPI_Datatype, 2 i n t source, MPI_Comm comm ) 1 MPI_Bcast ( &x, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD ) ; } All-to-one reduction 1 i n t MPI_Reduce ( void sendbuf, void recvbuf, 2 i n t count, MPI_Datatype datatype, 3 MPI_Op op, i n t t a r g e t, MPI_Comm comm) op = operace: MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD výsledek se uloží do recvbuf procesu target 1 MPI_Reduce ( &x, &max_x, 1, MPI_DOUBLE, MPI_MAX, 2 0, MPI_COMM_WORLD ) ;

All-to-all broadcast/all-to-all reduction Všech p procesů provádí současně one-to-all broadcast nebo all-to-one reduction s různými daty.

All-to-all broadcast/all-to-all reduction M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Před Po

All-to-all broadcast/all-to-all reduction M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Před All-to-all broadcast Po

All-to-all broadcast/all-to-all reduction M p M p M p M p.... M 3 M 3 M 3 M 3 M 2 M 2 M 2 M 2 M 1 M 2 M 3 M p M 1 M 1 M 1 M 1 1 2 3 p 1 2 3 p Před Po

All-to-all broadcast/all-to-all reduction M p,1 M p,2 M p,3 M p,4.... M 3,1 M 3,2 M 3,3 M 3,p M 2,1 M 2,2 M 2,3 M 2,p M 1,1 M 1,2 M 1,3 M 1,p 1 2 3 p 1 2 3 p Po Před

All-to-all broadcast/all-to-all reduction M p,1 M p,2 M p,3 M p,4.... M 3,1 M 3,2 M 3,3 M 3,p M 2,1 M 2,2 M 2,3 M 2,p M 1,1 M 1,2 M 1,3 M 1,p 1 2 3 p 1 2 3 p Po All-to-all reduction Před

All-to-all broadcast/all-to-all reduction M p,1 M p,2 M p,3 M p,4.... M 3,1 M 3,2 M 3,3 M 3,p p i=1 M 1,i p i=1 M 2,i p i=1 M 3,i p i=1 M p,i M 2,1 M 2,2 M 2,3 M 2,p M 1,1 M 1,2 M 1,3 M 1,p 1 2 3 p 1 2 3 p Po Před

All-to-all broadcast/all-to-all reduction Realizace all-to-all broadcast v případě sítě typu kruh: v každém kroku každý uzel pošle svoje data sousedovi vpravo a přijme data od souseda vlevo v následujícím kroku posílá data, která v předchozím kroku přijal vše se opakuje p 1-krát V případě ortogonálních sítí se opět postupuje podél jednotlivých souřadnic.

All-to-all broadcast/all-to-all reduction Realizace all-to-all reduction v případě sítě typu kruh: v první kroku pošle uzel i data M j,i pro j = 1, p a j i svému sousedovi vpravo a příjme data M j,i 1 pro j = 1, p a j i 1 od svého souseda vlevo v druhém kroku pošle uzel i data M j,i 1 pro j = 1, p a j i j i 1, svému sousedovi vpravo a příjme data M j,i 2 pro j = 1, p a j i 1 j i 2 od svého souseda vlevo vše se ještě opakuje p 2-krát za současného provádění redukční operace

All-to-all broadcast/all-to-all reduction v MPI All-to-all broadcast 1 i n t M P I _ A l l t o a l l ( void sendbuf, i n t sendcount, 2 MPI_Datatype sendtype, 3 void recvbuf, i n t recvcount, 4 MPI_Datatype recvtype, 5 MPI_Comm comm ) sendcount a recvcount je počet elementů poslaných jednomu procesu

All-reduce a Prefix-sum All-reduce na počátku má každý proces různá data M i o velikosti m na konci mají všechny procesy stejný součet dat p i=1 M i All-reduce lze provést jako All-to-one reduction + One-to-all broadcast p All-to-all broadcast, kde se ale provede součet i=1 M i pro m = 1 lze All-reduce použít jako bariéru 1 redukci nelze dokončit, dokud k ní nepřispěje každý proces svým podílem 1 Bariéra je místo v programu, které nesmí žádný proces překročit, dokud ho nedosáhnou všechny ostatní procesy. Má význam synchronizace procesů.

All-reduce a Prefix-sum Prefix-sum jde o modifikaci all-reduce pro data M 1, M p chceme najít S k = k i=1 M i pro k = 1, p postup je stejný jako u all-reduce, ale každý proces k si "přičítá"jen data od procesů s ID < k některá komunikace je tu tady zbytečná, ale celkovou složitost této operace to neovlivní

All-reduce a Prefix-sum v MPI All reduce 1 i n t MPI_Allreduce ( void sendbuf, void recvbuf, 2 i n t count, MPI_Datatype datatype, 3 MPI_Op op, MPI_Comm comm ) Prefix sum 1 i n t MPI_Scan ( const void sendbuf, void recvbuf, i n t count, 2 MPI_Datatype datatype, MPI_Op op, MPI_Comm comm ) Bariéra 1 i n t MPI_ Barrier ( MPI_Comm comm )

Scatter/Gather Scatter jeden proces má na počátku p různých zpráv M 1, M p proces i má na konci zprávu M i někdy se tato zpráva nazývá one-to-all personalized communicatio Gather je to duální operace ke scatter na počátku má každý proces i zprávu M i na konci má jeden proces všechny zprávy p i=1 M i

Scatter/Gather M p. M 3 M 2 M 1 1 2 3 p 1 2 3 p Před Po

Scatter/Gather M p. M 3 M 2 M 1 1 2 3 p 1 2 3 p Před Scatter Po

Scatter/Gather M p. M 3 M 2 M 1 M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Před Po

Scatter/Gather M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Po Před

Scatter/Gather M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Po Gather Před

Scatter/Gather M p. M 3 M 2 M 1 M 1 M 2 M 3 M p 1 2 3 p 1 2 3 p Po Před

Scatter/gather Realizace scatter v případě sítě typu kruh: je stejná jako u one-to-all broadcast ale s jinými objemy dat

Scatter/gather 8 7 6 5 Scatter 1 2 3 4

Scatter/gather 8 7 6 5 Scatter M 1, M 8 1 2 3 4

Scatter/gather M 5, M 8 8 7 6 5 M 1, M 4 Scatter 1 2 3 4

Scatter/gather M 7, M 8 M 5, M 6 8 7 6 5 Scatter M 1, M 2 M 3, M 4 1 2 3 4

Scatter/gather M 8 M 7 M 6 M 5 8 7 6 5 Scatter M 1 M 2 M 3 M 4 1 2 3 4

Scatter/gather M 8 M 7 M 6 M 5 8 7 6 5 Scatter M 1 M 2 M 3 M 4 1 2 3 4

Scatter/gather v MPI Scatter 1 i n t MPI_Scatter ( void sendbuf, i n t sendcount, 2 MPI_Datatype senddatatype, 3 void recvbuf, i n t recvcount, 4 MPI_Datatype recvdatatype, 5 i n t source, MPI_Comm comm ) } sendcount = recvcount udává počet prvků posílaných jednomu procesu Scatter vektorově - každý proces dostane jiný objem dat 1 i n t MPI_Scatterv ( void sendbuf, i n t sendcounts, 2 i n t d i s p l s, 3 MPI_Datatype senddatatype, 4 void recvbuf, i n t recvcount, 5 MPI_Datatype recvdatatype, 6 i n t source, MPI_Comm comm ) sendcounts ukazatel na pole udávájíci počet prvků posílaných danému procesu displs ukazatel na pole udávájící pozici dat pro daný proces

Scatter/gather v MPI Gather 1 i n t MPI_Gather ( void sendbuf, i n t sendcount, 2 MPI_Datatype senddatatype, 3 void recvbuf, i n t recvcount, 4 MPI_Datatype recvdatatype, 5 i n t t a r g e t, MPI_Comm comm ) recvcount udává počet prvků získaných od daného procesu Gather vektorově - každý proces dostane jiný objem dat 1 i n t MPI_Scatterv ( void sendbuf, i n t sendcount, 2 MPI_Datatype senddatatype, 3 void recvbuf, i n t recvcount, 4 i n t d i s p l s, 5 MPI_Datatype recvdatatype, 6 i n t t a r g e t, MPI_Comm comm ) } recvcounts ukazatel na pole udávájíci počet prvků získaných od daného procesu displs ukazatel na pole udávájící pozici dat od daného procesu

All-to-all personalized communication All-to-all personalized communication každý proces i má data M i,j, která pošle procesu j.

All-to-all personalized communication M p,1 M p,2 M p,3 M p,p.... M 3,1 M 3,2 M 3,3 M 3,p M 2,1 M 2,2 M 2,3 M 2,p M 1,1 M 1,2 M 1,3 M 1,p 1 2 3 p 1 2 3 p Před Po

All-to-all personalized communication M p,1 M p,2 M p,3 M p,p.... M 3,1 M 3,2 M 3,3 M 3,p M 2,1 M 2,2 M 2,3 M 2,p M 1,1 M 1,2 M 1,3 M 1,p 1 2 3 p 1 2 3 p Před All-to-all personalized communication Po

All-to-all personalized communication M p,1 M p,2 M p,3 M p,p M 1,p M 2,p M 3,p M p,p........ M 3,1 M 3,2 M 3,3 M 3,p M 2,1 M 2,2 M 2,3 M 2,p M 1,3 M 2,3 M 3,3 M p,3 M 1,2 M 2,2 M 3,2 M p,2 M 1,1 M 1,2 M 1,3 M 1,p M 1,1 M 2,1 M 3,1 M p,1 1 2 3 p 1 2 3 p Před Po

All-to-all personalized communication jde vlastně o maticovou transpozici stejná analogie jako mezi scatter a one-to-all broadcast platí i mezi all-to-all personalized communication a all-to-all broadcast z toho plyne i realizace all-to-all personalized communication na síti typu kruh nebo na ortogonálních sítích

All-to-all personalized communication v MPI All-to-all personalized communication 1 i n t M P I _ A l l t o a l l ( void sendbuf, i n t sendcount, 2 MPI_Datatype senddatatype, 3 void recvbuf, i n t recvcount, 4 MPI_Datatype recvdatatype, 5 MPI_Comm comm) 1 i n t M P I _ A l l t o a l l v ( void sendbuf, i n t sendcounts, 2 i n t s d i s p l s, 3 MPI_Datatype senddatatype, 4 void recvbuf, i n t recvcounts, 5 i n t r d i s p l s, 6 MPI_Datatype recvdatatype, 7 MPI_Comm comm)

Circular shift Circular shift patří mezi tzv. permutační komunikační operace každý proces pošle jednu zprávu o velikosti m slov některému jinému uzlu Příklad: Circular q-shift proces i pošle svá data procesu (i + q) mod p

Kostra jednoduché aplikace 1 # include <mpi. h> 2 3 i n t main ( i n t argc, char argv [ ] ) 4 { 5 i n t nproc, i p r o c ; 6 Config c o n f i g ; 7 InputData input_ data ; 8 OutputData output_ data ; 9 M P I _ I n i t (& argc, &argv ) ; 10 MPI_Comm_size (MPI_COMM_WORLD, &nproc ) ; 11 MPI_Comm_rank (MPI_COMM_WORLD, &i p r o c ) ; 12 i f ( i p r o c == 0) 13 { 14 ParseConfigurationParameters (& config,& argc,& argv ) ; 15 GetInputData (& config,& input_ data ) ; 16 } 17 Broadcast (& config, 0 ) ; 18 S c a t t e r (& input_data, 0 ) ; 19 Compute(& input_ data, &output_ data ) ; 20 Gather (& output_data, 0 ) ; 21 i f ( i p r o c == 0) WriteOutput (& output_data ) ; 22 MPI_Finalize ( ) ; 23 }

Spouštění MPI aplikací Programy pro MPI většinou překládáme pomocí mpicc 1 mpicc o foo foo. c a spouštíme pomocí 1 mpirun v np 2 foo program mpirun spustí foo ve dvou procesech

Spouštění MPI aplikací MPI aplikace lze dobře provozovat i na vícejádrových procesorech v případě výpočtu na klastru nebo superpočítači je často potřeba udat více parametrů 1 mpirun np 256 npernode 4 m a c h i n e f i l e f i l e foo -npernode udává počet procesů na jeden uzel -machinfile udává adresy jednotlivých uzlů 1 node328 2 node328 3 node328 4 node328 5 node329 6 node329 7 node329 8 node329 9 node330 10 node330 11 node330 12 node330 13...