Skip to content
Snippets Groups Projects
Commit 4183147d authored by Martin Larralde's avatar Martin Larralde
Browse files

Reorganise code for benchmarks

parent 3d091223
No related branches found
No related tags found
No related merge requests found
...@@ -38,12 +38,16 @@ fn bench_scanner_max_by(bencher: &mut test::Bencher) { ...@@ -38,12 +38,16 @@ fn bench_scanner_max_by(bencher: &mut test::Bencher) {
let pssm = pbm.to_scoring(bg); let pssm = pbm.to_scoring(bg);
striped.configure(&pssm); striped.configure(&pssm);
let mut best = 0;
bencher.iter(|| { bencher.iter(|| {
Scanner::new(&pssm, &striped) best = Scanner::new(&pssm, &striped)
.max_by(|x, y| x.score.partial_cmp(&y.score).unwrap()) .max_by(|x, y| x.score.partial_cmp(&y.score).unwrap())
.unwrap(); .unwrap()
.position;
}); });
bencher.bytes = seq.len() as u64; bencher.bytes = seq.len() as u64;
println!("best: {:?}", best);
} }
#[bench] #[bench]
...@@ -62,8 +66,11 @@ fn bench_scanner_best(bencher: &mut test::Bencher) { ...@@ -62,8 +66,11 @@ fn bench_scanner_best(bencher: &mut test::Bencher) {
let pssm = pbm.to_scoring(bg); let pssm = pbm.to_scoring(bg);
striped.configure(&pssm); striped.configure(&pssm);
bencher.iter(|| Scanner::new(&pssm, &striped).best().unwrap()); let mut best = 0;
bencher.iter(|| best = Scanner::new(&pssm, &striped).best().unwrap().position);
bencher.bytes = seq.len() as u64; bencher.bytes = seq.len() as u64;
println!("best: {:?}", best);
} }
fn bench_lightmotif<C: StrictlyPositive, P: Score<f32, Dna, C> + Maximum<f32, C>>( fn bench_lightmotif<C: StrictlyPositive, P: Score<f32, Dna, C> + Maximum<f32, C>>(
...@@ -87,10 +94,44 @@ fn bench_lightmotif<C: StrictlyPositive, P: Score<f32, Dna, C> + Maximum<f32, C> ...@@ -87,10 +94,44 @@ fn bench_lightmotif<C: StrictlyPositive, P: Score<f32, Dna, C> + Maximum<f32, C>
let mut scores = StripedScores::empty(); let mut scores = StripedScores::empty();
scores.resize(striped.matrix().rows(), striped.len()); scores.resize(striped.matrix().rows(), striped.len());
bencher.bytes = seq.len() as u64; bencher.bytes = seq.len() as u64;
let mut best = 0;
bencher.iter(|| { bencher.iter(|| {
test::black_box(pli.score_into(&pssm, &striped, &mut scores)); test::black_box(pli.score_into(&pssm, &striped, &mut scores));
test::black_box(pli.argmax(&scores)); best = scores.offset(test::black_box(pli.argmax(&scores).unwrap()));
}); });
println!("best: {:?}", best);
}
fn bench_lightmotif_discrete<C: StrictlyPositive, P: Score<u8, Dna, C> + Maximum<u8, C>>(
bencher: &mut test::Bencher,
pli: &P,
) {
let seq = &SEQUENCE[..N];
let encoded = EncodedSequence::<Dna>::encode(seq).unwrap();
let mut striped = Pipeline::generic().stripe(encoded);
let bg = Background::<Dna>::uniform();
let cm = CountMatrix::<Dna>::from_sequences([
EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(),
EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(),
])
.unwrap();
let pbm = cm.to_freq(0.1);
let pssm = pbm.to_scoring(bg);
let dm = pssm.to_discrete();
striped.configure(&pssm);
let mut scores = StripedScores::empty();
let mut best = 0;
scores.resize(striped.matrix().rows(), striped.len());
bencher.bytes = seq.len() as u64;
bencher.iter(|| {
test::black_box(pli.score_into(&dm, &striped, &mut scores));
best = scores.offset(test::black_box(pli.argmax(&scores).unwrap()));
});
println!("best: {:?}", best);
} }
#[bench] #[bench]
...@@ -119,6 +160,32 @@ fn bench_avx2(bencher: &mut test::Bencher) { ...@@ -119,6 +160,32 @@ fn bench_avx2(bencher: &mut test::Bencher) {
bench_lightmotif(bencher, &pli); bench_lightmotif(bencher, &pli);
} }
#[bench]
fn bench_discrete_generic(bencher: &mut test::Bencher) {
let pli = Pipeline::generic();
bench_lightmotif_discrete::<U1, _>(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_discrete_sse2(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench_lightmotif_discrete::<U16, _>(bencher, &pli);
}
#[bench]
fn bench_discrete_dispatch(bencher: &mut test::Bencher) {
let pli = Pipeline::dispatch();
bench_lightmotif_discrete(bencher, &pli);
}
#[cfg(target_feature = "avx2")]
#[bench]
fn bench_discrete_avx2(bencher: &mut test::Bencher) {
let pli = Pipeline::avx2().unwrap();
bench_lightmotif_discrete(bencher, &pli);
}
#[bench] #[bench]
fn bench_bio(bencher: &mut test::Bencher) { fn bench_bio(bencher: &mut test::Bencher) {
use bio::pattern_matching::pssm::DNAMotif; use bio::pattern_matching::pssm::DNAMotif;
...@@ -133,5 +200,8 @@ fn bench_bio(bencher: &mut test::Bencher) { ...@@ -133,5 +200,8 @@ fn bench_bio(bencher: &mut test::Bencher) {
.unwrap(); .unwrap();
bencher.bytes = seq.len() as u64; bencher.bytes = seq.len() as u64;
bencher.iter(|| test::black_box(pssm.score(seq.as_bytes()).unwrap())); let mut best = 0;
bencher.iter(|| best = test::black_box(pssm.score(seq.as_bytes()).unwrap()).loc);
println!("best: {:?}", best);
} }
...@@ -20,65 +20,135 @@ mod dna { ...@@ -20,65 +20,135 @@ mod dna {
const SEQUENCE: &str = include_str!("ecoli.txt"); const SEQUENCE: &str = include_str!("ecoli.txt");
fn bench<C: StrictlyPositive, P: Score<f32, Dna, C>>(bencher: &mut test::Bencher, pli: &P) { mod f32 {
let encoded = EncodedSequence::<Dna>::encode(SEQUENCE).unwrap(); use super::*;
let mut striped = Pipeline::generic().stripe(encoded);
fn bench<C: StrictlyPositive, P: Score<f32, Dna, C>>(bencher: &mut test::Bencher, pli: &P) {
let cm = CountMatrix::<Dna>::from_sequences([ let encoded = EncodedSequence::<Dna>::encode(SEQUENCE).unwrap();
EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(), let mut striped = Pipeline::generic().stripe(encoded);
EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(),
]) let cm = CountMatrix::<Dna>::from_sequences([
.unwrap(); EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(),
let pbm = cm.to_freq(0.1); EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(),
let pssm = pbm.to_scoring(None); ])
.unwrap();
striped.configure(&pssm); let pbm = cm.to_freq(0.1);
let mut scores = StripedScores::empty(); let pssm = pbm.to_scoring(None);
scores.resize(striped.matrix().rows(), striped.len());
bencher.bytes = SEQUENCE.len() as u64; striped.configure(&pssm);
bencher.iter(|| { let mut scores = StripedScores::empty();
test::black_box(pli.score_into(&pssm, &striped, &mut scores)); scores.resize(striped.matrix().rows(), striped.len());
}); bencher.bytes = SEQUENCE.len() as u64;
} bencher.iter(|| {
test::black_box(pli.score_into(&pssm, &striped, &mut scores));
#[bench] });
fn bench_generic(bencher: &mut test::Bencher) { }
let pli = Pipeline::generic();
bench::<U32, _>(bencher, &pli); #[bench]
} fn bench_generic(bencher: &mut test::Bencher) {
let pli = Pipeline::generic();
#[bench] bench::<U32, _>(bencher, &pli);
fn bench_dispatch(bencher: &mut test::Bencher) { }
let pli = Pipeline::dispatch();
bench(bencher, &pli); #[bench]
fn bench_dispatch(bencher: &mut test::Bencher) {
let pli = Pipeline::dispatch();
bench(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U16, _>(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2_32(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U32, _>(bencher, &pli);
}
#[cfg(target_feature = "avx2")]
#[bench]
fn bench_avx2(bencher: &mut test::Bencher) {
let pli = Pipeline::avx2().unwrap();
bench(bencher, &pli);
}
#[cfg(target_feature = "neon")]
#[bench]
fn bench_neon(bencher: &mut test::Bencher) {
let pli = Pipeline::neon().unwrap();
bench::<U16, _>(bencher, &pli);
}
} }
#[cfg(target_feature = "sse2")] mod u8 {
#[bench] use super::*;
fn bench_sse2(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap(); fn bench<C: StrictlyPositive, P: Score<u8, Dna, C>>(bencher: &mut test::Bencher, pli: &P) {
bench::<U16, _>(bencher, &pli); let encoded = EncodedSequence::<Dna>::encode(SEQUENCE).unwrap();
} let mut striped = Pipeline::generic().stripe(encoded);
#[cfg(target_feature = "sse2")] let cm = CountMatrix::<Dna>::from_sequences([
#[bench] EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(),
fn bench_sse2_32(bencher: &mut test::Bencher) { EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(),
let pli = Pipeline::sse2().unwrap(); ])
bench::<U32, _>(bencher, &pli); .unwrap();
} let pbm = cm.to_freq(0.1);
let pssm = pbm.to_scoring(None);
#[cfg(target_feature = "avx2")] let dm = pssm.to_discrete();
#[bench]
fn bench_avx2(bencher: &mut test::Bencher) { striped.configure(&pssm);
let pli = Pipeline::avx2().unwrap(); let mut scores = StripedScores::empty();
bench(bencher, &pli); scores.resize(striped.matrix().rows(), striped.len());
} bencher.bytes = SEQUENCE.len() as u64;
bencher.iter(|| {
#[cfg(target_feature = "neon")] test::black_box(pli.score_into(&dm, &striped, &mut scores));
#[bench] });
fn bench_neon(bencher: &mut test::Bencher) { }
let pli = Pipeline::neon().unwrap();
bench::<U16, _>(bencher, &pli); #[bench]
fn bench_generic(bencher: &mut test::Bencher) {
let pli = Pipeline::generic();
bench::<U32, _>(bencher, &pli);
}
#[bench]
fn bench_dispatch(bencher: &mut test::Bencher) {
let pli = Pipeline::dispatch();
bench(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U16, _>(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2_32(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U32, _>(bencher, &pli);
}
#[cfg(target_feature = "avx2")]
#[bench]
fn bench_avx2(bencher: &mut test::Bencher) {
let pli = Pipeline::avx2().unwrap();
bench(bencher, &pli);
}
#[cfg(target_feature = "neon")]
#[bench]
fn bench_neon(bencher: &mut test::Bencher) {
let pli = Pipeline::neon().unwrap();
bench::<U16, _>(bencher, &pli);
}
} }
} }
......
...@@ -17,67 +17,153 @@ use lightmotif::seq::EncodedSequence; ...@@ -17,67 +17,153 @@ use lightmotif::seq::EncodedSequence;
const SEQUENCE: &str = include_str!("ecoli.txt"); const SEQUENCE: &str = include_str!("ecoli.txt");
fn bench<C: StrictlyPositive, P: Score<f32, Dna, C> + Threshold<f32, C>>( mod f32 {
bencher: &mut test::Bencher,
pli: &P,
) {
let encoded = EncodedSequence::<Dna>::encode(SEQUENCE).unwrap();
let mut striped = Pipeline::generic().stripe(encoded);
let cm = CountMatrix::<Dna>::from_sequences([
EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(),
EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(),
])
.unwrap();
let pbm = cm.to_freq(0.1);
let pssm = pbm.to_scoring(None);
striped.configure(&pssm);
let mut scores = StripedScores::empty();
pli.score_into(&pssm, &striped, &mut scores);
bencher.bytes = (std::mem::size_of::<f32>() * scores.matrix().rows() * C::USIZE) as u64;
bencher.iter(|| {
test::black_box(pli.threshold(&scores, 10.0));
});
}
#[bench] use super::*;
fn bench_generic(bencher: &mut test::Bencher) {
let pli = Pipeline::generic();
bench::<U32, _>(bencher, &pli);
}
#[bench] fn bench<C: StrictlyPositive, P: Score<f32, Dna, C> + Threshold<f32, C>>(
fn bench_dispatch(bencher: &mut test::Bencher) { bencher: &mut test::Bencher,
let pli = Pipeline::dispatch(); pli: &P,
bench(bencher, &pli); ) {
} let encoded = EncodedSequence::<Dna>::encode(SEQUENCE).unwrap();
let mut striped = Pipeline::generic().stripe(encoded);
#[cfg(target_feature = "sse2")] let cm = CountMatrix::<Dna>::from_sequences([
#[bench] EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(),
fn bench_sse2(bencher: &mut test::Bencher) { EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(),
let pli = Pipeline::sse2().unwrap(); ])
bench::<U16, _>(bencher, &pli); .unwrap();
} let pbm = cm.to_freq(0.1);
let pssm = pbm.to_scoring(None);
#[cfg(target_feature = "sse2")] striped.configure(&pssm);
#[bench] let mut scores = StripedScores::empty();
fn bench_sse2_32(bencher: &mut test::Bencher) { pli.score_into(&pssm, &striped, &mut scores);
let pli = Pipeline::sse2().unwrap();
bench::<U32, _>(bencher, &pli); bencher.bytes = (std::mem::size_of::<f32>() * scores.matrix().rows() * C::USIZE) as u64;
} bencher.iter(|| {
test::black_box(pli.threshold(&scores, 10.0));
});
}
#[cfg(target_feature = "avx2")] #[bench]
#[bench] fn bench_generic(bencher: &mut test::Bencher) {
fn bench_avx2(bencher: &mut test::Bencher) { let pli = Pipeline::generic();
let pli = Pipeline::avx2().unwrap(); bench::<U32, _>(bencher, &pli);
bench(bencher, &pli); }
#[bench]
fn bench_dispatch(bencher: &mut test::Bencher) {
let pli = Pipeline::dispatch();
bench(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U16, _>(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2_32(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U32, _>(bencher, &pli);
}
#[cfg(target_feature = "avx2")]
#[bench]
fn bench_avx2(bencher: &mut test::Bencher) {
let pli = Pipeline::avx2().unwrap();
bench(bencher, &pli);
}
#[cfg(target_feature = "neon")]
#[bench]
fn bench_neon(bencher: &mut test::Bencher) {
let pli = Pipeline::neon().unwrap();
bench::<U16, _>(bencher, &pli);
}
} }
#[cfg(target_feature = "neon")] mod u8 {
#[bench]
fn bench_neon(bencher: &mut test::Bencher) { use super::*;
let pli = Pipeline::neon().unwrap();
bench::<U16, _>(bencher, &pli); fn bench<C: StrictlyPositive, P: Score<u8, Dna, C> + Threshold<u8, C>>(
bencher: &mut test::Bencher,
pli: &P,
) {
let encoded = EncodedSequence::<Dna>::encode(SEQUENCE).unwrap();
let mut striped = Pipeline::generic().stripe(encoded);
let cm = CountMatrix::<Dna>::from_sequences([
EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(),
EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(),
])
.unwrap();
let pbm = cm.to_freq(0.1);
let pssm = pbm.to_scoring(None);
let dm = pssm.to_discrete();
let threshold = dm.scale(10.0);
striped.configure(&pssm);
let mut scores = StripedScores::empty();
pli.score_into(&dm, &striped, &mut scores);
let mut hits = Vec::new();
bencher.bytes = (std::mem::size_of::<f32>() * scores.matrix().rows() * C::USIZE) as u64;
bencher.iter(|| {
hits.clear();
for mc in pli.threshold(&scores, threshold) {
let i = scores.offset(mc);
if pssm.score_position(&striped, i) >= 10.0 {
hits.push(i);
}
}
});
println!("{:?}", hits.len());
}
#[bench]
fn bench_generic(bencher: &mut test::Bencher) {
let pli = Pipeline::generic();
bench::<U32, _>(bencher, &pli);
}
#[bench]
fn bench_dispatch(bencher: &mut test::Bencher) {
let pli = Pipeline::dispatch();
bench(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U16, _>(bencher, &pli);
}
#[cfg(target_feature = "sse2")]
#[bench]
fn bench_sse2_32(bencher: &mut test::Bencher) {
let pli = Pipeline::sse2().unwrap();
bench::<U32, _>(bencher, &pli);
}
#[cfg(target_feature = "avx2")]
#[bench]
fn bench_avx2(bencher: &mut test::Bencher) {
let pli = Pipeline::avx2().unwrap();
bench(bencher, &pli);
}
#[cfg(target_feature = "neon")]
#[bench]
fn bench_neon(bencher: &mut test::Bencher) {
let pli = Pipeline::neon().unwrap();
bench::<U16, _>(bencher, &pli);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment