From 13553a5fe43934f1a5c78c59dd309a751bc29201 Mon Sep 17 00:00:00 2001 From: Kevaundray Wedderburn Date: Sat, 24 May 2025 22:42:52 +0100 Subject: [PATCH 1/3] cleanup trait bound --- crates/benchmark-runner/src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/crates/benchmark-runner/src/lib.rs b/crates/benchmark-runner/src/lib.rs index c4bcc95e..5738b8c7 100644 --- a/crates/benchmark-runner/src/lib.rs +++ b/crates/benchmark-runner/src/lib.rs @@ -47,10 +47,7 @@ pub enum Action { pub fn run_benchmark_ere(host_name: &str, zkvm_instance: V, action: Action) -> Result<()> where - // C: Compiler + Send + Sync, - // C::Error: std::error::Error + Send + Sync + 'static, V: zkVM + Sync, - // V::Error: std::error::Error + Send + Sync + 'static, { println!("Benchmarking `{}`…", host_name); From 1109aa16863552bd088a5510b98cf5b7d9b464da Mon Sep 17 00:00:00 2001 From: Kevaundray Wedderburn Date: Sat, 24 May 2025 22:48:57 +0100 Subject: [PATCH 2/3] refactor so we use parallel iterator when executing and sequential iterator when proving --- crates/benchmark-runner/src/lib.rs | 107 ++++++++++++++++------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/crates/benchmark-runner/src/lib.rs b/crates/benchmark-runner/src/lib.rs index 5738b8c7..fd424a3b 100644 --- a/crates/benchmark-runner/src/lib.rs +++ b/crates/benchmark-runner/src/lib.rs @@ -50,58 +50,73 @@ where V: zkVM + Sync, { println!("Benchmarking `{}`…", host_name); - let zkvm_ref = Arc::new(&zkvm_instance); - let corpuses = generate_stateless_witness::generate(); - // Iterate through test corpus and generate reports - // TODO: note that when proving, processing these in parallel will likely skew the results - corpuses.into_par_iter().try_for_each(|bw| -> Result<()> { - println!(" {} ({} blocks)", bw.name, bw.blocks_and_witnesses.len()); - - let mut reports = Vec::new(); - for ci in bw.blocks_and_witnesses { - let block_number = ci.block.number; + match action { + Action::Execute => { + // Use parallel iteration for execution + corpuses.into_par_iter().try_for_each(|bw| -> Result<()> { + process_corpus(bw, zkvm_ref.clone(), &action, host_name) + })?; + } + Action::Prove => { + // Use sequential iteration for proving + corpuses.into_iter().try_for_each(|bw| -> Result<()> { + process_corpus(bw, Arc::new(&*zkvm_ref), &action, host_name) + })?; + } + } - let mut stdin = Input::new(); - stdin.write(ci); - stdin.write(bw.network); + Ok(()) +} - let workload_metrics = match action { - Action::Execute => { - let report = zkvm_ref.execute(&stdin)?; - let region_cycles: HashMap<_, _> = report.region_cycles.into_iter().collect(); - WorkloadMetrics::Execution { - name: format!("{}-{}", bw.name, block_number), - total_num_cycles: report.total_num_cycles, - region_cycles, - } +fn process_corpus( + bw: BlocksAndWitnesses, + zkvm_ref: Arc<&V>, + action: &Action, + host_name: &str, +) -> Result<()> +where + V: zkVM + Sync, +{ + println!(" {} ({} blocks)", bw.name, bw.blocks_and_witnesses.len()); + let mut reports = Vec::new(); + + for ci in bw.blocks_and_witnesses { + let block_number = ci.block.number; + let mut stdin = Input::new(); + stdin.write(ci); + stdin.write(bw.network); + + let workload_metrics = match action { + Action::Execute => { + let report = zkvm_ref.execute(&stdin)?; + let region_cycles: HashMap<_, _> = report.region_cycles.into_iter().collect(); + WorkloadMetrics::Execution { + name: format!("{}-{}", bw.name, block_number), + total_num_cycles: report.total_num_cycles, + region_cycles, } - Action::Prove => { - let (proof, report) = zkvm_ref.prove(&stdin)?; - - WorkloadMetrics::Proving { - name: format!("{}-{}", bw.name, block_number), - proving_time_ms: report.proving_time.as_millis(), - } + } + Action::Prove => { + let (_, report) = zkvm_ref.prove(&stdin)?; + WorkloadMetrics::Proving { + name: format!("{}-{}", bw.name, block_number), + proving_time_ms: report.proving_time.as_millis(), } - }; - - reports.push(workload_metrics); - } - - let out_path = format!( - "{}/zkevm-metrics/{}/{}.json", - env!("CARGO_WORKSPACE_DIR"), - host_name, - bw.name - ); - WorkloadMetrics::to_path(out_path, &reports)?; - println!("wrote {} reports", reports.len()); - - Ok(()) - })?; - + } + }; + reports.push(workload_metrics); + } + + let out_path = format!( + "{}/zkevm-metrics/{}/{}.json", + env!("CARGO_WORKSPACE_DIR"), + host_name, + bw.name + ); + WorkloadMetrics::to_path(out_path, &reports)?; + println!("wrote {} reports", reports.len()); Ok(()) } From 8b881f2fa086209dcbe9a3704dfeb1941ff74b0a Mon Sep 17 00:00:00 2001 From: Kevaundray Wedderburn Date: Sat, 24 May 2025 22:50:57 +0100 Subject: [PATCH 3/3] add doc comments --- crates/metrics/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/metrics/src/lib.rs b/crates/metrics/src/lib.rs index 3c4c9736..40c8eabf 100644 --- a/crates/metrics/src/lib.rs +++ b/crates/metrics/src/lib.rs @@ -9,6 +9,7 @@ use thiserror::Error; /// Stores the total cycle count and a breakdown of cycle count per named region. #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum WorkloadMetrics { + /// Metrics produced when benchmarking in execution mode Execution { /// Name of the workload (e.g., "fft", "aes"). name: String, @@ -17,6 +18,7 @@ pub enum WorkloadMetrics { /// Region-specific cycles, mapping region names (e.g., "setup", "compute") to their cycle counts. region_cycles: HashMap, }, + /// Metrics produced when benchmarking in proving mode Proving { /// Name of the workload (e.g., "fft", "aes"). name: String,