IA039 Parallel Virtual Machine, PVM Základní vlastnosti Parallel Virtual Machine (PVM) ■ Vyvinut koncem na přelomu 80. a 90. let minulého století ■ Primarní motivace: tvorba paralelního virtualního superpoCítaCe * NedostateCny vykon * Puvodne pouze superpoCítaCe byly propojeny vysokorychlostní sítí ■ Postupne propojovaní praCovníCh staniC ■ Distribuovaná prostředí pro vyvoj a spoustení distribuovanyCh programu IA039 2 Jaro 2010 Komponenty ■ Sít pvmd démonů ■ Odpovídají za vlastní prostředí virtuálního paralelního (distribuovaného) počítače ■ Knihovna fůnkcí ■ API pro méziprocéso(ro)voů komunikace ■ API pro manipulaci s jednotlivými procesy ■ Přilinkovana k programů IA039 3 Jaro 2010 Programování ■ PVM podporuje primárně programy tvořené kooperujícími úlohami ■ Samostatné procesy na rUznych procesorech ■ Komunikace pomocí vymeny zprav ■ Přirozena podpora taskparalelismus ■ Odpovída MPMD (Multiple Programs Multiple Data) ■ Vhodny i pro SPMD vypocetní model ■ Je moZne realizovat i data paralelní programy ■ API dostupne pro jazyky ■ C, C++, Fortran 77 (a Fortran 90) IA039 4 Jaro 2010 Základní třídy příkazu ■ Řízení procesů ■ Posílání zpráv ■ Přijímání zpráv ■ Správá bůfferů ■ Skupinové operáce ■ Informáce ■ Signály IA039 5 Járo 2010 Řízení procesu ■ Každý proces má vlastní identifikátor ■ TID -Task Identifier ■ JedineCný v rámci cele PVM ■ Nese informace o úlože i o jejím umístení v PVM ■ Umístení- užel, na neemž proces beží ■ Výdavan master PVM demonem ■ Každa PVM ma jeden master demon ■ Potencialní slabe míst * Nebežpecní přetížení * Single point of failure IA039 6 Jaro 2010 Příkazy řízení procesu int tid = pvm_mytid(void) int info = pmv_exit(void) int info = pvm_kill(int tid) int info = pvm_addhosts(char **hosts, int nhosts, int *infos) int info = pvm_delhosts(char **hosts, int nhosts, int *infos) IA039 7 Jaro 2010 Spuštění nového procesu int numt = pvm_spawn(char *task, char **argv3 int flag, char *where3 int ntask, int *tids) flag: PvmTaskDefault PvmTaskHost PvmTaskArch PvmTaskDebug PvmTaskTrace PvmMppFront PvmHostCompl IA039 8 Jaro 2010 Posílání a přijímání zpráv ■ Předávání zpráv zprostředkováno pvmd démony ■ Odpovídají za spolehlivý přenos á doručení ■ Zprávu vZdy přebírá lokální (procesu přísluSny) pvmd ■ Následne z TID cílove procesu určí jeh umístení á zprávu zásle vzdálenemu pvmd procesu. ■ Musí zájistit prevod dát mezi ruznymi árchitekturámi IA039 9 Járo 2010 Jednoduchý příklad ■ Vlastní zaslání dat může realizovat např. následující jednoduchý příklad: int bufid = pvm_initsend(int encoding) ■ Encoding udava způsob překódovaní dat ■ PvmDataDefault * Data jsou překodovana do sýstemoveho bufferu ■ PvmDataRaw * Data se pruchodem sítí nemení (vhodne pokud víme, že používame identickou architekturu a prostředí) ■ PvmDatalnPlace * Data jsou konvertovana přímo v bufferu IA039 10 Jaro 2010 Zasílání zpráv int info = pvm_bufinfo(int bufid, int *bytes3 int *msgtag, int *tid) int info = pvm_send(int tid, int msgtag) int info = pvm_psend(int tid, int msgtag, char *buf, int len, int datatype) int info = pvm_mcast(int *tids, int ntask, int msgtag) IA039 11 Jaro 2010 Přijímání zpráv int info = pvm_recv(int tid, int msgtag) int info = pvm_precv(int tid, int msgtag, char *buf, int len, int datatype, int atid, int atag, int alen) int info = pvm_nrecv(int tid, int msgtag) int info = pvm_trecv(int tid, int msgtag, struct timeval tmout) IA039 12 Jaro2010 Overení dostupnosti zprávy int info = pvm_probe(int tid, int msgtag) IA039 13 Jaro 2010 Příprava a rozebírání dat pvm_pk( *data, int cnt, int stride) pvm_upk( *data, int cnt, int stride) byte char short short int int long long float float double double cplx float dcplx double str char 14 Jaro2010 Skupinové operace ■ PVM podporuje tvorbu skupin procesů ■ Proces se mUže kdykoliv ke skupine pridat ■ Proces mUže skupinu kdykoliv opustit ■ Není nutna žadna synchronizace ■ Je implementovan model slabe konzistence IA039 15 Jaro 2010 Příkazy skupinové komunikace int inum = pvm_joingroup(char *group) int info = pvm_lvgroup(char *group) int info = pvm_bcast(char *group, int msgtag) int info = pvm_barrier(char *group, int count) int info = pvm_reduce(void *op, void *data, int cnt, int datatype, int msgtag, char *group3 int root) void op(int *datatype, void *x, void *y3 int *num, int *info) int size = pvm_gsize(char *group) int tid = pvm_gettid(char *group, int inum) int inum = pvm_getinst(char *group, int tid) Mnozina informaCnich prikazU int tid = pvm_parent(void) int dtid = pvm_tidtohost(int tid) int info = pvm_config(int *nhost, int *narch, struct pvmhostinfo **hostp) int info = pvm_tasks(int which, int *ntask, struct pvmtaskinfo **taskp) int oldval = pvm_setopt(int what, int val) int val = pvm_getopt(int what) IA039 17 Jaro 2010 Pokročilé funkce int info = pvm_reg_hoster() int info = pvm_reg_tasker() int info = pvm_reg_rm(struct hostinfo **hip) ■ Všechny tri uvedené procedury slouží k nahrazení defaultních funkcí PVM pri spouštení novych uzlU (pvmd) i novych Uloh. ■ pvm_reg_hoster() a pvm_reg_tasker() žajisíújí konkrétní cinnosti (addhost ci spawn) ■ pvm_reg_rm() umožní definovat nový planovac (scheduler) IA039 18 Jaro 2010 Koordinační jazyky - Linda ■ Základní principy ■ Sdílená tabule (tuple space) ■ Matching (asociativní pamet) ■ Minimalní pocet primitivních operací: * zapis (out) * blokující a neblokující a destruktivní (in) a nedestruktivní (rd) ctení * test * zapis (pod)ulohy ■ Persistentní tabule ■ Hierarchicke tabule IA039 19 Jaro 2010 Piranha ■ Aktivní vyhledávání „volných" strojů ■ Podpora fáůlt-toleránce ■ Základní vlastnosti ■ feeder - vytváří á distribuuje ůlohy, sbírá výsledky ■ piranha - provádí vlástní vypoCet ■ retreat - volán pokůd piránhá můsí předCásne skonCit IA039 20 Járo 2010