cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
parallel.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm> // for std::min
4#include <cmath> // for std::ceil
5#include <future>
6#include <iterator>
7#include <numeric> // for std::accumulate (in reduce example)
8#include <stdexcept> // for exceptions
9#include <vector>
10
11#include <cpp-toolbox/cpp-toolbox_export.hpp>
12
13#include "cpp-toolbox/base/thread_pool_singleton.hpp" // 需要线程池/Thread pool required
14
15namespace toolbox::concurrent
16{
17
26
27//--------------------------------------------------------------------------
28// parallel_for_each
29//--------------------------------------------------------------------------
30
58template<typename Iterator, typename Function>
59CPP_TOOLBOX_EXPORT void parallel_for_each(Iterator begin,
60 Iterator end,
61 Function func);
62
71template<typename T, typename Alloc, typename Function>
72CPP_TOOLBOX_EXPORT void parallel_for_each(std::vector<T, Alloc>& vec,
73 Function func)
74{
75 parallel_for_each(vec.begin(), vec.end(), std::move(func));
76}
77
81template<typename T, typename Alloc, typename Function>
82CPP_TOOLBOX_EXPORT void parallel_for_each(const std::vector<T, Alloc>& vec,
83 Function func)
84{
85 parallel_for_each(vec.cbegin(), vec.cend(), std::move(func));
86}
87
91template<typename T, size_t N, typename Function>
92CPP_TOOLBOX_EXPORT void parallel_for_each(std::array<T, N>& arr, Function func)
93{
94 parallel_for_each(arr.begin(), arr.end(), std::move(func));
95}
96
100template<typename T, size_t N, typename Function>
101CPP_TOOLBOX_EXPORT void parallel_for_each(const std::array<T, N>& arr,
102 Function func)
103{
104 parallel_for_each(arr.cbegin(), arr.cend(), std::move(func));
105}
106
107//--------------------------------------------------------------------------
108// parallel_transform
109//--------------------------------------------------------------------------
110
147template<typename InputIt, typename OutputIt, typename UnaryOperation>
148CPP_TOOLBOX_EXPORT void parallel_transform(InputIt first1,
149 InputIt last1,
150 OutputIt d_first,
151 UnaryOperation unary_op);
152
156template<typename T, typename Alloc, typename Function>
157CPP_TOOLBOX_EXPORT void parallel_transform(std::vector<T, Alloc>& vec,
158 Function func)
159{
160 parallel_transform(vec.begin(), vec.end(), std::move(func));
161}
162
166template<typename T, typename Alloc, typename Function>
167CPP_TOOLBOX_EXPORT void parallel_transform(const std::vector<T, Alloc>& vec,
168 Function func)
169{
170 parallel_transform(vec.cbegin(), vec.cend(), std::move(func));
171}
172
176template<typename T, size_t N, typename Function>
177CPP_TOOLBOX_EXPORT void parallel_transform(std::array<T, N>& arr, Function func)
178{
179 parallel_transform(arr.begin(), arr.end(), std::move(func));
180}
181
185template<typename T, size_t N, typename Function>
186CPP_TOOLBOX_EXPORT void parallel_transform(const std::array<T, N>& arr,
187 Function func)
188{
189 parallel_transform(arr.cbegin(), arr.cend(), std::move(func));
190}
191
192//--------------------------------------------------------------------------
193// parallel_reduce
194//--------------------------------------------------------------------------
195
240template<typename Iterator, typename T, typename BinaryOperation>
241CPP_TOOLBOX_EXPORT T parallel_reduce(Iterator begin,
242 Iterator end,
243 T identity,
244 BinaryOperation reduce_op);
245
249template<typename T, typename Alloc, typename BinaryOperation>
250CPP_TOOLBOX_EXPORT T parallel_reduce(std::vector<T, Alloc>& vec,
251 T identity,
252 BinaryOperation reduce_op)
253{
254 return parallel_reduce(
255 vec.begin(), vec.end(), identity, std::move(reduce_op));
256}
257
261template<typename T, typename Alloc, typename BinaryOperation>
262CPP_TOOLBOX_EXPORT T parallel_reduce(const std::vector<T, Alloc>& vec,
263 T identity,
264 BinaryOperation reduce_op)
265{
266 return parallel_reduce(
267 vec.cbegin(), vec.cend(), identity, std::move(reduce_op));
268}
269
273template<typename T, size_t N, typename BinaryOperation>
274CPP_TOOLBOX_EXPORT T parallel_reduce(std::array<T, N>& arr,
275 T identity,
276 BinaryOperation reduce_op)
277{
278 return parallel_reduce(
279 arr.begin(), arr.end(), identity, std::move(reduce_op));
280}
281
285template<typename T, size_t N, typename BinaryOperation>
286CPP_TOOLBOX_EXPORT T parallel_reduce(const std::array<T, N>& arr,
287 T identity,
288 BinaryOperation reduce_op)
289{
290 return parallel_reduce(
291 arr.cbegin(), arr.cend(), identity, std::move(reduce_op));
292}
293
294//--------------------------------------------------------------------------
295// parallel_inclusive_scan
296//--------------------------------------------------------------------------
297
311template<typename InputIt,
312 typename OutputIt,
313 typename T,
314 typename BinaryOperation>
315CPP_TOOLBOX_EXPORT void parallel_inclusive_scan(InputIt first,
316 InputIt last,
317 OutputIt d_first,
318 T init,
319 BinaryOperation binary_op,
320 T identity = T {});
321
325template<typename T, typename Alloc, typename BinaryOperation>
326CPP_TOOLBOX_EXPORT void parallel_inclusive_scan(
327 const std::vector<T, Alloc>& input,
328 std::vector<T, Alloc>& out,
329 T init,
330 BinaryOperation binary_op,
331 T identity = T {})
332{
333 if (out.size() < input.size()) {
334 out.resize(input.size());
335 }
336 parallel_inclusive_scan(input.cbegin(),
337 input.cend(),
338 out.begin(),
339 init,
340 std::move(binary_op),
341 identity);
342}
343
344//--------------------------------------------------------------------------
345// parallel_merge_sort
346//--------------------------------------------------------------------------
347
353template<typename RandomIt, typename Compare = std::less<>>
354CPP_TOOLBOX_EXPORT void parallel_merge_sort(RandomIt begin,
355 RandomIt end,
356 Compare comp = Compare());
357
358//--------------------------------------------------------------------------
359// parallel_tim_sort
360//--------------------------------------------------------------------------
361
367template<typename RandomIt, typename Compare = std::less<>>
368CPP_TOOLBOX_EXPORT void parallel_tim_sort(RandomIt begin,
369 RandomIt end,
370 Compare comp = Compare());
371
372} // namespace toolbox::concurrent
373
374// 包含实现文件
375#if defined(CPP_TOOLBOX_USE_TBB)
376# include "impl/parallel_tbb.hpp"
377#else
378# include "impl/parallel_raw.hpp"
379#endif
简单的线程池单例封装/A simple singleton wrapper around thread_pool_t
Definition thread_pool_singleton.hpp:18
static thread_pool_singleton_t & instance()
获取单例实例/Get the singleton instance
Definition thread_pool_singleton.hpp:23
Definition parallel_raw.hpp:15
void parallel_merge_sort(RandomIt begin, RandomIt end, Compare comp)
使用TBB实现并行合并排序
Definition parallel_raw.hpp:309
void parallel_transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op)
使用TBB并行转换范围[first1, last1)中的元素并存储到从d_first开始的范围
Definition parallel_raw.hpp:70
void parallel_inclusive_scan(InputIt first, InputIt last, OutputIt d_first, T init, BinaryOperation binary_op, T identity)
使用TBB执行并行包含扫描操作
Definition parallel_raw.hpp:201
void parallel_for_each(Iterator begin, Iterator end, Function func)
使用TBB并行对范围[begin, end)中的每个元素应用函数
Definition parallel_raw.hpp:21
void parallel_tim_sort(RandomIt begin, RandomIt end, Compare comp)
使用TBB实现并行TimSort
Definition parallel_raw.hpp:380
base::thread_pool_singleton_t & default_pool()
获取默认线程池实例/Get the default thread pool instance
Definition parallel.hpp:22
T parallel_reduce(Iterator begin, Iterator end, T identity, BinaryOperation reduce_op)
使用TBB对范围[begin, end)执行并行归约操作
Definition parallel_raw.hpp:129