NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
parallel.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_PARALLEL_HPP__
2#define NEFORCE_CORE_ALGORITHM_PARALLEL_HPP__
3
10
13NEFORCE_BEGIN_NAMESPACE__
14
20
26
41template <typename Iterator, typename BinaryOperation, typename Result, size_t Threshhold = 10>
42void reduce(Iterator first, Iterator last, BinaryOperation op, Result& res) {
43 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
44
45 const size_t dist = _NEFORCE distance(first, last);
46 if (dist <= Threshhold) {
47 for (Iterator it = first; it != last; ++it) {
48 res = op(res, *it);
49 }
50 } else {
51 Iterator mid = _NEFORCE next(first, dist / 2);
52 Result l_res = res, r_res = res;
54 _NEFORCE ref(r_res));
55 _NEFORCE reduce(first, mid, op, l_res);
56 r_thd.join();
57 res = op(l_res, r_res);
58 }
59}
60
77template <typename Iterator, typename UnaryOperation, typename BinaryOp, typename Result, size_t Threshhold = 10>
78void transform_reduce(Iterator first, Iterator last, UnaryOperation transform, BinaryOp reduce, Result& res) {
79 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
80
81 const size_t dist = _NEFORCE distance(first, last);
82 if (dist <= Threshhold) {
83 for (Iterator it = first; it != last; ++it) {
84 res = reduce(res, transform(*it));
85 }
86 } else {
87 Iterator mid = _NEFORCE next(first, dist / 2);
88 Result l_res = _NEFORCE initialize<Result>(), r_res = _NEFORCE initialize<Result>();
90 transform, reduce, _NEFORCE ref(r_res));
91 _NEFORCE transform_reduce(first, mid, transform, reduce, l_res);
92 r_thd.join();
93 res = reduce(res, reduce(l_res, r_res));
94 }
95}
96 // ParallelAlgorithms
98 // StandardAlgorithms
100
101NEFORCE_END_NAMESPACE__
102#endif // NEFORCE_CORE_ALGORITHM_PARALLEL_HPP__
线程类
NEFORCE_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
void transform_reduce(Iterator first, Iterator last, UnaryOperation transform, BinaryOp reduce, Result &res)
并行变换归约操作
void reduce(Iterator first, Iterator last, BinaryOperation op, Result &res)
并行归约操作
NEFORCE_NODISCARD constexpr reference_wrapper< T > ref(T &val) noexcept
创建引用包装器
NEFORCE_ALWAYS_INLINE constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
迭代器操作算法
线程管理类