20constexpr size_t MIN_GROUP_PER_THREAD = 4;
22size_t compute_num_threads(
const size_t size)
25 if (size <= (num_threads * MIN_GROUP_PER_THREAD)) {
33void compute_lookup_table_single(
const Fr& input_root,
36 std::vector<Fr*>& round_roots)
40 round_roots.emplace_back(&roots[0]);
41 for (
size_t i = 1; i < num_rounds - 1; ++i) {
42 round_roots.emplace_back(round_roots.back() + (1UL << i));
45 for (
size_t i = 0; i < num_rounds - 1; ++i) {
46 const size_t m = 1UL << (i + 1);
47 const Fr round_root = input_root.
pow(
static_cast<uint64_t
>(size / (2 * m)));
48 Fr*
const current_round_roots = round_roots[i];
49 current_round_roots[0] =
Fr::one();
50 for (
size_t j = 1; j < m; ++j) {
51 current_round_roots[j] = current_round_roots[j - 1] * round_root;
60 , num_threads(compute_num_threads(domain_size))
61 , thread_size(domain_size / num_threads)
62 , log2_size(static_cast<size_t>(numeric::
get_msb(size)))
63 , log2_thread_size(static_cast<size_t>(numeric::
get_msb(thread_size)))
64 , log2_num_threads(static_cast<size_t>(numeric::
get_msb(num_threads)))
65 , generator_size(target_generator_size ? target_generator_size : domain_size)
66 , domain(
Fr{ size, 0, 0, 0 }.to_montgomery_form())
67 , domain_inverse(domain.invert())
68 , generator(
Fr::template coset_generator<0>())
69 , generator_inverse(
Fr::template coset_generator<0>().invert())
70 , four_inverse(
Fr(4).invert())
90 , num_threads(compute_num_threads(other.size))
91 , thread_size(other.size / num_threads)
92 , log2_size(static_cast<size_t>(numeric::
get_msb(size)))
93 , log2_thread_size(static_cast<size_t>(numeric::
get_msb(thread_size)))
94 , log2_num_threads(static_cast<size_t>(numeric::
get_msb(num_threads)))
95 , generator_size(other.generator_size)
96 , root(
Fr::get_root_of_unity(log2_size))
97 , root_inverse(root.invert())
98 , domain(
Fr{ size, 0, 0, 0 }.to_montgomery_form())
99 , domain_inverse(domain.invert())
100 , generator(other.generator)
101 , generator_inverse(other.generator_inverse)
102 , four_inverse(other.four_inverse)
107 if (other.
roots !=
nullptr) {
108 const size_t mem_size =
sizeof(
Fr) *
size * 2;
110 memcpy(
static_cast<void*
>(
roots.get()),
static_cast<void*
>(other.
roots.get()), mem_size);
115 for (
size_t i = 1; i <
log2_size - 1; ++i) {
124template <
typename Fr>
127 , num_threads(compute_num_threads(other.size))
128 , thread_size(other.size / num_threads)
129 , log2_size(static_cast<size_t>(numeric::
get_msb(size)))
130 , log2_thread_size(static_cast<size_t>(numeric::
get_msb(thread_size)))
131 , log2_num_threads(static_cast<size_t>(numeric::
get_msb(num_threads)))
132 , generator_size(other.generator_size)
133 , root(
Fr::get_root_of_unity(log2_size))
134 , root_inverse(root.invert())
135 , domain(
Fr{ size, 0, 0, 0 }.to_montgomery_form())
136 , domain_inverse(domain.invert())
137 , generator(other.generator)
138 , generator_inverse(other.generator_inverse)
139 , four_inverse(other.four_inverse)
144 other.roots =
nullptr;
150 generator_size = other.generator_size;
151 num_threads = compute_num_threads(other.size);
152 thread_size = other.size / num_threads;
159 Fr::__copy(other.domain_inverse, domain_inverse);
161 Fr::__copy(other.generator_inverse, generator_inverse);
164 if (other.roots !=
nullptr) {
166 round_roots =
std::move(other.round_roots);
167 inverse_round_roots =
std::move(other.inverse_round_roots);
169 other.roots =
nullptr;
179 compute_lookup_table_single(root, size, roots.get(), round_roots);
180 compute_lookup_table_single(root_inverse, size, &roots.get()[size], inverse_round_roots);
#define BB_ASSERT(expression,...)
#define BB_ASSERT_EQ(actual, expected,...)
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()
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
constexpr field invert() const noexcept
static BB_INLINE void __copy(const field &a, field &r) noexcept