rvalue の並列リダクション#
説明#
oneAPI スレッディング・ビルディング・ブロック (oneTBB) 実装は、ParallelReduceFunc および ParallelReduceReduction を拡張し、tbb::parallel_reduce および tbb::parallel_deterministic_reduce アルゴリズムの関数形式を使用して rvalues の操作を最適化します。
API#
ヘッダー#
#include <oneapi/tbb/parallel_reduce.h>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 アルゴリズムに対応するテンプレート・パラメーターと同一である必要があります。rvalueとlvalueの両方の形式が指定されている場合は、rvalueが優先されます。
ParallelReduceReduction の要件: 擬似署名、セマンティクス#
- Value Reduction::operator()(Value &&x, Value &&y) const#
または
- Value Reduction::operator()(const Value &x, const Value &y) const
xとyの結果を結合します。Valueタイプは、parallel_reduce アルゴリズムに対応するテンプレート・パラメーターと同一である必要があります。rvalueとlvalueの両方の形式が指定されている場合は、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;
}
);
}関連情報