78 const auto real_nb_threads
79 = nb_threads < 1 ? static_cast< Idx >(1) :
static_cast< Idx >(nb_threads);
80 const Idx range_size = end - beg;
81 std::vector< std::pair< Idx, Idx > > result;
82 result.reserve(real_nb_threads);
86 if (range_size <= real_nb_threads) {
87 for (
Idx i =
static_cast< Idx >(0); i < range_size; ++i) {
88 result.emplace_back(i, i + 1);
90 for (
Idx i = range_size; i < real_nb_threads; ++i) {
91 result.emplace_back(range_size, range_size);
96 Idx nb_elts_par_thread = range_size / real_nb_threads;
97 Idx rest_elts = range_size - nb_elts_par_thread * real_nb_threads;
99 Idx begin_index = beg;
100 for (
Idx i =
static_cast< Idx >(0); i < real_nb_threads; ++i) {
101 Idx end_index = begin_index + nb_elts_par_thread;
102 if (rest_elts !=
static_cast< Idx >(0)) {
106 result.emplace_back(begin_index, end_index);
107 begin_index = end_index;
std::vector< std::pair< Idx, Idx > > dispatchRangeToThreads(const Idx beg, const Idx end, const unsigned int nb_threads)
returns a vector equally splitting elements of a range among threads