Sdílet prostřednictvím


MPI_Alltoallw funkce

Shromažďuje data ze všech členů skupiny a rozptyluje je do všech členů skupiny. Funkce MPI_Alltoallw představuje nejobecnější formu úplné výměny dat v tomto rozhraní API. MPI_Alltoallw umožňuje samostatnou specifikaci počtu, posunutí a datového typu.

Syntaxe

int MPIAPI MPI_Alltoallw(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts[],
  _In_  int          *sdispls[],
  _In_  MPI_Datatype sendtypes[],
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts[],
  _In_  int          *rdispls[],
  _In_  MPI_Datatype recvtypes[],
        MPI_Comm     comm
);

Parametry

  • sendbuf [in]
    Ukazatel na data, která se mají odeslat všem procesům ve skupině. Počet a datový typ prvků ve vyrovnávací paměti jsou uvedeny v parametrech sendcount a sendtype . Každý prvek ve vyrovnávací paměti odpovídá procesu ve skupině.

    Pokud parametr comm odkazuje na intracommunicator, můžete zadat místní možnost zadáním MPI_IN_PLACE ve všech procesech. Parametry sendcount, sdispls a sendtype se ignorují. Každý proces zadává data do odpovídajícího prvku vyrovnávací paměti pro příjem.

    Data, která se odesílají a přijímají, musí mít mapování stejného typu, jak je určeno polem recvcounts a parametrem recvtype , a načítají se z umístění vyrovnávací paměti pro příjem, jak je určeno parametrem rdispls .

  • počet odeslání [v]
    Počet datových prvků, které tento proces odešle ve vyrovnávací paměti podle parametru sendbuf . Pokud je prvek v sendcount nula, datová část zprávy z tohoto procesu je prázdná.

  • sdispls [v]
    Umístění dat jednotlivých procesů komunikátoru v bajtech vzhledem k parametru sendbuf .

    Položka j určuje posunutí vzhledem k parametru sendbuf , ze kterého se mají převzít odchozí data určená pro proces j.

  • sendtypes [in]
    Datový typ pro každý prvek v vyrovnávací paměti pro odesílání. Položka j určuje typ dat odesílaných ke zpracování j ve skupině.

  • recvbuf [out]
    Ukazatel na vyrovnávací paměť, která obsahuje data přijatá z jednotlivých procesů. Počet a datový typ prvků ve vyrovnávací paměti jsou uvedeny v parametrech recvcount a recvtype .

  • recvcounts [in]
    Počet datových prvků z každého procesu komunikátoru ve vyrovnávací paměti pro příjem.

  • rdispls [v]
    Umístění dat z každého procesu komunikátoru v bajtech vzhledem k parametru recvbuf . Položka i určuje posunutí vzhledem k parametru recvbuf , na který se mají umístit příchozí data z procesu i.

    V polích parametrů recvbuf, recvcounts a rdispls odkazuje ntý prvek každého pole na data, která jsou přijata z ntého procesu komunikátoru.

  • recvtypes [in]
    Datový typ každého prvku ve vyrovnávací paměti. Položka i určuje typ dat přijatých z procesu i.

  • Komunikace
    Popisovač MPI_Comm komunikátoru.

Vrácená hodnota

Vrátí MPI_SUCCESS při úspěchu. V opačném případě je návratovou hodnotou kód chyby.

Ve Fortranu je vrácená hodnota uložena v parametru IERROR .

Fortran

    MPI_ALLTOALLW(SENDBUF, SENDCOUNT, SDISPLS, SENDTYPE, RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPE,COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPES(*), SDISPLS(*), RECVCOUNTS(*), RDISPLS(*), RECVTYPE, COMM, IERROR

Poznámky

Důležité

Pro maximální flexibilitu je posunutí bloků v vyrovnávací paměti pro odesílání a přijímání určeno v bajtech. 

Všechny parametry jsou důležité pro všechny procesy. Parametr comm musí být ve všech procesech identický.

Pokud comm parametr odkazuje na intrakomunikator, pak jth blok, který je odeslán z procesu i je přijat proces j a je umístěn v ith bloku příjmu vyrovnávací paměti. Tyto bloky nemusí mít všechny stejnou velikost.

Podpis typu určený parametry sendcounts[j] a sendtypes[j] pro proces i se musí rovnat podpisu typu přidruženému k recvcounts[i] a recvtypes[i] v procesu j. Množství odeslaných dat se proto musí rovnat množství dat přijatých mezi libovolnými dvojicemi procesů. Mapování různých typů mezi odesílatelem a příjemcem je stále povolené.

Výsledek volání funkce MPI_Alltoallw je, jako kdyby každý proces odeslal zprávu do každého druhého procesu pomocí MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)a přijal zprávu z každého druhého procesu s voláním MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...).

Určení možnosti indikuje, že se mezi libovolnými dvěma procesy ve skupině komunikátoru odesílá a přijímá stejné množství a typ dat. Různé páry procesů si můžou vyměňovat různá množství dat. Uživatelé musí zajistit, aby funkce recvcounts[j] a recvtypeu procesuodpovídaly recvcounts[i] a recvtype u procesu j.

Pokud parametr comm odkazuje na interkomunikator, výsledek je, jako kdyby každý proces ve skupině A odeslal zprávu každému procesu ve skupině B a naopak. Vyrovnávací paměť proodesílání procesu i ve skupině A by měla být konzistentní s vyrovnávací pamětí ipříjmu procesu j ve skupině B a naopak.

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; Soubor Mpif.h

Knihovna

Msmpi.lib

DLL

Msmpi.dll

Viz také

Kolektivní funkce MPI

MPI_Datatype

MPI_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv