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

Podobné dokumenty
Ú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

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

Základní komunikační operace

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

Pokročilé architektury počítačů

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

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

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

Računalniške delavnice FMF: Delavnica MPI

Transformace digitalizovaného obrazu

Paralelní LU rozklad

Paralelní algoritmy --- Parallel Algorithms

Motivace. Software. Literatura a odkazy

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

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

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

Více o konstruktorech a destruktorech

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

Distribuované kódovanie MP3 BAKALÁRSKA PRÁCA. David Zachar

Základní datové struktury

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

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

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

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

Algoritmizace a programování

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

Metody připojování periferií

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

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

Základy programování (IZP)

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

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

Základy programování (IZP)

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

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

Procesy a vlákna IPC Komunikace mezi procesy (IPC = Inter-Process Communication)

Vstupní a vstupní proudy v C++

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

Model je umělý objekt, který reflektuje a reprodukuje základní vlastnosti, vztahy (strukturu) a funkce konkrétního objektu nebo

Základy programování (IZP)

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

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

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

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

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

Základy programování (IZP)

ZÁPOČTOVÝ TEST. Zpracoval Vilém Závodný, #include "stdafx.h" #include "stdio.h"

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

Množina v C++ (set, multiset).

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

Čipové karty Lekařská informatika

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

Množina čísel int stl-set-int.cpp

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

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

Programování v jazyce C a C++

Car Agent. Struktura chování:

Generické programování

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

Semafory Zobecněním operací WAKEUP a SLEEP přidáním celočíselného čítače vzniknou semafory a jejich atomické operace DOWN a UP.

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.

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

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

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

2 Datové typy v jazyce C

map, multimap - Asociativní pole v 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í

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

Operační systémy. Přednáška 5: Komunikace mezi procesy

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Funkční objekty v C++.

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

Diplomová práce. Systém pro automatické spouštění Java programů v distribuovaném prostředí. Západočeská univerzita v Plzni. Fakulta aplikovaných věd

1 Příkazy MPI REDUCE a MPI ALLREDUCE

sms.sluzba.cz API_XML30 pro textové SMS zprávy do ČR a do zahraničí

Programovací jazyk C++ Hodina 1

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

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

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

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Vláknové programování část V

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

Cvičení č. 2. Komunikace mezi procesy Program Hodiny. 4 body

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

Struktury a dynamické proměnné

Popis funkcí a parametrů programu. Reliance External communicator. Verze 1.5.0

Algoritmizace a programování

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

1. Programování proti rozhraní

Ukazatele #1, struktury

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

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

Základy programování (IZP)

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Transkript:

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

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 #include <mpi.h> int main( int argc, char* argv[] ) { MPI_Init( argc, argv );... MPI_Finalize(); }

Základ kódu pro MPI #include <mpi.h> int main( int argc, char* argv[] ) { MPI_Init( argc, argv );... MPI_Finalize(); } 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.

Základ kódu pro MPI #include <mpi.h> int main( int argc, char* argv[] ) { MPI_Init( argc, argv );... MPI_Finalize(); } 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. shell$ mpicc -o foo foo.c shell$ mpif77 -o foo foo.f mpirun -v -np 2 foo

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í: int MPI_Comm_size( MPI_Comm comm, int* size ); Identifikační číslo procesu (rank) vůči dané skupině lze zjistit pomocí: int MPI_Comm_rank( MPI_Comm comm, int* rank );

Kostra jednoduché aplikace #include <mpi.h> int main( int argc, char* argv[] ) { int nproc, iproc; Config config; InputData input_data; OutputData output_data; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nproc); MPI_Comm_rank(MPI_COMM_WORLD, &iproc); if(iproc == 0) { ParseConfigurationParameters(&config,&argc,&argv); GetInputData(&config,&input_data); } Broadcast(&config, 0); Scatter(&input_data, 0); Compute(&input_data, &output_data); Gather(&output_data, 0); if(iproc == 0) WriteOutput(&output_data); MPI_Finalize(); }

Funkce send a receive I. int MPI_Send( void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ); int MPI_Receive( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status );

