| 1 | // -*- C++ -*-
|
|---|
| 2 | //===-- parallel_backend_serial.h -----------------------------------------===//
|
|---|
| 3 | //
|
|---|
| 4 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|---|
| 5 | // See https://llvm.org/LICENSE.txt for license information.
|
|---|
| 6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|---|
| 7 | //
|
|---|
| 8 | //===----------------------------------------------------------------------===//
|
|---|
| 9 |
|
|---|
| 10 | #ifndef _PSTL_PARALLEL_BACKEND_SERIAL_H
|
|---|
| 11 | #define _PSTL_PARALLEL_BACKEND_SERIAL_H
|
|---|
| 12 |
|
|---|
| 13 | #include <algorithm>
|
|---|
| 14 | #include <cstddef>
|
|---|
| 15 | #include <memory>
|
|---|
| 16 | #include <numeric>
|
|---|
| 17 | #include <utility>
|
|---|
| 18 |
|
|---|
| 19 | namespace __pstl
|
|---|
| 20 | {
|
|---|
| 21 | namespace __serial_backend
|
|---|
| 22 | {
|
|---|
| 23 |
|
|---|
| 24 | template <typename _Tp>
|
|---|
| 25 | class __buffer
|
|---|
| 26 | {
|
|---|
| 27 | std::allocator<_Tp> __allocator_;
|
|---|
| 28 | _Tp* __ptr_;
|
|---|
| 29 | const std::size_t __buf_size_;
|
|---|
| 30 | __buffer(const __buffer&) = delete;
|
|---|
| 31 | void
|
|---|
| 32 | operator=(const __buffer&) = delete;
|
|---|
| 33 |
|
|---|
| 34 | public:
|
|---|
| 35 | __buffer(std::size_t __n) : __allocator_(), __ptr_(__allocator_.allocate(__n)), __buf_size_(__n) {}
|
|---|
| 36 |
|
|---|
| 37 | operator bool() const { return __ptr_ != nullptr; }
|
|---|
| 38 | _Tp*
|
|---|
| 39 | get() const
|
|---|
| 40 | {
|
|---|
| 41 | return __ptr_;
|
|---|
| 42 | }
|
|---|
| 43 | ~__buffer() { __allocator_.deallocate(__ptr_, __buf_size_); }
|
|---|
| 44 | };
|
|---|
| 45 |
|
|---|
| 46 | inline void
|
|---|
| 47 | __cancel_execution()
|
|---|
| 48 | {
|
|---|
| 49 | }
|
|---|
| 50 |
|
|---|
| 51 | template <class _ExecutionPolicy, class _Index, class _Fp>
|
|---|
| 52 | void
|
|---|
| 53 | __parallel_for(_ExecutionPolicy&&, _Index __first, _Index __last, _Fp __f)
|
|---|
| 54 | {
|
|---|
| 55 | __f(__first, __last);
|
|---|
| 56 | }
|
|---|
| 57 |
|
|---|
| 58 | template <class _ExecutionPolicy, class _Value, class _Index, typename _RealBody, typename _Reduction>
|
|---|
| 59 | _Value
|
|---|
| 60 | __parallel_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, const _Value& __identity,
|
|---|
| 61 | const _RealBody& __real_body, const _Reduction&)
|
|---|
| 62 | {
|
|---|
| 63 | if (__first == __last)
|
|---|
| 64 | {
|
|---|
| 65 | return __identity;
|
|---|
| 66 | }
|
|---|
| 67 | else
|
|---|
| 68 | {
|
|---|
| 69 | return __real_body(__first, __last, __identity);
|
|---|
| 70 | }
|
|---|
| 71 | }
|
|---|
| 72 |
|
|---|
| 73 | template <class _ExecutionPolicy, class _Index, class _UnaryOp, class _Tp, class _BinaryOp, class _Reduce>
|
|---|
| 74 | _Tp
|
|---|
| 75 | __parallel_transform_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, _UnaryOp, _Tp __init, _BinaryOp,
|
|---|
| 76 | _Reduce __reduce)
|
|---|
| 77 | {
|
|---|
| 78 | return __reduce(__first, __last, __init);
|
|---|
| 79 | }
|
|---|
| 80 |
|
|---|
| 81 | template <class _ExecutionPolicy, typename _Index, typename _Tp, typename _Rp, typename _Cp, typename _Sp, typename _Ap>
|
|---|
| 82 | void
|
|---|
| 83 | __parallel_strict_scan(_ExecutionPolicy&&, _Index __n, _Tp __initial, _Rp __reduce, _Cp __combine, _Sp __scan,
|
|---|
| 84 | _Ap __apex)
|
|---|
| 85 | {
|
|---|
| 86 | _Tp __sum = __initial;
|
|---|
| 87 | if (__n)
|
|---|
| 88 | __sum = __combine(__sum, __reduce(_Index(0), __n));
|
|---|
| 89 | __apex(__sum);
|
|---|
| 90 | if (__n)
|
|---|
| 91 | __scan(_Index(0), __n, __initial);
|
|---|
| 92 | }
|
|---|
| 93 |
|
|---|
| 94 | template <class _ExecutionPolicy, class _Index, class _UnaryOp, class _Tp, class _BinaryOp, class _Reduce, class _Scan>
|
|---|
| 95 | _Tp
|
|---|
| 96 | __parallel_transform_scan(_ExecutionPolicy&&, _Index __n, _UnaryOp, _Tp __init, _BinaryOp, _Reduce, _Scan __scan)
|
|---|
| 97 | {
|
|---|
| 98 | return __scan(_Index(0), __n, __init);
|
|---|
| 99 | }
|
|---|
| 100 |
|
|---|
| 101 | template <class _ExecutionPolicy, typename _RandomAccessIterator, typename _Compare, typename _LeafSort>
|
|---|
| 102 | void
|
|---|
| 103 | __parallel_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
|
|---|
| 104 | _LeafSort __leaf_sort, std::size_t = 0)
|
|---|
| 105 | {
|
|---|
| 106 | __leaf_sort(__first, __last, __comp);
|
|---|
| 107 | }
|
|---|
| 108 |
|
|---|
| 109 | template <class _ExecutionPolicy, typename _RandomAccessIterator1, typename _RandomAccessIterator2,
|
|---|
| 110 | typename _RandomAccessIterator3, typename _Compare, typename _LeafMerge>
|
|---|
| 111 | void
|
|---|
| 112 | __parallel_merge(_ExecutionPolicy&&, _RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
|---|
| 113 | _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _RandomAccessIterator3 __outit,
|
|---|
| 114 | _Compare __comp, _LeafMerge __leaf_merge)
|
|---|
| 115 | {
|
|---|
| 116 | __leaf_merge(__first1, __last1, __first2, __last2, __outit, __comp);
|
|---|
| 117 | }
|
|---|
| 118 |
|
|---|
| 119 | template <class _ExecutionPolicy, typename _F1, typename _F2>
|
|---|
| 120 | void
|
|---|
| 121 | __parallel_invoke(_ExecutionPolicy&&, _F1&& __f1, _F2&& __f2)
|
|---|
| 122 | {
|
|---|
| 123 | std::forward<_F1>(__f1)();
|
|---|
| 124 | std::forward<_F2>(__f2)();
|
|---|
| 125 | }
|
|---|
| 126 |
|
|---|
| 127 | } // namespace __serial_backend
|
|---|
| 128 | } // namespace __pstl
|
|---|
| 129 |
|
|---|
| 130 | #endif /* _PSTL_PARALLEL_BACKEND_SERIAL_H */
|
|---|