parallel_reduce 関数
連続する部分的な合計を計算することで、指定された範囲のすべての要素の合計を計算します。または、指定された二項演算を使用して取得した、合計以外の連続する部分的な結果を並列で計算します。 parallel_reduce は std::accumulate と意味が同じです。ただし、結合のための二項演算と、初期値ではなく ID 値が必要です。
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 が reduction ID の型と戻り値の型と同じである **_Reduce_type _Sym_fun(_Reduce_type, _Reduce_type)**シグネチャを持つ関数型である必要があります。 3 番目のオーバーロードでは、これは _Range_reduce_funの出力の種類に準拠している必要があります。_Reduce_type
入力要素の型と異なる場合、入力が単純化する型。 戻り値と ID 値はこの型を含んでいます。_Range_reduce_fun
範囲の低減関数の型。 これは **_Reduce_type _Range_fun(_Forward_iterator, _Forward_iterator, _Reduce_type)**シグネチャを持つ関数型である必要があります_Reduce_type が reduction ID の型と戻り値の型と同じです。_Begin
低下する範囲の最初の要素を示す入力反復子。_End
低下する範囲の最後の要素以外の 1 種類の要素の位置を示す入力反復子。_Identity
ID 値 _Identity が reduction 結果型、1 番目と 2 番目のオーバーロードの反復子の、value_type と同じ型です。 3 番目のオーバーロードでは、識別子の値が reduction 結果型と同じ型でなければなりません。反復子の value_type とは異なります。 この型は、型 value_type と ID 値の一つの要素の範囲に適用した場合、範囲の低減の演算子が型 value_type から特定の型に応じた値の型キャストのように動作すること _Range_funように適切な値が必要です。_Sym_fun
リダクションの第 2 で使用される対称関数。 詳細については、"解説"を参照してください。_Range_fun
リダクションのフェーズ内に使用される関数。 詳細については、"解説"を参照してください。
戻り値
リダクションの結果。
解説
並列リダクションを実行するには、関数は、基になるスケジューラで使用できる豊富な数に基づいてチャンクに範囲を区切ります。 リダクションは 2 フェーズで行われますフェーズでは、各チャンク内の低減を実行し、2 番目のフェーズでは、各チャンクの部分的な結果間の低減を実行します。
最初のオーバーロードは、反復子の value_type、Tが ID 値の型、または reduction 結果型と同じであることが必要です。 要素の型 T に各チャンク要素を単純化するに演算子を指定する T T::operator + (T) 必要があります。 同じ演算子は 2 番目のフェーズに使用されます。
2 番目のオーバーロードは、反復子の value_type が ID 値の型、または reduction 結果型と同じであることが必要です。 指定された _Sym_fun 二項演算子は最初の段階 ID 値を使用して両方の低減フェーズは、初期値として使用されます。
3 番目のオーバーロードでは、識別子の値型が reduction 結果型と同じである必要があります。反復子の value_type とは異なる場合があります。 範囲の低減関数 _Range_fun は初期値として ID 値を持つ最初に使用され、バイナリ _Sym_reduce_fun 関数は 2 番目のフェーズの補助的な結果に適用されます。
必要条件
ヘッダー: ppl.h
名前空間: concurrency