Add embench

for now, compile all benchmarks (except one) and run serially
This commit is contained in:
David Venhoff 2025-09-06 17:12:01 +02:00
parent c2e432c219
commit 57ff2f187c
4 changed files with 117 additions and 11 deletions

14
Cargo.lock generated
View File

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

View File

@ -2,3 +2,6 @@
name = "client"
version = "0.1.0"
edition = "2024"
[build-dependencies]
cc = "1.2.36"

97
client/build.rs Normal file
View File

@ -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)
}

View File

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