38 - Distribuované a paralelní algoritmy - předávání zpráv a knihovny pro paralelní zpracování (MPI).
pátek 1. dubna 2016
10:58
PVM a MPI jsou často používané nástroje pro paralelní programování.
PVM (Parallel Virtual Machine)
MPI (Message Passing Interface)
Distribuovaný OS
Knihovna pro psaní programů (nikoli distribuovaný OS)
Portabilita
Portabilita
Heterogenita
Heterogenita
Popere se s komunikačními chybami
MPI (Message Passing Interface)
MPI je knihovna, která je nezávislá na použitém programovacím jazyce a implementaci. 
Je to knihovna implementující stejnojmennou specifikaci (protokol) pro podporu paralelního řešení výpočetních problémů v počítačových clusterech.
Něco o procesech v MPI
Fixní počet procesů je vytvořen během inicializace programu.
Statický model je kvůli zvýšení výkonu.
Proces nemůže vytvářet nové procesy (platí asi jenom pro staré MPI-1).
Každý proces zná své číslo (rank).
Každý proces zná počet všech procesů.
Každý proces může komunikovat s ostatními procesy.
Tolerance chyb v MPI
Pokud jeden proces selže, tak selžou i všechny ostatní.
Je to z toho důvodu, aby se program nenechal počítat hlouposti s nějakým divným výsledkem.
Problém je že se to nedá použít ve velkých výpočetních střediscích, jelikož pravděpodobnost, že se nějaký z milionu procesorů pokazí je celkem velká. 
Praktické věci ohledně MPI
Jak zjistíme počet procesů a vlastní rank?
K tomu existují 2 funkce:
MPI_Comm_size reports the number of processes.
MPI_Comm_rank reports the rank, a number between 0 and size-1, identifying the calling process.
#include "mpi.h"
#include <stdio.h>
int main( int argc, char *argv[] )
{
int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
printf( "I am %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}
Základní koncepty MPI
Procesy mohou být ve skupinách.
Každá zpráva je poslaná v nějakém kontextu a musí být přijata v tom stejném kontextu.
Skupina a kontext tvoří dohromady communicator.
Existuje defaultní communicator nazvaný MPI_COMM_WORLD jehož skupina (group) obsahuje všechny počáteční procesy.
Datové typy v MPI
Poslaná/přijatá datová zpráva je popsaná trojicí:
𝑎𝑑𝑟𝑒𝑠𝑎, 𝑝𝑜č𝑒𝑡, 𝑑𝑎𝑡𝑜𝑣ý𝑇𝑦𝑝
Datové typy jsou v MPI explicitně definovány, jelikož různé počítače mohou mít jinou reprezentaci dat a jinou velikost typů (např. int na x86 a x64).
MPI Tags
Zprávy jsou odesílány s tagy, které příjemci říkají, jaký typ zprávy přijal.
Příjemce poté může zprávy filtrovat pomocí tagů, případně použít tag MPI_ANY_TAG, který nefiltruje nic.
Základní operace v MPI
MPI_SEND - blocking
MPI_SEND (start, count, datatype, dest, tag, comm)
Buffer zprávy popsán pomocí (start, count, datatype).
Cílový proces je popsán pomocí dest a comm, kde dest je rank procesu v komunikátoru comm.
Jakmile se funkce vrátí, tak data byla doručena a buffer může být znovu použit.
MPI_RECV - blocking
MPI_RECV(buf, count, datatype, source, tag, comm, status)
Tato funkce čeká, dokud nepřijde zpráva od procesu source (je to rank procesu v daném komunikátoru comm) s tagem tag.
Dá se použít i MPI_ANY_SOURCE.
status obsahuje dodatečné informace.
Pokud se přijme méně dat datového typu specifikovaného pomocí datatype, než je množství udané v count, tak to OK, pokud ovšem přijmeme více dat, to je chyba.
In contrast, non-blocking communication is done using MPI_Isend() and MPI_Irecv(). These function return immediately (i.e., they do not block) even if the communication is not finished yet. You must call MPI_Wait() or MPI_Test() to see whether the communication has finished.
From <[link]> 
Kolektivní operace v MPI
Kolektivní operace jsou zavolány pro všechny procesy v communicatoru.
Broadcast a reduce
MPI_BCAST distributes data from one process (the root) to all others in a communicator.
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root,  MPI_Comm comm )
MPI_REDUCE combines data from all processes in communicator and returns it to one process.
int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
In many numerical algorithms, SEND/RECEIVE can be replaced by BCAST/REDUCE, improving both simplicity and efficiency.
Synchronizace v PMI
MPI_Barrier( comm )
• Blocks until all processes in the group of the communicator comm call it.
Ještě dovětek k praxi… kromě MPI tu jsou i jiné frameworky, jako například Akka, ZeroMQ atd.
[link]
Příklady na MPI
PVM (Parallel Virtual Machine)
[link]
Parallel Virtual Machine je rozhraní pro paralelní programy. Není závislé na implementaci a je tak funkční i mezi počítači s rozdílnými operačními systémy. Jedná se o komunikační vrstvu využívající zejména TCP protokol za účelem spojení výkonu procesorů více počítačů k vytvoření virtuálního superpočítače.
Pro komunikaci po síti používá systém zasílání zpráv metodou broadcastu - zasílání zpráv celé skupině, nebo metodou multicastu - zasílání zpráv pouze vybrané skupině účastníků komunikace.
Následovníkem tohoto rozhraní je MPI.
Notes
2. Otazka (předmět) (okruh): Distribuovane a paralelni algoritmy - MPI (PRL)
Kdo me primarne zkousel: Zboril ml.
Co jsem k tomu rekl(a)/na co se ptali/co mne vytkli:
Tak zacal som tie obecne kecy okolo MPI, kazdy proces ma rank, vidia sa, bezia v kontexte, ake ma vyhody nevyhody, porovnal som to s PVM ale potom ma sekol, ze staci. Povedal mi ze tie procesory spolu nejak komunikuju nech poviem ako. Povedal som mu send() recv() get() put() ale ze to nechce ze on chce nieco ine, nevedel som co po mne chce. Naviedol ma ze sa jedna o komunikaciu 1:N, vtedy ma napadli tie kolektivne operacie tak som mu ich vymenoval. Tak sa usmial ze vyborne nech mu poviem nieco o broadcast a reduce a zaroven nech mu napisem jednoduchy algoritmus v MPI na takuto komunikaciu - totalny fail 
 Vobec som si to nepamatal, tak to preskocil a nech mu strucne poviem ako by som riesil vyhladanie hodnoty v postupnosti procesorov. Povedal som ze broadcastom, lokalnym porovnanim, nastavenim priznaku a reducom hore. Povedal ze OK, to mu staci.
From <[link]> 
From <[link]> 