xref: /llvm-project/libcxx/include/__pstl/backends/std_thread.h (revision e99c4906e44ae3f921fa05356909d006cda8d954)
1d423d80eSLouis Dionne //===----------------------------------------------------------------------===//
2d423d80eSLouis Dionne //
3d423d80eSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d423d80eSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5d423d80eSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d423d80eSLouis Dionne //
7d423d80eSLouis Dionne //===----------------------------------------------------------------------===//
8d423d80eSLouis Dionne 
9d423d80eSLouis Dionne #ifndef _LIBCPP___PSTL_BACKENDS_STD_THREAD_H
10d423d80eSLouis Dionne #define _LIBCPP___PSTL_BACKENDS_STD_THREAD_H
11d423d80eSLouis Dionne 
12d423d80eSLouis Dionne #include <__config>
139540950aSLouis Dionne #include <__pstl/backend_fwd.h>
149540950aSLouis Dionne #include <__pstl/cpu_algos/any_of.h>
15d423d80eSLouis Dionne #include <__pstl/cpu_algos/cpu_traits.h>
169540950aSLouis Dionne #include <__pstl/cpu_algos/fill.h>
179540950aSLouis Dionne #include <__pstl/cpu_algos/find_if.h>
189540950aSLouis Dionne #include <__pstl/cpu_algos/for_each.h>
199540950aSLouis Dionne #include <__pstl/cpu_algos/merge.h>
209540950aSLouis Dionne #include <__pstl/cpu_algos/stable_sort.h>
219540950aSLouis Dionne #include <__pstl/cpu_algos/transform.h>
229540950aSLouis Dionne #include <__pstl/cpu_algos/transform_reduce.h>
23d423d80eSLouis Dionne #include <__utility/empty.h>
24d423d80eSLouis Dionne #include <__utility/move.h>
25d423d80eSLouis Dionne #include <optional>
26d423d80eSLouis Dionne 
27d423d80eSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
28d423d80eSLouis Dionne #  pragma GCC system_header
29d423d80eSLouis Dionne #endif
30d423d80eSLouis Dionne 
31d423d80eSLouis Dionne _LIBCPP_PUSH_MACROS
32d423d80eSLouis Dionne #include <__undef_macros>
33d423d80eSLouis Dionne 
34*bbff52bfSLouis Dionne #if _LIBCPP_STD_VER >= 17
35*bbff52bfSLouis Dionne 
36d423d80eSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
37d423d80eSLouis Dionne namespace __pstl {
38d423d80eSLouis Dionne 
399540950aSLouis Dionne //
409540950aSLouis Dionne // This partial backend implementation is for testing purposes only and not meant for production use. This will be
419540950aSLouis Dionne // replaced by a proper implementation once the PSTL implementation is somewhat stable.
429540950aSLouis Dionne //
439540950aSLouis Dionne // This is intended to be used on top of the "default backend".
449540950aSLouis Dionne //
459540950aSLouis Dionne 
46d423d80eSLouis Dionne template <>
47d423d80eSLouis Dionne struct __cpu_traits<__std_thread_backend_tag> {
48d423d80eSLouis Dionne   template <class _RandomAccessIterator, class _Fp>
49d423d80eSLouis Dionne   _LIBCPP_HIDE_FROM_ABI static optional<__empty>
50d423d80eSLouis Dionne   __for_each(_RandomAccessIterator __first, _RandomAccessIterator __last, _Fp __f) {
51d423d80eSLouis Dionne     __f(__first, __last);
52d423d80eSLouis Dionne     return __empty{};
53d423d80eSLouis Dionne   }
54d423d80eSLouis Dionne 
55d423d80eSLouis Dionne   template <class _Index, class _UnaryOp, class _Tp, class _BinaryOp, class _Reduce>
56d423d80eSLouis Dionne   _LIBCPP_HIDE_FROM_ABI static optional<_Tp>
57d423d80eSLouis Dionne   __transform_reduce(_Index __first, _Index __last, _UnaryOp, _Tp __init, _BinaryOp, _Reduce __reduce) {
58d423d80eSLouis Dionne     return __reduce(std::move(__first), std::move(__last), std::move(__init));
59d423d80eSLouis Dionne   }
60d423d80eSLouis Dionne 
61d423d80eSLouis Dionne   template <class _RandomAccessIterator, class _Compare, class _LeafSort>
62d423d80eSLouis Dionne   _LIBCPP_HIDE_FROM_ABI static optional<__empty>
63d423d80eSLouis Dionne   __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, _LeafSort __leaf_sort) {
64d423d80eSLouis Dionne     __leaf_sort(__first, __last, __comp);
65d423d80eSLouis Dionne     return __empty{};
66d423d80eSLouis Dionne   }
67d423d80eSLouis Dionne 
68d423d80eSLouis Dionne   _LIBCPP_HIDE_FROM_ABI static void __cancel_execution() {}
69d423d80eSLouis Dionne 
70d423d80eSLouis Dionne   template <class _RandomAccessIterator1,
71d423d80eSLouis Dionne             class _RandomAccessIterator2,
72d423d80eSLouis Dionne             class _RandomAccessIterator3,
73d423d80eSLouis Dionne             class _Compare,
74d423d80eSLouis Dionne             class _LeafMerge>
75d423d80eSLouis Dionne   _LIBCPP_HIDE_FROM_ABI static optional<__empty>
76d423d80eSLouis Dionne   __merge(_RandomAccessIterator1 __first1,
77d423d80eSLouis Dionne           _RandomAccessIterator1 __last1,
78d423d80eSLouis Dionne           _RandomAccessIterator2 __first2,
79d423d80eSLouis Dionne           _RandomAccessIterator2 __last2,
80d423d80eSLouis Dionne           _RandomAccessIterator3 __outit,
81d423d80eSLouis Dionne           _Compare __comp,
82d423d80eSLouis Dionne           _LeafMerge __leaf_merge) {
83d423d80eSLouis Dionne     __leaf_merge(__first1, __last1, __first2, __last2, __outit, __comp);
84d423d80eSLouis Dionne     return __empty{};
85d423d80eSLouis Dionne   }
86d423d80eSLouis Dionne 
87d423d80eSLouis Dionne   static constexpr size_t __lane_size = 64;
88d423d80eSLouis Dionne };
89d423d80eSLouis Dionne 
909540950aSLouis Dionne // Mandatory implementations of the computational basis
919540950aSLouis Dionne template <class _ExecutionPolicy>
929540950aSLouis Dionne struct __find_if<__std_thread_backend_tag, _ExecutionPolicy>
939540950aSLouis Dionne     : __cpu_parallel_find_if<__std_thread_backend_tag, _ExecutionPolicy> {};
949540950aSLouis Dionne 
959540950aSLouis Dionne template <class _ExecutionPolicy>
969540950aSLouis Dionne struct __for_each<__std_thread_backend_tag, _ExecutionPolicy>
979540950aSLouis Dionne     : __cpu_parallel_for_each<__std_thread_backend_tag, _ExecutionPolicy> {};
989540950aSLouis Dionne 
999540950aSLouis Dionne template <class _ExecutionPolicy>
1009540950aSLouis Dionne struct __merge<__std_thread_backend_tag, _ExecutionPolicy>
1019540950aSLouis Dionne     : __cpu_parallel_merge<__std_thread_backend_tag, _ExecutionPolicy> {};
1029540950aSLouis Dionne 
1039540950aSLouis Dionne template <class _ExecutionPolicy>
1049540950aSLouis Dionne struct __stable_sort<__std_thread_backend_tag, _ExecutionPolicy>
1059540950aSLouis Dionne     : __cpu_parallel_stable_sort<__std_thread_backend_tag, _ExecutionPolicy> {};
1069540950aSLouis Dionne 
1079540950aSLouis Dionne template <class _ExecutionPolicy>
1089540950aSLouis Dionne struct __transform<__std_thread_backend_tag, _ExecutionPolicy>
1099540950aSLouis Dionne     : __cpu_parallel_transform<__std_thread_backend_tag, _ExecutionPolicy> {};
1109540950aSLouis Dionne 
1119540950aSLouis Dionne template <class _ExecutionPolicy>
1129540950aSLouis Dionne struct __transform_binary<__std_thread_backend_tag, _ExecutionPolicy>
1139540950aSLouis Dionne     : __cpu_parallel_transform_binary<__std_thread_backend_tag, _ExecutionPolicy> {};
1149540950aSLouis Dionne 
1159540950aSLouis Dionne template <class _ExecutionPolicy>
1169540950aSLouis Dionne struct __transform_reduce<__std_thread_backend_tag, _ExecutionPolicy>
1179540950aSLouis Dionne     : __cpu_parallel_transform_reduce<__std_thread_backend_tag, _ExecutionPolicy> {};
1189540950aSLouis Dionne 
1199540950aSLouis Dionne template <class _ExecutionPolicy>
1209540950aSLouis Dionne struct __transform_reduce_binary<__std_thread_backend_tag, _ExecutionPolicy>
1219540950aSLouis Dionne     : __cpu_parallel_transform_reduce_binary<__std_thread_backend_tag, _ExecutionPolicy> {};
1229540950aSLouis Dionne 
1239540950aSLouis Dionne // Not mandatory, but better optimized
1249540950aSLouis Dionne template <class _ExecutionPolicy>
1259540950aSLouis Dionne struct __any_of<__std_thread_backend_tag, _ExecutionPolicy>
1269540950aSLouis Dionne     : __cpu_parallel_any_of<__std_thread_backend_tag, _ExecutionPolicy> {};
1279540950aSLouis Dionne 
1289540950aSLouis Dionne template <class _ExecutionPolicy>
1299540950aSLouis Dionne struct __fill<__std_thread_backend_tag, _ExecutionPolicy>
1309540950aSLouis Dionne     : __cpu_parallel_fill<__std_thread_backend_tag, _ExecutionPolicy> {};
1319540950aSLouis Dionne 
132d423d80eSLouis Dionne } // namespace __pstl
133d423d80eSLouis Dionne _LIBCPP_END_NAMESPACE_STD
134d423d80eSLouis Dionne 
135*bbff52bfSLouis Dionne #endif // _LIBCPP_STD_VER >= 17
136*bbff52bfSLouis Dionne 
137d423d80eSLouis Dionne _LIBCPP_POP_MACROS
138d423d80eSLouis Dionne 
139d423d80eSLouis Dionne #endif // _LIBCPP___PSTL_BACKENDS_STD_THREAD_H
140