Funkce send a receive I. int MPI_Send( void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ); int MPI_Receive( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status ); buf ukazatel na pole dat typu datatype o velikosti count

Funkce send a receive I. int MPI_Send( void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ); int MPI_Receive( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status ); buf ukazatel na pole dat typu datatype o velikosti count datatype může být: MPI_CHAR, MPI_INT, MPI_FLOAT, MPI_DOUBLE,...

Funkce send a receive I. int MPI_Send( void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ); int MPI_Receive( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status ); 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

Funkce send a receive I. int MPI_Send( void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ); int MPI_Receive( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status ); 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

Funkce send a receive I. int MPI_Send( void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ); int MPI_Receive( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status ); 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

Funkce send a receive I. int MPI_Send( void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ); int MPI_Receive( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status ); 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 typedef struct MPI_Status { int MPI_SOURCE; int MPI_TAG; int MPI_ERROR; }; MPI_SOURCE = odesílatel MPI_SOURCE = typ zprávy MPI_ERROR = chybové hlášení

Funkce send a receive II. U odesílatele i příjemce musí být count, datatype a tag stejné.

Funkce send a receive II. U odesílatele i příjemce musí být count, datatype a tag stejné. Funkce int MPI_Get_count( MPI_Status* status, MPI_Datatype datatype, int* count ) udává skutečný počet přijatých dat.

Funkce send a receive II. U odesílatele i příjemce musí být count, datatype a tag stejné. Funkce int MPI_Get_count( MPI_Status* status, MPI_Datatype datatype, int* 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 - příklad s deadlockem int a[ 10 ], b[ 10 ], myrank; MPI_Status status;... MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); if( myrank == 0 ) { MPI_Send(a, 10, MPI_INT, 1, 1, MPI_COMM_WORLD); MPI_Send(b, 10, MPI_INT, 1, 2, MPI_COMM_WORLD); } else if( myrank == 1 ) { MPI_Recv(b, 10, MPI_INT, 0, 2, MPI_COMM_WORLD); MPI_Recv(a, 10, MPI_INT, 0, 1, MPI_COMM_WORLD); }

Funkce send a receive - příklad bez deadlocku int a[ 10 ], b[ 10 ], myrank; MPI_Status status;... MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); if( myrank == 0 ) { MPI_Send(a, 10, MPI_INT, 1, 1, MPI_COMM_WORLD); MPI_Send(b, 10, MPI_INT, 1, 2, MPI_COMM_WORLD); } else if( myrank == 1 ) { MPI_Recv(a, 10, MPI_INT, 0, 1, MPI_COMM_WORLD); MPI_Recv(b, 10, MPI_INT, 0, 2, MPI_COMM_WORLD); }

Simultání send a receive Za účelem zabránění deadlocku je často lepší použít funkce pro simultání send/receive. int MPI_Sendrecv( void* sendbuf, int sendcoutn, MPI_Datatype senddatatype, int dset, int sendtag, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int source, int recvtag, MPI_Comm comm, MPI_Status* status ) 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 ) V případě MPI_Sendrecv_replace jsou odeslaná data přepsána přijatými.

Neblokující send a receive I. int MPI_Isend( void* buf, int count, MPI_Datatype datatype, int dest, int source, int tag, MPI_Comm comm, MPI_Request* request ) int MPI_Irecv( void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request* request ) Obě funkce vracejí řízení programu dřive, než jsou data skutečně přenesena. request - slouží k ověření, zda byla data již přenesena

Neblokující send a receive II. Funkce pro ověření stavu přenosu dat při neblokujícím send a receive. int MPI_Test( MPI_Request* request, int* flag, MPI_Status* status ) int MPI_Wait( MPI_Request* request, MPI_Status* status ) MPI_Test vrací v proměnné flag nenulovou hodnotu, pokud již operace skončila MPI_Wait čeká na ukončení operace

Hromadné komunikační operace I. Bariéra int MPI_Barrier( MPI_Comm comm )

Hromadné komunikační operace I. Bariéra int MPI_Barrier( MPI_Comm comm ) One-to-all broadcast int MPI_Bcast( void* buf, int count, MPI_Datatype, int source, MPI_Comm comm ) MPI_Bcast( &x, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD );

