Partilhar via


função MPI_Alltoallv

Recolhe 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 ao permitir uma contagem variada 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 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 especificado pela matriz de recvcounts e pelo parâmetro recvtype . Os dados são lidos a partir das localizações da memória intermédia de receção especificada pelo parâmetro rdispls .

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

  • sdispls [in]
    A localização, relativa ao parâmetro sendbuf , dos dados de cada processo do communicator.

    A entrada j especifica o deslocamento relativo ao parâmetro sendbuf a partir do qual os dados de saída estão destinados ao processo j.

  • sendtype
    O tipo de dados MPI dos elementos na memória intermédia de envio.

  • recvbuf [out]
    O ponteiro para uma memória intermédia que contém os dados que são 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 comunicador na memória intermédia de receção.

  • rdispls [in]
    A localização, relativa ao parâmetro recvbuf , dos dados de cada processo do communicator.

    Nas matrizes de parâmetros recvbuf, recvcounts e rdispls , o n.ºelemento de cada matriz refere-se aos dados que são recebidos do processo do comunicador n.

  • recvtype
    O tipo de dados MPI de cada elemento na memória intermédia.

  • vírgula
    Especifica o identificador do MPI_Comm communicator.

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_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
                COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

Observações

A assinatura de tipo especificada pelos parâmetros sendcount e sendtype para um processo tem de ser igual à assinatura de tipo especificada pela conta de recvcount e os parâmetros de tipo revtype do processo de receção. 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.

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 intracomunicador, 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.

O resultado da chamada da 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 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 revtype no processo i correspondem a recvcounts[i] e revtype no processo j. Esta troca simétrica pode ser útil em aplicações para as quais os dados a enviar não são utilizados pelo processo de envio após a chamada da função MPI_Alltoallv .

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ória intermédia de envio jdo processo i no grupo A deve ser consistente com a ith receive buffer 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_Alltoall

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv