aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/libcxx/include/__pstl/internal/omp/parallel_scan.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/libcxx/include/__pstl/internal/omp/parallel_scan.h')
-rw-r--r--contrib/llvm-project/libcxx/include/__pstl/internal/omp/parallel_scan.h136
1 files changed, 0 insertions, 136 deletions
diff --git a/contrib/llvm-project/libcxx/include/__pstl/internal/omp/parallel_scan.h b/contrib/llvm-project/libcxx/include/__pstl/internal/omp/parallel_scan.h
deleted file mode 100644
index f3eb967ca4fb..000000000000
--- a/contrib/llvm-project/libcxx/include/__pstl/internal/omp/parallel_scan.h
+++ /dev/null
@@ -1,136 +0,0 @@
-// -*- C++ -*-
-// -*-===----------------------------------------------------------------------===//
-//
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _PSTL_INTERNAL_OMP_PARALLEL_SCAN_H
-#define _PSTL_INTERNAL_OMP_PARALLEL_SCAN_H
-
-#include "parallel_invoke.h"
-
-namespace __pstl
-{
-namespace __omp_backend
-{
-
-template <typename _Index>
-_Index
-__split(_Index __m)
-{
- _Index __k = 1;
- while (2 * __k < __m)
- __k *= 2;
- return __k;
-}
-
-template <typename _Index, typename _Tp, typename _Rp, typename _Cp>
-void
-__upsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize, _Rp __reduce, _Cp __combine)
-{
- if (__m == 1)
- __r[0] = __reduce(__i * __tilesize, __lastsize);
- else
- {
- _Index __k = __split(__m);
- __omp_backend::__parallel_invoke_body(
- [=] { __omp_backend::__upsweep(__i, __k, __tilesize, __r, __tilesize, __reduce, __combine); },
- [=] {
- __omp_backend::__upsweep(__i + __k, __m - __k, __tilesize, __r + __k, __lastsize, __reduce, __combine);
- });
- if (__m == 2 * __k)
- __r[__m - 1] = __combine(__r[__k - 1], __r[__m - 1]);
- }
-}
-
-template <typename _Index, typename _Tp, typename _Cp, typename _Sp>
-void
-__downsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize, _Tp __initial, _Cp __combine,
- _Sp __scan)
-{
- if (__m == 1)
- __scan(__i * __tilesize, __lastsize, __initial);
- else
- {
- const _Index __k = __split(__m);
- __omp_backend::__parallel_invoke_body(
- [=] { __omp_backend::__downsweep(__i, __k, __tilesize, __r, __tilesize, __initial, __combine, __scan); },
- // Assumes that __combine never throws.
- // TODO: Consider adding a requirement for user functors to be constant.
- [=, &__combine]
- {
- __omp_backend::__downsweep(__i + __k, __m - __k, __tilesize, __r + __k, __lastsize,
- __combine(__initial, __r[__k - 1]), __combine, __scan);
- });
- }
-}
-
-template <typename _ExecutionPolicy, typename _Index, typename _Tp, typename _Rp, typename _Cp, typename _Sp,
- typename _Ap>
-void
-__parallel_strict_scan_body(_Index __n, _Tp __initial, _Rp __reduce, _Cp __combine, _Sp __scan, _Ap __apex)
-{
- _Index __p = omp_get_num_threads();
- const _Index __slack = 4;
- _Index __tilesize = (__n - 1) / (__slack * __p) + 1;
- _Index __m = (__n - 1) / __tilesize;
- __buffer<_Tp> __buf(__m + 1);
- _Tp* __r = __buf.get();
-
- __omp_backend::__upsweep(_Index(0), _Index(__m + 1), __tilesize, __r, __n - __m * __tilesize, __reduce, __combine);
-
- std::size_t __k = __m + 1;
- _Tp __t = __r[__k - 1];
- while ((__k &= __k - 1))
- {
- __t = __combine(__r[__k - 1], __t);
- }
-
- __apex(__combine(__initial, __t));
- __omp_backend::__downsweep(_Index(0), _Index(__m + 1), __tilesize, __r, __n - __m * __tilesize, __initial,
- __combine, __scan);
-}
-
-template <class _ExecutionPolicy, typename _Index, typename _Tp, typename _Rp, typename _Cp, typename _Sp, typename _Ap>
-void
-__parallel_strict_scan(__pstl::__internal::__openmp_backend_tag, _ExecutionPolicy&&, _Index __n, _Tp __initial,
- _Rp __reduce, _Cp __combine, _Sp __scan, _Ap __apex)
-{
- if (__n <= __default_chunk_size)
- {
- _Tp __sum = __initial;
- if (__n)
- {
- __sum = __combine(__sum, __reduce(_Index(0), __n));
- }
- __apex(__sum);
- if (__n)
- {
- __scan(_Index(0), __n, __initial);
- }
- return;
- }
-
- if (omp_in_parallel())
- {
- __pstl::__omp_backend::__parallel_strict_scan_body<_ExecutionPolicy>(__n, __initial, __reduce, __combine,
- __scan, __apex);
- }
- else
- {
- _PSTL_PRAGMA(omp parallel)
- _PSTL_PRAGMA(omp single nowait)
- {
- __pstl::__omp_backend::__parallel_strict_scan_body<_ExecutionPolicy>(__n, __initial, __reduce, __combine,
- __scan, __apex);
- }
- }
-}
-
-} // namespace __omp_backend
-} // namespace __pstl
-#endif // _PSTL_INTERNAL_OMP_PARALLEL_SCAN_H