Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disable copy-constructor and copy-assignment operations for the __future class #1859

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions include/oneapi/dpl/internal/async_impl/async_impl_hetero.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,9 @@ __pattern_walk1_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _For
oneapi::dpl::__ranges::__get_sycl_range<__par_backend_hetero::access_mode::read_write, _ForwardIterator>();
auto __buf = __keep(__first, __last);

auto __future_obj = oneapi::dpl::__par_backend_hetero::__parallel_for(
return oneapi::dpl::__par_backend_hetero::__parallel_for(
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec),
unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n, __buf.all_view());
return __future_obj;
}

template <__par_backend_hetero::access_mode __acc_mode1 = __par_backend_hetero::access_mode::read,
Expand All @@ -69,7 +68,8 @@ __pattern_walk2_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _For
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec),
unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n, __buf1.all_view(), __buf2.all_view());

return __future.__make_future(__first2 + __n);
using _f_type = decltype(__future);
return _f_type::__make_future(std::move(__future), __first2 + __n);
}

template <typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2,
Expand All @@ -96,7 +96,8 @@ __pattern_walk3_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _For
unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n,
__buf1.all_view(), __buf2.all_view(), __buf3.all_view());

return __future.__make_future(__first3 + __n);
using _f_type = decltype(__future);
return _f_type::__make_future(std::move(__future), __first3 + __n);
}

template <typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2,
Expand Down Expand Up @@ -201,10 +202,12 @@ __pattern_transform_scan_base_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&
auto __keep2 = oneapi::dpl::__ranges::__get_sycl_range<__par_backend_hetero::access_mode::write, _Iterator2>();
auto __buf2 = __keep2(__result, __result + __n);

auto __res = oneapi::dpl::__par_backend_hetero::__parallel_transform_scan(
auto __future = oneapi::dpl::__par_backend_hetero::__parallel_transform_scan(
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec), __buf1.all_view(), __buf2.all_view(), __n, __unary_op,
__init, __binary_op, _Inclusive{});
return __res.__make_future(__result + __n);

using _f_type = decltype(__future);
return _f_type::__make_future(std::move(__future), __result + __n);
}

template <typename _BackendTag, typename _ExecutionPolicy, typename _Iterator1, typename _Iterator2,
Expand Down
15 changes: 5 additions & 10 deletions include/oneapi/dpl/internal/async_impl/glue_async_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,9 @@ transform_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIt
const auto __dispatch_tag = oneapi::dpl::__internal::__select_backend(__exec, __first, __result);

wait_for_all(::std::forward<_Events>(__dependencies)...);
auto ret_val = oneapi::dpl::__internal::__pattern_walk2_async(
return oneapi::dpl::__internal::__pattern_walk2_async(
__dispatch_tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
oneapi::dpl::__internal::__transform_functor<_UnaryOperation>{::std::move(__op)});
return ret_val;
}

template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
Expand All @@ -64,10 +63,9 @@ transform_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardI
const auto __dispatch_tag = oneapi::dpl::__internal::__select_backend(__exec, __first1, __first2, __result);

wait_for_all(::std::forward<_Events>(__dependencies)...);
auto ret_val = oneapi::dpl::__internal::__pattern_walk3_async(
return oneapi::dpl::__internal::__pattern_walk3_async(
__dispatch_tag, ::std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __result,
oneapi::dpl::__internal::__transform_functor<_BinaryOperation>(::std::move(__op)));
return ret_val;
}

// [async.copy]
Expand All @@ -80,10 +78,9 @@ copy_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterato
auto __dispatch_tag = oneapi::dpl::__internal::__select_backend(__exec, __first, __result);

wait_for_all(::std::forward<_Events>(__dependencies)...);
auto ret_val = oneapi::dpl::__internal::__pattern_walk2_brick_async(
return oneapi::dpl::__internal::__pattern_walk2_brick_async(
__dispatch_tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
oneapi::dpl::__internal::__brick_copy<decltype(__dispatch_tag), _ExecutionPolicy>{});
return ret_val;
}

