49 u32 num_threads = std::min(end - begin, std::thread::hardware_concurrency());
50 u32 steps_per_thread = std::ceil((
float)(end - begin) / num_threads);
52 std::vector<std::thread> threads;
53 threads.reserve(num_threads);
56 for (
u32 thread_idx = 1; thread_idx < num_threads; ++thread_idx)
58 threads.emplace_back([&func, end, thread_idx, steps_per_thread]() {
59 u32 local_end = std::min(end, steps_per_thread * (thread_idx + 1));
60 for (
u32 i = steps_per_thread * thread_idx; i < local_end; ++i)
69 u32 local_end = std::min(end, steps_per_thread);
70 for (
u32 i = 0; i < local_end; ++i)
77 for (
auto& t : threads)
83 template<
typename T,
typename R>
89 template<
typename T,
typename R>
93 vec.reserve(elements.size());
94 vec.insert(vec.end(), elements.begin(), elements.end());
98 template<
typename T,
typename R>
102 vec.reserve(elements.size());
103 vec.insert(vec.end(), elements.begin(), elements.end());
void parallel_for_each(u32 begin, u32 end, R func)