次の方法で共有


parallel_reduce 関数

指定された範囲のすべての要素の合計を逐次的な部分の合計を計算して計算します。または、同様に合計以外の指定されたバイナリ操作の使用から派生した一連の部分的な結果の結果を並行して計算します。parallel_reducestd::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 がリダクションの ID の型と結果型と同じである **_Reduce_type _Sym_fun(_Reduce_type, _Reduce_type)**定義を持つ関数型である必要があります。3 番目のオーバーロードの場合、これは _Range_reduce_funの出力の種類に準拠している必要があります。

  • _Reduce_type
    入力要素の型が異なります、入力が低下する型。戻り値と識別子の値はで、この型。

  • _Range_reduce_fun
    範囲のリダクションの関数の型。これは、定義 **_Reduce_type _Range_fun(_Forward_iterator, _Forward_iterator, _Reduce_type)**を持つ関数型である必要があります _Reduce_type は、リダクションの ID の型と結果型と同じです。

  • _Begin
    減少する範囲の最初の要素を示す入力反復子。

  • _End
    減少する範囲の最後の要素以外の 1 か所である要素を示す入力反復子。

  • _Identity
    識別子の値 _Identity は、リダクションの結果型と 1 番目と 2 番目のオーバーロードの反復子のまたは value_type と同じ型です。3 番目のオーバーロードでは、識別子の値は、リダクションの結果型と同じ型である必要があります。反復子の value_type とは異なります。これは、一つの要素の型 value_type と識別子の値の範囲に適用した場合、範囲のリダクション演算子を型 value_type から特定の型に値型キャストのように動作すること _Range_funこのようなに適切な値を指定する必要があります。

  • _Sym_fun
    リダクションの 2 番目ので使用される対称関数。詳細については、解説を参照してください。

  • _Range_fun
    リダクションのフェーズ以内に使用される関数。詳細については、解説を参照してください。

戻り値

リダクションの結果。

解説

並列リダクションを実行するには、関数は基になるスケジューラに使用できるワーカー スレッドの数に基づいて範囲をチャンクに分割します。リダクションは、次の 2 段階に実行フェーズでは、各チャンク内のリダクションを実行し、 2 番目のフェーズでは、各チャンクの部分的な結果の間のリダクションを実行します。

最初のオーバーロードは、反復子の value_typeTが識別子の値型、またはリダクションの結果型と同じであることが必要です。要素の型 T は、各チャンクの要素を減らすために演算子を提供する T T::operator + (T) 必要があります。同じ演算子は 2 番目のフェーズにも使用されます。

2 番目のオーバーロードは、反復子の value_type が識別子の値型、またはリダクションの結果型と同じであることが必要です。_Sym_fun 指定された二項演算子は最初の段階識別子の値を持つ両方のリダクション フェーズに、が初期値として使用されます。

3 番目のオーバーロードでは、識別子の値型は、リダクションの結果型と同じである必要があります value_type は反復子の両方とは異なる場合があります。範囲のリダクションの関数 _Range_fun は、初期値として識別子の値を持つ最初に使用され、 2 番目のフェーズの結果を代わりにするために、バイナリの関数 _Sym_reduce_fun が適用されます。

必要条件

ヘッダー: ppl.h

名前空間: の同時実行

参照

関連項目

concurrency 名前空間