Skip to content

Commit 7e73531

Browse files
authored
feat(avm): parallelize polynomial alloc and set (#8520)
This PR * Parallelizes allocation and initialization of prover polys * Removes duplicated initialization * Removes copy (replaces with move) Improvements in proving time for a 2^20 trace * Creation of prover time goes down 90% * Overall proving time goes down ~40% 2^20 before ``` >>> prove/create_prover_ms: 53011 >>> prove/all_ms: 95457 prove/create_composer_ms: 0 prove/create_verifier_ms: 322 prove/execute_log_derivative_inverse_commitments_round_ms: 2579 prove/execute_log_derivative_inverse_round_ms: 2294 prove/execute_pcs_rounds_ms: 1915 prove/execute_relation_check_rounds_ms: 12066 prove/execute_wire_commitments_round_ms: 1138 prove/gen_trace_ms: 18690 ``` 2^20 after ``` >>> prove/create_prover_ms: 5797 >>> prove/all_ms: 50688 circuit_builder/init_polys_to_be_shifted_ms: 660 circuit_builder/init_polys_unshifted_ms: 301 circuit_builder/set_polys_shifted_ms: 0 circuit_builder/set_polys_unshifted_ms: 4395 composer/create_prover:commitment_key_ms: 152 composer/create_prover:construct_prover_ms: 55 composer/create_prover:proving_key_ms: 177 composer/create_prover:witness_ms: 5410 prove/create_composer_ms: 0 prove/create_verifier_ms: 326 prove/execute_log_derivative_inverse_commitments_round_ms: 2523 prove/execute_log_derivative_inverse_round_ms: 2185 prove/execute_pcs_rounds_ms: 1766 prove/execute_relation_check_rounds_ms: 11966 prove/execute_wire_commitments_round_ms: 1148 prove/gen_trace_ms: 20765 ```
1 parent c458a79 commit 7e73531

File tree

9 files changed

+735
-718
lines changed

9 files changed

+735
-718
lines changed

barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp

+679-664
Large diffs are not rendered by default.

barretenberg/cpp/src/barretenberg/vm/avm/generated/composer.cpp

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// AUTOGENERATED FILE
22
#include "barretenberg/vm/avm/generated/composer.hpp"
3+
#include "barretenberg/vm/stats.hpp"
34

45
namespace bb {
56

@@ -14,20 +15,20 @@ void AvmComposer::compute_witness(CircuitConstructor& circuit)
1415

1516
for (auto [key_poly, prover_poly] : zip_view(proving_key->get_all(), polynomials.get_unshifted())) {
1617
ASSERT(flavor_get_label(*proving_key, key_poly) == flavor_get_label(polynomials, prover_poly));
17-
key_poly = prover_poly;
18+
key_poly = std::move(prover_poly);
1819
}
1920

2021
computed_witness = true;
2122
}
2223

2324
AvmProver AvmComposer::create_prover(CircuitConstructor& circuit_constructor)
2425
{
25-
compute_proving_key(circuit_constructor);
26-
compute_witness(circuit_constructor);
27-
compute_commitment_key(circuit_constructor.get_circuit_subgroup_size());
28-
29-
AvmProver output_state(proving_key, proving_key->commitment_key);
30-
26+
AVM_TRACK_TIME("composer/create_prover:proving_key", compute_proving_key(circuit_constructor));
27+
AVM_TRACK_TIME("composer/create_prover:witness", compute_witness(circuit_constructor));
28+
AVM_TRACK_TIME("composer/create_prover:commitment_key",
29+
compute_commitment_key(circuit_constructor.get_circuit_subgroup_size()));
30+
auto output_state = AVM_TRACK_TIME_V("composer/create_prover:construct_prover",
31+
AvmProver(proving_key, proving_key->commitment_key));
3132
return output_state;
3233
}
3334

@@ -44,10 +45,8 @@ std::shared_ptr<Flavor::ProvingKey> AvmComposer::compute_proving_key(CircuitCons
4445
}
4546

4647
// Initialize proving_key
47-
{
48-
const size_t subgroup_size = circuit_constructor.get_circuit_subgroup_size();
49-
proving_key = std::make_shared<Flavor::ProvingKey>(subgroup_size, 0);
50-
}
48+
const size_t subgroup_size = circuit_constructor.get_circuit_subgroup_size();
49+
proving_key = std::make_shared<Flavor::ProvingKey>(subgroup_size, 0);
5150

5251
return proving_key;
5352
}

barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -2273,14 +2273,8 @@ AvmFlavor::ProvingKey::ProvingKey(const size_t circuit_size, const size_t num_pu
22732273
this->log_circuit_size = numeric::get_msb(circuit_size);
22742274
this->num_public_inputs = num_public_inputs;
22752275

2276-
// Allocate memory for precomputed polynomials
2277-
for (auto& poly : PrecomputedEntities<Polynomial>::get_all()) {
2278-
poly = Polynomial(circuit_size);
2279-
}
2280-
// Allocate memory for witness polynomials
2281-
for (auto& poly : WitnessEntities<Polynomial>::get_all()) {
2282-
poly = Polynomial(circuit_size);
2283-
}
2276+
// The proving key's polynomials are not allocated here because they are later overwritten
2277+
// AvmComposer::compute_witness(). We should probably refactor this flow.
22842278
};
22852279

22862280
/**

barretenberg/cpp/src/barretenberg/vm/avm/generated/prover.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ using FF = Flavor::FF;
2727
* @tparam settings Settings class.
2828
*/
2929
AvmProver::AvmProver(std::shared_ptr<Flavor::ProvingKey> input_key, std::shared_ptr<PCSCommitmentKey> commitment_key)
30-
: key(input_key)
31-
, commitment_key(commitment_key)
30+
: key(std::move(input_key))
31+
, commitment_key(std::move(commitment_key))
3232
{
3333
for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) {
3434
ASSERT(bb::flavor_get_label(prover_polynomials, prover_poly) == bb::flavor_get_label(*key, key_poly));

bb-pilcom/bb-pil-backend/src/lookup_builder.rs

-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ pub fn get_counts_from_lookups(lookups: &[Lookup]) -> Vec<String> {
109109

110110
fn create_lookup_settings_data(lookup: &Lookup) -> Json {
111111
let columns_per_set = lookup.left.cols.len();
112-
let counts_poly_name = lookup.counts_poly.to_owned();
113112

114113
// NOTE: https://github.com/AztecProtocol/aztec-packages/issues/3879
115114
// Settings are not flexible enough to combine inverses

bb-pilcom/bb-pil-backend/templates/circuit_builder.cpp.hbs

+30-15
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "barretenberg/relations/generic_permutation/generic_permutation_relation.hpp"
1111
#include "barretenberg/relations/generic_lookup/generic_lookup_relation.hpp"
1212
#include "barretenberg/honk/proof_system/logderivative_library.hpp"
13+
#include "barretenberg/vm/stats.hpp"
1314

1415
namespace bb {
1516

@@ -18,26 +19,40 @@ namespace bb {
1819
ProverPolynomials polys;
1920

2021
// Allocate mem for each column
21-
22-
for (auto& poly : polys.get_to_be_shifted()) {
23-
poly = Polynomial::shiftable(num_rows);
24-
}
22+
AVM_TRACK_TIME("circuit_builder/init_polys_to_be_shifted", ({
23+
for (auto& poly : polys.get_to_be_shifted()) {
24+
poly = Polynomial{ /*memory size*/ num_rows - 1,
25+
/*largest possible index*/ num_rows,
26+
/*make shiftable with offset*/ 1 };
27+
}
28+
}));
2529
// catch-all with fully formed polynomials
26-
for (auto& poly : polys.get_unshifted()) {
27-
if (poly.is_empty()) {
28-
poly = Polynomial{ num_rows };
29-
}
30-
}
31-
32-
for (size_t i = 0; i < rows.size(); i++) {
30+
AVM_TRACK_TIME("circuit_builder/init_polys_unshifted", ({
31+
auto unshifted = polys.get_unshifted();
32+
bb::parallel_for(unshifted.size(), [&](size_t i) {
33+
auto& poly = unshifted[i];
34+
if (poly.is_empty()) {
35+
// Not set above
36+
poly = Polynomial{ /*memory size*/ num_rows, /*largest possible index*/ num_rows };
37+
}
38+
});
39+
}));
40+
41+
AVM_TRACK_TIME(
42+
"circuit_builder/set_polys_unshifted", ({
43+
bb::parallel_for(rows.size(), [&](size_t i) {
3344
{{#each all_cols_without_inverses as |poly|}}
3445
polys.{{poly}}.set_if_valid_index(i, rows[i].{{poly}});
3546
{{/each}}
36-
}
47+
});
48+
}));
3749

38-
for (auto [shifted, to_be_shifted] : zip_view(polys.get_shifted(), polys.get_to_be_shifted())) {
39-
shifted = to_be_shifted.shifted();
40-
}
50+
AVM_TRACK_TIME(
51+
"circuit_builder/set_polys_shifted", ({
52+
for (auto [shifted, to_be_shifted] : zip_view(polys.get_shifted(), polys.get_to_be_shifted())) {
53+
shifted = to_be_shifted.shifted();
54+
}
55+
}));
4156

4257
return polys;
4358
}

bb-pilcom/bb-pil-backend/templates/composer.cpp.hbs

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// AUTOGENERATED FILE
22
#include "barretenberg/vm/{{snakeCase name}}/generated/composer.hpp"
3+
#include "barretenberg/vm/stats.hpp"
34

45
namespace bb {
56

@@ -14,20 +15,20 @@ void {{name}}Composer::compute_witness(CircuitConstructor& circuit)
1415

1516
for (auto [key_poly, prover_poly] : zip_view(proving_key->get_all(), polynomials.get_unshifted())) {
1617
ASSERT(flavor_get_label(*proving_key, key_poly) == flavor_get_label(polynomials, prover_poly));
17-
key_poly = prover_poly;
18+
key_poly = std::move(prover_poly);
1819
}
1920

2021
computed_witness = true;
2122
}
2223

2324
{{name}}Prover {{name}}Composer::create_prover(CircuitConstructor& circuit_constructor)
2425
{
25-
compute_proving_key(circuit_constructor);
26-
compute_witness(circuit_constructor);
27-
compute_commitment_key(circuit_constructor.get_circuit_subgroup_size());
28-
29-
{{name}}Prover output_state(proving_key, proving_key->commitment_key);
30-
26+
AVM_TRACK_TIME("composer/create_prover:proving_key", compute_proving_key(circuit_constructor));
27+
AVM_TRACK_TIME("composer/create_prover:witness", compute_witness(circuit_constructor));
28+
AVM_TRACK_TIME("composer/create_prover:commitment_key",
29+
compute_commitment_key(circuit_constructor.get_circuit_subgroup_size()));
30+
auto output_state = AVM_TRACK_TIME_V("composer/create_prover:construct_prover",
31+
AvmProver(proving_key, proving_key->commitment_key));
3132
return output_state;
3233
}
3334

bb-pilcom/bb-pil-backend/templates/flavor.cpp.hbs

+2-8
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,8 @@ AvmFlavor::ProvingKey::ProvingKey(const size_t circuit_size, const size_t num_pu
114114
this->log_circuit_size = numeric::get_msb(circuit_size);
115115
this->num_public_inputs = num_public_inputs;
116116

117-
// Allocate memory for precomputed polynomials
118-
for (auto& poly : PrecomputedEntities<Polynomial>::get_all()) {
119-
poly = Polynomial(circuit_size);
120-
}
121-
// Allocate memory for witness polynomials
122-
for (auto& poly : WitnessEntities<Polynomial>::get_all()) {
123-
poly = Polynomial(circuit_size);
124-
}
117+
// The proving key's polynomials are not allocated here because they are later overwritten
118+
// AvmComposer::compute_witness(). We should probably refactor this flow.
125119
};
126120

127121
/**

bb-pilcom/bb-pil-backend/templates/prover.cpp.hbs

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ using FF = Flavor::FF;
2828
*/
2929
{{name}}Prover::{{name}}Prover(std::shared_ptr<Flavor::ProvingKey> input_key,
3030
std::shared_ptr<PCSCommitmentKey> commitment_key)
31-
: key(input_key)
32-
, commitment_key(commitment_key)
31+
: key(std::move(input_key))
32+
, commitment_key(std::move(commitment_key))
3333
{
3434
for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) {
3535
ASSERT(bb::flavor_get_label(prover_polynomials, prover_poly) ==

0 commit comments

Comments
 (0)