Skip to content

Commit f90d4e6

Browse files
committed
chore(avm): basic stat collection
1 parent f401a9a commit f90d4e6

8 files changed

Lines changed: 285 additions & 128 deletions

File tree

barretenberg/cpp/src/barretenberg/bb/main.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,12 @@ void avm_prove(const std::filesystem::path& bytecode_path,
712712
vinfo("vk written to: ", vk_path);
713713
write_file(vk_fields_path, { vk_json.begin(), vk_json.end() });
714714
vinfo("vk as fields written to: ", vk_fields_path);
715+
716+
#ifdef AVM_TRACK_STATS
717+
info("------- STATS -------");
718+
const auto& stats = avm_trace::Stats::get();
719+
info(stats.to_string());
720+
#endif
715721
}
716722

717723
/**

barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_common.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "barretenberg/common/throw_or_abort.hpp"
44
#include "barretenberg/serialize/msgpack.hpp"
55
#include "barretenberg/vm/avm_trace/constants.hpp"
6+
#include "barretenberg/vm/avm_trace/stats.hpp"
67
#include "barretenberg/vm/generated/avm_flavor.hpp"
78

89
#include <array>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "barretenberg/vm/avm_trace/stats.hpp"
2+
3+
#include <chrono>
4+
#include <cstdint>
5+
#include <string>
6+
#include <vector>
7+
8+
namespace bb::avm_trace {
9+
10+
Stats& Stats::get()
11+
{
12+
static Stats stats;
13+
return stats;
14+
}
15+
16+
void Stats::reset()
17+
{
18+
stats.clear();
19+
}
20+
21+
void Stats::increment(const std::string& key, uint64_t value)
22+
{
23+
stats[key] += value;
24+
}
25+
26+
void Stats::time(const std::string& key, std::function<void()> f)
27+
{
28+
auto start = std::chrono::system_clock::now();
29+
f();
30+
auto elapsed = std::chrono::system_clock::now() - start;
31+
increment(key, static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count()));
32+
}
33+
34+
std::string Stats::to_string() const
35+
{
36+
std::vector<std::string> result;
37+
result.reserve(stats.size());
38+
for (const auto& [key, value] : stats) {
39+
result.push_back(key + ": " + std::to_string(value));
40+
}
41+
std::sort(result.begin(), result.end());
42+
std::string joined;
43+
for (auto& s : result) {
44+
joined += std::move(s) + "\n";
45+
}
46+
return joined;
47+
}
48+
49+
std::string Stats::aggregate_to_string(const std::string& key_prefix) const
50+
{
51+
uint64_t result = 0;
52+
for (const auto& [key, value] : stats) {
53+
if (key.starts_with(key_prefix)) {
54+
result += value;
55+
}
56+
}
57+
return key_prefix + ": " + std::to_string(result);
58+
}
59+
60+
} // namespace bb::avm_trace
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
#include <functional>
5+
#include <string>
6+
#include <unordered_map>
7+
8+
// To enable stats tracking, compile in RelWithAssert mode.
9+
// cmake --preset $PRESET -DCMAKE_BUILD_TYPE=RelWithAssert
10+
#ifndef NDEBUG
11+
#define AVM_TRACK_STATS
12+
#endif
13+
14+
#ifdef AVM_TRACK_STATS
15+
#define AVM_TRACK_TIME(key, body) ::bb::avm_trace::Stats::get().time(key, [&]() { body; });
16+
#else
17+
#define AVM_TRACK_TIME(key, body) body
18+
#endif
19+
20+
namespace bb::avm_trace {
21+
22+
class Stats {
23+
public:
24+
static Stats& get();
25+
void reset();
26+
void increment(const std::string& key, uint64_t value);
27+
void time(const std::string& key, std::function<void()> f);
28+
std::string to_string() const;
29+
std::string aggregate_to_string(const std::string& key_prefix) const;
30+
31+
private:
32+
Stats() = default;
33+
34+
std::unordered_map<std::string, uint64_t> stats;
35+
};
36+
37+
} // namespace bb::avm_trace

barretenberg/cpp/src/barretenberg/vm/generated/avm_flavor.hpp

Lines changed: 163 additions & 108 deletions
Large diffs are not rendered by default.

barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "barretenberg/polynomials/polynomial.hpp"
1010
#include "barretenberg/relations/permutation_relation.hpp"
1111
#include "barretenberg/sumcheck/sumcheck.hpp"
12+
#include "barretenberg/vm/avm_trace/stats.hpp"
1213

1314
namespace bb {
1415

@@ -240,18 +241,18 @@ HonkProof AvmProver::construct_proof()
240241
execute_preamble_round();
241242

242243
// Compute wire commitments
243-
execute_wire_commitments_round();
244+
AVM_TRACK_TIME("proving/wire_commitments_round_ms", execute_wire_commitments_round());
244245

245246
// Compute sorted list accumulator and commitment
246-
execute_log_derivative_inverse_round();
247+
AVM_TRACK_TIME("proving/log_derivative_inverse_round_ms", execute_log_derivative_inverse_round());
247248

248249
// Fiat-Shamir: alpha
249250
// Run sumcheck subprotocol.
250-
execute_relation_check_rounds();
251+
AVM_TRACK_TIME("proving/relation_check_rounds_ms", execute_relation_check_rounds());
251252

252253
// Fiat-Shamir: rho, y, x, z
253254
// Execute Zeromorph multilinear PCS
254-
execute_pcs_rounds();
255+
AVM_TRACK_TIME("proving/pcs_rounds_ms", execute_pcs_rounds());
255256

256257
return export_proof();
257258
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ fn flavor_includes(name: &str, relation_file_names: &[String], lookups: &[String
128128
129129
#include \"barretenberg/relations/generic_permutation/generic_permutation_relation.hpp\"
130130
131+
#include \"barretenberg/vm/avm_trace/stats.hpp\"
131132
#include \"barretenberg/flavor/flavor_macros.hpp\"
132133
#include \"barretenberg/transcript/transcript.hpp\"
133134
#include \"barretenberg/polynomials/evaluation_domain.hpp\"
@@ -568,7 +569,7 @@ fn create_compute_logderivative_inverses(flavor_name: &str, lookups: &[String])
568569
}
569570

570571
let compute_inverse_transformation = |lookup_name: &String| {
571-
format!("bb::compute_logderivative_inverse<{flavor_name}Flavor, {lookup_name}_relation<FF>>(prover_polynomials, relation_parameters, this->circuit_size);")
572+
format!("AVM_TRACK_TIME(\"compute_logderivative_inverse/{lookup_name}_ms\", (bb::compute_logderivative_inverse<{flavor_name}Flavor, {lookup_name}_relation<FF>>(prover_polynomials, relation_parameters, this->circuit_size)));")
572573
};
573574

574575
let compute_inverses = map_with_newline(lookups, compute_inverse_transformation);

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

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,8 @@ impl ProverBuilder for BBFiles {
8181
fn create_prover_cpp(&mut self, name: &str, lookup_names: &[String]) {
8282
let include_str = includes_cpp(&snake_case(name));
8383

84-
let polynomial_commitment_phase = create_commitments_phase();
85-
86-
let (call_log_derivative_phase, log_derivative_inverse_phase): (String, String) =
87-
if lookup_names.is_empty() {
88-
("".to_owned(), "".to_owned())
89-
} else {
90-
(
91-
"execute_log_derivative_inverse_round();".to_owned(),
92-
create_log_derivative_inverse_round(lookup_names),
93-
)
94-
};
84+
let polynomial_commitment_phase = create_commitments_phase(commitment_polys);
85+
let log_derivative_inverse_phase = create_log_derivative_inverse_round(lookup_names);
9586

9687
let prover_cpp = format!("
9788
{include_str}
@@ -206,18 +197,18 @@ impl ProverBuilder for BBFiles {
206197
execute_preamble_round();
207198
208199
// Compute wire commitments
209-
execute_wire_commitments_round();
200+
AVM_TRACK_TIME(\"proving/wire_commitments_round_ms\", execute_wire_commitments_round());
210201
211202
// Compute sorted list accumulator and commitment
212-
{call_log_derivative_phase}
203+
AVM_TRACK_TIME(\"proving/log_derivative_inverse_round_ms\", execute_log_derivative_inverse_round());
213204
214205
// Fiat-Shamir: alpha
215206
// Run sumcheck subprotocol.
216-
execute_relation_check_rounds();
207+
AVM_TRACK_TIME(\"proving/relation_check_rounds_ms\", execute_relation_check_rounds());
217208
218209
// Fiat-Shamir: rho, y, x, z
219210
// Execute Zeromorph multilinear PCS
220-
execute_pcs_rounds();
211+
AVM_TRACK_TIME(\"proving/pcs_rounds_ms\", execute_pcs_rounds());
221212
222213
return export_proof();
223214
}}
@@ -264,6 +255,7 @@ fn includes_cpp(name: &str) -> String {
264255
#include \"barretenberg/polynomials/polynomial.hpp\"
265256
#include \"barretenberg/relations/permutation_relation.hpp\"
266257
#include \"barretenberg/sumcheck/sumcheck.hpp\"
258+
#include \"barretenberg/vm/avm_trace/stats.hpp\"
267259
"
268260
)
269261
}
@@ -296,6 +288,10 @@ fn create_commitments_phase() -> String {
296288
}
297289

298290
fn create_log_derivative_inverse_round(lookup_operations: &[String]) -> String {
291+
if lookup_operations.is_empty() {
292+
return "".to_owned();
293+
}
294+
299295
let all_commit_operations = map_with_newline(lookup_operations, commitment_transform);
300296
let send_to_verifier_operations =
301297
map_with_newline(lookup_operations, send_to_verifier_transform);

0 commit comments

Comments
 (0)