aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamen Mladenov <kamen@syndamia.com>2025-03-07 16:22:14 +0200
committerKamen Mladenov <kamen@syndamia.com>2025-03-10 10:25:57 +0200
commit8c3237c2802c0e1e03fbc2f93358e9d2201d9d18 (patch)
tree853d0981d7ddfe4f52c8a1b14b265102bc420f03
parent821a5eacd870f5f9482875cb07b2e5eecd9231a1 (diff)
downloadzkVMs-benchmarks-8c3237c2802c0e1e03fbc2f93358e9d2201d9d18.tar
zkVMs-benchmarks-8c3237c2802c0e1e03fbc2f93358e9d2201d9d18.tar.gz
zkVMs-benchmarks-8c3237c2802c0e1e03fbc2f93358e9d2201d9d18.zip
feat(zkvms_guest_io): Make execution linear, instead of parallel
zkVMs are multithreaded, so having parallel execution will result in inconsistent results, as every zkVM is fighting for resources
-rw-r--r--zkvms_guest_io/src/main.rs60
1 files changed, 24 insertions, 36 deletions
diff --git a/zkvms_guest_io/src/main.rs b/zkvms_guest_io/src/main.rs
index 86e8dde..5f3d4f2 100644
--- a/zkvms_guest_io/src/main.rs
+++ b/zkvms_guest_io/src/main.rs
@@ -1,11 +1,5 @@
use clap::Parser;
use std::process::{Command, Stdio};
-use std::sync::{
- atomic::{AtomicBool, Ordering},
- Arc,
-};
-use std::thread;
-use std::time::Duration;
/// A CLI tool for running and benchmarking a guest program inside all
/// supported zkVMs.
@@ -35,45 +29,39 @@ fn main() {
.split(',')
.filter(|x| !x.is_empty())
.collect();
- let mut threads = Vec::new();
let ignored = cli.ignore.unwrap_or(Vec::new());
- let fail = Arc::new(AtomicBool::new(false));
for guest in guests.into_iter() {
if ignored.iter().any(|i| guest.contains(i)) {
continue;
}
- let args = cli.zkvm_args.clone();
- let fail = fail.clone();
- threads.push(
- thread::Builder::new()
- .name(format!(r#"Running "{}""#, guest))
- .spawn(move || {
- let output = Command::new(guest)
- .args(args)
- .stdout(Stdio::piped())
- .output()
- .expect("failed to run command");
+ println!("== Executing {} ==", guest);
- let mut stdout = String::from_utf8(output.stdout).unwrap();
- if !output.stderr.is_empty() {
- stdout.push('\n');
- stdout += &String::from_utf8(output.stderr).unwrap();
- }
+ let output = Command::new(guest)
+ .args(cli.zkvm_args.clone())
+ .stdout(Stdio::piped())
+ .output();
- print!("== Executing {} ==\n{}", guest, stdout);
- if !output.status.success() {
- fail.store(true, Ordering::Relaxed);
- }
- })
- .expect("failed to spawn thread"),
- );
- }
+ if let Err(msg) = output {
+ println!("Failed to run command {}!", guest);
+ println!("{msg}");
+ if cli.fail_propagation {
+ break;
+ }
+ continue;
+ }
+ let output = output.unwrap();
- while threads.iter().any(|t| !t.is_finished())
- && (!cli.fail_propagation || !fail.load(Ordering::Relaxed))
- {
- thread::sleep(Duration::from_millis(200));
+ if !output.stdout.is_empty() {
+ print!("{}", String::from_utf8(output.stdout).unwrap());
+ }
+ if !output.stderr.is_empty() {
+ print!("{}", String::from_utf8(output.stderr).unwrap());
+ }
+
+ if cli.fail_propagation && !output.status.success() {
+ break;
+ }
}
}