diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index 11ea759d4f2d..d85fd78eb5ff 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -60,17 +60,11 @@ void Polynomial::allocate_backing_memory(size_t size, size_t virtual_size, s * * @param size The size of the polynomial. */ -template -Polynomial::Polynomial(size_t size, size_t virtual_size, size_t start_index, bool disable_parallelisation) +template Polynomial::Polynomial(size_t size, size_t virtual_size, size_t start_index) { PROFILE_THIS_NAME("polynomial allocation with zeroing"); allocate_backing_memory(size, virtual_size, start_index); - if (disable_parallelisation) { - // In AVM polynomials are small and already constructed in parallel - memset(static_cast(coefficients_.backing_memory_.get()), 0, sizeof(Fr) * size); - return; - } size_t num_threads = calculate_num_threads(size); size_t range_per_thread = size / num_threads; @@ -293,6 +287,13 @@ template Polynomial& Polynomial::operator*=(const Fr scali return *this; } +template Polynomial Polynomial::create_non_parallel_zero_init(size_t size, size_t virtual_size) +{ + Polynomial p(size, virtual_size, Polynomial::DontZeroMemory::FLAG); + memset(static_cast(p.coefficients_.backing_memory_.get()), 0, sizeof(Fr) * size); + return p; +} + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1113): Optimizing based on actual sizes would involve using // expand, but it is currently unused. template diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 17d6ab34c614..3747b1bf2c73 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -65,7 +65,7 @@ template class Polynomial { using FF = Fr; enum class DontZeroMemory { FLAG }; - Polynomial(size_t size, size_t virtual_size, size_t start_index = 0, bool disable_parallelisation = false); + Polynomial(size_t size, size_t virtual_size, size_t start_index = 0); // Intended just for plonk, where size == virtual_size always Polynomial(size_t size) : Polynomial(size, size){}; @@ -284,6 +284,14 @@ template class Polynomial { return p; } + /** + * @brief A factory to construct a polynomial where parallel initialization is + * not possible (e.g. AVM code). + * + * @return a polynomial initialized with zero on the range defined by size + */ + static Polynomial create_non_parallel_zero_init(size_t size, size_t virtual_size); + /** * @brief Expands the polynomial with new start_index and end_index * The value of the polynomial remains the same, but defined memory region differs. diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp index 5f37b4e56b4c..53d570dea50e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp @@ -78,24 +78,17 @@ AvmCircuitBuilder::ProverPolynomials AvmCircuitBuilder::compute_polynomials() co bb::parallel_for(num_unshifted, [&](size_t i) { auto& poly = unshifted[i]; const auto col_idx = polys_to_cols_unshifted_idx[i]; - size_t col_size = 0; - - // We fully allocate the inverse polynomials. We leave this potential memory optimization for - // later. - if (derived_labels_set.contains(labels[i])) { - col_size = num_rows; - } else { - col_size = col_nonzero_size[col_idx]; - } + const bool is_derived = derived_labels_set.contains(labels[i]); if (poly.is_empty()) { - // Not set above - poly = Polynomial{ /*memory size*/ - col_size, - /*largest possible index as virtual size*/ circuit_subgroup_size, - /*start_index=*/0, - /*/*disable parallel initialisation=*/true - }; + // Not set above. Non-derived unshifted polynomials are initialized below. The + // non-derived ones do need to be initialized with zeros and are fully allocated (size == + // num_rows). + poly = is_derived + ? Polynomial::create_non_parallel_zero_init(num_rows, circuit_subgroup_size) + : Polynomial{ col_nonzero_size[col_idx], + circuit_subgroup_size, + Polynomial::DontZeroMemory::FLAG }; } }); })); diff --git a/bb-pilcom/bb-pil-backend/templates/circuit_builder.cpp.hbs b/bb-pilcom/bb-pil-backend/templates/circuit_builder.cpp.hbs index 537361df77ea..4eb311cd2109 100644 --- a/bb-pilcom/bb-pil-backend/templates/circuit_builder.cpp.hbs +++ b/bb-pilcom/bb-pil-backend/templates/circuit_builder.cpp.hbs @@ -78,22 +78,14 @@ namespace bb { bb::parallel_for(num_unshifted, [&](size_t i) { auto& poly = unshifted[i]; const auto col_idx = polys_to_cols_unshifted_idx[i]; - size_t col_size = 0; - - // We fully allocate the inverse polynomials. We leave this potential memory optimization for later. - if (derived_labels_set.contains(labels[i])) { - col_size = num_rows; - } else { - col_size = col_nonzero_size[col_idx]; - } + const bool is_derived = derived_labels_set.contains(labels[i]); if (poly.is_empty()) { - // Not set above - poly = Polynomial{ /*memory size*/ col_size, - /*largest possible index as virtual size*/ circuit_subgroup_size, - /*start_index=*/0, - /*disable parallel initialization=*/true - }; } + // Not set above. Non-derived unshifted polynomials are initialized below. The non-derived ones + // do need to be initialized with zeros and are fully allocated (size == num_rows). + poly = is_derived ? Polynomial::create_non_parallel_zero_init(num_rows, circuit_subgroup_size) + : Polynomial{ col_nonzero_size[col_idx], circuit_subgroup_size, Polynomial::DontZeroMemory::FLAG }; + } }); }));