// [async.sort]
Expand Down Expand Up @@ -127,9 +124,8 @@ for_each_async(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIter
const auto __dispatch_tag = oneapi::dpl::__internal::__select_backend(__exec, __first);

wait_for_all(::std::forward<_Events>(__dependencies)...);
auto ret_val = oneapi::dpl::__internal::__pattern_walk1_async(
return oneapi::dpl::__internal::__pattern_walk1_async(
__dispatch_tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last, __f);
return ret_val;
}

// [async.reduce]
Expand All @@ -144,10 +140,9 @@ reduce_async(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterat
const auto __dispatch_tag = oneapi::dpl::__internal::__select_backend(__exec, __first);

wait_for_all(::std::forward<_Events>(__dependencies)...);
auto ret_val = oneapi::dpl::__internal::__pattern_transform_reduce_async(
return oneapi::dpl::__internal::__pattern_transform_reduce_async(
__dispatch_tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, __binary_op,
oneapi::dpl::__internal::__no_op());
return ret_val;
}

template <class _ExecutionPolicy, class _ForwardIt, class... _Events,
Expand Down
32 changes: 19 additions & 13 deletions include/oneapi/dpl/pstl/hetero/dpcpp/parallel_backend_sycl.h
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ template <typename... _Name>
struct __parallel_for_submitter<__internal::__optional_kernel_name<_Name...>>
{
template <typename _ExecutionPolicy, typename _Fp, typename _Index, typename... _Ranges>
auto
__future<sycl::event>
operator()(_ExecutionPolicy&& __exec, _Fp __brick, _Index __count, _Ranges&&... __rngs) const
{
assert(oneapi::dpl::__ranges::__get_first_range_size(__rngs...) > 0);
Expand All @@ -242,14 +242,14 @@ struct __parallel_for_submitter<__internal::__optional_kernel_name<_Name...>>
__brick(__idx, __rngs...);
});
});
return __future(__event);
return __future<sycl::event>(std::move(__event));
}
};

//General version of parallel_for, one additional parameter - __count of iterations of loop __cgh.parallel_for,
//for some algorithms happens that size of processing range is n, but amount of iterations is n/2.
template <typename _ExecutionPolicy, typename _Fp, typename _Index, typename... _Ranges>
auto
__future<sycl::event>
__parallel_for(oneapi::dpl::__internal::__device_backend_tag, _ExecutionPolicy&& __exec, _Fp __brick, _Index __count,
_Ranges&&... __rngs)
{
Expand All @@ -275,7 +275,7 @@ struct __parallel_scan_submitter<_CustomName, __internal::__optional_kernel_name
{
template <typename _ExecutionPolicy, typename _Range1, typename _Range2, typename _BinaryOperation,
typename _InitType, typename _LocalScan, typename _GroupScan, typename _GlobalScan>
auto
__future<sycl::event, __result_and_scratch_storage<_ExecutionPolicy, typename _InitType::__value_type>>
operator()(_ExecutionPolicy&& __exec, _Range1&& __rng1, _Range2&& __rng2, _BinaryOperation __binary_op,
_InitType __init, _LocalScan __local_scan, _GroupScan __group_scan, _GlobalScan __global_scan) const
{
Expand Down Expand Up @@ -372,7 +372,8 @@ struct __parallel_scan_submitter<_CustomName, __internal::__optional_kernel_name
});
});

return __future(__final_event, __result_and_scratch);
return __future<sycl::event, __result_and_scratch_storage<_ExecutionPolicy, typename _InitType::__value_type>>{
std::move(__final_event), std::move(__result_and_scratch)};
}
};

Expand Down Expand Up @@ -556,7 +557,7 @@ struct __parallel_copy_if_static_single_group_submitter<_Size, _ElemsPerItem, _W
{
template <typename _Policy, typename _InRng, typename _OutRng, typename _InitType, typename _BinaryOperation,
typename _UnaryOp, typename _Assign>
auto
__future<sycl::event, __result_and_scratch_storage<_Policy, _Size>>
operator()(_Policy&& __policy, _InRng&& __in_rng, _OutRng&& __out_rng, ::std::size_t __n, _InitType __init,
_BinaryOperation __bin_op, _UnaryOp __unary_op, _Assign __assign)
{
Expand Down Expand Up @@ -644,13 +645,14 @@ struct __parallel_copy_if_static_single_group_submitter<_Size, _ElemsPerItem, _W
}
});
});
return __future(__event, __result);
return __future<sycl::event, __result_and_scratch_storage<_Policy, _Size>>{std::move(__event),
std::move(__result)};
}
};

