@@ -224,34 +224,54 @@ namespace hpx::compute::host {
224224 hpx::parallel::execution::detail::bulk_execute_result_t <F,
225225 Shape, Ts...>;
226226
227- std::vector<result_type> results;
228227 std::size_t cnt = util::size (shape);
229228 std::size_t const num_executors = executors_.size ();
230229
231- results.reserve (cnt);
232-
233230 try
234231 {
235- auto begin = util::begin (shape);
236- for (std::size_t i = 0 ; i != num_executors; ++i)
232+ if constexpr (!std::is_void_v<result_type>)
237233 {
238- std::size_t part_begin_offset = (i * cnt) / num_executors;
239- std::size_t part_end_offset =
240- ((i + 1 ) * cnt) / num_executors;
241- auto part_begin = begin;
242- auto part_end = begin;
243- std::advance (part_begin, part_begin_offset);
244- std::advance (part_end, part_end_offset);
245- auto part_results =
234+ std::vector<result_type> results;
235+ results.reserve (cnt);
236+
237+ auto begin = util::begin (shape);
238+ for (std::size_t i = 0 ; i != num_executors; ++i)
239+ {
240+ std::size_t part_begin_offset =
241+ (i * cnt) / num_executors;
242+ std::size_t part_end_offset =
243+ ((i + 1 ) * cnt) / num_executors;
244+ auto part_begin = std::next (begin, part_begin_offset);
245+ auto part_end = std::next (begin, part_end_offset);
246+ auto part_results =
247+ hpx::parallel::execution::bulk_sync_execute (
248+ executors_[i], HPX_FORWARD (F, f),
249+ util::iterator_range (part_begin, part_end),
250+ HPX_FORWARD (Ts, ts)...);
251+ results.emplace (results.end (),
252+ std::make_move_iterator (part_results.begin ()),
253+ std::make_move_iterator (part_results.end ()));
254+ }
255+
256+ return results;
257+ }
258+ else
259+ {
260+ auto begin = util::begin (shape);
261+ for (std::size_t i = 0 ; i != num_executors; ++i)
262+ {
263+ std::size_t part_begin_offset =
264+ (i * cnt) / num_executors;
265+ std::size_t part_end_offset =
266+ ((i + 1 ) * cnt) / num_executors;
267+ auto part_begin = std::next (begin, part_begin_offset);
268+ auto part_end = std::next (begin, part_end_offset);
246269 hpx::parallel::execution::bulk_sync_execute (
247270 executors_[i], HPX_FORWARD (F, f),
248- util::iterator_range (begin , part_end),
271+ util::iterator_range (part_begin , part_end),
249272 HPX_FORWARD (Ts, ts)...);
250- results.emplace (results.end (),
251- std::make_move_iterator (part_results.begin ()),
252- std::make_move_iterator (part_results.end ()));
273+ }
253274 }
254- return results;
255275 }
256276 catch (std::bad_alloc const &)
257277 {
0 commit comments