fluxbench_core/bencher/
batch_size.rs1pub const SETUP_CHUNK: u64 = 1024;
7
8pub const LARGE_INPUT_CHUNK: u64 = 16;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum BatchSize {
17 SmallInput,
19 LargeInput,
21 PerIteration,
23 NumBatches(u64),
25 NumIterations(u64),
27}
28
29impl BatchSize {
30 pub(super) fn batch_len(self, iters: u64) -> u64 {
32 let len = match self {
33 BatchSize::SmallInput => SETUP_CHUNK,
34 BatchSize::LargeInput => LARGE_INPUT_CHUNK,
35 BatchSize::PerIteration => 1,
36 BatchSize::NumBatches(batches) => iters.div_ceil(batches.max(1)),
37 BatchSize::NumIterations(size) => size,
38 };
39 len.clamp(1, iters.max(1))
40 }
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 #[test]
48 fn fixed_sizes_cap_at_the_sample() {
49 assert_eq!(BatchSize::SmallInput.batch_len(5_000), 1024);
50 assert_eq!(BatchSize::SmallInput.batch_len(10), 10);
51 assert_eq!(BatchSize::LargeInput.batch_len(5_000), 16);
52 assert_eq!(BatchSize::LargeInput.batch_len(3), 3);
53 assert_eq!(BatchSize::PerIteration.batch_len(5_000), 1);
54 }
55
56 #[test]
57 fn num_batches_rounds_up() {
58 assert_eq!(BatchSize::NumBatches(4).batch_len(10), 3);
59 assert_eq!(BatchSize::NumBatches(1).batch_len(10), 10);
60 assert_eq!(BatchSize::NumBatches(0).batch_len(10), 10);
61 assert_eq!(BatchSize::NumBatches(100).batch_len(10), 1);
62 }
63
64 #[test]
65 fn num_iterations_clamps() {
66 assert_eq!(BatchSize::NumIterations(7).batch_len(10), 7);
67 assert_eq!(BatchSize::NumIterations(70).batch_len(10), 10);
68 assert_eq!(BatchSize::NumIterations(0).batch_len(10), 1);
69 }
70
71 #[test]
72 fn zero_iters_still_gives_one() {
73 assert_eq!(BatchSize::SmallInput.batch_len(0), 1);
74 }
75}