diff --git a/Cargo.lock b/Cargo.lock index d3d81e87..79989127 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,6 +69,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -633,6 +634,12 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +[[package]] +name = "bytemuck" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31" + [[package]] name = "byteorder" version = "1.4.3" @@ -754,7 +761,7 @@ dependencies = [ "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "once_cell", "strsim", "termcolor", @@ -882,6 +889,15 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "cpp_demangle" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "cpufeatures" version = "0.2.6" @@ -1090,6 +1106,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid 1.10.0", +] + [[package]] name = "der" version = "0.7.8" @@ -1255,6 +1280,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.3" @@ -1295,7 +1326,7 @@ dependencies = [ "sha2", "sha3 0.10.6", "thiserror", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -1495,6 +1526,18 @@ dependencies = [ "subtle", ] +[[package]] +name = "findshlibs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" +dependencies = [ + "cc", + "lazy_static", + "libc", + "winapi", +] + [[package]] name = "fixed-hash" version = "0.8.0" @@ -1757,7 +1800,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -2162,6 +2205,34 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "inferno" +version = "0.11.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" +dependencies = [ + "ahash", + "indexmap 2.4.0", + "is-terminal", + "itoa", + "log", + "num-format", + "once_cell", + "quick-xml", + "rgb", + "str_stack", +] + [[package]] name = "inout" version = "0.1.3" @@ -2190,6 +2261,7 @@ dependencies = [ "itertools 0.10.5", "log", "log4rs", + "pprof", "prover", "rand", "revm 3.5.0", @@ -2431,6 +2503,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memmap2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45fd3a57831bf88bc63f8cebc0cf956116276e97fef3966103e96416209f7c92" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.8.0" @@ -2518,6 +2599,17 @@ dependencies = [ "zktrie", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if 1.0.0", + "libc", +] + [[package]] name = "nom" version = "7.1.3" @@ -2574,6 +2666,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec", + "itoa", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -2933,6 +3035,27 @@ dependencies = [ "thiserror", ] +[[package]] +name = "pprof" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5c97c51bd34c7e742402e216abdeb44d415fbe6ae41d56b114723e953711cb" +dependencies = [ + "backtrace", + "cfg-if 1.0.0", + "findshlibs", + "inferno", + "libc", + "log", + "nix", + "once_cell", + "parking_lot", + "smallvec", + "symbolic-demangle", + "tempfile", + "thiserror", +] + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -3081,6 +3204,15 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick-xml" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.36" @@ -3373,6 +3505,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "rgb" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f86ae463694029097b846d8f99fd5536740602ae00022c0c50c5600720b2f71" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.16.20" @@ -4008,6 +4149,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "stacker" version = "0.1.15" @@ -4027,6 +4174,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "str_stack" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" + [[package]] name = "strsim" version = "0.10.0" @@ -4093,6 +4246,29 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "symbolic-common" +version = "12.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16629323a4ec5268ad23a575110a724ad4544aae623451de600c747bf87b36cf" +dependencies = [ + "debugid", + "memmap2", + "stable_deref_trait", + "uuid 1.10.0", +] + +[[package]] +name = "symbolic-demangle" +version = "12.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c043a45f08f41187414592b3ceb53fb0687da57209cc77401767fb69d5b596" +dependencies = [ + "cpp_demangle", + "rustc-demangle", + "symbolic-common", +] + [[package]] name = "syn" version = "1.0.109" @@ -4305,7 +4481,7 @@ version = "0.19.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" dependencies = [ - "indexmap", + "indexmap 1.9.3", "toml_datetime", "winnow", ] @@ -4481,6 +4657,12 @@ dependencies = [ "serde", ] +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + [[package]] name = "valuable" version = "0.1.0" diff --git a/integration/Cargo.toml b/integration/Cargo.toml index a2f87f33..daec735d 100644 --- a/integration/Cargo.toml +++ b/integration/Cargo.toml @@ -21,6 +21,9 @@ snark-verifier-sdk = { git = "https://github.com/scroll-tech/snark-verifier", br halo2_proofs.workspace = true prover.workspace = true +pprof = { version = "0.13", features = ["flamegraph"], optional = true } + [features] default = ["prove_verify"] prove_verify = [] +pprof = ["dep:pprof"] diff --git a/integration/tests/unit_tests.rs b/integration/tests/unit_tests.rs index eae39470..8eb63c4a 100644 --- a/integration/tests/unit_tests.rs +++ b/integration/tests/unit_tests.rs @@ -8,7 +8,7 @@ use integration::{ }; use prover::{ io::read_all, - utils::{init_env_and_log, short_git_version}, + utils::{init_env_and_log, short_git_version, read_env_var}, zkevm::circuit::{block_traces_to_witness_block, TargetCircuit}, }; @@ -126,9 +126,42 @@ fn estimate_circuit_rows() { init_env_and_log("integration"); prepare_circuit_capacity_checker(); + let repeated = read_env_var("PROF_REPEAT", 20); + let (_, block_trace) = load_chunk_for_test(); - let witness_block = block_traces_to_witness_block(block_trace).unwrap(); + + let mut block_traces = (0..repeated) + .map(|_| block_trace.clone()) + .collect::>(); + log::info!("estimating used rows"); + + #[cfg(feature = "pprof")] + let guard = pprof::ProfilerGuardBuilder::default() + .frequency(1000) + .blocklist(&["libc", "libgcc", "pthread", "vdso"]) + .build() + .unwrap(); + + let now = std::time::Instant::now(); + + for _ in 0..repeated { + let block_trace = std::hint::black_box(&mut block_traces).pop().unwrap(); + let witness_block = block_traces_to_witness_block(std::hint::black_box(block_trace)).unwrap(); + let row_usage = ::Inner::min_num_rows_block_subcircuits(std::hint::black_box(&witness_block)); + std::mem::forget(std::hint::black_box(witness_block)); + std::mem::forget(std::hint::black_box(row_usage)); + } + + let ccc_elapsed = now.elapsed(); + + #[cfg(feature = "pprof")] + if let Ok(report) = guard.report().build() { + let file = std::fs::File::create("flamegraph.svg").unwrap(); + report.flamegraph(file).unwrap(); + }; + + let witness_block = block_traces_to_witness_block(block_trace).unwrap(); let row_usage = ::Inner::min_num_rows_block_subcircuits(&witness_block); let r = row_usage .iter() @@ -136,4 +169,9 @@ fn estimate_circuit_rows() { .unwrap() .clone(); log::info!("final rows: {} {}", r.row_num_real, r.name); + + log::info!( + "ccc_elapsed: {:.2}ms", + ccc_elapsed.as_millis() as f64 / repeated as f64 + ); }