21constexpr size_t MIN_GROUP_PER_THREAD = 4;
23size_t compute_num_threads(
const size_t size)
26 if (size <= (num_threads * MIN_GROUP_PER_THREAD)) {
34void compute_lookup_table_single(
const Fr& input_root,
37 std::vector<Fr*>& round_roots)
41 round_roots.emplace_back(&roots[0]);
42 for (
size_t i = 1; i < num_rounds - 1; ++i) {
43 round_roots.emplace_back(round_roots.back() + (1UL << i));
46 for (
size_t i = 0; i < num_rounds - 1; ++i) {
47 const size_t m = 1UL << (i + 1);
48 const Fr round_root = input_root.
pow(
static_cast<uint64_t
>(size / (2 * m)));
49 Fr*
const current_round_roots = round_roots[i];
50 current_round_roots[0] =
Fr::one();
51 for (
size_t j = 1; j < m; ++j) {
52 current_round_roots[j] = current_round_roots[j - 1] * round_root;
61 , num_threads(compute_num_threads(domain_size))
62 , thread_size(domain_size / num_threads)
63 , log2_size(static_cast<size_t>(numeric::
get_msb(size)))
64 , log2_thread_size(static_cast<size_t>(numeric::
get_msb(thread_size)))
65 , log2_num_threads(static_cast<size_t>(numeric::
get_msb(num_threads)))
66 , generator_size(target_generator_size ? target_generator_size : domain_size)
67 , domain(
Fr{ size, 0, 0, 0 }.to_montgomery_form())
68 , domain_inverse(domain.invert())
69 , generator(
Fr::template coset_generator<0>())
70 , generator_inverse(
Fr::template coset_generator<0>().invert())
71 , four_inverse(
Fr(4).invert())
91 , num_threads(compute_num_threads(other.size))
92 , thread_size(other.size / num_threads)
93 , log2_size(static_cast<size_t>(numeric::
get_msb(size)))
94 , log2_thread_size(static_cast<size_t>(numeric::
get_msb(thread_size)))
95 , log2_num_threads(static_cast<size_t>(numeric::
get_msb(num_threads)))
96 , generator_size(other.generator_size)
97 , root(
Fr::get_root_of_unity(log2_size))
98 , root_inverse(root.invert())
99 , domain(
Fr{ size, 0, 0, 0 }.to_montgomery_form())
100 , domain_inverse(domain.invert())
101 , generator(other.generator)
102 , generator_inverse(other.generator_inverse)
103 , four_inverse(other.four_inverse)
108 if (other.
roots !=
nullptr) {
109 const size_t mem_size =
sizeof(
Fr) *
size * 2;
111 memcpy(
static_cast<void*
>(
roots.get()),
static_cast<void*
>(other.
roots.get()), mem_size);
116 for (
size_t i = 1; i <
log2_size - 1; ++i) {
125template <
typename Fr>
128 , num_threads(compute_num_threads(other.size))
129 , thread_size(other.size / num_threads)
130 , log2_size(static_cast<size_t>(numeric::
get_msb(size)))
131 , log2_thread_size(static_cast<size_t>(numeric::
get_msb(thread_size)))
132 , log2_num_threads(static_cast<size_t>(numeric::
get_msb(num_threads)))
133 , generator_size(other.generator_size)
134 , root(
Fr::get_root_of_unity(log2_size))
135 , root_inverse(root.invert())
136 , domain(
Fr{ size, 0, 0, 0 }.to_montgomery_form())
137 , domain_inverse(domain.invert())
138 , generator(other.generator)
139 , generator_inverse(other.generator_inverse)
140 , four_inverse(other.four_inverse)
145 other.roots =
nullptr;
151 generator_size = other.generator_size;
152 num_threads = compute_num_threads(other.size);
153 thread_size = other.size / num_threads;
160 Fr::__copy(other.domain_inverse, domain_inverse);
162 Fr::__copy(other.generator_inverse, generator_inverse);
165 if (other.roots !=
nullptr) {
167 round_roots =
std::move(other.round_roots);
168 inverse_round_roots =
std::move(other.inverse_round_roots);
170 other.roots =
nullptr;
181 compute_lookup_table_single(root, size, roots.get(), round_roots);
182 compute_lookup_table_single(root_inverse, size, &roots.get()[size], inverse_round_roots);
#define BB_ASSERT_EQ(actual, expected,...)
#define ASSERT(expression,...)
void compute_lookup_table()
std::vector< FF * > inverse_round_roots
std::vector< FF * > round_roots
EvaluationDomain & operator=(const EvaluationDomain &)=delete
std::shared_ptr< FF[]> roots
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
size_t get_num_cpus_pow2()
std::shared_ptr< void > get_mem_slab(size_t size)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field get_root_of_unity(size_t subgroup_size) noexcept
static constexpr field one()
BB_INLINE constexpr field pow(const uint256_t &exponent) const noexcept
static BB_INLINE void __copy(const field &a, field &r) noexcept