120#ifdef SUBPAR_CUSTOM_PARALLELIZE_RANGE
121 if constexpr(nothrow_) {
122#ifdef SUBPAR_CUSTOM_PARALLELIZE_RANGE_NOTHROW
123 SUBPAR_CUSTOM_PARALLELIZE_RANGE_NOTHROW(num_workers, num_tasks, run_task_range);
125 SUBPAR_CUSTOM_PARALLELIZE_RANGE(num_workers, num_tasks, run_task_range);
128 SUBPAR_CUSTOM_PARALLELIZE_RANGE(num_workers, num_tasks, run_task_range);
132 if (num_tasks == 0) {
136 if (num_workers <= 1 || num_tasks == 1) {
137 run_task_range(0, 0, num_tasks);
142 Task_ tasks_per_worker;
144 if (internal::ge(num_workers, num_tasks)) {
145 num_workers = num_tasks;
146 tasks_per_worker = 1;
149 tasks_per_worker = num_tasks / num_workers;
150 remainder = num_tasks % num_workers;
154 typename std::conditional<nothrow_, int, std::vector<std::exception_ptr> >::type errors(num_workers);
156#if defined(_OPENMP) && !defined(SUBPAR_NO_OPENMP_RANGE) && !defined(SUBPAR_NO_OPENMP)
157#define SUBPAR_USES_OPENMP 1
158#define SUBPAR_USES_OPENMP_RANGE 1
162 #pragma omp parallel for num_threads(num_workers)
163 for (
int w = 0; w < num_workers; ++w) {
164 Task_ start = w * tasks_per_worker + (w < remainder ? w : remainder);
165 Task_ length = tasks_per_worker + (w < remainder);
167 if constexpr(nothrow_) {
168 run_task_range(w, start, length);
171 run_task_range(w, start, length);
173 errors[w] = std::current_exception();
180#undef SUBPAR_USES_OPENMP
181#undef SUBPAR_USES_OPENMP_RANGE
184 std::vector<std::thread> workers;
185 workers.reserve(num_workers);
187 for (
int w = 0; w < num_workers; ++w) {
188 Task_ length = tasks_per_worker + (w < remainder);
190 if constexpr(nothrow_) {
191 workers.emplace_back(run_task_range, w, start, length);
193 workers.emplace_back([&run_task_range,&errors](
int w, Task_ start, Task_ length) ->
void {
195 run_task_range(w, start, length);
197 errors[w] = std::current_exception();
199 }, w, start, length);
205 for (
auto& wrk : workers) {
210 if constexpr(!nothrow_) {
211 for (
const auto& e : errors) {
213 std::rethrow_exception(e);
void parallelize_range(int num_workers, Task_ num_tasks, Run_ run_task_range)
Parallelize a range of tasks across multiple workers.
Definition range.hpp:119