#benchmark #multi-thread #framework #correct #reproducible #config #shumai

shumai-config-impl

一个高效且准确的并行基准测试框架

10个版本

0.2.2 2023年4月4日
0.2.1 2023年2月11日
0.2.0 2022年2月26日
0.1.6 2022年2月14日
0.1.0 2021年11月28日

#1316 in 进程宏


3 个库中使用(通过 shumai

MIT 许可

15KB
246 代码行

Shumai

Crates.io shumai dependency status

Shumai 是一个多线程基准测试框架,可以产生准确且可重复的结果。

Shumai 是作为 Alchemy 项目的部分开发的,以满足其关于准确和可重复基准测试的学术要求。Shumai 通过自动收集系统信息、基准测试配置和基准测试结果,将可重复性作为首要任务。所有这些数据都将存储在一个 json 文件中。基准测试配置也存储在一个 toml 文件中,该文件应保留在源代码控制之下。

示例

# benchmark.toml

[[Foo]]
name = "foo"
threads = [1, 2, 3]
time = 1
parameter = [1, 2]
// bench_config.rs

#[config(path = "benchmark.toml")]
pub struct Foo {
  pub name: String,
  pub threads: Vec<usize>,
  pub time: usize,
  #[matrix]
  pub parameter: usize,
}


impl ShumaiBench for TestBench {
    type Result = usize;
    type Config = Foo;

    fn load(&self) -> Option<Value> {
        None
    }

    fn run(&self, context: BenchContext<Foo>) -> Self::Result {
	// Barrier to ensure all threads start at the same time
        context.wait_for_start(); 

	// start benchmark
        todo!()
    }

    fn cleanup(&self) -> Option<Value> {
        None
    }
}


fn main() {
    let config = Foo::load()
        .expect("Failed to parse config!");
    let repeat = 3;

    for c in config.iter() {
        let benchmark = TestBench::default();
        let result = shumai::run(&benchmark, c, repeat);
        result.to_json() // save results to a json file
    }
}

使用上述设置,Shumai 将基准测试结果写入 json 文件

{
  "config": {
    "name": "foo-foo-1",
    "threads": [
      1,
      2,
      3
    ],
    "time": 1,
    "a": 1
  },
  "load_results": null,
  "env": {
    "os_release": "5.10.60.1-microsoft-standard-WSL2",
    "rustc_version": "1.59.0",
    "hostname": "DESKTOP-DPOIAG6",
    "cpu_num": 16,
    "cpu_speed": 2894
  },
  "bench_results": [
    {
      "thread_cnt": 1,
      "bench_results": [
        110484492
      ],
      "pcm": [],
      "perf": null
    },
    {
      "thread_cnt": 2,
      "bench_results": [
        222437918
      ],
      "pcm": [],
      "perf": null
    },
    {
      "thread_cnt": 3,
      "bench_results": [
        315043334
      ],
      "pcm": [],
      "perf": null
    }
  ]
}

功能

  • flamegraph 功能可以在零配置的情况下生成基准函数的 flamegraph(而不是整个程序)。

  • pcm 功能收集与 pcm 相关的数据,例如 L3 缓存命中/未命中、内存带宽(包括 DRAM 和 PM)、UPI 带宽等。它需要在目标主机上运行一个 pcm-server。

  • perf 功能收集常见的 perf 统计数据,如 CPU_CYCLESINSTRUCTIONSBRANCH_MISSES 等。

请注意,上述功能可能相互排斥,即您可能一次只能启用一个功能。

控制基准测试执行

Shumai 有两个环境变量可以控制基准测试的执行方式

  • SHUMAI_THREAD:只使用指定的线程数运行基准测试,它必须在基准测试配置中指定。
  • SHUMAI_FILTER:过滤配置,它必须是一个有效的正则表达式字符串。

依赖关系

~1.5MB
~35K SLoC