-
Notifications
You must be signed in to change notification settings - Fork 103
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adds benchmark suite for the PG-Goblin client IVC scheme. The only real caveat is that we only consider function circuits of size 2^17 since our PG code doesn't support folding unequal sizes. Results at present: ``` ----------------------------------------------------------------- Benchmark Time CPU Iterations ----------------------------------------------------------------- IvcBench/Full/6 66891 ms 63569 ms 1 ``` ---------
- Loading branch information
1 parent
0bc971f
commit 13ac9cf
Showing
9 changed files
with
288 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,11 @@ | ||
add_subdirectory(basics_bench) | ||
add_subdirectory(decrypt_bench) | ||
add_subdirectory(goblin_bench) | ||
add_subdirectory(ipa_bench) | ||
add_subdirectory(ivc_bench) | ||
add_subdirectory(pippenger_bench) | ||
add_subdirectory(plonk_bench) | ||
add_subdirectory(ultra_bench) | ||
add_subdirectory(goblin_bench) | ||
add_subdirectory(basics_bench) | ||
add_subdirectory(protogalaxy_bench) | ||
add_subdirectory(relations_bench) | ||
add_subdirectory(widgets_bench) | ||
add_subdirectory(protogalaxy_bench) | ||
add_subdirectory(ultra_bench) | ||
add_subdirectory(widgets_bench) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
barretenberg_module(ivc_bench client_ivc stdlib_recursion stdlib_sha256 stdlib_merkle_tree stdlib_primitives) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,178 @@ | ||
|
||
#include <benchmark/benchmark.h> | ||
|
||
#include "barretenberg/benchmark/ultra_bench/mock_proofs.hpp" | ||
#include "barretenberg/client_ivc/client_ivc.hpp" | ||
#include "barretenberg/common/op_count_google_bench.hpp" | ||
#include "barretenberg/goblin/goblin.hpp" | ||
#include "barretenberg/goblin/mock_circuits.hpp" | ||
#include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp" | ||
#include "barretenberg/ultra_honk/ultra_composer.hpp" | ||
|
||
using namespace benchmark; | ||
using namespace bb; | ||
|
||
namespace { | ||
|
||
/** | ||
* @brief Benchmark suite for the aztec client PG-Goblin IVC scheme | ||
* | ||
*/ | ||
class IvcBench : public benchmark::Fixture { | ||
public: | ||
using Builder = GoblinUltraCircuitBuilder; | ||
|
||
// Number of function circuits to accumulate(based on Zacs target numbers) | ||
static constexpr size_t NUM_ITERATIONS_MEDIUM_COMPLEXITY = 6; | ||
|
||
void SetUp([[maybe_unused]] const ::benchmark::State& state) override | ||
{ | ||
bb::srs::init_crs_factory("../srs_db/ignition"); | ||
bb::srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); | ||
} | ||
|
||
/** | ||
* @brief Perform a specified number of function circuit accumulation rounds | ||
* @details Each round "accumulates" a mock function circuit and a mock kernel circuit. Each round thus consists of | ||
* the generation of two circuits, two folding proofs and two Merge proofs. To match the sizes called out in the | ||
* spec | ||
* (https://github.com/AztecProtocol/aztec-packages/blob/master/yellow-paper/docs/cryptography/performance-targets.md) | ||
* we set the size of the function circuit to be 2^17. The first one should be 2^19 but we can't currently support | ||
* folding circuits of unequal size. | ||
* | ||
*/ | ||
static void perform_ivc_accumulation_rounds(State& state, ClientIVC& ivc) | ||
{ | ||
// Initialize IVC with function circuit | ||
Builder function_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(function_circuit); | ||
ivc.initialize(function_circuit); | ||
|
||
// Accumulate kernel circuit (first kernel mocked as simple circuit since no folding proofs yet) | ||
Builder kernel_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(kernel_circuit); | ||
auto kernel_fold_proof = ivc.accumulate(kernel_circuit); | ||
|
||
auto NUM_CIRCUITS = static_cast<size_t>(state.range(0)); | ||
NUM_CIRCUITS -= 1; // Subtract one to account for the "initialization" round above | ||
for (size_t circuit_idx = 0; circuit_idx < NUM_CIRCUITS; ++circuit_idx) { | ||
|
||
// Accumulate function circuit | ||
Builder function_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(function_circuit); | ||
auto function_fold_proof = ivc.accumulate(function_circuit); | ||
|
||
// Accumulate kernel circuit | ||
Builder kernel_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_folding_kernel(kernel_circuit, function_fold_proof, kernel_fold_proof); | ||
auto kernel_fold_proof = ivc.accumulate(kernel_circuit); | ||
} | ||
} | ||
}; | ||
|
||
/** | ||
* @brief Benchmark the prover work for the full PG-Goblin IVC protocol | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Full)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
for (auto _ : state) { | ||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct IVC scheme proof (fold, decider, merge, eccvm, translator) | ||
ivc.prove(); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the accumulation rounds | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Accumulate)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
// Perform a specified number of iterations of function/kernel accumulation | ||
for (auto _ : state) { | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the Decider component | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Decide)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct eccvm proof, measure only translator proof construction | ||
for (auto _ : state) { | ||
ivc.decider_prove(); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the ECCVM component | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, ECCVM)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct and measure eccvm only | ||
for (auto _ : state) { | ||
ivc.goblin.prove_eccvm(); | ||
} | ||
} | ||
|
||
/** | ||
* @brief Benchmark only the Translator component | ||
* | ||
*/ | ||
BENCHMARK_DEFINE_F(IvcBench, Translator)(benchmark::State& state) | ||
{ | ||
ClientIVC ivc; | ||
|
||
BB_REPORT_OP_COUNT_IN_BENCH(state); | ||
// Perform a specified number of iterations of function/kernel accumulation | ||
perform_ivc_accumulation_rounds(state, ivc); | ||
|
||
// Construct eccvm proof, measure only translator proof construction | ||
ivc.goblin.prove_eccvm(); | ||
for (auto _ : state) { | ||
ivc.goblin.prove_translator(); | ||
} | ||
} | ||
|
||
#define ARGS \ | ||
Arg(IvcBench::NUM_ITERATIONS_MEDIUM_COMPLEXITY) \ | ||
->Arg(1 << 0) \ | ||
->Arg(1 << 1) \ | ||
->Arg(1 << 2) \ | ||
->Arg(1 << 3) \ | ||
->Arg(1 << 4) \ | ||
->Arg(1 << 5) \ | ||
->Arg(1 << 6) | ||
|
||
BENCHMARK_REGISTER_F(IvcBench, Full)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, Accumulate)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, Decide)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, ECCVM)->Unit(benchmark::kMillisecond)->ARGS; | ||
BENCHMARK_REGISTER_F(IvcBench, Translator)->Unit(benchmark::kMillisecond)->ARGS; | ||
|
||
} // namespace | ||
|
||
BENCHMARK_MAIN(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
42 changes: 42 additions & 0 deletions
42
cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#include "barretenberg/client_ivc/client_ivc.hpp" | ||
#include "barretenberg/goblin/mock_circuits.hpp" | ||
#include "barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp" | ||
#include "barretenberg/ultra_honk/ultra_composer.hpp" | ||
#include <gtest/gtest.h> | ||
|
||
using namespace bb; | ||
|
||
/** | ||
* @brief For benchmarking, we want to be sure that our mocking functions create circuits of a known size. We control | ||
* this, to the degree that matters for proof construction time, using these "pinning tests" that fix values. | ||
* | ||
*/ | ||
class MockKernelTest : public ::testing::Test { | ||
protected: | ||
static void SetUpTestSuite() { srs::init_crs_factory("../srs_db/ignition"); } | ||
}; | ||
|
||
TEST_F(MockKernelTest, PinFoldingKernelSizes) | ||
{ | ||
ClientIVC ivc; | ||
|
||
// Accumulate three circuits to generate two folding proofs for input to folding kernel | ||
GoblinUltraCircuitBuilder circuit_1{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(circuit_1); | ||
ivc.initialize(circuit_1); | ||
|
||
GoblinUltraCircuitBuilder circuit_2{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(circuit_2); | ||
auto fold_proof_1 = ivc.accumulate(circuit_2); | ||
|
||
GoblinUltraCircuitBuilder circuit_3{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_function_circuit(circuit_3); | ||
auto fold_proof_2 = ivc.accumulate(circuit_3); | ||
|
||
// Construct kernel circuit | ||
GoblinUltraCircuitBuilder kernel_circuit{ ivc.goblin.op_queue }; | ||
GoblinMockCircuits::construct_mock_folding_kernel(kernel_circuit, fold_proof_1, fold_proof_2); | ||
GoblinUltraComposer composer; | ||
auto instance = composer.create_instance(kernel_circuit); | ||
EXPECT_EQ(instance->proving_key->log_circuit_size, 17); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters