|
| 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