From 350e9a7b795a2c01ef65e5383fbae25d494a6ac3 Mon Sep 17 00:00:00 2001 From: ashjeong Date: Tue, 13 Aug 2024 16:26:37 +0900 Subject: [PATCH 1/4] chore(benchmark): fix `Poseidon2` typo --- benchmark/poseidon2/horizen/src/lib.rs | 8 ++++---- benchmark/poseidon2/plonky3/src/lib.rs | 6 +++--- benchmark/poseidon2/poseidon2_benchmark.cc | 10 +++++----- benchmark/poseidon2/poseidon2_benchmark_runner.h | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/benchmark/poseidon2/horizen/src/lib.rs b/benchmark/poseidon2/horizen/src/lib.rs index 2d759975fb..c77c278891 100644 --- a/benchmark/poseidon2/horizen/src/lib.rs +++ b/benchmark/poseidon2/horizen/src/lib.rs @@ -6,14 +6,14 @@ use zkhash::{ }; #[no_mangle] -pub extern "C" fn run_poseidon_horizen_bn254_fr(duration: *mut u64) -> *mut CppFr { - let poseidon = Poseidon2::new(&POSEIDON2_BN256_PARAMS); +pub extern "C" fn run_poseidon2_horizen_bn254_fr(duration: *mut u64) -> *mut CppFr { + let poseidon2 = Poseidon2::new(&POSEIDON2_BN256_PARAMS); - let t = poseidon.get_t(); + let t = poseidon2.get_t(); let input: Vec = (0..t).map(|_i| FpBN256::from(0)).collect(); let start = Instant::now(); - let state = poseidon.permutation(&input); + let state = poseidon2.permutation(&input); unsafe { duration.write(start.elapsed().as_micros() as u64); } diff --git a/benchmark/poseidon2/plonky3/src/lib.rs b/benchmark/poseidon2/plonky3/src/lib.rs index 54ac4f92d6..275a191cf6 100644 --- a/benchmark/poseidon2/plonky3/src/lib.rs +++ b/benchmark/poseidon2/plonky3/src/lib.rs @@ -30,7 +30,7 @@ fn bn254_from_ark_ff(input: ark_FpBN256) -> Bn254Fr { } #[no_mangle] -pub extern "C" fn run_poseidon_plonky3_bn254_fr(duration: *mut u64) -> *mut CppFr { +pub extern "C" fn run_poseidon2_plonky3_bn254_fr(duration: *mut u64) -> *mut CppFr { const WIDTH: usize = 3; const D: u64 = 5; const ROUNDS_F: usize = 8; @@ -56,7 +56,7 @@ pub extern "C" fn run_poseidon_plonky3_bn254_fr(duration: *mut u64) -> *mut CppF .collect::>(); let external_round_constants = round_constants; - let poseidon = + let poseidon2 = Poseidon2::::new( ROUNDS_F, external_round_constants, @@ -73,7 +73,7 @@ pub extern "C" fn run_poseidon_plonky3_bn254_fr(duration: *mut u64) -> *mut CppF .unwrap(); let start = Instant::now(); - poseidon.permute_mut(&mut input); + poseidon2.permute_mut(&mut input); unsafe { duration.write(start.elapsed().as_micros() as u64); } diff --git a/benchmark/poseidon2/poseidon2_benchmark.cc b/benchmark/poseidon2/poseidon2_benchmark.cc index aa4e9ceab7..40b13a41e8 100644 --- a/benchmark/poseidon2/poseidon2_benchmark.cc +++ b/benchmark/poseidon2/poseidon2_benchmark.cc @@ -18,15 +18,15 @@ using namespace crypto; using Field = math::bn254::Fr; -extern "C" tachyon_bn254_fr* run_poseidon_horizen_bn254_fr(uint64_t* duration); -extern "C" tachyon_bn254_fr* run_poseidon_plonky3_bn254_fr(uint64_t* duration); +extern "C" tachyon_bn254_fr* run_poseidon2_horizen_bn254_fr(uint64_t* duration); +extern "C" tachyon_bn254_fr* run_poseidon2_plonky3_bn254_fr(uint64_t* duration); template void Run(SimplePoseidonBenchmarkReporter& reporter, const tachyon::Poseidon2Config& config, Fn horizen_fn, Fn plonky3_fn) { Field::Init(); - PoseidonBenchmarkRunner runner(&reporter, &config); + Poseidon2BenchmarkRunner runner(&reporter, &config); crypto::Poseidon2Config poseidon2_config = crypto::Poseidon2Config::CreateCustom( @@ -65,8 +65,8 @@ int RealMain(int argc, char** argv) { switch (config.prime_field()) { case tachyon::Poseidon2Config::PrimeField::kBn254Fr: { - Run(reporter, config, run_poseidon_horizen_bn254_fr, - run_poseidon_plonky3_bn254_fr); + Run(reporter, config, run_poseidon2_horizen_bn254_fr, + run_poseidon2_plonky3_bn254_fr); break; } } diff --git a/benchmark/poseidon2/poseidon2_benchmark_runner.h b/benchmark/poseidon2/poseidon2_benchmark_runner.h index 74a6db4453..08053afeb1 100644 --- a/benchmark/poseidon2/poseidon2_benchmark_runner.h +++ b/benchmark/poseidon2/poseidon2_benchmark_runner.h @@ -22,14 +22,14 @@ namespace tachyon { template -class PoseidonBenchmarkRunner { +class Poseidon2BenchmarkRunner { public: using CPrimeField = typename c::base::TypeTraits::CType; typedef CPrimeField* (*PoseidonExternalFn)(uint64_t* duration); - PoseidonBenchmarkRunner(SimplePoseidonBenchmarkReporter* reporter, - const Poseidon2Config* config) + Poseidon2BenchmarkRunner(SimplePoseidonBenchmarkReporter* reporter, + const Poseidon2Config* config) : reporter_(reporter), config_(config) {} Field Run(const crypto::Poseidon2Config& config) { From ae13f371e660653d91f7c13606366e8bc60f2880 Mon Sep 17 00:00:00 2001 From: Wonyong Kim Date: Mon, 5 Aug 2024 22:48:55 +0900 Subject: [PATCH 2/4] test(benchmark): add poseidon2 benchmark for baby bear Note that Poseidon2 permutations are now run 100 times to make the difference in results more visible. Authored by @chokobole, fixed by @ashjeong --- Cargo.Bazel.lock | 6 +- Cargo.lock | 1 + benchmark/poseidon2/BUILD.bazel | 3 + benchmark/poseidon2/horizen/src/lib.rs | 38 ++++++-- benchmark/poseidon2/plonky3/Cargo.toml | 1 + benchmark/poseidon2/plonky3/src/lib.rs | 91 +++++++++++++------ benchmark/poseidon2/poseidon2_benchmark.cc | 49 ++++++++-- .../poseidon2/poseidon2_benchmark_runner.h | 6 +- benchmark/poseidon2/poseidon2_config.cc | 4 +- benchmark/poseidon2/poseidon2_config.h | 1 + 10 files changed, 153 insertions(+), 47 deletions(-) diff --git a/Cargo.Bazel.lock b/Cargo.Bazel.lock index f1aea8e4f5..65332bf6e1 100644 --- a/Cargo.Bazel.lock +++ b/Cargo.Bazel.lock @@ -1,5 +1,5 @@ { - "checksum": "d9a69b7b7c2e8f7447076811098173ebe669c22af14223e2e9dfeb933bf91d26", + "checksum": "5d4563b52a4fb67e240f27d8b902c760a53d92fd0b9afc3a6e6c6b6f33bb5236", "crates": { "addchain 0.2.0": { "name": "addchain", @@ -13491,6 +13491,10 @@ "id": "ff 0.13.0", "target": "ff" }, + { + "id": "p3-baby-bear 0.1.3-succinct", + "target": "p3_baby_bear" + }, { "id": "p3-bn254-fr 0.1.3-succinct", "target": "p3_bn254_fr" diff --git a/Cargo.lock b/Cargo.lock index 676e8b428c..f9f4bd2bce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2617,6 +2617,7 @@ name = "plonky3_poseidon2_benchmark" version = "0.0.1" dependencies = [ "ff 0.13.0", + "p3-baby-bear 0.1.3-succinct", "p3-bn254-fr", "p3-field 0.1.3-succinct", "p3-poseidon2 0.1.3-succinct", diff --git a/benchmark/poseidon2/BUILD.bazel b/benchmark/poseidon2/BUILD.bazel index 97eba7b16c..959f0b8b37 100644 --- a/benchmark/poseidon2/BUILD.bazel +++ b/benchmark/poseidon2/BUILD.bazel @@ -41,7 +41,10 @@ tachyon_cc_binary( "//benchmark/poseidon:simple_poseidon_benchmark_reporter", "//benchmark/poseidon2/horizen", "//benchmark/poseidon2/plonky3", + "//tachyon/base/containers:contains", "//tachyon/c/math/elliptic_curves/bn/bn254:fr", + "//tachyon/c/math/finite_fields/baby_bear", "//tachyon/math/elliptic_curves/bn/bn254:poseidon2", + "//tachyon/math/finite_fields/baby_bear:poseidon2", ], ) diff --git a/benchmark/poseidon2/horizen/src/lib.rs b/benchmark/poseidon2/horizen/src/lib.rs index c77c278891..db57fab3b0 100644 --- a/benchmark/poseidon2/horizen/src/lib.rs +++ b/benchmark/poseidon2/horizen/src/lib.rs @@ -1,22 +1,40 @@ -use std::time::Instant; -use tachyon_rs::math::elliptic_curves::bn::bn254::Fr as CppFr; +use std::{sync::Arc, time::Instant}; +use tachyon_rs::math::{ + elliptic_curves::bn::bn254::Fr as CppBn254Fr, finite_fields::baby_bear::BabyBear as CppBabyBear, +}; use zkhash::{ - fields::bn256::FpBN256, - poseidon2::{poseidon2::Poseidon2, poseidon2_instance_bn256::POSEIDON2_BN256_PARAMS}, + ark_ff::PrimeField, + poseidon2::{ + poseidon2::Poseidon2, poseidon2_instance_babybear::POSEIDON2_BABYBEAR_16_PARAMS, + poseidon2_instance_bn256::POSEIDON2_BN256_PARAMS, poseidon2_params::Poseidon2Params, + }, }; -#[no_mangle] -pub extern "C" fn run_poseidon2_horizen_bn254_fr(duration: *mut u64) -> *mut CppFr { - let poseidon2 = Poseidon2::new(&POSEIDON2_BN256_PARAMS); +fn run_poseidon2, R>( + duration: *mut u64, + params: &Arc>, +) -> *mut R { + let poseidon2 = Poseidon2::new(params); let t = poseidon2.get_t(); - let input: Vec = (0..t).map(|_i| FpBN256::from(0)).collect(); + let mut input: Vec = (0..t).map(|_| F::from(0)).collect(); let start = Instant::now(); - let state = poseidon2.permutation(&input); + for _ in 0..100 { + input = poseidon2.permutation(&input); + } unsafe { duration.write(start.elapsed().as_micros() as u64); } + Box::into_raw(Box::new(input[1] as F)) as *mut R +} - Box::into_raw(Box::new(state[1])) as *mut CppFr +#[no_mangle] +pub extern "C" fn run_poseidon2_horizen_baby_bear(duration: *mut u64) -> *mut CppBabyBear { + run_poseidon2::<_, CppBabyBear>(duration, &POSEIDON2_BABYBEAR_16_PARAMS) +} + +#[no_mangle] +pub extern "C" fn run_poseidon2_horizen_bn254_fr(duration: *mut u64) -> *mut CppBn254Fr { + run_poseidon2::<_, CppBn254Fr>(duration, &POSEIDON2_BN256_PARAMS) } diff --git a/benchmark/poseidon2/plonky3/Cargo.toml b/benchmark/poseidon2/plonky3/Cargo.toml index 1aba614f64..f4451333bd 100644 --- a/benchmark/poseidon2/plonky3/Cargo.toml +++ b/benchmark/poseidon2/plonky3/Cargo.toml @@ -17,6 +17,7 @@ publish = false [dependencies] ff = { version = "0.13", features = ["derive", "derive_bits"] } +p3-baby-bear = "0.1.3-succinct" p3-bn254-fr = "0.1.3-succinct" p3-field = "0.1.3-succinct" p3-poseidon2 = "0.1.3-succinct" diff --git a/benchmark/poseidon2/plonky3/src/lib.rs b/benchmark/poseidon2/plonky3/src/lib.rs index 275a191cf6..971183554e 100644 --- a/benchmark/poseidon2/plonky3/src/lib.rs +++ b/benchmark/poseidon2/plonky3/src/lib.rs @@ -1,13 +1,19 @@ +use core::fmt; use ff::PrimeField; +use p3_baby_bear::{BabyBear, DiffusionMatrixBabyBear}; use p3_bn254_fr::{Bn254Fr, DiffusionMatrixBN254, FFBn254Fr}; use p3_field::AbstractField; -use p3_poseidon2::{Poseidon2, Poseidon2ExternalMatrixHL}; +use p3_poseidon2::{DiffusionPermutation, Poseidon2, Poseidon2ExternalMatrixHL}; use p3_symmetric::Permutation; use std::time::Instant; -use tachyon_rs::math::elliptic_curves::bn::bn254::Fr as CppFr; -use zkhash::ark_ff::{BigInteger, PrimeField as ark_PrimeField}; -use zkhash::fields::bn256::FpBN256 as ark_FpBN256; -use zkhash::poseidon2::poseidon2_instance_bn256::RC3; +use tachyon_rs::math::{ + elliptic_curves::bn::bn254::Fr as CppBn254Fr, finite_fields::baby_bear::BabyBear as CppBabyBear, +}; +use zkhash::ark_ff::{BigInteger, Field, PrimeField as ark_PrimeField}; +use zkhash::fields::{babybear::FpBabyBear as ark_FpBabyBear, bn256::FpBN256 as ark_FpBN256}; +use zkhash::poseidon2::{ + poseidon2_instance_babybear::RC16 as BabyBearRC16, poseidon2_instance_bn256::RC3 as BN256RC3, +}; fn bn254_from_ark_ff(input: ark_FpBN256) -> Bn254Fr { let bytes = input.into_bigint().to_bytes_le(); @@ -29,20 +35,32 @@ fn bn254_from_ark_ff(input: ark_FpBN256) -> Bn254Fr { } } -#[no_mangle] -pub extern "C" fn run_poseidon2_plonky3_bn254_fr(duration: *mut u64) -> *mut CppFr { - const WIDTH: usize = 3; - const D: u64 = 5; - const ROUNDS_F: usize = 8; - const ROUNDS_P: usize = 56; +fn baby_bear_from_ark_ff(input: ark_FpBabyBear) -> BabyBear { + BabyBear::from_canonical_u32(input.into_bigint().0[0] as u32) +} +fn run_poseidon2< + const WIDTH: usize, + const D: u64, + const ROUNDS_F: usize, + const ROUNDS_P: usize, + NativeF: p3_field::PrimeField + fmt::Debug, + F: Field, + R, + DiffusionMatrix: DiffusionPermutation, +>( + duration: *mut u64, + rc: &Vec>, + from_ark_ff: &dyn Fn(F) -> NativeF, + diffusion_matrix: DiffusionMatrix, +) -> *mut R { // Copy over round constants from zkhash. - let mut round_constants: Vec<[Bn254Fr; WIDTH]> = RC3 + let mut round_constants: Vec<[NativeF; WIDTH]> = rc .iter() .map(|vec| { vec.iter() .cloned() - .map(bn254_from_ark_ff) + .map(from_ark_ff) .collect::>() .try_into() .unwrap() @@ -56,27 +74,48 @@ pub extern "C" fn run_poseidon2_plonky3_bn254_fr(duration: *mut u64) -> *mut Cpp .collect::>(); let external_round_constants = round_constants; - let poseidon2 = - Poseidon2::::new( - ROUNDS_F, - external_round_constants, - Poseidon2ExternalMatrixHL, - ROUNDS_P, - internal_round_constants, - DiffusionMatrixBN254, - ); + let poseidon2 = Poseidon2::::new( + ROUNDS_F, + external_round_constants, + Poseidon2ExternalMatrixHL, + ROUNDS_P, + internal_round_constants, + diffusion_matrix, + ); - let mut input = (0..3) - .map(|_i| Bn254Fr::zero()) + let mut input = (0..WIDTH) + .map(|_i| NativeF::zero()) .collect::>() .try_into() .unwrap(); let start = Instant::now(); - poseidon2.permute_mut(&mut input); + for _ in 0..100 { + poseidon2.permute_mut(&mut input); + } unsafe { duration.write(start.elapsed().as_micros() as u64); } - Box::into_raw(Box::new(input[1])) as *mut CppFr + Box::into_raw(Box::new(input[1])) as *mut R +} + +#[no_mangle] +pub extern "C" fn run_poseidon2_plonky3_baby_bear(duration: *mut u64) -> *mut CppBabyBear { + run_poseidon2::<16, 7, 8, 13, BabyBear, ark_FpBabyBear, CppBabyBear, DiffusionMatrixBabyBear>( + duration, + &BabyBearRC16, + &baby_bear_from_ark_ff, + DiffusionMatrixBabyBear, + ) +} + +#[no_mangle] +pub extern "C" fn run_poseidon2_plonky3_bn254_fr(duration: *mut u64) -> *mut CppBn254Fr { + run_poseidon2::<3, 5, 8, 56, Bn254Fr, ark_FpBN256, CppBn254Fr, DiffusionMatrixBN254>( + duration, + &BN256RC3, + &bn254_from_ark_ff, + DiffusionMatrixBN254, + ) } diff --git a/benchmark/poseidon2/poseidon2_benchmark.cc b/benchmark/poseidon2/poseidon2_benchmark.cc index 40b13a41e8..1a3a5a4dee 100644 --- a/benchmark/poseidon2/poseidon2_benchmark.cc +++ b/benchmark/poseidon2/poseidon2_benchmark.cc @@ -5,19 +5,26 @@ #include "benchmark/poseidon2/poseidon2_benchmark_runner.h" #include "benchmark/poseidon2/poseidon2_config.h" // clang-format on +#include "tachyon/base/containers/contains.h" #include "tachyon/base/logging.h" #include "tachyon/c/math/elliptic_curves/bn/bn254/fr.h" #include "tachyon/c/math/elliptic_curves/bn/bn254/fr_type_traits.h" +#include "tachyon/c/math/finite_fields/baby_bear/baby_bear.h" +#include "tachyon/c/math/finite_fields/baby_bear/baby_bear_type_traits.h" #include "tachyon/crypto/hashes/sponge/poseidon2/poseidon2_config.h" #include "tachyon/math/elliptic_curves/bn/bn254/fr.h" #include "tachyon/math/elliptic_curves/bn/bn254/poseidon2.h" +#include "tachyon/math/finite_fields/baby_bear/baby_bear.h" +#include "tachyon/math/finite_fields/baby_bear/poseidon2.h" namespace tachyon { using namespace crypto; -using Field = math::bn254::Fr; - +extern "C" tachyon_baby_bear* run_poseidon2_horizen_baby_bear( + uint64_t* duration); +extern "C" tachyon_baby_bear* run_poseidon2_plonky3_baby_bear( + uint64_t* duration); extern "C" tachyon_bn254_fr* run_poseidon2_horizen_bn254_fr(uint64_t* duration); extern "C" tachyon_bn254_fr* run_poseidon2_plonky3_bn254_fr(uint64_t* duration); @@ -28,10 +35,22 @@ void Run(SimplePoseidonBenchmarkReporter& reporter, Poseidon2BenchmarkRunner runner(&reporter, &config); - crypto::Poseidon2Config poseidon2_config = - crypto::Poseidon2Config::CreateCustom( - 2, 5, 8, 56, math::bn254::GetPoseidon2InternalDiagonalVector<3>()); - + crypto::Poseidon2Config poseidon2_config; + if constexpr (std::is_same_v) { + if (base::Contains(config.vendors(), + tachyon::Poseidon2Config::Vendor::kPlonky3)) { + poseidon2_config = crypto::Poseidon2Config::CreateCustom( + 15, 7, 8, 13, math::GetPoseidon2BabyBearInternalShiftVector<15>()); + CHECK_EQ(config.vendors().size(), static_cast(1)) + << "Run one vendor at a time for Baby Bear!"; + } else { + poseidon2_config = crypto::Poseidon2Config::CreateCustom( + 15, 7, 8, 13, math::GetPoseidon2BabyBearInternalDiagonalVector<16>()); + } + } else { + poseidon2_config = crypto::Poseidon2Config::CreateCustom( + 2, 5, 8, 56, math::bn254::GetPoseidon2InternalDiagonalVector<3>()); + } Field result = runner.Run(poseidon2_config); for (const tachyon::Poseidon2Config::Vendor vendor : config.vendors()) { Field result_vendor; @@ -45,7 +64,18 @@ void Run(SimplePoseidonBenchmarkReporter& reporter, } if (config.check_results()) { - CHECK_EQ(result, result_vendor) << "Result not matched"; + if constexpr (Field::Config::kModulusBits < 32) { + if (vendor == tachyon::Poseidon2Config::Vendor::kHorizen) { + // NOTE(ashjeong): horizen's montgomery R = tachyon's montgomery R² + CHECK_EQ(result, Field::FromMontgomery(result_vendor.ToBigInt()[0])) + << "Tachyon and Horizen results do not match"; + } else { + CHECK_EQ(result, result_vendor) + << "Tachyon and Plonky3 results do not match"; + } + } else { + CHECK_EQ(result, result_vendor) << "Results do not match"; + } } } } @@ -64,6 +94,11 @@ int RealMain(int argc, char** argv) { } switch (config.prime_field()) { + case tachyon::Poseidon2Config::PrimeField::kBabyBear: { + Run(reporter, config, run_poseidon2_horizen_baby_bear, + run_poseidon2_plonky3_baby_bear); + break; + } case tachyon::Poseidon2Config::PrimeField::kBn254Fr: { Run(reporter, config, run_poseidon2_horizen_bn254_fr, run_poseidon2_plonky3_bn254_fr); diff --git a/benchmark/poseidon2/poseidon2_benchmark_runner.h b/benchmark/poseidon2/poseidon2_benchmark_runner.h index 08053afeb1..8d2184bb91 100644 --- a/benchmark/poseidon2/poseidon2_benchmark_runner.h +++ b/benchmark/poseidon2/poseidon2_benchmark_runner.h @@ -33,14 +33,16 @@ class Poseidon2BenchmarkRunner { : reporter_(reporter), config_(config) {} Field Run(const crypto::Poseidon2Config& config) { - Field ret; + Field ret = Field::Zero(); for (size_t i = 0; i < config_->repeating_num(); ++i) { crypto::Poseidon2Sponge>> sponge(config); crypto::SpongeState state(config); base::TimeTicks start = base::TimeTicks::Now(); - sponge.Permute(state); + for (size_t j = 0; j < 100; ++j) { + sponge.Permute(state); + } reporter_->AddTime(i, (base::TimeTicks::Now() - start).InSecondsF()); if (i == 0) { ret = state.elements[1]; diff --git a/benchmark/poseidon2/poseidon2_config.cc b/benchmark/poseidon2/poseidon2_config.cc index c87b94e3ab..1b5c46df4a 100644 --- a/benchmark/poseidon2/poseidon2_config.cc +++ b/benchmark/poseidon2/poseidon2_config.cc @@ -12,7 +12,9 @@ class FlagValueTraits { static bool ParseValue(std::string_view input, Poseidon2Config::PrimeField* value, std::string* reason) { - if (input == "bn254_fr") { + if (input == "baby_bear") { + *value = Poseidon2Config::PrimeField::kBabyBear; + } else if (input == "bn254_fr") { *value = Poseidon2Config::PrimeField::kBn254Fr; } else { *reason = absl::Substitute("Unknown prime field: $0", input); diff --git a/benchmark/poseidon2/poseidon2_config.h b/benchmark/poseidon2/poseidon2_config.h index 22cbe393f8..ec2a0e1b0c 100644 --- a/benchmark/poseidon2/poseidon2_config.h +++ b/benchmark/poseidon2/poseidon2_config.h @@ -11,6 +11,7 @@ namespace tachyon { class Poseidon2Config { public: enum class PrimeField { + kBabyBear, kBn254Fr, }; From 53d91e4eeef104275e4f240f97c2517a28a2e694 Mon Sep 17 00:00:00 2001 From: ashjeong Date: Tue, 13 Aug 2024 13:27:07 +0900 Subject: [PATCH 3/4] docs(benchmark): fix up bn254 benchmark docs --- benchmark/poseidon2/README.md | 74 +++++++++--------- .../poseidon2_benchmark_bn254_mac_m3.png | Bin 0 -> 23941 bytes .../poseidon2_benchmark_bn254_ubuntu_i9.png | Bin 0 -> 21886 bytes .../poseidon2/poseidon2_benchmark_mac_m3.png | Bin 20608 -> 0 bytes .../poseidon2_benchmark_ubuntu_i9.png | Bin 19802 -> 0 bytes 5 files changed, 39 insertions(+), 35 deletions(-) create mode 100644 benchmark/poseidon2/poseidon2_benchmark_bn254_mac_m3.png create mode 100644 benchmark/poseidon2/poseidon2_benchmark_bn254_ubuntu_i9.png delete mode 100644 benchmark/poseidon2/poseidon2_benchmark_mac_m3.png delete mode 100644 benchmark/poseidon2/poseidon2_benchmark_ubuntu_i9.png diff --git a/benchmark/poseidon2/README.md b/benchmark/poseidon2/README.md index 8ad2734aa6..737aa8d6b3 100644 --- a/benchmark/poseidon2/README.md +++ b/benchmark/poseidon2/README.md @@ -15,42 +15,46 @@ CPU Caches: L2 Unified 4096 KiB (x12) ``` +Note that Poseidon2 runs 100x per test due to some time results being too small when running a single iteration. + +## BN254 + ```shell bazel run -c opt --//:has_openmp --//:has_rtti --//:has_matplotlib //benchmark/poseidon2:poseidon2_benchmark -- -p bn254_fr --vendor horizen --vendor plonky3 --check_results ``` -#### On Intel i9-13900K - -| Repetition | Tachyon | Horizen | Plonky3 | -| :--------- | ------- | ----------- | ------- | -| 0 | 8e-06 | **7e-06** | 1e-05 | -| 1 | 7e-06 | **5e-06** | 8e-06 | -| 2 | 5e-06 | **4e-06** | 8e-06 | -| 3 | 6e-06 | **4e-06** | 8e-06 | -| 4 | 5e-06 | **3e-06** | 7e-06 | -| 5 | 6e-06 | **3e-06** | 7e-06 | -| 6 | 5e-06 | **3e-06** | 7e-06 | -| 7 | 6e-06 | **3e-06** | 7e-06 | -| 8 | 5e-06 | **4e-06** | 7e-06 | -| 9 | 5e-06 | **3e-06** | 7e-06 | -| avg | 5.8e-06 | **3.9e-06** | 7.6e-06 | - -![image](/benchmark/poseidon2/poseidon2_benchmark_ubuntu_i9.png) - -#### On Mac M3 Pro - -| Repetition | Tachyon | Horizen | Plonky3 | -| :--------- | ------- | ----------- | -------- | -| 0 | 1.3e-05 | **1.2e-05** | 1.5e-05 | -| 1 | 1e-05 | **8e-06** | 1.1e-05 | -| 2 | 9e-06 | **7e-06** | 1e-05 | -| 3 | 9e-06 | **7e-06** | 1e-05 | -| 4 | 9e-06 | **7e-06** | 1e-05 | -| 5 | 9e-06 | **7e-06** | 1e-05 | -| 6 | 9e-06 | **7e-06** | 1e-05 | -| 7 | 9e-06 | **7e-06** | 1e-05 | -| 8 | 9e-06 | **7e-06** | 1e-05 | -| 9 | 9e-06 | **7e-06** | 1e-05 | -| avg | 9.5e-06 | **7.6e-06** | 1.06e-05 | - -![image](/benchmark/poseidon2/poseidon2_benchmark_mac_m3.png) +### On Intel i9-13900K + +| Trial Number | Tachyon | Horizen | Plonky3 | +| :----------- | --------- | ------------- | --------- | +| 0 | 0.000788 | **0.000534** | 0.000876 | +| 1 | 0.000628 | **0.000585** | 0.00087 | +| 2 | 0.000624 | **0.000517** | 0.000865 | +| 3 | 0.000622 | **0.000513** | 0.000866 | +| 4 | 0.000634 | **0.000603** | 0.000861 | +| 5 | 0.000628 | **0.000512** | 0.001002 | +| 6 | 0.000618 | **0.00051** | 0.000853 | +| 7 | 0.000616 | **0.000553** | 0.000852 | +| 8 | 0.0007 | **0.000693** | 0.000873 | +| 9 | 0.000614 | **0.000525** | 0.000937 | +| avg | 0.0006472 | **0.0005545** | 0.0008855 | + +![image](/benchmark/poseidon2/poseidon2_benchmark_bn254_ubuntu_i9.png) + +### On Mac M3 Pro + +| Trial Number | Tachyon | Horizen | Plonky3 | +| :----------- | --------- | ------------- | --------- | +| 0 | 0.001053 | **0.000816** | 0.001186 | +| 1 | 0.001033 | **0.00076** | 0.001177 | +| 2 | 0.001019 | **0.000726** | 0.001157 | +| 3 | 0.001012 | **0.000712** | 0.001172 | +| 4 | 0.001007 | **0.000691** | 0.001152 | +| 5 | 0.001023 | **0.000684** | 0.001131 | +| 6 | 0.001051 | **0.000682** | 0.001123 | +| 7 | 0.001005 | **0.000678** | 0.001116 | +| 8 | 0.000996 | **0.000687** | 0.001118 | +| 9 | 0.001003 | **0.00068** | 0.001127 | +| avg | 0.0010202 | **0.0007116** | 0.0011459 | + +![image](/benchmark/poseidon2/poseidon2_benchmark_bn254_mac_m3.png) diff --git a/benchmark/poseidon2/poseidon2_benchmark_bn254_mac_m3.png b/benchmark/poseidon2/poseidon2_benchmark_bn254_mac_m3.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd20f84aada48d56c26554883f94bc80a041109 GIT binary patch literal 23941 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 KRQ!pHxBnk&^k$_1 literal 0 HcmV?d00001 diff --git a/benchmark/poseidon2/poseidon2_benchmark_mac_m3.png b/benchmark/poseidon2/poseidon2_benchmark_mac_m3.png deleted file mode 100644 index f2a90bf513d44c5391612972304f683405385921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20608 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 IUb+3h0F{ZF&Hw-a From 67d1c515b91a0bd985abe56872347284377e9ce8 Mon Sep 17 00:00:00 2001 From: ashjeong Date: Tue, 13 Aug 2024 13:34:58 +0900 Subject: [PATCH 4/4] docs(benchmark): add baby bear poseidon2 benchmark results --- benchmark/poseidon2/README.md | 88 ++++++++++++++++++ ...on2_benchmark_baby_bear_horizen_mac_m3.png | Bin 0 -> 26579 bytes ..._benchmark_baby_bear_horizen_ubuntu_i9.png | Bin 0 -> 25674 bytes ...on2_benchmark_baby_bear_plonky3_mac_m3.png | Bin 0 -> 26495 bytes ..._benchmark_baby_bear_plonky3_ubuntu_i9.png | Bin 0 -> 24088 bytes 5 files changed, 88 insertions(+) create mode 100644 benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_mac_m3.png create mode 100644 benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_ubuntu_i9.png create mode 100644 benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_mac_m3.png create mode 100644 benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_ubuntu_i9.png diff --git a/benchmark/poseidon2/README.md b/benchmark/poseidon2/README.md index 737aa8d6b3..ef0039c3ed 100644 --- a/benchmark/poseidon2/README.md +++ b/benchmark/poseidon2/README.md @@ -58,3 +58,91 @@ bazel run -c opt --//:has_openmp --//:has_rtti --//:has_matplotlib //benchmark/p | avg | 0.0010202 | **0.0007116** | 0.0011459 | ![image](/benchmark/poseidon2/poseidon2_benchmark_bn254_mac_m3.png) + +## Baby Bear + +Note: Horizen and Plonky3 compute values with a different internal matrix, requiring them to be compared with Tachyon separately. + +### Horizen + +```shell +bazel run -c opt --//:has_openmp --//:has_rtti --//:has_matplotlib //benchmark/poseidon2:poseidon2_benchmark -- -p baby_bear --vendor horizen --check_results +``` + +#### On Intel i9-13900K + +| Trial Number | Tachyon | Horizen | +| :----------- | ------------- | --------- | +| 0 | **0.000127** | 0.000381 | +| 1 | **0.000126** | 0.00036 | +| 2 | **0.000125** | 0.00037 | +| 3 | **0.000125** | 0.000356 | +| 4 | **0.000125** | 0.000354 | +| 5 | **0.000125** | 0.000354 | +| 6 | **0.000125** | 0.000354 | +| 7 | **0.000125** | 0.00036 | +| 8 | **0.000125** | 0.000359 | +| 9 | **0.000125** | 0.000353 | +| avg | **0.0001253** | 0.0003601 | + +![image](/benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_ubuntu_i9.png) + +#### On Mac M3 Pro + +| Trial Number | Tachyon | Horizen | +| :----------- | ------------- | --------- | +| 0 | **0.000191** | 0.000203 | +| 1 | **0.000191** | 0.0002 | +| 2 | **0.000189** | 0.0002 | +| 3 | **0.000188** | 0.0002 | +| 4 | **0.000194** | 0.000199 | +| 5 | **0.000188** | 0.000199 | +| 6 | **0.000189** | 0.000199 | +| 7 | **0.000189** | 0.000199 | +| 8 | **0.000188** | 0.0002 | +| 9 | **0.000188** | 0.000199 | +| avg | **0.0001895** | 0.0001998 | + +![image](/benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_mac_m3.png) + +### Plonky3 + +```shell +bazel run -c opt --//:has_openmp --//:has_rtti --//:has_matplotlib //benchmark/poseidon2:poseidon2_benchmark -- -p baby_bear --vendor plonky3 --check_results +``` + +#### On Intel i9-13900K + +| Trial Number | Tachyon | Plonky3 | +| :----------- | --------- | ------------ | +| 0 | 0.000112 | **6.6e-05** | +| 1 | 0.000111 | **6.5e-05** | +| 2 | 0.000111 | **6.6e-05** | +| 3 | 0.000111 | **6.6e-05** | +| 4 | 0.00011 | **6.6e-05** | +| 5 | 0.000116 | **6.6e-05** | +| 6 | 0.00011 | **6.5e-05** | +| 7 | 0.000109 | **6.6e-05** | +| 8 | 0.00011 | **6.6e-05** | +| 9 | 0.000109 | **6.5e-05** | +| avg | 0.0001109 | **6.57e-05** | + +![image](/benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_ubuntu_i9.png) + +#### On Mac M3 Pro + +| Trial Number | Tachyon | Plonky3 | +| :----------- | --------- | ------------- | +| 0 | 0.000169 | **0.000106** | +| 1 | 0.000167 | **0.000105** | +| 2 | 0.000166 | **0.000105** | +| 3 | 0.000169 | **0.000105** | +| 4 | 0.000167 | **0.000105** | +| 5 | 0.00017 | **0.000105** | +| 6 | 0.000168 | **0.000105** | +| 7 | 0.000167 | **0.000105** | +| 8 | 0.000168 | **0.000105** | +| 9 | 0.000168 | **0.000105** | +| avg | 0.0001679 | **0.0001051** | + +![image](/benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_mac_m3.png)**** diff --git a/benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_mac_m3.png b/benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_mac_m3.png new file mode 100644 index 0000000000000000000000000000000000000000..edbb95e902e1f9a0ec3ce93e82b2b3cf82040976 GIT binary patch literal 26579 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 literal 0 HcmV?d00001 diff --git a/benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_ubuntu_i9.png b/benchmark/poseidon2/poseidon2_benchmark_baby_bear_horizen_ubuntu_i9.png new file mode 100644 index 0000000000000000000000000000000000000000..e56d89e31508bdd59ee8b5f6e58c1d35fa8c572b GIT binary patch literal 25674 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 literal 0 HcmV?d00001 diff --git a/benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_mac_m3.png b/benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_mac_m3.png new file mode 100644 index 0000000000000000000000000000000000000000..c767ea5b0ea48c08b439f313e24932f14e5d3ba6 GIT binary patch literal 26495 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 z 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 Bw+8?K literal 0 HcmV?d00001 diff --git a/benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_ubuntu_i9.png b/benchmark/poseidon2/poseidon2_benchmark_baby_bear_plonky3_ubuntu_i9.png new file mode 100644 index 0000000000000000000000000000000000000000..2002933ad223e04ad3963cf7d80b863452fd0838 GIT binary patch literal 24088 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%0Asw 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