função MPI_Reduce
Executa uma operação de redução global em todos os membros de um grupo. Você pode especificar uma operação matemática ou lógica predefinida ou uma operação definida pelo aplicativo.
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 um buffer que contém os dados a serem enviados para o processo raiz.Se o parâmetro comm fizer referência a 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 nºprocesso envia dados para o nºelemento do buffer de recebimento. O processo raiz usa seus dados de entrada do elemento correspondente do buffer de recebimento e os substitui pelos dados de saída.
recvbuf [out, opcional]
O identificador para um buffer para receber o resultado da operação de redução. Esse parâmetro é significativo apenas no processo raiz.contagem
O número de elementos a serem enviados desse processo.datatype
O tipo de dados de cada elemento no buffer. Esse parâmetro deve ser compatível com a operação, conforme especificado no parâmetro op .op
A operação de redução global a ser executada. O identificador pode indicar uma operação interna ou definida pelo aplicativo. Para obter uma lista de operações predefinidas, consulte o tópico MPI_Op .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_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR
Comentários
A função MPI_Reduce é implementada com a suposição de que a operação especificada é associativa. Todas as operações predefinidas foram projetadas para serem associativas e comutativas. Os usuários podem definir operações projetadas para serem associativas, mas não comutativas. A ordem de avaliação padrão de uma operação de redução é determinada pelas classificações dos processos no grupo. No entanto, a implementação pode aproveitar a associatividade ou a associatividade e a commuta para alterar a ordem de avaliação. Esse processo pode alterar o resultado da redução de operações que não são estritamente associativas e comutativas, como adição de ponto flutuante.
Alguns aplicativos não podem ignorar a natureza não associativa das operações de ponto flutuante ou podem usar operações definidas pelo usuário que exigem uma ordem especial de avaliação e não podem ser tratadas como associativas. Nesse caso, você pode impor a ordem de avaliação explicitamente. Por exemplo, no caso de operações que exigem uma ordem de avaliação estrita da esquerda para a direita ou da direita para a esquerda, você pode usar o seguinte processo:
- Reúna todos os operandos em um único processo, por exemplo, usando a função MPI_Gather .
- Aplique a operação de redução na ordem necessária, por exemplo, usando a função MPI_Reduce_local .
- Se necessário, transmita ou espalhe o resultado para os outros processos.
Observação
É possível fornecer diferentes operações definidas pelo usuário para a função MPI_Reduce em cada processo. A função não define quais operações são usadas em quais operandos nesse caso. Você não pode fazer nenhuma suposição sobre como a função MPI_Reduce é implementada. É mais seguro especificar a mesma operação em cada processo.
Os operadores definidos pelo usuário podem operar em tipos de dados gerais e derivados. Nesse caso, cada argumento ao qual a operação de redução é aplicada é um elemento descrito por esse tipo de dados, que pode conter vários valores básicos.
Tipos de dados sobrepostos são permitidos em buffers de envio, mas não em buffers de recebimento. Os tipos de dados sobrepostos em buffers de recebimento podem fornecer resultados imprevisíveis e são considerados um erro.
Se o parâmetro comm referenciar um intracomunicador, a função MPI_Reduce combinará os elementos conforme especificado no buffer de entrada de cada processo no grupo e, usando a operação especificada, retornará o valor combinado no buffer de saída do processo raiz.
O buffer de entrada e o buffer 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 usando os mesmos valores para os parâmetros count, datatype, op, root e comm . Essa prática garante que todos os processos forneçam buffers de entrada e buffers de saída do mesmo comprimento, com elementos do mesmo tipo.
Cada processo pode fornecer um elemento ou uma sequência de elementos; nesse caso, a operação é executada por elemento em cada entrada da sequência. Por exemplo, se a operação for MPI_MAX e o buffer de envio contiver dois elementos que são números de ponto flutuante, recvbuf(1)
receberá o máximo global de (sendbuf(1))
e recvbuf(2)
receberá o máximo global de (sendbuf(2))
.
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 . Somente os parâmetros de buffer de envio são significativos nos processos do grupo B e somente os parâmetros de buffer de recebimento são significativos no 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 |