funktionen MPI_Alltoallw

Samlar in data från och sprider data till alla medlemmar i en grupp. Funktionen MPI_Alltoallw är den mest allmänna formen av fullständigt datautbyte i det här API:et. MPI_Alltoallw möjliggör separat specifikation av antal, deplacement och datatyp.

Syntax

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
);

Parametrar

  • sendbuf [in]
    Pekaren till de data som ska skickas till alla processer i gruppen. Antalet och datatypen för elementen i bufferten anges i parametrarna sendcount och sendtype . Varje element i bufferten motsvarar en process i gruppen.

    Om comm-parametern refererar till en intracommunicator kan du ange ett alternativ på plats genom att ange MPI_IN_PLACE i alla processer. Parametrarna sendcount, sdispls och sendtype ignoreras. Varje process anger data i motsvarande mottagningsbuffertelement.

    Data som skickas och tas emot måste ha samma typkarta, som anges av matrisen recvcounts och parametern recvtype , och läsas från platserna för mottagningsbufferten enligt parametern rdispls .

  • sendcounts [in]
    Antalet dataelement som den här processen skickar i bufferten enligt vad som anges i parametern sendbuf . Om ett element i sendcount är noll är datadelen av meddelandet från den processen tom.

  • sdispls [in]
    Platsen i byte, i förhållande till parametern sendbuf , för data för varje kommunikatorprocess.

    Post j anger förskjutningen i förhållande till parametern sendbuf som de utgående data som är avsedda för process j ska tas från.

  • sendtypes [in]
    Datatypen för vart och ett av elementen i sändningsbufferten. Post j anger vilken typ av data som skickas för att bearbeta j i gruppen.

  • recvbuf [out]
    Pekaren till en buffert som innehåller de data som tas emot från varje process. Antalet och datatypen för elementen i bufferten anges i parametrarna recvcount och recvtype .

  • recvcounts [in]
    Antalet dataelement från varje kommunikationsprocess i mottagningsbufferten.

  • rdispls [in]
    Platsen i byte i förhållande till parametern recvbuf för data från varje kommunikatorprocess. Post i anger deplacementet i förhållande till parametern recvbuf där inkommande data ska placeras från process i.

    I parametermatriserna recvbuf, recvcounts och rdispls refererar det n:e elementet i varje matris till de data som tas emot från den n:e kommunikatorprocessen.

  • recvtypes [in]
    Datatypen för varje element i bufferten. Post i anger vilken typ av data som tas emot från process i.

  • Comm
    MPI_Comm communicator-handtaget.

Returvärde

Returnerar MPI_SUCCESS vid lyckat resultat. Annars är returvärdet en felkod.

I Fortran lagras returvärdet i parametern 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

Kommentarer

Viktigt

För att tillåta maximal flexibilitet anges deplacementen för block i sändnings- och mottagningsbuffertarna i byte. 

Alla parametrar är viktiga för alla processer. Kommaparametern måste vara identisk i alla processer.

Om comm-parametern refererar till en intracommunicator tas det j:e blocket som skickas från processen i emot av process j och placeras i det i:e blocket i mottagningsbufferten. Alla dessa block behöver inte ha samma storlek.

Typsignaturen som anges av parametrarna sendcounts[j] och sendtypes[j] för process i måste vara lika med den typsignatur som är associerad med recvcounts[i] och recvtypes[i] vid process j. Därför måste mängden data som skickas vara lika med mängden data som tas emot mellan alla processer. Distinkta typkartor mellan avsändare och mottagare tillåts fortfarande.

Resultatet av ett anrop till funktionen MPI_Alltoallw är som om varje process skickade ett meddelande till alla andra processer med MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)och tog emot ett meddelande från alla andra processer med ett anrop till MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...).

Om du anger alternativet på plats anger du att samma mängd och typ av data skickas och tas emot mellan två processer i kommunikatörsgruppen. Olika processpar kan utbyta olika mängder data. Användarna måste se till att recvcounts[j] och recvtype på process jag matchar recvcounts[i] och recvtype på process j.

Om comm-parametern refererar till en intercommunicator är resultatet som om varje process i grupp A skickar ett meddelande till varje process i grupp B och vice versa. J: e skicka buffert av process i i grupp A bör vara konsekvent med ith ta emot bufferten av process j i grupp B, och vice versa.

Krav

Produkt

HPC Pack 2012 MS-MPI Redistributable Package, HPC Pack 2008 R2 MS-MPI Redistributable Package, HPC Pack 2008 MS-MPI Redistributable Package eller HPC Pack 2008 Client Utilities

Huvud

Mpi.h; Mpif.h

Bibliotek

Msmpi.lib

DLL

Msmpi.dll

Se även

Kollektiva MPI-funktioner

MPI_Datatype

MPI_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv