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

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

Ú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

MPI Message Passing Interface. Charakteristika

Pokročilé architektury počítačů

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

Základní komunikační operace

Motivace. Software. Literatura a odkazy

Struktura programu v době běhu

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

Transformace digitalizovaného obrazu

Paralelní algoritmy --- Parallel Algorithms

Paralelní LU rozklad

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

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

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

Základy programování (IZP)

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

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

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

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

Algoritmizace a programování

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

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

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

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

Přepínaný Ethernet. Virtuální sítě.

GPGPU Aplikace GPGPU. Obecné výpočty na grafických procesorech. Jan Vacata

Algoritmizace a programování

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

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Procesy a vlákna (Processes and Threads)

Úvod do OpenMP. Jiří Fürst

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Knihovny pro CUDA J. Sloup a I. Šimeček

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

Úvod do programování - Java. Cvičení č.4

Základní datové struktury

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

Aktivní prvky: brány a směrovače. směrovače

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

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

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

Management procesu II Mgr. Josef Horálek

Martin Lísal. Úvod do MPI

Pokročilé architektury počítačů

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

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.

X.25 Frame Relay. Frame Relay

1 Příkazy MPI REDUCE a MPI ALLREDUCE

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

a co je operační systém?

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

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

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

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

Operační systémy. Přednáška 2: Procesy a vlákna

Funkce, intuitivní chápání složitosti

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

1. Zpracování událostí na pozadí aplikace

Aktivní prvky: přepínače

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

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

Úvod do programování. Lekce 3

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

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

Budování sítě v datových centrech

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

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

Internet a zdroje. (ARP, routing) Mgr. Petr Jakubec. Katedra fyzikální chemie Univerzita Palackého v Olomouci Tř. 17. listopadu

Kryptoanalýza šifry PRESENT pomocí rekonfigurovatelného hardware COPACOBANA

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus

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

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

Von Neumannovo schéma

2 Datové typy v jazyce C

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Rekurzivní algoritmy

Databázové systémy Cvičení 5.2

K čemu slouží počítačové sítě

Základy programování (IZP)

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

Počítačové sítě. Další informace naleznete na :

Metody připojování periferií

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

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

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

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Povídání na téma. SUPERPOČÍTAČE DNES A ZÍTRA (aneb krátký náhled na SC) Filip Staněk

Mobilní sítě. Počítačové sítě a systémy. _ 3. a 4. ročník SŠ technické. Ing. Fales Alexandr Software: SMART Notebook

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

Počítačové sítě. Další informace naleznete na :

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

e1 e1 ROUTER2 Skupina1

MS WINDOWS II. Jádro. Správa objektů. Správa procesů. Zabezpečení. Správa paměti

x86 assembler and inline assembler in GCC

Paralelizace datových přenosů

Optické sítě. Počítačové sítě a systémy. _ 3. a 4. ročník SŠ technické. Ing. Fales Alexandr Software: SMART Notebook

Transkript:

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 Nelze zajistit různost příznaků: - neznáme příznaky v knihovních podprogramech, nebo -někdy se používá MPI_Any_tag. Řešení v MPI jsou komunikátory. I když jde třeba o stejné skupiny procesů, systém jim přidělí různý kontext (komunikátor, tj. číslo). Komunikace v různých komunikátorech jsou odděleny a každá kolektivní komunikace je oddělena od každé p2p (dvoubodové) i ve stejném komunikátoru. Intrakomunikátor - komunikace v rámci skupiny Interkomunikátor - pro komunikaci mezi skupinami (MPI-2) Anatomie příkazu send v MPI MPI_Send(&N, 1, MPI_INT, i, i, MPI_COMM_WORLD) jméno podprogramu Nelze uvádět délku v byte Adresa zprávy délka (počet zpráv) příznak zprávy komunikátor Identifikace cílového procesu Datový typ zprávy; může být jiný v různých zemích, např. znak je 8 bitů (Evropa) nebo 16 bitů (Čína) Příklad blokující komunikace v MPI Poslat int x z procesu 0 do procesu 1: MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /*najdi svuj index*/ if (myrank == 0) { komu MPI_Send(&x, 1, MPI_INT, 1, msgtag, MPI_COMM_WORLD); else if (myrank == 1) { MPI_Recv(&x, 1, MPI_INT, 0, msgtag, MPI_COMM_WORLD, status); od koho stav po operaci Standardní send, nečeká na receive, buffer není v MPI definován; pokud je k dispozici, send může skončit dříve než se dojde na recv. Příklad neblokující komunikace v MPI Poslat int x z procesu 0 do procesu 1 a dovolit procesu 0 pokračovat: MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { MPI_Isend(&x, 1, MPI_INT, 1, msgtag, MPI_COMM_WORLD, req1); compute(); MPI_Wait(req1, status); parametr popisovač else if (myrank == 1) { MPI_Recv(&x, 0, MPI_INT, 1, msgtag, MPI_COMM_WORLD, status); MPI program typu SPMD pro Σf(i) #include mpi.h int f(i) int i; {... main(argc, argv) int argc; char* argv[]; { int i, tmp, sum=0, group_size, my_rank, N; MPI_Init (&argc, &argv); MPI_Comm_size( MPI_COMM_WORLD, &group_size); MPI_Comm_rank( MPI_COMM_WORLD, &my_rank); if ( my_rank == 0 ) { printf( Enter N: ); scanf( % d, &N); for ( i=1; i<group_size; i++) /*one-to-all broadcast N */ S1: MPI_Send(&N, 1, MPI_INT, i, i, MPI_COMM_WORLD); for (i=my_rank; i<n; i = i +group_size) sum = sum + f(i); /*f(0)+f(p)+f(2p)+... */ 1

MPI program, pokrač. for ( i=1; i<group_size; i++) { /* all-to-one gather */ S2: MPI_Recv(&tmp, 1, MPI_INT, i, i, MPI_COMM_WORLD, &status); sum = sum + tmp; printf ( \n The result = %d, sum); else { /* if my_rank!= 0 */ S3: MPI_Recv(&N, 1, MPI_INT, 0, i, MPI_COMM_WORLD, &status); for (i=my_rank; i<n; i=i+group_size) sum = sum + f(i); /*f(k)+f(k+p)+f(k+2p)+... k=my_rank */ S4: MPI_Send(&sum, 1, MPI_INT, 0, i, MPI_COMM_WORLD); MPI_Finalize( ); Tvorba nových komunikátorů Kromě duplikace též vyloučením podskupiny procesů, inkluzí, použitím množinových operací... - z podmnožiny procesů subgroup spojených s existujícím komunikátorem MPI_Comm_create (oldcomm, subgroup, &newcomm) - z disjunktních podskupin procesů podle klíče MPI_Comm_split (oldcomm, color, key, &SplitWorld) příkaz musí být obsažen ve všech procesech starého komunikátoru. Příklad: Nechť má oldcomm 10 procesů; použijeme-li color = my_rank% 3 a key = my_rank/3, dostaneme index v oldcomm 0 1 2 3 4 5 6 7 8 9 color 0 1 2 0 1 2 0 1 2 0 key 0 0 0 1 1 1 2 2 2 3 index ve SplitWorld (color=0) 0 1 2 3 index ve SplitWorld (color=1) 0 1 2 index ve SplitWorld (color=2) 0 1 2 Virtuální topologie v MPI-1 Komunikátor může být spojen s topologií 2 virtuální topologie: kartézská a grafová MPI_Cart_create() vrací nový komunikátor s kartézskou strukturou; lze získat nový index procesu nebo jeho kartézské souřadnice; MPI_Graph_create() vrací nový komunikátor, v němž jsou procesy uspořádány do obecného grafu. - Virtuální topologii lze optimálně mapovat na fyzické procesory ležící pod ní - povoluje se ve funkci create. - Virtuální topologie umožňuje praktičtější schéma adresace procesů. Datové typy v MPI Předdefinované: Odvozené (příklad): MPI_YTE EvenElements = EE MPI_CHAR double A[100]; MPI_DOULE MPI_Data_type EE; MPI_FLOAT... MPI_INT MPI_Type_vector(50, 1, 2, MPI_ MPI_LONG DOULE, &EE); MPI LONG_DOULE MPI_Type_commit(&EE) ; MPI_UNSIGNED MPI_Send(A, 1, EE, dst,... ) (CHAR, SHORT, LONG) MPI_PACKED (count, blocklength, stride, oldtype, &newtype) Různé operace Send/Receive v MPI Tři typy buferů zpráv v MPI Příkaz MPI lokující Neblokující Standardní send MPI_Send MPI_Isend Synchronní send MPI_Ssend MPI_Issend uffered Send MPI_send MPI_Ibsend Ready Send MPI_Rsend MPI_Irsend Receive MPI_Recv MPI_Irecv Test hotovo? MPI_Wait MPI_Test uffered Mode: Je nutné specifikovat prostor bufferu pomocí MPI_uffer_attach() - odstranění pomocí MPI_uffer_detach(). Synchronous Mode: Send a receive může začít jeden před druhým, ale mohou skončit pouze spolu. Ready Mode : Send může začít jen když se dosáhlo odpovídající receive, jinak chyba. Používat opatrně. a) jen uživatelské bufery Proces P Proces Q b) je použit systémový buffer S S Proces P Proces Q double A[2000000]; double [32]; send(a, 32, Q, tag); recv(, 32, P, tag) T Proces P c) je použit dočasný buffer T na úrovni uživatele. Proces Q 2

Deadlock při komunikaci v MPI může vzniknout, když dva procesy posílají a přijímají zprávy jeden od druhého; deadlok vznikne když oba procesy provedou synchronní send, nebo blokující send bez dostatečně velkého buferu; žádný proces se ze send nevrátí, protože čeká na odpovídající recv, kterého se nikdy nedosáhne; program SPMD je nutno upravit tak, aby jeden partner měl sekvenci send, recv a druhý partner recv, send, např. sudé a liché procesy; MPI také poskytuje kombinované operace bez deadlocku MPI_Sendrecv() a MPI_Sendrecv_replace() P i-1 P i P i+1 sendrecv(p i ); sendrecv(p i-1 ); sendrecv(p i+1 ); sendrecv(p i ); Synchronizace v MPI zajištění následnosti použitím blokujícího Receive: f1( ) /*call the function f1 */ task 0 f1( ) MPI_Send(sbuf,1,MPI_int, 5, 99, comm_space) skončí před task 5 MPI_Recv (rbuf,1,mpi_int, 0, 99, comm_space, &status) začátkem f2( ) /*call the function f2 */ f2( ) synchronizace při komunikaci (rendezvous): MPI_Ssend( ) MPI_Recv( ) MPI_arrier(comm_space) Kolektivní operace v MPI zahrnují množinu procesů definovaných komunikátorem jsou blokující příznaky zpráv se zde nepoužívají všechny procesy musí obsahovat volání kolektivní operace. Globální kombinace (předdefinovaná nebo definovaná uživatelem) do root MPI_Reduce(sbuf, rbuf, n, data_type, op, rt, communicator) Redukce mnoha do mnoha, operace Prefix scan MPI_Allreduce(sbuf, rbuf, n, data_type, op, communicator) MPI_Scan(sbuf, rbuf, n, data_type, op, communicator) Operace přesunující data MPI_cast(buffer, n, data_type, root, communicator) MPI_Scatter(sbuf, n, stype, rbuf, m, rtype, rt, communicator) MPI_Gather(sbuf, n, stype, rbuf, m, rtype, rt, communicator) MPI_Alltoall( ) MPI_SUM MPI_PROD MPI_MIN MPI_MAX MPI_LAND MPI_LXOR MPI_OR a další Kolektivní operace v MPI - příklad Posbírání hodnot ze skupiny procesů do procesu 0, včetně procesu 0, použitím dynamicky alokované paměti v procesu root int data[10]; /*data která se mají posbirat z procesů*/... MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* najdi rank */ if (myrank == 0) { /*najdi velikost skupiny a alokuj paměť */ MPI_Comm_size(MPI_COMM_WORLD, &grp_size); buf = (int *)malloc(grp_size*10*sizeof(int)); MPI_Gather(data, 10, MPI_INT, buf, grp_size*10, MPI_INT, 0, MPI_COMM_WORLD); kdo sbírá #include mpi.h #include <stdio.h> #include <math.h> #define MAXSIZE 1000 void main(int argc, char *argv) { int myid, numprocs; int data[maxsize], i, x, low, high, myresult, result; char fn[255]; char *fp; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); if (myid == 0) { /* Open input file and initialize data */ strcpy(fn,getenv( HOME )); strcat(fn, /MPI/rand_data.txt ); if ((fp = fopen(fn, r )) == NULL) { printf( Can t open the input file: %s\n\n, fn); exit(1); for(i = 0; i < MAXSIZE; i++) fscanf(fp, %d, &data[i]); Příklad - sčítání Příklad - pokrač. /* broadcast data */ MPI_cast(data, MAXSIZE, MPI_INT, 0, MPI_COMM_WORLD); /* Add my portion of data */ x = n/nproc; low = myid * x; high = low + x; for(i = low; i < high; i++) myresult += data[i]; printf( I got %d from %d\n, myresult, myid); /* Compute global sum */ MPI_Reduce(&myresult, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if (myid == 0) printf( The sum is %d.\n, result); MPI_Finalize(); 3

Počítání na svazcích stanic - odkazy Poslední vývoj ve svazcích Informační centrum: http://www.csse.monash.edu.au/~rajkumar/cluster/ IEEE Computer Society Task Force on Cluster Computing: http://www.ieeetfcc.org/ Clusters@TOP500: (Top 10 clusters) http://clusters.top500.org/ eowulf - svazek Linuxových pracovních stanic nebo PC svazky SMP, thread-safe MPI je rozšíření MPI pro práci s vlákny a sdílenou pamětí ( z OpenMP lze volat funkce z knihovny MPI). V poslední době se i superpočítače koncipují jako svazky SMP. Meta-computing, Hyper-computing, Remote Message Passing RMP, grid computing - účinnost není důležitá, hlavní je udělat a dokončit velký objem výpočtů. Svazek pracovních stanic (FIT) Svazky PC s Linuxem na FIT Summit48 hardware router Stanice : CPU: UltraSPARC II @ 270 MHz + linková karta. HW směrovač: Summit48 (firmy Extreme Networks) s 48 bránami Ethernet na 100 Mbit/s a dvě Ethernetové brány na 1 Gbit/s. Směrovač Summit48 má celkově propustnost 17.5 Gbit/s, neblokující strukturu přepínačů a přepravuje 10.1 milionu paketů za sekundu. Zpoždění HW směrovače : pod 10 µs a dá se zanedbat. Zpoždění SW : 160 µs pro send a 260 µs pro receive při hodinovém kmitočtu 270 MHz. Na 65 stanicích s Linuxem je nainstalovan balík LAM (Local Area Multiprocesor, implementace MPI). Jedná se o tyto počítače; PC00-09 PCA0 - A9 PC0-9 PCC0 - C9 PCD0 - D9 PCE0 - E1 PC50-61 + server merlin.dcse.fee.vutbr.cz Systém lineárních rovnic na svazku stanic Paralelní řešení systému lineárních rovnic Gauss - Jordanova metoda řešení jedním průchodem for i = 1 to n do {číslo pivotního řádku for j = 1 to n, j <> i do (číslo řádku begin c j := a ji /a ii {násobící činitel b j := b j - c j b i for k = i+1 to n do {číslo prvku a jk := a jk - c j a ik {řádek - činitel * pivotní řadek end for i = 1 to n do x i := b i /a ii {řešení Paralelizace: Každý procesor n/p rovnic; pak jeden procesor po druhém řídí postup - posílá pivotní řádek opakovaně všem ostatním (vystačíme s OA). Poznámky: délka pivotního řádku se systematicky snižuje jediný typ komunikace: broadcast dvě možnosti, počáteční distribuce dat je zahrnuta do času řešení nebo nikoliv rozesílání pivotního řádku je překryto s počítáním, v němž se používá předchozí pivotní řádek (SW řetěz) Řešení po skončení kroku i: i=1 i=2 i=3 i=5 4

Schéma programu (SPMD) # P fází výpočtu, všechny procesory se střídají for [i=0 to P-1] if (i=myid) { # jsem v této fázi řídící procesor for [k=0 to n/p-1] # rozhlašuji pivotní řádky, # pracuji na svém bloku rovnic else{ # i! = myid for [k=0 to n/p-1] # jsem v této fázi řadový procesor ; přijímám # pivotní řádky a pracuji na svém bloku rovnic Příště: ariéra a synchronní iterační výpočty. ezpečné zasílání zpráv v MPI. 5