Add embench
for now, compile all benchmarks (except one) and run serially
This commit is contained in:
parent
c2e432c219
commit
57ff2f187c
14
Cargo.lock
generated
14
Cargo.lock
generated
@ -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"
|
||||
|
@ -2,3 +2,6 @@
|
||||
name = "client"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[build-dependencies]
|
||||
cc = "1.2.36"
|
97
client/build.rs
Normal file
97
client/build.rs
Normal 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)
|
||||
}
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user