|
| 1 | +use clap::Parser; |
1 | 2 | use packed_seq::SeqVec;
|
2 | 3 | use seq_hash::{NtHasher, SeqHasher};
|
| 4 | +use simd_minimizers::private::sliding_min::Cache; |
| 5 | + |
| 6 | +#[derive(clap::Parser)] |
| 7 | +struct Args { |
| 8 | + #[arg(short)] |
| 9 | + a: bool, |
| 10 | + #[arg(short)] |
| 11 | + b: bool, |
| 12 | + #[arg(short)] |
| 13 | + c: bool, |
| 14 | + #[arg(short)] |
| 15 | + d: bool, |
| 16 | + |
| 17 | + #[arg(short)] |
| 18 | + n: Option<usize>, |
| 19 | +} |
3 | 20 |
|
4 | 21 | fn main() {
|
5 | 22 | let k = 9;
|
6 | 23 | let w = 19;
|
7 | 24 |
|
| 25 | + let Args { a, b, c, d, n } = Args::parse(); |
| 26 | + |
| 27 | + let ns = n.map(|n| vec![n]).unwrap_or( vec![50, 150, 300, 1000, 10000, 100000]); |
| 28 | + |
8 | 29 | eprintln!(" n fwd simd/scalar can simd/scalar");
|
9 |
| - for n in [50, 100, 150, 500, 10000, 100000, 1000000] { |
10 |
| - let seq = packed_seq::PackedSeqVec::random(n); |
| 30 | + for n in ns { |
11 | 31 | eprint!("{n:>7}: ");
|
12 | 32 |
|
13 |
| - let time = bench(w, n, &seq, &NtHasher::<false>::new(k), false, true); |
14 |
| - eprint!(" {:5.2}", time); |
15 |
| - let time = bench(w, n, &seq, &NtHasher::<false>::new(k), false, false); |
16 |
| - eprint!(" {:5.2}", time); |
| 33 | + if a { |
| 34 | + let time = bench(w, n, &NtHasher::<false>::new(k), false, true); |
| 35 | + eprint!(" {:5.2}", time); |
| 36 | + } |
| 37 | + if b { |
| 38 | + let time = bench(w, n, &NtHasher::<false>::new(k), false, false); |
| 39 | + eprint!(" {:5.2}", time); |
| 40 | + } |
17 | 41 |
|
18 |
| - let time = bench(w, n, &seq, &NtHasher::<true>::new(k), true, true); |
19 |
| - eprint!(" {:5.2}", time); |
20 |
| - let time = bench(w, n, &seq, &NtHasher::<true>::new(k), true, false); |
21 |
| - eprint!(" {:5.2}", time); |
| 42 | + if c { |
| 43 | + let time = bench(w, n, &NtHasher::<true>::new(k), true, true); |
| 44 | + eprint!(" {:5.2}", time); |
| 45 | + } |
| 46 | + if d { |
| 47 | + let time = bench(w, n, &NtHasher::<true>::new(k), true, false); |
| 48 | + eprint!(" {:5.2}", time); |
| 49 | + } |
22 | 50 | eprintln!();
|
23 | 51 | }
|
24 | 52 | }
|
25 | 53 |
|
26 | 54 | fn bench(
|
27 | 55 | w: usize,
|
28 | 56 | n: usize,
|
29 |
| - seq: &packed_seq::PackedSeqVec, |
30 | 57 | hasher: &impl SeqHasher,
|
31 | 58 | canonical: bool,
|
32 | 59 | simd: bool,
|
33 | 60 | ) -> f32 {
|
34 |
| - let total = 100_000_000; |
| 61 | + let total = 150_000_000; |
35 | 62 | let samples = total / n;
|
36 | 63 |
|
37 | 64 | let poss = &mut vec![];
|
38 | 65 | let mut times = vec![];
|
| 66 | + let mut cache = Cache::default(); |
39 | 67 | for _ in 0..samples {
|
| 68 | + let seq = packed_seq::PackedSeqVec::random(n); |
40 | 69 | poss.clear();
|
41 | 70 | let s = std::time::Instant::now();
|
42 | 71 | if simd {
|
43 | 72 | if canonical {
|
44 |
| - simd_minimizers::canonical_minimizer_positions(seq.as_slice(), hasher, w, poss); |
| 73 | + simd_minimizers::canonical_minimizer_positions(seq.as_slice(), hasher, w, poss, &mut cache); |
45 | 74 | } else {
|
46 |
| - simd_minimizers::minimizer_positions(seq.as_slice(), hasher, w, poss); |
| 75 | + simd_minimizers::minimizer_positions(seq.as_slice(), hasher, w, poss, &mut cache); |
47 | 76 | }
|
48 | 77 | } else {
|
49 | 78 | if canonical {
|
50 |
| - simd_minimizers::scalar::canonical_minimizer_positions_scalar(seq.as_slice(), hasher, w, poss); |
| 79 | + simd_minimizers::scalar::canonical_minimizer_positions_scalar( |
| 80 | + seq.as_slice(), |
| 81 | + hasher, |
| 82 | + w, |
| 83 | + poss, |
| 84 | + &mut cache |
| 85 | + ); |
51 | 86 | } else {
|
52 |
| - simd_minimizers::scalar::minimizer_positions_scalar(seq.as_slice(), hasher, w, poss); |
| 87 | + simd_minimizers::scalar::minimizer_positions_scalar( |
| 88 | + seq.as_slice(), |
| 89 | + hasher, |
| 90 | + w, |
| 91 | + poss, |
| 92 | + &mut cache |
| 93 | + ); |
53 | 94 | }
|
54 | 95 | }
|
55 | 96 | times.push(s.elapsed().as_nanos());
|
|
0 commit comments