Skip to content

Commit

Permalink
[oneDPL][ranges] + hetero implementations of ranges::copy, ranges::co…
Browse files Browse the repository at this point in the history
…py_if, ranges::merge
  • Loading branch information
MikeDvorskiy committed Apr 5, 2024
1 parent f37ca58 commit 5cfde5d
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 5 deletions.
10 changes: 6 additions & 4 deletions include/oneapi/dpl/pstl/algorithm_ranges_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -495,8 +495,11 @@ __pattern_copy_impl(_Tag __tag, _ExecutionPolicy&& __exec, _InRange&& __in_r, _O
{
static_assert(__is_parallel_tag_v<_Tag> || typename _Tag::__is_vector{});

auto __res = oneapi::dpl::__internal::__pattern_copy(__tag, std::forward<_ExecutionPolicy>(__exec), std::ranges::begin(__in_r),
std::ranges::begin(__in_r) + __in_r.size(), __out_r.begin());
static(__in_r.size() == __out_r.size());

oneapi::dpl::__internal::__pattern_walk2_brick(__tag, std::forward<_ExecutionPolicy>(__exec),
std::ranges::begin(__in_r), std::ranges::begin(__in_r) + __in_r.size(), __out_r.begin(),
oneapi::dpl::__internal::__brick_copy<decltype(__dispatch_tag), _ExecutionPolicy>{});

using __return_t = std::ranges::copy_result<std::ranges::borrowed_iterator_t<_InRange>,
std::ranges::borrowed_iterator_t<_OutRange>>;
Expand All @@ -512,8 +515,7 @@ __pattern_copy(__parallel_tag<_IsVector> __tag, _ExecutionPolicy&& __exec, _InRa
std::forward<_OutRange>(__out_r));
}

template<typename _Tag, typename _ExecutionPolicy, typename _InRange, typename _OutRange,
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, int> = 0>
template<typename _Tag, typename _ExecutionPolicy, typename _InRange, typename _OutRange>
auto
__pattern_copy(_Tag __tag, _ExecutionPolicy&& __exec, _InRange&& __in_r, _OutRange&& __out_r)
{
Expand Down
2 changes: 1 addition & 1 deletion include/oneapi/dpl/pstl/glue_algorithm_ranges_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ struct merge_fn
_Proj1 __proj2) const
{
const auto __dispatch_tag = oneapi::dpl::__internal::__select_backend(__exec, __r1.begin(), __r2.begin(), __out_r.begin());
return oneapi::dpl::__internal::__ranges::merge(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
return oneapi::dpl::__internal::__ranges::pattern_merge(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
std::forward<_R1>(__r1), std::forward<_R2>(__r2), std::forward<_OutRange>(__out_r), __comp, __proj1, __proj2);
}
};//merge_fn
Expand Down
57 changes: 57 additions & 0 deletions include/oneapi/dpl/pstl/hetero/algorithm_ranges_impl_hetero.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,22 @@ __pattern_transform(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec,

return __return_t{__in_r.begin() + __in_r.size(), __out_r.begin() + __out_r.size()};
}

template <typename _BackendTag, typename _ExecutionPolicy, typename _InRange, typename _OutRange>
auto
__pattern_copy(__hetero_tag<_IsVector> __tag, _ExecutionPolicy&& __exec, _InRange&& __in_r, _OutRange&& __out_r)
{
oneapi::dpl::__internal::__ranges::__pattern_walk_n(
__dispatch_tag, ::std::forward<_ExecutionPolicy>(__exec),
oneapi::dpl::__internal::__brick_copy<decltype(__dispatch_tag), _ExecutionPolicy>{},
views::all_read(std::forward<_InRange>(__in_r)), views::all_write(std::forward<_OutRange>(__out_r)));

using __return_t = std::ranges::copy_result<std::ranges::borrowed_iterator_t<_InRange>,
std::ranges::borrowed_iterator_t<_OutRange>>;

return __return_t{__in_r.begin() + __in_r.size(), __out_r.begin() + __out_r.size()};
}

#endif //_ONEDPL___cplusplus

//------------------------------------------------------------------------
Expand Down Expand Up @@ -558,6 +574,26 @@ __pattern_copy_if(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _R
::std::forward<_Range2>(__rng2), __create_mask_op, __copy_by_mask_op);
}

#if _ONEDPL___cplusplus >= 202002L
template <typename _BackendTag, typename _ExecutionPolicy, typename _InRange, typename _OutRange, typename __Pred,
typename _Proj>
auto
__pattern_copy_if(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _InRange&& __in_r, _OutRange&& __out_r,
_Pred __pred, _Proj __proj)
{
auto __pred_1 = [__pred, __proj](auto&& __val) { return __pred(__proj(__val));};

auto __res_idx = oneapi::dpl::__internal::__ranges::__pattern_copy_if(
__dispatch_tag, ::std::forward<_ExecutionPolicy>(__exec), views::all_read(::std::forward<_InRange>(__in_r)),
views::all_write(::std::forward<_OutRange>(__out_r)), __pred_1, oneapi::dpl::__internal::__pstl_assign());

using __return_t = std::ranges::copy_if_result<std::ranges::borrowed_iterator_t<_InRange>,
std::ranges::borrowed_iterator_t<_OutRange>>;

return __return_t{__in_r.begin() + __res_idx, __out_r.begin() + __res_idx};
}
#endif //_ONEDPL___cplusplus >= 202002L

//------------------------------------------------------------------------
// remove_if
//------------------------------------------------------------------------
Expand Down Expand Up @@ -686,6 +722,27 @@ __pattern_merge(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _Ran
return __n;
}

#if _ONEDPL___cplusplus >= 202002L
template<typename _BackendTag, typename _ExecutionPolicy, typename _R1, typename _R2, typename _OutRange, typename _Comp,
typename _Proj1, typename _Proj2>
auto
__pattern_merge(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _R1&& __r1, _R2&& __r2, _OutRange&& __out_r,
_Comp __comp, _Proj1 __proj1, _Proj2 __proj2)
{
auto __comp_2 = [__comp, __proj1, __proj2](auto&& __val1, auto&& __val2) { return __comp(__proj1(__val1),
__proj2(__val2));};

auto __res = oneapi::dpl::__internal::__ranges::__pattern_merge(__tag, std::forward<_ExecutionPolicy>(__exec),
oneapi::dpl::views::all_read(std::forward<_R1>(__r1)), oneapi::dpl::views::all_read(std::forward<_R2>(__r2)),
oneapi::dpl::views::all_write(std::forward<_OutRange>(__out_r)), __comp_2);

using __return_t = std::ranges::merge_result<std::ranges::borrowed_iterator_t<_R1>, std::ranges::borrowed_iterator_t<_R2>
std::ranges::borrowed_iterator_t<_OutRange>>;

return __return_t{__r1.begin() + __r1.size(), __r2.begin() + __r2.size(), __res};
}
#endif //_ONEDPL___cplusplus >= 202002L

//------------------------------------------------------------------------
// sort
//------------------------------------------------------------------------
Expand Down

0 comments on commit 5cfde5d

Please sign in to comment.