Compartilhar via


função MPI_Alltoallv

Coleta dados de e dispersão de dados para todos os membros de um grupo. A função MPI_Alltoallv adiciona flexibilidade à função MPI_Alltoall , permitindo uma contagem variável de dados de cada processo.

Sintaxe

int MPIAPI MPI_Alltoallv(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts,
  _In_  int          *sdispls,
        MPI_Datatype sendtype,
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts,
  _In_  int          *rdispls,
        MPI_Datatype recvtype,
        MPI_Comm     comm
);

Parâmetros

  • sendbuf [in]
    O ponteiro para os dados a serem enviados para todos os processos no grupo. O número e o tipo de dados dos elementos no buffer são especificados nos parâmetros sendcount e sendtype . Cada elemento no buffer corresponde a um processo no grupo.

    Se o parâmetro comm fizer referência a um intracomunicador, você poderá especificar uma opção in-loco especificando MPI_IN_PLACE em todos os processos. Os parâmetros sendcount, sdispls e sendtype são ignorados. Cada processo insere dados no elemento de buffer de recebimento correspondente.

    Os dados enviados e recebidos devem ter o mesmo mapa de tipo especificado pela matriz recvcounts e pelo parâmetro recvtype . Os dados são lidos dos locais do buffer de recebimento especificado pelo parâmetro rdispls .

  • sendcounts [in]
    O número de elementos de dados que esse processo envia no buffer especificado no parâmetro sendbuf . Se um elemento emsendcount for zero, a parte de dados da mensagem desse processo estará vazia.

  • sdispls [in]
    O local, relativo ao parâmetro sendbuf , dos dados para cada processo de comunicador.

    Entry j especifica o deslocamento em relação ao parâmetro sendbuf do qual usar os dados de saída destinados ao processo j.

  • sendtype
    O tipo de dados MPI dos elementos no buffer de envio.

  • recvbuf [out]
    O ponteiro para um buffer que contém os dados recebidos de cada processo. O número e o tipo de dados dos elementos no buffer são especificados nos parâmetros recvcount e recvtype .

  • recvcounts [in]
    O número de elementos de dados de cada processo de comunicador no buffer de recebimento.

  • rdispls [in]
    O local, em relação ao parâmetro recvbuf , dos dados de cada processo do comunicador.

    Nas matrizes de parâmetro recvbuf, recvcounts e rdispls , o elemento de cada matriz refere-se aos dados recebidos do processo do comunicador.

  • recvtype
    O tipo de dados MPI de cada elemento no buffer.

  • comm
    Especifica o identificador MPI_Comm comunicador.

Retornar valor

Retorna MPI_SUCCESS em caso de êxito. Caso contrário, o valor retornado será um código de erro.

Em Fortran, o valor retornado é armazenado no parâmetro IERROR .

Fortran

    MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
                COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

Comentários

A assinatura de tipo especificada pelos parâmetros sendcount e sendtype para um processo deve ser igual à assinatura de tipo especificada pelos parâmetros recvcount e recvtype do processo de recebimento. Portanto, a quantidade de dados enviados deve ser igual à quantidade de dados recebidos entre qualquer par de processos. Mapas de tipo distintos entre remetente e receptor ainda são permitidos.

Todos os parâmetros são significativos em todos os processos. O parâmetro comm deve ser idêntico em todos os processos.

Se o parâmetro comm fizer referência a um intracommunicator, o bloco jth enviado do processo i será recebido pelo processo j e será colocado no i th bloco do buffer de recebimento. Esses blocos não precisam ter o mesmo tamanho.

O resultado de chamar a função MPI_Alltoallv é como se cada processo enviasse uma mensagem para todos os outros processos com, MPI_Send(sendbuf + sdispls[i]*extent(sendtype), sendcounts[i], sendtype, I, …)e recebesse uma mensagem de todos os outros processos com uma chamada para MPI_Recv(recvbuf + rdispls[i]*extent(recvtype), recvcounts[i], recvtype, I, …).

Especificar a opção in-loco indica que a mesma quantidade e tipo de dados são enviados e recebidos entre os dois processos no grupo do comunicador. Diferentes pares de processos podem trocar diferentes quantidades de dados. Os usuários devem garantir que recvcounts[j] e recvtype no processo correspondamrecvcounts[i] e recvtype no processo j. Essa troca simétrica pode ser útil em aplicativos em que os dados a serem enviados não são usados pelo processo de envio após a chamada de função MPI_Alltoallv .

Se o parâmetro comm 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. O jth send buffer do processo i no grupo A deve ser consistente com o ith receive buffer do processo j no grupo B e vice-versa.

Requisitos

Produto

Pacote Redistribuível do HPC Pack 2012 MS-MPI, Pacote Redistribuível HPC Pack 2008 R2 MS-MPI, Pacote Redistribuível do HPC Pack 2008 MS-MPI ou Utilitários de Cliente HPC Pack 2008

parâmetro

Mpi.h; Mpif.h

Biblioteca

Msmpi.lib

DLL

Msmpi.dll

Confira também

Funções coletivas de MPI

MPI_Datatype

MPI_Alltoall

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv