Partilhar via


função MPI_Alltoallw

Recolhe dados de e dispersão de dados para todos os membros de um grupo. A função MPI_Alltoallw é a forma mais geral de troca de dados completa nesta API. MPI_Alltoallw permite especificações separadas da contagem, deslocamento e tipo de dados.

Sintaxe

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

Parâmetros

  • sendbuf [in]
    O ponteiro para os dados a enviar para todos os processos no grupo. O número e o tipo de dados dos elementos na memória intermédia são especificados nos parâmetros sendcount e sendtype . Cada elemento na memória intermédia corresponde a um processo no grupo.

    Se o parâmetro de comunicação fizer referência a um intracomunicador, pode especificar uma opção no local ao especificar MPI_IN_PLACE em todos os processos. Os parâmetros sendcount, sdispls e sendtype são ignorados. Cada processo introduz dados no elemento de memória intermédia de receção correspondente.

    Os dados enviados e recebidos têm de ter o mesmo tipo de mapa, conforme especificado pela matriz de recvcounts e pelo parâmetro recvtype , e são lidos a partir das localizações da memória intermédia de receção, conforme especificado pelo parâmetro rdispls .

  • sendcounts [in]
    O número de elementos de dados que este processo envia na memória intermédia, conforme especificado no parâmetro sendbuf . Se um elemento na conta de envio for zero, a parte de dados da mensagem desse processo estará vazia.

  • sdispls [in]
    A localização, em bytes, relativamente ao parâmetro sendbuf , dos dados para cada processo de comunicação.

    A entrada j especifica a deslocação relativamente ao parâmetro sendbuf a partir do qual deve utilizar os dados de saída destinados ao processo j.

  • sendtypes [in]
    O tipo de dados para cada um dos elementos na memória intermédia de envio. A entrada j especifica o tipo de dados que é enviado para processar j no grupo.

  • recvbuf [out]
    O ponteiro para uma memória intermédia que contém os dados recebidos de cada processo. O número e o tipo de dados dos elementos na memória intermédia são especificados nos parâmetros recvcount e recvtype .

  • recvcounts [in]
    O número de elementos de dados de cada processo de comunicação na memória intermédia de receção.

  • rdispls [in]
    A localização, em bytes, relativamente ao parâmetro recvbuf , dos dados de cada processo de comunicação. A entrada i especifica a deslocação relativamente ao parâmetro recvbuf no qual os dados recebidos do processo i são colocados.

    Nas matrizes de parâmetros recvbuf, recvcounts e rdispls , o nelemento de cada matriz refere-se aos dados recebidos do nth communicator process.

  • recvtypes [in]
    O tipo de dados de cada elemento na memória intermédia. A entrada i especifica o tipo de dados recebidos do processo i.

  • vírgula
    O MPI_Comm identificador do comunicador.

Valor devolvido

Devolve MPI_SUCCESS com êxito. Caso contrário, o valor devolvido é um código de erro.

Em Fortran, o valor devolvido é armazenado no parâmetro 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

Observações

Importante

Para permitir a máxima flexibilidade, a deslocação de blocos nas memórias intermédias de envio e receção é especificada em bytes. 

Todos os parâmetros são significativos em todos os processos. O parâmetro de vírgula tem de ser idêntico em todos os processos.

Se o parâmetro de comm fizer referência a um intracomunário, o bloco jque é enviado do processo i é recebido pelo processo j e é colocado no bloco ida memória intermédia de receção. Estes blocos não têm de ter todos o mesmo tamanho.

A assinatura de tipo especificada pelos parâmetros sendcounts[j] e sendtypes[j] para o processo i tem de ser igual à assinatura do tipo que está associada às contações[i] e aos recvtypes[i] no processo j. Por conseguinte, a quantidade de dados enviados tem de ser igual à quantidade de dados recebidos entre qualquer par de processos. Ainda são permitidos mapas de tipos distintos entre o remetente e o recetor.

O resultado de uma chamada para a função MPI_Alltoallw é como se cada processo enviasse uma mensagem para todos os outros processos com MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)e recebesse uma mensagem de todos os outros processos com uma chamada para MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...).

Especificar a opção no local indica que a mesma quantidade e tipo de dados são enviados e recebidos entre dois processos no grupo do comunicador. Diferentes pares de processos podem trocar diferentes quantidades de dados. Os utilizadores têm de garantir que as recvcounts[j] e o recvtype no processo correspondem às recvcounts[i] e ao recvtype no processo j.

Se o parâmetro de comunicação fizer referência a um intercomunicador, o resultado será como se cada processo no grupo A enviasse uma mensagem para cada processo no grupo B e vice-versa. A memóriaintermédia de envio j do processo i no grupo A deve ser consistente com a memóriaintermédia do processo j no grupo B e vice-versa.

Requisitos

Produto

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

Cabeçalho

Mpi.h; Mpif.h

Biblioteca

Msmpi.lib

DLL

Msmpi.dll

Ver também

Funções Coletivas de MPI

MPI_Datatype

MPI_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv