Skip to content

Commit 8c4fde8

Browse files
committed
feat: add async regex benchmark example
1 parent e7d512e commit 8c4fde8

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

benchmarks/prove/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ openvm-native-recursion = { workspace = true, features = ["test-utils"] }
2121

2222
clap = { version = "4.5.9", features = ["derive", "env"] }
2323
eyre.workspace = true
24-
tokio = { version = "1.43.1", features = ["rt", "rt-multi-thread", "macros"] }
24+
tokio = { version = "1.43.1", features = ["rt", "rt-multi-thread", "macros", "time"] }
2525
rand_chacha = { version = "0.3", default-features = false }
2626
k256 = { workspace = true, features = ["ecdsa"] }
2727
tiny-keccak.workspace = true
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
use std::{
2+
env::var,
3+
sync::{
4+
atomic::{AtomicUsize, Ordering},
5+
Arc,
6+
},
7+
time::Duration,
8+
};
9+
10+
use clap::Parser;
11+
use openvm_benchmarks_prove::util::BenchmarkCli;
12+
use openvm_benchmarks_utils::get_programs_dir;
13+
use openvm_sdk::{
14+
config::{SdkVmBuilder, SdkVmConfig},
15+
prover::AppProver,
16+
DefaultStarkEngine, Sdk, StdIn, F,
17+
};
18+
use openvm_stark_sdk::config::setup_tracing;
19+
use tokio::{spawn, task::spawn_blocking, time::sleep};
20+
21+
#[tokio::main]
22+
async fn main() -> eyre::Result<()> {
23+
setup_tracing();
24+
let args = BenchmarkCli::parse();
25+
let mut config = SdkVmConfig::from_toml(include_str!("../../../guest/regex/openvm.toml"))?;
26+
if let Some(max_height) = args.max_segment_length {
27+
config
28+
.app_vm_config
29+
.as_mut()
30+
.segmentation_limits
31+
.max_trace_height = max_height;
32+
}
33+
if let Some(max_cells) = args.segment_max_cells {
34+
config.app_vm_config.as_mut().segmentation_limits.max_cells = max_cells;
35+
}
36+
37+
let sdk = Sdk::new(config)?;
38+
39+
let manifest_dir = get_programs_dir().join("regex");
40+
let elf = sdk.build(Default::default(), manifest_dir, &None, None)?;
41+
let app_exe = sdk.convert_to_exe(elf)?;
42+
43+
let data = include_str!("../../../guest/regex/regex_email.txt");
44+
let fe_bytes = data.to_owned().into_bytes();
45+
let input = StdIn::<F>::from_bytes(&fe_bytes);
46+
47+
let (app_pk, _app_vk) = sdk.app_keygen();
48+
49+
let max_par_jobs: usize = var("MAX_PAR_JOBS").map(|m| m.parse()).unwrap_or(Ok(1))?;
50+
let num_jobs: usize = var("NUM_JOBS").map(|m| m.parse()).unwrap_or(Ok(10))?;
51+
let cur_num_jobs = Arc::new(AtomicUsize::new(0));
52+
53+
let mut tasks = Vec::with_capacity(num_jobs);
54+
for idx in 0..num_jobs {
55+
let cur_num_jobs = cur_num_jobs.clone();
56+
let app_exe = app_exe.clone();
57+
let app_pk = app_pk.clone();
58+
let input = input.clone();
59+
let task = spawn(async move {
60+
loop {
61+
let c = cur_num_jobs.fetch_add(1, Ordering::SeqCst);
62+
if c < max_par_jobs {
63+
tracing::info!("Acquired job {}, cur num jobs {}", idx, c + 1);
64+
break;
65+
}
66+
cur_num_jobs.fetch_sub(1, Ordering::SeqCst);
67+
sleep(Duration::from_millis(100)).await;
68+
}
69+
let res = spawn_blocking(move || -> eyre::Result<()> {
70+
let mut prover = AppProver::<DefaultStarkEngine, _>::new(
71+
SdkVmBuilder,
72+
&app_pk.app_vm_pk,
73+
app_exe,
74+
app_pk.leaf_verifier_program_commit(),
75+
)?;
76+
let _proof = prover.prove(input)?;
77+
Ok(())
78+
})
79+
.await?;
80+
let prev_num = cur_num_jobs.fetch_sub(1, Ordering::SeqCst);
81+
tracing::info!("Decrement cur_num_jobs {} to {}", prev_num, prev_num - 1);
82+
res
83+
});
84+
tasks.push(task);
85+
}
86+
for task in tasks {
87+
task.await??;
88+
}
89+
90+
Ok(())
91+
}

0 commit comments

Comments
 (0)