rvalue の並列リダクション#

説明#

oneAPI スレッディング・ビルディング・ブロック (oneTBB) 実装は、ParallelReduceFunc および ParallelReduceReduction を拡張し、tbb::parallel_reduce および tbb::parallel_deterministic_reduce アルゴリズムの関数形式を使用して rvalues の操作を最適化します。

API#

ParallelReduceFunc の要件: 擬似署名、セマンティクス#

Value Func::operator()(const Range &range, Value &&x) const#

または

Value Func::operator()(const Range &range, const Value &x) const#

初期値 x から開始して、サブレンジの結果を累積します。Range タイプは、レンジ要件を満たしている必要があります。Value タイプは、parallel_reduce アルゴリズムに対応するテンプレート・パラメーターと同一である必要があります。

rvaluelvalue の両方の形式が指定されている場合は、rvalue が優先されます。

ParallelReduceReduction の要件: 擬似署名、セマンティクス#

Value Reduction::operator()(Value &&x, Value &&y) const#

または

Value Reduction::operator()(const Value &x, const Value &y) const

xy の結果を結合します。Value タイプは、parallel_reduce アルゴリズムに対応するテンプレート・パラメーターと同一である必要があります。

rvaluelvalue の両方の形式が指定されている場合は、rvalue が優先されます。

#

// C++17 
#include <oneapi/tbb/parallel_reduce.h> 
#include <oneapi/tbb/blocked_range.h> 
#include <vector> 
#include <set> 

int main() { 
    std::vector<std::set<int>> sets; 

    oneapi::tbb::parallel_reduce(oneapi::tbb::blocked_range<size_t>(0, sets.size()), 
                                    std::set<int>{}, // identity element - empty set 
                                    [&](const oneapi::tbb::blocked_range<size_t>& range, std::set<int>&& value) { 
                                        for (size_t i = range.begin(); i < range.end(); ++i) { 
                                            // 非 const rvalue 参照として値を持つことで、データをコピー/移動することなく、 
                                            // sets[i] からノードを効率的に転送できます 
                                            value.merge(std::move(sets[i])); 
                                        } 
                                        return value; 
                                    }, 
                                    [&](std::set<int>&& x, std::set<int>&& y) { 
                                        x.merge(std::move(y)); 
                                        return x; 
                                    } 
                                    ); 
}

関連情報