feat(bb): consider polynomial end_index when constructing partially evaluated multivariates#12530
feat(bb): consider polynomial end_index when constructing partially evaluated multivariates#12530
Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. |
164245b to
77cd95d
Compare
77cd95d to
caf6579
Compare
| } | ||
| }; | ||
|
|
||
| /** |
There was a problem hiding this comment.
Just moved because this class refers to ProverPolynomials.
caf6579 to
90bed9f
Compare
90bed9f to
4c353b0
Compare
barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp
Outdated
Show resolved
Hide resolved
barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp
Outdated
Show resolved
Hide resolved
| FF expected_lo = v00 * (FF(1) - round_challenge_0) + v10 * round_challenge_0; | ||
| FF expected_hi = v01 * (FF(1) - round_challenge_0) + v11 * round_challenge_0; | ||
|
|
||
| sumcheck.partially_evaluated_polynomials = typename Flavor::PartiallyEvaluatedMultivariates(multivariate_n); |
There was a problem hiding this comment.
why reassign? should probably just change the constructor in sumcheck itself
There was a problem hiding this comment.
oh I see, that constructor was just removed and moved to the prove() function
There was a problem hiding this comment.
Yeah this test itself is not very nice. It tests "partially_evaluate" on itself, but that's not how the usual flow goes.
There was a problem hiding this comment.
Thanks for taking this on; the memory savings are fantastic. There's still a little room for optimization I believe. You actually allocate up to double the memory necessary. I also realize that a lot of these changes were made with the assumption that the polynomials are nonzero starting from 0, rather than some arbitrary start_index. That's fine though, we can keep it like that for now since that's the main use case for this optimization.
946e1f3 to
f8f25c7
Compare
| for (auto [poly, full_poly] : zip_view(get_all(), full_polynomials.get_all())) { | ||
| size_t desired_size = std::min(full_poly.end_index(), halved_circuit_size); | ||
| poly = Polynomial(desired_size, halved_circuit_size); | ||
| poly = Polynomial(full_poly.end_index() / 2, circuit_size / 2); |
There was a problem hiding this comment.
looking at this again, I would be wary of off-by-issues. I think if the end_index was odd like it was 7, then, we would actually want the poly size to be 4, not 3.
20bf171 to
5d74c12
Compare
| multivariate_challenge.emplace_back(round_challenge); | ||
| // Prepare sumcheck book-keeping table for the next round | ||
| partially_evaluate(partially_evaluated_polynomials, round.round_size, round_challenge); | ||
| partially_evaluate(partially_evaluated_polynomials, round_idx, round_challenge); |
There was a problem hiding this comment.
there's confusingly 2 prove functions (and many other functions) - one for normal, one with zk. So both need to be updated similarly
| pep_view[j].at(i >> 1) = | ||
| polynomials[j][i] + round_challenge * (polynomials[j][i + 1] - polynomials[j][i]); | ||
| const auto& poly = polynomials[j]; | ||
| size_t actual_end_index = (poly.end_index() + 1) / (1 << (round_index - 1)); |
There was a problem hiding this comment.
I think this is the wrong partially_evaluate to update? No idea what PolynomialT is and where this is used...
There was a problem hiding this comment.
is this only used in the partially evaluation test? if so, maybe we can just get rid of this function...
| @@ -0,0 +1,10 @@ | |||
| #pragma once | |||
There was a problem hiding this comment.
nit: not really a bitop but its fine
There was a problem hiding this comment.
he yes I know, but didn't want to create a whole new directory. Give me a name for it and I'll create it :)
There was a problem hiding this comment.
If we create a function for this, I would like it to be "overflow/underflow" safe.
If we restrict such a function to work on "unsigned types" then one elegant solution is:
q = x/y + (x % y != 0); (Credit to https://stackoverflow.com/a/14878734)
Or for any signed type integer:
int div = a / b;
if (((a ^ b) >= 0) && (a % b != 0))
div++;
(Credit to https://stackoverflow.com/a/924160)
d947ebf to
ab1c419
Compare
ab1c419 to
89964cc
Compare
jeanmon
left a comment
There was a problem hiding this comment.
LGTM and great improvement!
lucasxia01
left a comment
There was a problem hiding this comment.
Looks good! Agree with Jean that the optimizations we were suggesting should be possible, but also agree that we can just get this in first.
| // Prepare sumcheck book-keeping table for the next round | ||
| partially_evaluate(partially_evaluated_polynomials, round.round_size, round_challenge); | ||
| // Prepare sumcheck book-keeping table for the next round. | ||
| partially_evaluate(partially_evaluated_polynomials, multivariate_n >> round_idx, round_challenge); |
There was a problem hiding this comment.
why this change? to make it more clear what this is?
There was a problem hiding this comment.
Ah, it is kind of a leftover of many changes that I had and rolled back. However now that you mention it, it is kind of nice to use multivariate_n in round 0 and multivariate_n >> round_idx here. I'll keep it just because CI is green but feel free to change!
|
Partially handles AztecProtocol/barretenberg#1120, but maybe a followup will fully close it |
🤖 I have created a new Aztec Packages release --- ## [0.79.0](v0.78.1...v0.79.0) (2025-03-11) ### ⚠ BREAKING CHANGES * aggregate data for batch calls ([#12562](#12562)) ### Features * add extra attributes to target_info ([#12583](#12583)) ([c296422](c296422)) * add optional oracle resolver url in `acvm_cli` (noir-lang/noir#7630) ([cc6cdbb](cc6cdbb)) * allow to pay via sponsored fpc from cli ([#12598](#12598)) ([877de5c](877de5c)) * array concat method (noir-lang/noir#7199) ([cc6cdbb](cc6cdbb)) * **avm:** ToRadix gadget ([#12528](#12528)) ([02a7171](02a7171)) * aztec-up -v flag ([#12590](#12590)) ([6a41565](6a41565)) * **bb:** consider polynomial end_index when constructing partially evaluated multivariates ([#12530](#12530)) ([abd22cd](abd22cd)) * **config:** add fallbacks ([#12593](#12593)) ([f2f9ef3](f2f9ef3)) * **p2p:** add trusted peers mechanics ([#12447](#12447)) ([d67f7e8](d67f7e8)) * **p2p:** peer manager peer count metrics ([#12575](#12575)) ([b4891c1](b4891c1)) * provision alerts ([#12561](#12561)) ([2ea1767](2ea1767)) * Resolve callstacks in protocol circuit errors on wasm ([#12573](#12573)) ([657299b](657299b)) ### Bug Fixes * aggregate data for batch calls ([#12562](#12562)) ([bd0b3b6](bd0b3b6)) * broken kind transfer test ([#12611](#12611)) ([6e91934](6e91934)) * Cl/release fixes 2 ([#12595](#12595)) ([fc597f4](fc597f4)) * Cl/release noir refs ([#12597](#12597)) ([fdcfcaf](fdcfcaf)) * demote log ([#12626](#12626)) ([bec8953](bec8953)) * deploy method test ([#12609](#12609)) ([f2c06c2](f2c06c2)) * Do not report epoch as complete until blocks have synced ([#12638](#12638)) ([2ddfa76](2ddfa76)), closes [#12625](#12625) * Error on infinitely recursive types (noir-lang/noir#7579) ([cc6cdbb](cc6cdbb)) * get L1 tx utils config from env ([#12620](#12620)) ([d930c01](d930c01)) * Log overflow handling in reset ([#12579](#12579)) ([283b624](283b624)) * metrics update ([#12571](#12571)) ([80a5df2](80a5df2)) * **sandbox:** query release please manifest for version if in a docker container ([#12591](#12591)) ([db8ebc6](db8ebc6)) * **spartan:** setup needs kubectl ([#12580](#12580)) ([753cb33](753cb33)) * update dead partial notes link ([#12629](#12629)) ([5a1dc4c](5a1dc4c)) * update error message to display 128 bits as valid bit size (noir-lang/noir#7626) ([cc6cdbb](cc6cdbb)) * update fallback transport ([#12470](#12470)) ([88f0711](88f0711)) ### Miscellaneous * bump external pinned commits (noir-lang/noir#7640) ([cc6cdbb](cc6cdbb)) * **ci3:** add helper for uncached test introspection ([#12618](#12618)) ([9ac518b](9ac518b)) * **ci3:** better memsuspend_limit comment ([#12622](#12622)) ([de84187](de84187)) * clean up upgrade test and other small things ([#12558](#12558)) ([c28abe1](c28abe1)) * cleanup eth artifacts + misc aztec.js reorg ([#12563](#12563)) ([6623244](6623244)) * **docs:** Updated accounts page ([#12019](#12019)) ([d45dac9](d45dac9)) * Fix mac build ([#12610](#12610)) ([adceed6](adceed6)) * gemini soundness regression test ([#12570](#12570)) ([c654106](c654106)) * more sane e2e_prover/full timeout ([#12619](#12619)) ([add9d35](add9d35)) * reactivate acir_test for `regression_5045` ([#12548](#12548)) ([c89f89c](c89f89c)) * remove unnecessary trait bounds (noir-lang/noir#7635) ([cc6cdbb](cc6cdbb)) * Rename `StructDefinition` to `TypeDefinition` (noir-lang/noir#7614) ([cc6cdbb](cc6cdbb)) * replace relative paths to noir-protocol-circuits ([4f7f5c3](4f7f5c3)) * replace relative paths to noir-protocol-circuits ([0f68d11](0f68d11)) * replace relative paths to noir-protocol-circuits ([8f593ce](8f593ce)) * replace relative paths to noir-protocol-circuits ([251ae38](251ae38)) * rollup library cleanup ([#12621](#12621)) ([361fc59](361fc59)) * **sandbox:** drop cheat-codes log level ([#12586](#12586)) ([24f04c7](24f04c7)) * **sandbox:** expose anvil port ([#12599](#12599)) ([955f1b0](955f1b0)) * **testnet:** updating script for ignition, change naming ([#12566](#12566)) ([2d7b69d](2d7b69d)) * turn on masking in eccvm ([#12467](#12467)) ([aacb91a](aacb91a)) * Update Bb line counting script ([#12350](#12350)) ([7a41843](7a41843)) * update docs to reflect u128 type (noir-lang/noir#7623) ([cc6cdbb](cc6cdbb)) * Validate blobs posted to sink belong to our L2 ([#12587](#12587)) ([9578f1e](9578f1e)), closes [#12497](#12497) ### Documentation * update cli-wallet commands in profiler doc ([#12568](#12568)) ([239a4fb](239a4fb)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).

This fixes the sumcheck memory peak.
Takes AVM memory usage for a trivial transaction from
33GB(projected100GBon full VM) to5GB.Hopefully also useful for other flavors, when the trace is not full.
This also improves sumcheck performance (thanks @jeanmon and @lucasxia01 for the suggestions on this)