72void parallel_for(
size_t num_iterations,
const std::function<
void(
size_t)>& func)
74#ifdef NO_MULTITHREADING
75 for (
size_t i = 0; i < num_iterations; ++i) {
79#ifdef OMP_MULTITHREADING
103 const std::function<
void(
size_t,
size_t)>& func,
104 size_t no_multhreading_if_less_or_equal)
106 if (num_points <= no_multhreading_if_less_or_equal) {
114 const size_t chunk_size = (num_points / num_cpus) + (num_points % num_cpus == 0 ? 0 : 1);
116 parallel_for(num_cpus, [num_points, chunk_size, &func](
size_t chunk_index) {
118 if (chunk_size * chunk_index > num_points) {
122 size_t current_chunk_size = std::min(num_points - (chunk_size * chunk_index), chunk_size);
123 if (current_chunk_size == 0) {
126 size_t start = chunk_index * chunk_size;
127 size_t end = chunk_index * chunk_size + current_chunk_size;
133 const std::function<
void(
size_t,
size_t,
size_t)>& func,
134 size_t heuristic_cost)
140 constexpr size_t PARALLEL_FOR_COST = 400000;
145 const size_t chunk_size = (num_points / num_cpus) + (num_points % num_cpus == 0 ? 0 : 1);
148 const size_t offset_cost = (num_points - chunk_size) * heuristic_cost;
151 if (offset_cost < PARALLEL_FOR_COST) {
152 func(0, num_points, 0);
156 parallel_for(num_cpus, [num_points, chunk_size, &func](
size_t chunk_index) {
158 if (chunk_size * chunk_index > num_points) {
162 size_t current_chunk_size = std::min(num_points - (chunk_size * chunk_index), chunk_size);
163 if (current_chunk_size == 0) {
166 size_t start = chunk_index * chunk_size;
167 size_t end = chunk_index * chunk_size + current_chunk_size;
169 func(start, end, chunk_index);
176 const size_t thread_size = num_iterations / num_threads;
179 std::vector<size_t> start(num_threads);
180 std::vector<size_t> end(num_threads);
181 for (
size_t thread_idx = 0; thread_idx < num_threads; ++thread_idx) {
182 start[thread_idx] = thread_idx * thread_size;
183 end[thread_idx] = (thread_idx == num_threads - 1) ? num_iterations : (thread_idx + 1) * thread_size;
202 size_t desired_num_threads = num_iterations / min_iterations_per_thread;
203 size_t num_threads = std::min(desired_num_threads, max_num_threads);
204 num_threads = num_threads > 0 ? num_threads : 1;
218 size_t desired_num_threads = num_iterations / min_iterations_per_thread;
219 desired_num_threads =
static_cast<size_t>(1ULL <<
numeric::get_msb(desired_num_threads));
220 size_t num_threads = std::min(desired_num_threads, max_num_threads);
221 num_threads = num_threads > 0 ? num_threads : 1;
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
void parallel_for_mutex_pool(size_t num_iterations, const std::function< void(size_t)> &func)
MultithreadData calculate_thread_data(size_t num_iterations, size_t min_iterations_per_thread)
Calculates number of threads and index bounds for each thread.
void parallel_for_queued(size_t num_iterations, const std::function< void(size_t)> &func)
size_t get_num_cpus_pow2()
void parallel_for_moody(size_t num_iterations, const std::function< void(size_t)> &func)
size_t calculate_num_threads(size_t num_iterations, size_t min_iterations_per_thread)
calculates number of threads to create based on minimum iterations per thread
size_t calculate_num_threads_pow2(size_t num_iterations, size_t min_iterations_per_thread)
calculates number of threads to create based on minimum iterations per thread, guaranteed power of 2
void parallel_for_atomic_pool(size_t num_iterations, const std::function< void(size_t)> &func)
void parallel_for_heuristic(size_t num_points, const std::function< void(size_t, size_t, size_t)> &func, size_t heuristic_cost)
Split a loop into several loops running in parallel based on operations in 1 iteration.
void parallel_for_spawning(size_t num_iterations, const std::function< void(size_t)> &func)
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
void parallel_for_omp(size_t num_iterations, const std::function< void(size_t)> &func)
void parallel_for_range(size_t num_points, const std::function< void(size_t, size_t)> &func, size_t no_multhreading_if_less_or_equal)
Split a loop into several loops running in parallel.