Partilhar via


função MPI_Reduce

Executa uma operação de redução global em todos os membros de um grupo. Pode especificar uma operação matemática ou lógica predefinida ou uma operação definida pela aplicação.

Sintaxe

int MPIAPI MPI_Reduce(
  _In_      void         *sendbuf,
  _Out_opt_ void         *recvbuf,
            int          count,
            MPI_Datatype datatype,
            MPI_Op       op,
            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. O processo de raiz retira os dados de entrada do elemento correspondente da memória intermédia de receção e substitui-os pelos dados de saída.

  • recvbuf [out, optional]
    A alça para uma memória intermédia para receber o resultado da operação de redução. Este parâmetro é significativo apenas no processo de raiz.

  • contagem
    O número de elementos a enviar a partir deste processo.

  • tipo de dados
    O tipo de dados de cada elemento na memória intermédia. Este parâmetro tem de ser compatível com a operação, conforme especificado no parâmetro op .

  • op
    A operação de redução global a executar. O identificador pode indicar uma operação incorporada ou definida pela aplicação. Para obter uma lista de operações predefinidas, veja o tópico MPI_Op .

  • 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_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 
        <type> SENDBUF(*), RECVBUF(*) 
        INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

Observações

A função MPI_Reduce é implementada com o pressuposto de que a operação especificada é associativa. Todas as operações predefinidas foram concebidas para serem associativas e comutativas. Os utilizadores podem definir operações concebidas para serem associativas, mas não comutativas. A ordem de avaliação predefinida de uma operação de redução é determinada pelas classificações dos processos no grupo. No entanto, a implementação pode tirar partido da associatividade ou associatividade e comutividade para alterar a ordem de avaliação. Este processo pode alterar o resultado da redução para operações que não são estritamente associativas e comutativas, como a adição de vírgula flutuante.

Algumas aplicações não podem ignorar a natureza não associativa das operações de vírgula flutuante ou podem utilizar operações definidas pelo utilizador que requerem uma ordem especial de avaliação e não podem ser tratadas como associativas. Neste caso, pode impor explicitamente a ordem de avaliação. Por exemplo, no caso de operações que requerem uma ordem de avaliação estrita da esquerda para a direita ou da direita para a esquerda, pode utilizar o seguinte processo:

  1. Reúna todos os operandos num único processo, por exemplo, com a função MPI_Gather .
  2. Aplique a operação de redução pela ordem necessária, por exemplo, com a função MPI_Reduce_local .
  3. Se necessário, difunda ou espalhe o resultado para os outros processos.

Nota

É possível fornecer diferentes operações definidas pelo utilizador à função MPI_Reduce em cada processo. A função não define que operações são utilizadas em que operandos neste caso. Não pode fazer suposições sobre a forma como a função MPI_Reduce é implementada. É mais seguro especificar a mesma operação em cada processo.

 

Os operadores definidos pelo utilizador podem operar em tipos de dados gerais derivados. Neste caso, cada argumento a que a operação de redução é aplicada é um elemento descrito por esse tipo de dados, que pode conter vários valores básicos.

Os tipos de dados sobrepostos são permitidos em memórias intermédias de envio, mas não em memórias intermédias de receção. Os tipos de dados sobrepostos nas memórias intermédias de receção podem dar resultados imprevisíveis e são considerados um erro.

Se o parâmetro de comm fizer referência a um intracomunicador, a função MPI_Reduce combina os elementos conforme especificado na memória intermédia de entrada de cada processo no grupo e, ao utilizar a operação especificada, devolve o valor combinado na memória intermédia de saída do processo de raiz.

A memória intermédia de entrada e a memória intermédia de saída têm o mesmo número de elementos do mesmo tipo de dados. Chame a função em todos os membros do grupo com os mesmos valores para os parâmetros count, datatype, op, root e comm . Esta prática garante que todos os processos fornecem memórias intermédias de entrada e memórias intermédias de saída com o mesmo comprimento, com elementos do mesmo tipo.

Cada processo pode fornecer um elemento ou uma sequência de elementos, caso em que a operação é executada por elemento em cada entrada da sequência. Por exemplo, se a operação for MPI_MAX e a memória intermédia de envio contiver dois elementos que são números de vírgula flutuante, recvbuf(1) recebe o máximo global de (sendbuf(1)) e recvbuf(2) recebe o máximo global de (sendbuf(2)).

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 . Apenas os parâmetros da memória intermédia de envio são significativos nos processos do grupo B e só recebem parâmetros de memória intermédia são significativos no 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

MPI_Op

MPI_Bcast