Hromadné komunikační operace I. Bariéra int MPI_Barrier( MPI_Comm comm ) One-to-all broadcast int MPI_Bcast( void* buf, int count, MPI_Datatype, int source, MPI_Comm comm ) MPI_Bcast( &x, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD ); All-to-one reduction int MPI_Reduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int target, MPI_Comm comm)

Hromadné komunikační operace I. Bariéra int MPI_Barrier( MPI_Comm comm ) One-to-all broadcast int MPI_Bcast( void* buf, int count, MPI_Datatype, int source, MPI_Comm comm ) MPI_Bcast( &x, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD ); All-to-one reduction int MPI_Reduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int target, MPI_Comm comm) op = operace: MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD

Hromadné komunikační operace I. Bariéra int MPI_Barrier( MPI_Comm comm ) One-to-all broadcast int MPI_Bcast( void* buf, int count, MPI_Datatype, int source, MPI_Comm comm ) MPI_Bcast( &x, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD ); All-to-one reduction int MPI_Reduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int target, MPI_Comm comm) op = operace: MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD výsledek se uloží do recvbuf procesu target

Hromadné komunikační operace I. Bariéra int MPI_Barrier( MPI_Comm comm ) One-to-all broadcast int MPI_Bcast( void* buf, int count, MPI_Datatype, int source, MPI_Comm comm ) MPI_Bcast( &x, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD ); All-to-one reduction int MPI_Reduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int target, MPI_Comm comm) op = operace: MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD výsledek se uloží do recvbuf procesu target MPI_Reduce( &x, &max_x, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD );

Hromadné komunikační operace II. All-to-all reduction int MPI_Allreduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )

Hromadné komunikační operace II. All-to-all reduction int MPI_Allreduce( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm ) Prefix sum int MPI_Scan( void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )

Hromadné komunikační operace III. Scatter int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int source, MPI_Comm comm )

Hromadné komunikační operace III. Scatter int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int source, MPI_Comm comm ) sendcount = recvcount udává počet prvků posílaných jednomu procesu

Hromadné komunikační operace III. Scatter int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int 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 int MPI_Scatterv( void* sendbuf, int* sendcounts, int* displs, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int source, MPI_Comm comm )

Hromadné komunikační operace III. Scatter int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int 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 int MPI_Scatterv( void* sendbuf, int* sendcounts, int* displs, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int source, MPI_Comm comm ) sendcounts ukazatel na pole udávájíci počet prvků posílaných danému procesu

Hromadné komunikační operace III. Scatter int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int 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 int MPI_Scatterv( void* sendbuf, int* sendcounts, int* displs, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int 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

Hromadné komunikační operace IV. Gather int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int target, MPI_Comm comm )

Hromadné komunikační operace IV. Gather int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int target, MPI_Comm comm ) recvcount udává počet prvků získaných od daného procesu

Hromadné komunikační operace IV. Gather int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int target, 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 int MPI_Scatterv( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int* recvcount, int* displs, MPI_Datatype recvdatatype, int target, MPI_Comm comm )

Hromadné komunikační operace IV. Gather int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int target, 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 int MPI_Scatterv( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int* recvcount, int* displs, MPI_Datatype recvdatatype, int target, MPI_Comm comm ) recvcounts ukazatel na pole udávájíci počet prvků získaných od daného procesu

Hromadné komunikační operace IV. Gather int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, int target, 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 int MPI_Scatterv( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int* recvcount, int* displs, MPI_Datatype recvdatatype, int target, 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

Hromadné komunikační operace V. All-to-all personalized communication int MPI_Alltoall( void* sendbuf, int sendcount, MPI_Datatype senddatatype, void* recvbuf, int recvcount, MPI_Datatype recvdatatype, MPI_Comm comm) int MPI_Alltoallv( void* sendbuf, int* sendcounts, int* sdispls, MPI_Datatype senddatatype, void* recvbuf, int* recvcounts, int* rdispls, MPI_Datatype recvdatatype, MPI_Comm comm)