78 const auto real_nb_threads = nb_threads < 1 ?
Idx(1) :
Idx(nb_threads);
79 const Idx range_size = end - beg;
80 std::vector< std::pair< Idx, Idx > > result;
81 result.reserve(real_nb_threads);
85 if (range_size <= real_nb_threads) {
86 for (
Idx i =
Idx(0); i < range_size; ++i) {
87 result.emplace_back(i, i + 1);
89 for (
Idx i = range_size; i < real_nb_threads; ++i)
90 result.emplace_back(range_size, range_size);
94 Idx nb_elts_par_thread = range_size / real_nb_threads;
95 Idx rest_elts = range_size - nb_elts_par_thread * real_nb_threads;
97 Idx begin_index = beg;
98 for (
Idx i =
Idx(0); i < real_nb_threads; ++i) {
99 Idx end_index = begin_index + nb_elts_par_thread;
100 if (rest_elts !=
Idx(0)) {
104 result.emplace_back(begin_index, end_index);
105 begin_index = end_index;
std::vector< std::pair< Idx, Idx > > dispatchRangeToThreads(Idx beg, Idx end, unsigned int nb_threads)
returns a vector equally splitting elements of a range among threads