From 57ff2f187cbfaf230ee1ba53cb41637aa6f87e0e Mon Sep 17 00:00:00 2001 From: David Venhoff Date: Sat, 6 Sep 2025 17:12:01 +0200 Subject: [PATCH] Add embench for now, compile all benchmarks (except one) and run serially --- Cargo.lock | 14 ++++++- client/Cargo.toml | 3 ++ client/build.rs | 97 +++++++++++++++++++++++++++++++++++++++++++++++ client/src/lib.rs | 14 +++---- 4 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 client/build.rs diff --git a/Cargo.lock b/Cargo.lock index a30835e..cd2742a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -144,10 +144,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.31" +version = "1.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -207,6 +208,9 @@ checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "client" version = "0.1.0" +dependencies = [ + "cc", +] [[package]] name = "cmake" @@ -342,6 +346,12 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "find-msvc-tools" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" + [[package]] name = "fs4" version = "0.5.4" diff --git a/client/Cargo.toml b/client/Cargo.toml index 325f3d4..e99dab1 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -2,3 +2,6 @@ name = "client" version = "0.1.0" edition = "2024" + +[build-dependencies] +cc = "1.2.36" \ No newline at end of file diff --git a/client/build.rs b/client/build.rs new file mode 100644 index 0000000..46ea92c --- /dev/null +++ b/client/build.rs @@ -0,0 +1,97 @@ +use std::fmt::Write; +use std::path::PathBuf; +use std::process::Command; +use std::str::FromStr; +use std::{env, fs}; + +const BENCHMARKS: &[&str] = &[ + "src/ud/libud.c", + // "src/wikisort/libwikisort.c", Error: undefined reference to rand_beebs + "src/nbody/nbody.c", + "src/edn/libedn.c", + "src/st/libst.c", + "src/aha-mont64/mont64.c", + "src/matmult-int/matmult-int.c", + "src/slre/libslre.c", + "src/tarfind/tarfind.c", + "src/sglib-combined/combined.c", + "src/huffbench/libhuffbench.c", + "src/nsichneu/libnsichneu.c", + "src/minver/libminver.c", + "src/statemate/libstatemate.c", + "src/crc32/crc_32.c", + "src/picojpeg/libpicojpeg.c", + "src/cubic/basicmath_small.c", + "src/md5sum/md5.c", + "src/qrduino/qrtest.c", + "src/nettle-aes/nettle-aes.c", + "src/primecount/primecount.c", + "src/nettle-sha256/nettle-sha256.c", +]; + +fn main() { + println!("cargo:rerun-if-changed=coremark/"); + + let out_dir = env::var("OUT_DIR").unwrap(); + Command::new("git") + .args(&["clone", "https://github.com/embench/embench-iot"]) + .current_dir(&out_dir) + .spawn() + .unwrap() + .wait() + .unwrap(); + + let embench_dir = PathBuf::from_str(&format!("{out_dir}/embench-iot")).unwrap(); + + let mut generated_code = String::new(); + let mut benchmark_functions = vec![]; + + for &benchmark_file in BENCHMARKS { + let path = embench_dir.join(benchmark_file); + let dir = path.parent().unwrap(); + let benchmark_name = dir.file_name().unwrap().to_string_lossy(); + let (wrapper_path, function_name) = make_wrapper(&benchmark_name, &out_dir); + cc::Build::new() + .include(embench_dir.join("support")) + .include(dir) + .file(&path) + .file(&wrapper_path) + .define("CPU_MHZ", "2700") // FIXME: Use correct CPU frequency + .compile(&format!("libembench_{benchmark_name}.a")); + + write!( + generated_code, + r#" + unsafe extern "C" {{ + fn {function_name}(); + }}"# + ) + .unwrap(); + benchmark_functions.push(function_name); + } + + write!(generated_code, "pub unsafe fn benchmark_all() {{ ").unwrap(); + for function_name in benchmark_functions { + write!(generated_code, "unsafe {{ {function_name}(); }}\n").unwrap(); + } + write!(generated_code, "}}").unwrap(); + + fs::write(&format!("{out_dir}/libembench-sys.rs"), generated_code).unwrap(); +} + +fn make_wrapper(benchmark_name: &str, out_dir: &str) -> (PathBuf, String) { + let benchmark_name = benchmark_name.replace("-", "_"); + let function_name = format!("benchmark_{benchmark_name}"); + let code = format!( + r#" + extern int benchmark(void); + + void {function_name}(void) {{ + benchmark(); + }} + "# + ); + let path = PathBuf::from(out_dir).join(&format!("{benchmark_name}_wrapper.c")); + fs::write(&path, code).unwrap(); + (path, function_name) +} diff --git a/client/src/lib.rs b/client/src/lib.rs index 78636c0..965328a 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -1,15 +1,11 @@ -pub fn collect_primes(c: u64) { - for i in 2..c { - std::hint::black_box(is_prime(i)); - } -} - -fn is_prime(number: u64) -> bool { - !(2..(number / 2)).any(|it| number % it == 0) +mod embench_sys { + include!(concat!(env!("OUT_DIR"), "/libembench-sys.rs")); } pub fn program() { - collect_primes(std::hint::black_box(300_000)); + unsafe { + embench_sys::benchmark_all(); + } } /// This method is used to benchmark without nyx