WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit ac55b29

Browse files
committed
Unify brick_*copy_by_mask
1 parent 85b8dd0 commit ac55b29

File tree

3 files changed

+26
-61
lines changed

3 files changed

+26
-61
lines changed

include/oneapi/dpl/pstl/algorithm_fwd.h

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -452,25 +452,15 @@ std::pair<_DifferenceType, _DifferenceType>
452452
__brick_compute_mask(_RandomAccessIterator, _DifferenceType, _IterPredicate, bool*,
453453
/*vector=*/std::true_type) noexcept;
454454

455-
template <class _ForwardIterator, class _OutputIterator>
456-
void
457-
__brick_copy_by_mask(_ForwardIterator, _ForwardIterator, _OutputIterator, bool*,
458-
/*vector=*/::std::false_type) noexcept;
459-
460-
template <class _RandomAccessIterator, class _OutputIterator>
461-
void
462-
__brick_copy_by_mask(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator, bool*,
463-
/*vector=*/::std::true_type) noexcept;
464-
465-
template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
455+
template <bool, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
466456
_Bound
467-
__brick_bounded_copy_by_mask(_RandomAccessIterator1, _Bound, _RandomAccessIterator2, _Bound, bool*, _Assigner,
468-
/*vector=*/std::false_type) noexcept;
457+
__brick_copy_by_mask(_RandomAccessIterator1, _Bound, _RandomAccessIterator2, _Bound, bool*, _Assigner,
458+
/*vector=*/std::false_type) noexcept;
469459

470-
template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
460+
template <bool, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
471461
_Bound
472-
__brick_bounded_copy_by_mask(_RandomAccessIterator1, _Bound, _RandomAccessIterator2, _Bound, bool*, _Assigner,
473-
/*vector=*/std::true_type) noexcept;
462+
__brick_copy_by_mask(_RandomAccessIterator1, _Bound, _RandomAccessIterator2, _Bound, bool*, _Assigner,
463+
/*vector=*/std::true_type) noexcept;
474464

475465
template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2>
476466
void

include/oneapi/dpl/pstl/algorithm_impl.h

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,56 +1267,32 @@ __brick_compute_mask(_RandomAccessIterator __first, _DifferenceType __len, _Iter
12671267
return std::make_pair(__count_true, __len - __count_true);
12681268
}
12691269

1270-
template <class _ForwardIterator, class _OutputIterator, class _Assigner>
1271-
void
1272-
__brick_copy_by_mask(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, bool* __mask,
1273-
_Assigner __assigner, /*vector=*/::std::false_type) noexcept
1274-
{
1275-
for (; __first != __last; ++__first, (void)++__mask)
1276-
{
1277-
if (*__mask)
1278-
{
1279-
__assigner(__first, __result);
1280-
++__result;
1281-
}
1282-
}
1283-
}
1284-
1285-
template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _Assigner>
1286-
void
1287-
__brick_copy_by_mask(_RandomAccessIterator1 __first, _RandomAccessIterator1 __last, _RandomAccessIterator2 __result,
1288-
bool* __mask, _Assigner __assigner, /*vector=*/::std::true_type) noexcept
1289-
{
1290-
__unseq_backend::__simd_copy_by_mask(__first, __last - __first, __result, __mask, __assigner);
1291-
}
1292-
1293-
template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
1270+
template <bool __Bounded, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
12941271
_Bound
1295-
__brick_bounded_copy_by_mask(_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result,
1296-
_Bound __out_len, bool* __mask, _Assigner __assigner, /*vector=*/std::false_type) noexcept
1272+
__brick_copy_by_mask(_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result, _Bound __out_len,
1273+
bool* __mask, _Assigner __assigner, /*vector=*/std::false_type) noexcept
12971274
{
12981275
_Bound __i = 0, __j = 0;
1299-
for (; __i < __in_len; ++__i, (void)++__first)
1276+
for (; __i < __in_len; ++__i)
13001277
{
13011278
if (__mask[__i])
13021279
{
1303-
if (__j == __out_len)
1304-
break;
1305-
__assigner(__first, __result);
1306-
++__result;
1280+
if constexpr (__Bounded)
1281+
if (__j == __out_len)
1282+
break;
1283+
__assigner(__first + __i, __result + __j);
13071284
++__j;
13081285
}
13091286
}
13101287
return __i;
13111288
}
13121289

