Функция parallel_reduce

Вычисляет параллельно сумму всех элементов в указанном диапазоне путем вычисления последовательных частичных сумм или вычисляет результат последовательных частичных сумм, полученных сходным образом с использованием указанной бинарной операции, отличной от суммирования. parallel_reduce семантически аналогичен std::accumulate, но требует, чтобы бинарная операция была ассоциативна, и значение идентификатора вместо начального значения.

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
);

Параметры

  • _Forward_iterator
    Тип итератора диапазона ввода.

  • _Sym_reduce_fun
    Тип функции симметричной редукции. Это должен быть тип функции с сигнатурой _Reduce_type _Sym_fun(_Reduce_type, _Reduce_type), где _Reduce_type совпадает с типом идентификатора и результата редукции. В третьей перегруженной функции он должен быть совместим с типом вывода _Range_reduce_fun.

  • _Reduce_type
    Тип, в который будет редуцирован ввод, который может отличаться от типа входного элемента. Возвращаемое значение и значение идентификатора будут иметь этот тип.

  • _Range_reduce_fun
    Тип функции редукции диапазона. Это должен быть тип функции с сигнатурой _Reduce_type _Range_fun(_Forward_iterator, _Forward_iterator, _Reduce_type), где _Reduce_type совпадает с типом идентификатора и результата редукции.

  • _Begin
    Итератор ввода, указывающий на первый элемент в диапазоне для редукции.

  • _End
    Итератор ввода, указывающий на позицию после последнего элемента в диапазоне для редукции.

  • _Identity
    Значение идентификатора _Identity того же типа, что и результат редукции, и также совпадает с value_type итератора для первой и второй перегрузок. В третьей перегруженной функции значение идентификатора должно иметь тот же тип, что и результат редукции, но может отличаться от value_type итератора. Оно должно иметь соответствующее значение так, что оператор _Range_fun редукции диапазона, примененный к диапазону из единственного элемента value_type и значения идентификатора, ведет себя подобно приведению типа значения из типа value_type в тип идентификатора.

  • _Sym_fun
    Симметрическая функции, которая будет использоваться для второй части редукции. Дополнительные сведения см. в замечаниях.

  • _Range_fun
    Симметрическая функции, которая будет использоваться для первой части редукции. Дополнительные сведения см. в замечаниях.

Возвращаемое значение

Результат редукции.

Заметки

Для выполнения параллельной редукции функция делит диапазон в блоки на основе количества рабочих, доступных базовому планировщику. Редукция происходит в два фазы, первая фаза выполняет редукцию в каждом блоке, на второй фазе выполняется редукция частичных результатов каждого блока.

Первый перегруженный метод требует, чтобы типы итератора value_type и T были такими же, как и тип идентификатора и результата редукции. Тип элемента T должен предоставить оператор T T::operator + (T), чтобы выполнить редукцию в каждом блоке. Тот же оператор используется во втором фазе.

Второй перегруженный метод также требует, чтобы тип итератора value_type был таким же, как и тип идентификатора и результата редукции. Предоставленный бинарный оператор _Sym_fun используется в обоих фазах редукции со значением идентификатора как начальным значением для первая фазы.

В третьей перегруженной функции, тип значения идентификатора должен совпадать с типом результата редукции, но value_type итератора может отличаться от них. Функция _Range_fun редукции диапазона используется в первой фазе со значением идентификатора в качестве начального, а бинарная функция _Sym_reduce_fun применяется к промежуточным результатам в второй фазе.

Требования

Заголовок: ppl.h

Пространство имен: concurrency

См. также

Ссылки

Пространство имен concurrency