template <typename _ExecutionPolicy, typename _InRng, typename _OutRng, typename _UnaryOperation, typename _InitType,
typename _BinaryOperation, typename _Inclusive>
auto
__future<sycl::event, __result_and_scratch_storage<_ExecutionPolicy, typename _InitType::__value_type>>
__parallel_transform_scan_single_group(oneapi::dpl::__internal::__device_backend_tag, _ExecutionPolicy&& __exec,
_InRng&& __in_rng, _OutRng&& __out_rng, ::std::size_t __n,
_UnaryOperation __unary_op, _InitType __init, _BinaryOperation __binary_op,
Expand Down Expand Up @@ -700,7 +702,10 @@ __parallel_transform_scan_single_group(oneapi::dpl::__internal::__device_backend
/* _IsFullGroup= */ ::std::false_type, _Inclusive, _CustomName>>>()(
::std::forward<_ExecutionPolicy>(__exec), std::forward<_InRng>(__in_rng),
std::forward<_OutRng>(__out_rng), __n, __init, __binary_op, __unary_op);
return __future(__event, __dummy_result_and_scratch);

return __future<sycl::event,
__result_and_scratch_storage<_ExecutionPolicy, typename _InitType::__value_type>>{
std::move(__event), std::move(__dummy_result_and_scratch)};
};
if (__n <= 16)
return __single_group_scan_f(std::integral_constant<::std::uint16_t, 16>{});
Expand Down Expand Up @@ -734,13 +739,14 @@ __parallel_transform_scan_single_group(oneapi::dpl::__internal::__device_backend
__parallel_transform_scan_dynamic_single_group_submitter<_Inclusive::value, _DynamicGroupScanKernel>()(
std::forward<_ExecutionPolicy>(__exec), std::forward<_InRng>(__in_rng),
std::forward<_OutRng>(__out_rng), __n, __init, __binary_op, __unary_op, __max_wg_size);
return __future(__event, __dummy_result_and_scratch);
return __future<sycl::event, __result_and_scratch_storage<_ExecutionPolicy, typename _InitType::__value_type>>{
std::move(__event), std::move(__dummy_result_and_scratch)};
}
}

template <typename _ExecutionPolicy, typename _Range1, typename _Range2, typename _BinaryOperation, typename _InitType,
typename _LocalScan, typename _GroupScan, typename _GlobalScan>
auto
__future<sycl::event, __result_and_scratch_storage<_ExecutionPolicy, typename _InitType::__value_type>>
__parallel_transform_scan_base(oneapi::dpl::__internal::__device_backend_tag, _ExecutionPolicy&& __exec,
_Range1&& __in_rng, _Range2&& __out_rng, _BinaryOperation __binary_op, _InitType __init,
_LocalScan __local_scan, _GroupScan __group_scan, _GlobalScan __global_scan)
Expand Down Expand Up @@ -1806,7 +1812,7 @@ struct __parallel_partial_sort_submitter<__internal::__optional_kernel_name<_Glo
__internal::__optional_kernel_name<_CopyBackName...>>
{
template <typename _BackendTag, typename _ExecutionPolicy, typename _Range, typename _Merge, typename _Compare>
auto
__future<sycl::event>
operator()(_BackendTag, _ExecutionPolicy&& __exec, _Range&& __rng, _Merge __merge, _Compare __comp) const
{
using _Tp = oneapi::dpl::__internal::__value_t<_Range>;
Expand Down Expand Up @@ -1866,7 +1872,7 @@ struct __parallel_partial_sort_submitter<__internal::__optional_kernel_name<_Glo
});
}
// return future and extend lifetime of temporary buffer
return __future(__event1);
return __future<sycl::event>(std::move(__event1));
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ template <typename... _Name>
struct __parallel_for_fpga_submitter<__internal::__optional_kernel_name<_Name...>>
{
template <typename _ExecutionPolicy, typename _Fp, typename _Index, typename... _Ranges>
auto
__future<sycl::event>
operator()(_ExecutionPolicy&& __exec, _Fp __brick, _Index __count, _Ranges&&... __rngs) const
{
auto __n = oneapi::dpl::__ranges::__get_first_range_size(__rngs...);
Expand All @@ -75,12 +75,12 @@ struct __parallel_for_fpga_submitter<__internal::__optional_kernel_name<_Name...
}
});
});
return __future(__event);
return __future<sycl::event>(std::move(__event));
}
};

