Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
thread.hpp
Go to the documentation of this file.
1#pragma once
3#include <atomic>
6#include <functional>
7#include <iostream>
8#include <vector>
9
10namespace bb {
11
12inline size_t get_num_cpus()
13{
15}
16
17// For algorithms that need to be divided amongst power of 2 threads.
18inline size_t get_num_cpus_pow2()
19{
20 return static_cast<size_t>(1ULL << numeric::get_msb(get_num_cpus()));
21}
22
30void parallel_for(size_t num_iterations, const std::function<void(size_t)>& func);
31void parallel_for_range(size_t num_points,
32 const std::function<void(size_t, size_t)>& func,
33 size_t no_multhreading_if_less_or_equal = 0);
34
45void parallel_for_heuristic(size_t num_points,
46 const std::function<void(size_t, size_t, size_t)>& func,
47 size_t heuristic_cost);
48
49template <typename Func>
51void parallel_for_heuristic(size_t num_points, const Func& func, size_t heuristic_cost)
52{
54 num_points,
55 [&](size_t start_idx, size_t end_idx, BB_UNUSED size_t chunk_index) {
56 for (size_t i = start_idx; i < end_idx; i++) {
57 func(i);
58 }
59 },
60 heuristic_cost);
61}
62
69template <typename Func, typename Accum>
72 const Accum& initial_accum,
73 const Func& func,
74 size_t heuristic_cost)
75{
76 // thread-safe accumulators
77 std::vector<Accum> accumulators(get_num_cpus(), initial_accum);
79 num_points,
80 [&](size_t start_idx, size_t end_idx, size_t chunk_index) {
81 for (size_t i = start_idx; i < end_idx; i++) {
82 func(i, accumulators[chunk_index]);
83 }
84 },
85 heuristic_cost);
86 return accumulators;
87}
88
89const size_t DEFAULT_MIN_ITERS_PER_THREAD = 1 << 4;
90
93 // index bounds for each thread
94 std::vector<size_t> start;
95 std::vector<size_t> end;
96};
97
106MultithreadData calculate_thread_data(size_t num_iterations,
107 size_t min_iterations_per_thread = DEFAULT_MIN_ITERS_PER_THREAD);
108
119size_t calculate_num_threads(size_t num_iterations, size_t min_iterations_per_thread = DEFAULT_MIN_ITERS_PER_THREAD);
120
128size_t calculate_num_threads_pow2(size_t num_iterations,
129 size_t min_iterations_per_thread = DEFAULT_MIN_ITERS_PER_THREAD);
130
131namespace thread_heuristics {
132// Rough cost of operations (the operation costs are derives in basics_bench and the units are nanoseconds)
133// Field element (16 byte) addition cost
134constexpr size_t FF_ADDITION_COST = 4;
135// Field element (16 byte) multiplication cost
136constexpr size_t FF_MULTIPLICATION_COST = 21;
137// Field element (16 byte) inversion cost
138constexpr size_t FF_INVERSION_COST = 7000;
139// Group element projective addition number
140constexpr size_t GE_ADDITION_COST = 350;
141// Group element projective doubling number
142constexpr size_t GE_DOUBLING_COST = 194;
143// Group element scalar multiplication cost
144constexpr size_t SM_COST = 50000;
145// Field element (16 byte) sequential copy number
146constexpr size_t FF_COPY_COST = 3;
147// Fine default if something looks 'chunky enough that I don't want to calculate'
148constexpr size_t ALWAYS_MULTITHREAD = 100000;
149} // namespace thread_heuristics
150
151} // namespace bb
#define BB_UNUSED
uint32_t env_hardware_concurrency()
constexpr T get_msb(const T in)
Definition get_msb.hpp:47
constexpr size_t FF_COPY_COST
Definition thread.hpp:146
constexpr size_t GE_ADDITION_COST
Definition thread.hpp:140
constexpr size_t GE_DOUBLING_COST
Definition thread.hpp:142
constexpr size_t ALWAYS_MULTITHREAD
Definition thread.hpp:148
constexpr size_t FF_ADDITION_COST
Definition thread.hpp:134
constexpr size_t FF_MULTIPLICATION_COST
Definition thread.hpp:136
constexpr size_t FF_INVERSION_COST
Definition thread.hpp:138
constexpr size_t SM_COST
Definition thread.hpp:144
Entry point for Barretenberg command-line interface.
MultithreadData calculate_thread_data(size_t num_iterations, size_t min_iterations_per_thread)
Calculates number of threads and index bounds for each thread.
Definition thread.cpp:173
const size_t DEFAULT_MIN_ITERS_PER_THREAD
Definition thread.hpp:89
size_t get_num_cpus_pow2()
Definition thread.hpp:18
size_t get_num_cpus()
Definition thread.hpp:12
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
Definition thread.cpp:199
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
Definition thread.cpp:215
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.
Definition thread.cpp:132
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
Definition thread.cpp:72
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.
Definition thread.cpp:102
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< size_t > end
Definition thread.hpp:95
std::vector< size_t > start
Definition thread.hpp:94