Partilhar via


função MPI_Gather

Recolhe dados de todos os membros de um grupo para um membro.

Sintaxe

int MPIAPI MPI_Gather(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
            int          recvcount,
            MPI_Datatype recvtype,
            int          root,
            MPI_Comm     comm
);

Parâmetros

  • sendbuf [in]
    O ponteiro 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 intracomunário, 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 elemento nda 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 estará vazia.

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

  • recvbuf [fora, opcional]
    O ponteiro para uma memória intermédia no processo de raiz que contém os dados recebidos de cada processo. Inclui 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.

  • recvcount
    O número de elementos que são recebidos de cada processo. Este número não é o número total de itens na memória intermédia. Se a contagem for zero, a parte de dados da mensagem estará vazia. Este parâmetro é significativo apenas no processo de raiz.

  • recvtype
    O tipo de dados MPI 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 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_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR

Observações

Todos os parâmetros da função são significativos no processo de raiz, apenas o 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 especificada pelos parâmetros sendtype e recvtype em cada processo tem de ser igual à assinatura de tipo dos parâmetros de contagem de recvcount e sendcount no processo de raiz. A quantidade de dados que é enviada tem de ser igual à quantidade de dados que é recebida 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 das contagens e dos tipos não deve fazer com que qualquer localização na raiz seja escrita mais do que uma vez. Tal chamada é errónea.

Se o parâmetro de comunicação fizer referência a um intracomunário, 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 executasse 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 mensagens n 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_Gatherv