template <typename _ExecutionPolicy, typename _Fp, typename _Index, typename... _Ranges>
auto
__future<sycl::event>
__parallel_for(oneapi::dpl::__internal::__fpga_backend_tag, _ExecutionPolicy&& __exec, _Fp __brick, _Index __count,
_Ranges&&... __rngs)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ __histogram_general_private_global_atomics(oneapi::dpl::__internal::__device_bac

template <::std::uint16_t __iters_per_work_item, typename _ExecutionPolicy, typename _Range1, typename _Range2,
typename _BinHashMgr>
auto
__future<sycl::event>
__parallel_histogram_select_kernel(oneapi::dpl::__internal::__device_backend_tag __backend_tag,
_ExecutionPolicy&& __exec, const sycl::event& __init_event, _Range1&& __input,
_Range2&& __bins, const _BinHashMgr& __binhash_manager)
Expand All @@ -516,19 +516,19 @@ __parallel_histogram_select_kernel(oneapi::dpl::__internal::__device_backend_tag
// if bins fit into registers, use register private accumulation
if (__num_bins <= __max_work_item_private_bins)
{
return __future(
return __future<sycl::event>(
__histogram_general_registers_local_reduction<__iters_per_work_item, __max_work_item_private_bins>(
__backend_tag, ::std::forward<_ExecutionPolicy>(__exec), __init_event, __work_group_size,
::std::forward<_Range1>(__input), ::std::forward<_Range2>(__bins), __binhash_manager));
__backend_tag, std::forward<_ExecutionPolicy>(__exec), __init_event, __work_group_size,
std::forward<_Range1>(__input), std::forward<_Range2>(__bins), __binhash_manager));
}
// if bins fit into SLM, use local atomics
else if (__num_bins * sizeof(_local_histogram_type) +
__binhash_manager.get_required_SLM_elements() * sizeof(_extra_memory_type) <
__local_mem_size)
{
return __future(__histogram_general_local_atomics<__iters_per_work_item>(
__backend_tag, ::std::forward<_ExecutionPolicy>(__exec), __init_event, __work_group_size,
::std::forward<_Range1>(__input), ::std::forward<_Range2>(__bins), __binhash_manager));
return __future<sycl::event>(__histogram_general_local_atomics<__iters_per_work_item>(
__backend_tag, std::forward<_ExecutionPolicy>(__exec), __init_event, __work_group_size,
std::forward<_Range1>(__input), std::forward<_Range2>(__bins), __binhash_manager));
}
else // otherwise, use global atomics (private copies per workgroup)
{
Expand All @@ -537,9 +537,9 @@ __parallel_histogram_select_kernel(oneapi::dpl::__internal::__device_backend_tag
// suggestion which but global memory limitations may increase this value to be able to fit the workgroup
// private copies of the histogram bins in global memory. No unrolling is taken advantage of here because it
// is a runtime argument.
return __future(__histogram_general_private_global_atomics(
__backend_tag, ::std::forward<_ExecutionPolicy>(__exec), __init_event, __iters_per_work_item,
__work_group_size, ::std::forward<_Range1>(__input), ::std::forward<_Range2>(__bins), __binhash_manager));
return __future<sycl::event>(__histogram_general_private_global_atomics(
__backend_tag, std::forward<_ExecutionPolicy>(__exec), __init_event, __iters_per_work_item,
__work_group_size, std::forward<_Range1>(__input), std::forward<_Range2>(__bins), __binhash_manager));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ template <typename _IdType, typename... _Name>
struct __parallel_merge_submitter<_IdType, __internal::__optional_kernel_name<_Name...>>
{
template <typename _ExecutionPolicy, typename _Range1, typename _Range2, typename _Range3, typename _Compare>
auto
__future<sycl::event>
operator()(_ExecutionPolicy&& __exec, _Range1&& __rng1, _Range2&& __rng2, _Range3&& __rng3, _Compare __comp) const
{
const _IdType __n1 = __rng1.size();
Expand All @@ -162,7 +162,7 @@ struct __parallel_merge_submitter<_IdType, __internal::__optional_kernel_name<_N
__comp);
});
});
return __future(__event);
return __future<sycl::event>(std::move(__event));
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ struct __parallel_sort_submitter<_IdType, __internal::__optional_kernel_name<_Le
__internal::__optional_kernel_name<_CopyBackName...>>
{
template <typename _ExecutionPolicy, typename _Range, typename _Compare, typename _LeafSorter>
auto
__future<sycl::event>
operator()(_ExecutionPolicy&& __exec, _Range&& __rng, _Compare __comp, _LeafSorter& __leaf_sorter) const
{
using _Tp = oneapi::dpl::__internal::__value_t<_Range>;
Expand Down Expand Up @@ -303,7 +303,7 @@ struct __parallel_sort_submitter<_IdType, __internal::__optional_kernel_name<_Le
});
}

return __future(__event1);
return __future<sycl::event>(std::move(__event1));
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -766,7 +766,7 @@ struct __parallel_radix_sort_iteration
// radix sort: main function
//-----------------------------------------------------------------------
template <bool __is_ascending, typename _Range, typename _ExecutionPolicy, typename _Proj>
auto
__future<sycl::event>
__parallel_radix_sort(oneapi::dpl::__internal::__device_backend_tag, _ExecutionPolicy&& __exec, _Range&& __in_rng,
_Proj __proj)
{
Expand Down Expand Up @@ -866,7 +866,7 @@ __parallel_radix_sort(oneapi::dpl::__internal::__device_backend_tag, _ExecutionP
}
}

return __future(__event);
return __future<sycl::event>(std::move(__event));
}

} // namespace __par_backend_hetero
Expand Down
Loading
Loading