MPI_Gatherv funkce
Shromažďuje data proměnných ze všech členů skupiny do jednoho člena. Funkce MPI_Gatherv přidává funkci MPI_Gather flexibilitu tím, že umožňuje různé počty dat z jednotlivých procesů.
Syntaxe
int MPIAPI MPI_Gatherv(
_In_ void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
_Out_opt_ void *recvbuf,
_In_opt_ int *recvcounts[],
_In_opt_ int *displs[],
MPI_Datatype recvtype,
int root,
MPI_Comm comm
);
Parametry
sendbuf [in]
Popisovač vyrovnávací paměti, která obsahuje data, která se mají odeslat do kořenového procesu.Pokud parametr comm odkazuje na intrakomunikator, můžete zadat místní možnost zadáním MPI_IN_PLACE ve všech procesech. Parametry sendcount a sendtype jsou ignorovány. Každý proces zadává data do odpovídajícího elementu vyrovnávací paměti pro příjem. N.proces odešle data do nth elementu vyrovnávací paměti pro příjem. Předpokládá se, že data odesílaná kořenovým procesem jsou na správném místě ve vyrovnávací paměti pro příjem.
sendcount
Počet prvků ve vyrovnávací paměti pro odesílání. Pokud je hodnota sendcount nulová, datová část zprávy je prázdná.sendtype
Datový typ každého prvku ve vyrovnávací paměti.recvbuf [out, volitelné]
Popisovač vyrovnávací paměti kořenového procesu, který obsahuje data přijatá z jednotlivých procesů, včetně dat odesílaných kořenovým procesem. Tento parametr je významný pouze v kořenovém procesu. Parametr recvbuf je ignorován pro všechny procesy, které nejsou root.recvcounts[] [in, optional]
Počet prvků, které jsou přijaty z každého procesu. Každý prvek v poli odpovídá pořadí procesu odesílání. Pokud je počet nulový, datová část zprávy je prázdná. Tento parametr je významný pouze v kořenovém procesu.displs[] [in, optional]
Umístění dat z jednotlivých procesů komunikátoru vzhledem k parametru recvbuf . Data přijatá z procesu j jsou umístěna do vyrovnávací paměti příjmu kořenového procesu offset displs[j] prvků z ukazatele sendbuf .V polích parametrů recvbuf, recvcounts a displs odkazuje nth prvek každého pole na data, která jsou přijata z n-tého procesu komunikátoru.
Tento parametr je významný pouze v kořenovém procesu.
recvtype
Datový typ každého prvku ve vyrovnávací paměti. Tento parametr je významný pouze v kořenovém procesu.Kořenové
Pořadí procesu příjmu v zadaném komunikátoru.Komunikace
Popisovač MPI_Comm communicatoru.
Vrácená hodnota
Vrátí MPI_SUCCESS při úspěchu. V opačném případě je návratovou hodnotou kód chyby.
V nástroji Fortran je vrácená hodnota uložena v parametru IERROR .
Fortran
MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR
Poznámky
Všechny parametry funkce jsou významné pro kořenový proces, pouze sendbuf, sendcount, sendtype, root a comm jsou důležité pro ostatní procesy. Parametry root a comm musí být ve všech procesech identické.
Obecně platí, že odvozené datové typy jsou povolené pro parametry sendtype i recvtype . Podpis typu zadaný parametry sendtype a recvtype u každého procesu se musí rovnat podpisu typu parametrů recvcount a sendcount v kořenovém procesu. Množství odeslaných dat se musí rovnat množství dat přijatých mezi kořenovým procesem a jednotlivými procesy. Mapování různých typů mezi odesílatelem a příjemcem jsou stále povolená.
Specifikace počtů a typů by neměla způsobit, že by se jakékoli umístění v kořenovém adresáři zapisuje vícekrát. Takové volání je chybné.
Pokud parametr comm odkazuje na intrakomunikator, všechny procesy odesílají obsah jeho vyrovnávací paměti pro odesílání do kořenového procesu. Kořenový proces přijímá zprávy a ukládá je v pořadí pořadí. Výsledek je, jako by každý z n procesů ve skupině, které jsou spuštěny volání MPI_Send(sendbuf, sendcount, sendtype, root, …)
; a kořen spustil n volání .MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …)
Hodnota se extent(recvtype)
získá pomocí funkce MPI_Type_get_extent . Alternativním popisem funkce je, že n zpráv odeslaných procesy ve skupině jsou zřetězeny v pořadí a výsledná zpráva je přijata kořenem jako voláním MPI_RECV(recvbuf, recvcountn, recvtype, ...)
. Vyrovnávací paměť příjmu je ignorována pro všechny procesy, které nejsou kořeny.
Pokud parametr comm odkazuje na interkomunikátor, pak volání zahrnuje všechny procesy v interkomunikátoru, ale s jednou skupinou, skupinou A, která definuje kořenový proces. Všechny procesy v druhé skupině, skupině B, nastavují stejnou hodnotu v kořenovém parametru, tj. pořadí kořenového procesu ve skupině A. Kořenový proces nastaví hodnotu MPI_ROOT v kořenovém parametru. Všechny ostatní procesy ve skupině A nastavují hodnotu MPI_PROC_NULL v kořenovém parametru. Data se vysílají z kořenového procesu do všech procesů ve skupině B. Parametry vyrovnávací paměti procesů ve skupině B musí být konzistentní s parametrem vyrovnávací paměti kořenového procesu.
Požadavky
Produkt |
HPC Pack 2012 MS-MPI Redistributable Package, HPC Pack 2008 R2 MS-MPI Redistributable Package, HPC Pack 2008 MS-MPI Redistributable Package nebo HPC Pack 2008 Client Utilities |
Hlavička |
Mpi.h; Mpif.h |
Knihovna |
Msmpi.lib |
DLL |
Msmpi.dll |