3#include <wmtk/threading/task_group.hpp>
9namespace wmtk::threading {
26void dynamic_parallel_for(
size_t n,
int num_threads,
size_t chunk, F&& fn)
31 chunk = std::max<size_t>(1, chunk);
32 const size_t n_chunks = (n + chunk - 1) / chunk;
33 const size_t n_tasks = std::min<size_t>(
size_t(std::max(1, num_threads)), n_chunks);
39 std::atomic<size_t> next{0};
41 for (
size_t t = 0; t < n_tasks; ++t) {
42 tg.run([&next, &fn, n, chunk]() {
44 const size_t begin = next.fetch_add(chunk, std::memory_order_relaxed);
48 fn(begin, std::min(n, begin + chunk));