Partilhar via


função MPI_Gatherv

Recolhe dados variáveis de todos os membros de um grupo para um membro. A função MPI_Gatherv adiciona flexibilidade à função MPI_Gather ao permitir 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 uma memória intermédia que contém os dados a serem enviados para o processo de raiz.

    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 e sendtype são ignorados. Cada processo introduz dados no elemento de memória intermédia de receção correspondente. O nth process envia dados para o nth elemento da memória intermédia de receção. Presume-se que os dados enviados pelo processo de raiz estão no local correto na memória intermédia de receção.

  • sendcount
    O número de elementos na memória intermédia de envio. Se a conta de envio for zero, a parte de dados da mensagem está vazia.

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

  • recvbuf [out, optional]
    O identificador para uma memória intermédia no processo de raiz que contém os dados que são recebidos de cada processo, incluindo os dados que são enviados pelo processo de raiz. Este parâmetro é significativo apenas no processo de raiz. O parâmetro recvbuf é ignorado para todos os processos não raiz.

  • recvcounts[] [in, optional]
    O número de elementos que são 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 está vazia. Este parâmetro é significativo apenas no processo de raiz.

  • displs[] [in, optional]
    A localização, relativa ao parâmetro recvbuf , dos dados de cada processo do communicator. Os dados recebidos do processo j são colocados na memória intermédia de receção do desvio do processo de raiz desativa[j] elementos do ponteiro do sendbuf .

    No recvbuf, recvcounts e desativa as matrizes de parâmetros, o n.ºelemento de cada matriz refere-se aos dados recebidos do nth communicator process.

    Este parâmetro é significativo apenas no processo de raiz.

  • recvtype
    O tipo de dados de cada elemento na memória intermédia. Este parâmetro é significativo apenas no processo de raiz.

  • raiz
    A classificação do processo de receção no comunicador especificado.

  • vírgula
    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_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR

Observações

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

Geralmente, os 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, tem de ser igual à assinatura de tipo dos parâmetros de conta de recvcount e sendcount no processo de raiz. A quantidade de dados enviados tem de ser igual à quantidade de dados recebidos entre o processo de raiz e cada processo individual. Ainda são permitidos mapas de tipos distintos entre o remetente e o recetor.

A especificação de contagens e tipos não deve fazer com que qualquer localização na raiz seja escrita mais do que uma vez. Tal chamada é errada.

Se o parâmetro de comm fizer referência a um intracomunicador, todos os processos enviam o conteúdo da memória intermédia de envio para o processo de raiz. O processo de raiz recebe as mensagens e armazena-as por 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 com 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 por ordem de classificação e a mensagem resultante é recebida pela raiz como se fosse uma chamada para MPI_RECV(recvbuf, recvcountn, recvtype, ...). A memória intermédia de receção é ignorada para todos os processos não raiz.

Se o parâmetro de comunicação fizer referência a um intercomunicador, a chamada envolve todos os processos no intercomunicador, mas com um grupo, grupo A, que define o processo de raiz. Todos os processos no outro grupo, grupo B, definem o mesmo valor no parâmetro raiz , ou seja, a classificação do processo de raiz no grupo A. O processo de 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 de raiz para todos os processos no grupo B. Os parâmetros de memória intermédia dos processos no grupo B têm de ser consistentes com o parâmetro de memória intermédia do processo de raiz.

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_Gather