Compartilhar via


Função parallel_reduce

Calcula a soma de todos os elementos em um intervalo especificado calculando somas parciais sucessivas, ou calcula o resultado de resultados parciais sucessivos obtidos da mesma forma de usar uma operação binária especificada diferente da soma, em paralelo. parallel_reduce é semanticamente similar a std::accumulate, exceto que requer a operação binária ser associativa, e requer um valor de identidade em vez de um valor inicial.

template<
   typename _Forward_iterator
>
inline typename std::iterator_traits<_Forward_iterator>::value_type parallel_reduce(
   _Forward_iterator_Begin,
   _Forward_iterator_End,
   const typename std::iterator_traits<_Forward_iterator>::value_type &_Identity
);

template<
   typename _Forward_iterator,
   typename _Sym_reduce_fun
>
inline typename std::iterator_traits<_Forward_iterator>::value_type parallel_reduce(
   _Forward_iterator_Begin,
   _Forward_iterator_End,
   const typename std::iterator_traits<_Forward_iterator>::value_type &_Identity,
   _Sym_reduce_fun_Sym_fun
);

template<
   typename _Reduce_type,
   typename _Forward_iterator,
   typename _Range_reduce_fun,
   typename _Sym_reduce_fun
>
inline _Reduce_type parallel_reduce(
   _Forward_iterator_Begin,
   _Forward_iterator_End,
   const _Reduce_type& _Identity,
   const _Range_reduce_fun &_Range_fun,
   const _Sym_reduce_fun &_Sym_fun
);

Parâmetros

  • _Forward_iterator
    O tipo de iterador de intervalo de entrada.

  • _Sym_reduce_fun
    O tipo de função simétrica de redução. Isso deve ser um tipo de função com assinatura _Reduce_type _Sym_fun(_Reduce_type, _Reduce_type), onde o _Reduce_type é o mesmo que o tipo de identidade e o tipo de resultado de redução. Para a terceira sobrecarga, isso deve ser consistente com o tipo de saída de _Range_reduce_fun.

  • _Reduce_type
    O tipo que a entrada será reduzido, que pode ser diferente do tipo de elemento de entrada. O valor de retorno e o valor de identidade tenham esse tipo.

  • _Range_reduce_fun
    O tipo de função de redução do intervalo. Isso deve ser um tipo de função com assinatura _Reduce_type _Range_fun(_Forward_iterator, _Forward_iterator, _Reduce_type), o _Reduce_type é o mesmo que o tipo de identidade e o tipo de resultado de redução.

  • _Begin
    Um iterador de entrada que trata o primeiro elemento no intervalo a ser reduzido.

  • _End
    Um iterador de entrada que trata o elemento que é uma posição além de elemento final no intervalo ser reduzido.

  • _Identity
    O valor _Identity de identidade seja do mesmo tipo que o tipo de resultado da redução e também o value_type de iterador para o primeiro e segundo sobrecargas. Para a terceira sobrecarga, o valor da identidade deve ter o mesmo tipo que o tipo de resultado da redução, mas pode ser diferente de value_type de iterador. Deve ter um valor apropriado de modo que o operador _Range_funde redução de intervalo, quando aplicado a um intervalo de um único elemento de tipo value_type e o valor de identidade, se comporta como uma conversão de tipo do valor do tipo value_type ao tipo de identidade.

  • _Sym_fun
    A função simétrica que será usada na segunda de redução. Consulte comentários para obter mais informações.

  • _Range_fun
    A função que será usada na primeira fase de redução. Consulte comentários para obter mais informações.

Valor de retorno

O resultado de redução.

Comentários

Para executar uma redução em paralelo, a função divide o intervalo em partes com base no número de trabalhadores disponíveis para o agendador subjacente. A redução ocorre em duas fases, a primeira fase executa uma redução em cada parte, e a segunda fase executa uma redução entre os resultados parciais de cada parte.

A primeira sobrecarga requer que value_typeiterator, T, é o mesmo que o tipo de valor de identidade bem como o resultado da redução tipo. O tipo de elemento T deve fornecer o operador T T::operator + (T) para reduzir os elementos em cada parte. O mesmo operador é usado na segunda fase também.

A segunda sobrecarga também requer que value_type de iterador é o mesmo que o tipo de valor de identidade bem como o resultado da redução tipo. O operador binário fornecido _Sym_fun é usado em ambas as fases de redução, com o valor de identidade como o valor inicial para a primeira fase.

Para a terceira sobrecarga, o tipo de valor de identidade deve ser o mesmo que o tipo de resultado de redução, mas value_type de iterador pode ser diferente de ambos. A função _Range_fun de redução do intervalo é usada na primeira fase com o valor de identidade como o valor inicial, e a função binário _Sym_reduce_fun é aplicada para sub resultados na segunda fase.

Requisitos

Cabeçalho: ppl.h

Namespace: simultaneidade

Consulte também

Referência

Namespace Concurrency