1313-
template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
1290+
template <bool __Bounded, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Bound, class _Assigner>
13141291
_Bound
1315-
__brick_bounded_copy_by_mask(_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result,
1316-
_Bound __out_len, bool* __mask, _Assigner __assigner,
1317-
/*vector=*/std::true_type) noexcept
1292+
__brick_copy_by_mask(_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result, _Bound __out_len,
1293+
bool* __mask, _Assigner __assigner, /*vector=*/std::true_type) noexcept
13181294
{
1319-
return __unseq_backend::__simd_copy_by_mask<true>(__first, __in_len, __result, __mask, __assigner, __out_len);
1295+
return __unseq_backend::__simd_copy_by_mask<__Bounded>(__first, __in_len, __result, __out_len, __mask, __assigner);
13201296
}
13211297

13221298
template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2>
@@ -1371,8 +1347,8 @@ __parallel_selective_copy(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec,
13711347
},
13721348
std::plus<_DifferenceType>(), // Combine
13731349
[=](_DifferenceType __i, _DifferenceType __len, _DifferenceType __initial) { // Scan
1374-
__internal::__brick_copy_by_mask(
1375-
__first + __i, __first + (__i + __len), __result + __initial, __mask + __i,
1350+
__internal::__brick_copy_by_mask</*bounded*/ false>(
1351+
__first + __i, __len, __result + __initial, __len, __mask + __i,
13761352
[](_RandomAccessIterator1 __x, _RandomAccessIterator2 __z) { *__z = *__x; }, _IsVector{});
13771353
},
13781354
[&__m](_DifferenceType __total) { __m = __total; }); // Apex
@@ -1437,7 +1413,7 @@ __pattern_bounded_copy_if(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec,
14371413
[=, &__res_in](_DifferenceType __i, _DifferenceType __len, _DifferenceType __initial) { // Scan
14381414
if (__initial > __n_out) // The chunk has neither elements to write nor the stop position
14391415
return;
1440-
_DifferenceType __stop = __internal::__brick_bounded_copy_by_mask(
1416+
_DifferenceType __stop = __internal::__brick_copy_by_mask</*bounded*/ true>(
14411417
__first + __i, __len, __result + __initial, __n_out - __initial, __mask + __i,
14421418
[](_RandomAccessIterator1 __x, _RandomAccessIterator2 __z) { *__z = *__x; }, _IsVector{});
14431419
if (__stop == __len)
@@ -1597,8 +1573,8 @@ __remove_elements(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec, _RandomA
15971573
},
15981574
::std::plus<_DifferenceType>(),
15991575
[=](_DifferenceType __i, _DifferenceType __len, _DifferenceType __initial) {
1600-
__internal::__brick_copy_by_mask(
1601-
__first + __i, __first + __i + __len, __result + __initial, __mask + __i,
1576+
__internal::__brick_copy_by_mask</*bounded*/ false>(
1577+
__first + __i, __len, __result + __initial, __len, __mask + __i,
16021578
[](_RandomAccessIterator __x, _Tp* __z) { ::new (std::addressof(*__z)) _Tp(std::move(*__x)); },
16031579
_IsVector{});
16041580
},

include/oneapi/dpl/pstl/unseq_backend_simd.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#define _ONEDPL_UNSEQ_BACKEND_SIMD_H
1818

1919
#include <type_traits>
20-
#include <limits>
2120

2221
#include "utils.h"
2322

@@ -298,10 +297,10 @@ __simd_compute_mask(_Iterator __first, _DifferenceType __n, _IterPredicate __pre
298297
return __count;
299298
}
300299

301-
template <bool __Bounded = false, class _InputIterator, class _DifferenceType, class _OutputIterator, class _Assigner>
300+
template <bool __Bounded, class _InputIterator, class _DifferenceType, class _OutputIterator, class _Assigner>
302301
_DifferenceType
303-
__simd_copy_by_mask(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, bool* __mask,
304-
_Assigner __assign, _DifferenceType __n_out = std::numeric_limits<_DifferenceType>::max()) noexcept
302+
__simd_copy_by_mask(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, _DifferenceType __n_out,
303+
bool* __mask, _Assigner __assign) noexcept
305304
{
306305
std::make_signed_t<_DifferenceType> __cnt = -1; // to use inclusive scan of the mask
307306
_DifferenceType __stop = __n;

0 commit comments

Comments
 (0)