Compartilhar via


função MPI_Gatherv

Coleta dados variáveis de todos os membros de um grupo para um membro. A função MPI_Gatherv adiciona flexibilidade à função MPI_Gather , permitindo uma contagem variada de dados de cada processo.

Sintaxe

int MPIAPI MPI_Gatherv(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
  _In_opt_  int          *recvcounts[],
  _In_opt_  int          *displs[],
            MPI_Datatype recvtype,
            int          root,
            MPI_Comm     comm
);

Parâmetros

  • sendbuf [in]
    O identificador para um buffer que contém os dados a serem enviados para o processo raiz.

    Se o parâmetro comm referenciar um intracomunicador, você poderá especificar uma opção in-loco especificando MPI_IN_PLACE em todos os processos. Os parâmetros sendcount e sendtype são ignorados. Cada processo insere dados no elemento de buffer de recebimento correspondente. O processo envia dados para o elemento do buffer de recebimento. Presume-se que os dados enviados pelo processo raiz estejam no lugar correto no buffer de recebimento.

  • sendcount
    O número de elementos no buffer de envio. Se sendcount for zero, a parte de dados da mensagem estará vazia.

  • sendtype
    O tipo de dados de cada elemento no buffer.

  • recvbuf [out, opcional]
    O identificador para um buffer no processo raiz que contém os dados recebidos de cada processo, incluindo os dados enviados pelo processo raiz. Esse parâmetro é significativo apenas no processo raiz. O parâmetro recvbuf é ignorado para todos os processos não raiz.

  • recvcounts[] [in, opcional]
    O número de elementos recebidos de cada processo. Cada elemento na matriz corresponde à classificação do processo de envio. Se a contagem for zero, a parte de dados da mensagem estará vazia. Esse parâmetro é significativo apenas no processo raiz.

  • displs[] [in, opcional]
    O local, em relação ao parâmetro recvbuf , dos dados de cada processo do comunicador. Os dados recebidos do processo j são colocados no buffer de recebimento dos elementos displs[j] de deslocamento do processo raiz do ponteiro sendbuf .

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

    Esse parâmetro é significativo apenas no processo raiz.

  • recvtype
    O tipo de dados de cada elemento no buffer. Esse parâmetro é significativo apenas no processo raiz.

  • root
    A classificação do processo de recebimento dentro do comunicador especificado.

  • comm
    O MPI_Comm identificador do 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_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR

Comentários

Todos os parâmetros de função são significativos no processo raiz, somente sendbuf, sendcount, sendtype, root e comm são significativos nos outros processos. Os parâmetros raiz e comm devem ser idênticos em todos os processos.

Geralmente, tipos de dados derivados são permitidos para os parâmetros sendtype e recvtype . A assinatura de tipo conforme especificado pelos parâmetros sendtype e recvtype em cada processo deve ser igual à assinatura de tipo dos parâmetros recvcount e sendcount no processo raiz. A quantidade de dados enviados deve ser igual à quantidade de dados recebidos entre o processo raiz e cada processo individual. Mapas de tipo distintos entre remetente e receptor ainda são permitidos.

A especificação de contagens e tipos não deve fazer com que qualquer local na raiz seja gravado mais de uma vez. Tal chamada é errônea.

Se o parâmetro comm referenciar um intracomunicador, todos os processos enviarão o conteúdo de seu buffer de envio para o processo raiz. O processo raiz recebe as mensagens e as armazena na ordem de classificação. O resultado é como se cada um dos n processos no grupo que são executados uma chamada para MPI_Send(sendbuf, sendcount, sendtype, root, …); e a raiz tivesse executado n chamadas para MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …). O valor de extent(recvtype) é obtido usando a função MPI_Type_get_extent . Uma descrição alternativa da função é que as n mensagens enviadas pelos processos no grupo são concatenadas na ordem de classificação e a mensagem resultante é recebida pela raiz como se fosse por uma chamada para MPI_RECV(recvbuf, recvcountn, recvtype, ...). O buffer de recebimento é ignorado para todos os processos não raiz.

Se o parâmetro comm fizer referência a um intercomunicador, a chamada envolverá todos os processos no intercomunicador, mas com um grupo, o grupo A, que define o processo raiz. Todos os processos no outro grupo, grupo B, definem o mesmo valor no parâmetro raiz , ou seja, a classificação do processo raiz no grupo A. O processo raiz define o valor MPI_ROOT no parâmetro raiz . Todos os outros processos no grupo A definem o valor MPI_PROC_NULL no parâmetro raiz . Os dados são transmitidos do processo raiz para todos os processos no grupo B. Os parâmetros de buffer dos processos no grupo B devem ser consistentes com o parâmetro de buffer do processo raiz.

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_Gather