33
44#![ allow( clippy:: unwrap_used) ]
55
6+ use std:: arch;
67use std:: hint:: black_box;
78use std:: iter:: Iterator ;
89
@@ -11,6 +12,7 @@ use rand::prelude::StdRng;
1112use rand:: { Rng , SeedableRng } ;
1213use vortex_buffer:: { buffer_mut, BitBuffer } ;
1314use vortex_compute:: bench;
15+ use vortex_compute:: filter:: Filter ;
1416
1517fn main ( ) {
1618 divan:: main ( ) ;
@@ -20,6 +22,34 @@ fn main() {
2022const N : usize = 1024 ;
2123type BitView < ' a > = vortex_buffer:: BitView < ' a , 128 > ;
2224
25+ trait FilterImpl {
26+ fn filter < T : Copy > ( bitview : & BitView , slice : & mut [ T ] ) ;
27+ }
28+
29+ /// The main entry point for the filter function that performs all the dispatch.
30+ struct ActualFilter ;
31+ impl FilterImpl for ActualFilter {
32+ fn filter < T : Copy > ( bitview : & BitView , slice : & mut [ T ] ) {
33+ slice. filter ( bitview)
34+ }
35+ }
36+
37+ struct ScalarFilter ;
38+ impl FilterImpl for ScalarFilter {
39+ fn filter < T : Copy > ( bitview : & BitView , slice : & mut [ T ] ) {
40+ bench:: bench_filter_scalar :: < _ , T > ( bitview, slice)
41+ }
42+ }
43+
44+ struct NeonFilter ;
45+ impl FilterImpl for NeonFilter {
46+ fn filter < T : Copy > ( bitview : & BitView , slice : & mut [ T ] ) {
47+ if arch:: is_aarch64_feature_detected!( "neon" ) {
48+ bench:: bench_filter_neon :: < _ , T > ( bitview, slice)
49+ }
50+ }
51+ }
52+
2353const MASK_DENSITY : & [ f64 ] = & [
2454 0.0 , 0.01 , 0.05 , 0.1 , 0.25 , // 0.3,
2555 // 0.4,
@@ -29,23 +59,32 @@ const MASK_DENSITY: &[f64] = &[
2959 0.99 , 1.00 ,
3060] ;
3161
32- #[ divan:: bench( types = [ u8 , u16 , u32 , u64 , u128 ] , args = MASK_DENSITY ) ]
33- fn filter_scalar < T : Default + Copy > ( bencher : Bencher , mask_density : f64 ) {
34- bench_filter_fn ( bencher , mask_density , bench :: bench_filter_scalar :: < _ , T > )
62+ #[ divan:: bench( types = [ ScalarFilter , NeonFilter , ActualFilter ] , args = MASK_DENSITY ) ]
63+ fn filter_u8 < F : FilterImpl > ( bencher : Bencher , mask_density : f64 ) {
64+ bench_filter_fn :: < F , u8 > ( bencher , mask_density )
3565}
3666
37- #[ cfg( target_arch = "aarch64" ) ]
38- #[ divan:: bench( types = [ u8 , u16 , u32 , u64 , u128 ] , args = MASK_DENSITY ) ]
39- fn filter_neon < T : Default + Copy > ( bencher : Bencher , mask_density : f64 ) {
40- if std:: arch:: is_aarch64_feature_detected!( "neon" ) {
41- bench_filter_fn ( bencher, mask_density, bench:: bench_filter_neon :: < _ , T > )
42- }
67+ #[ divan:: bench( types = [ ScalarFilter , NeonFilter , ActualFilter ] , args = MASK_DENSITY ) ]
68+ fn filter_u16 < F : FilterImpl > ( bencher : Bencher , mask_density : f64 ) {
69+ bench_filter_fn :: < F , u16 > ( bencher, mask_density)
70+ }
71+
72+ #[ divan:: bench( types = [ ScalarFilter , NeonFilter , ActualFilter ] , args = MASK_DENSITY ) ]
73+ fn filter_u32 < F : FilterImpl > ( bencher : Bencher , mask_density : f64 ) {
74+ bench_filter_fn :: < F , u32 > ( bencher, mask_density)
75+ }
76+
77+ #[ divan:: bench( types = [ ScalarFilter , NeonFilter , ActualFilter ] , args = MASK_DENSITY ) ]
78+ fn filter_u64 < F : FilterImpl > ( bencher : Bencher , mask_density : f64 ) {
79+ bench_filter_fn :: < F , u64 > ( bencher, mask_density)
80+ }
81+
82+ #[ divan:: bench( types = [ ScalarFilter , NeonFilter , ActualFilter ] , args = MASK_DENSITY ) ]
83+ fn filter_u128 < F : FilterImpl > ( bencher : Bencher , mask_density : f64 ) {
84+ bench_filter_fn :: < F , u128 > ( bencher, mask_density)
4385}
4486
45- fn bench_filter_fn < T : Default + Copy , F > ( bencher : Bencher , mask_density : f64 , f : F )
46- where
47- F : Fn ( & BitView , & mut [ T ] ) ,
48- {
87+ fn bench_filter_fn < F : FilterImpl , T : Default + Copy > ( bencher : Bencher , mask_density : f64 ) {
4988 let mut buffer = buffer_mut ! [ T :: default ( ) ; N ] ;
5089
5190 let mut rng = StdRng :: seed_from_u64 ( 0 ) ;
5594
5695 bencher. bench_local ( || {
5796 let view = BitView :: new ( mask. inner ( ) . as_ref ( ) . try_into ( ) . unwrap ( ) ) ;
58- f ( & view, & mut buffer) ;
97+ F :: filter ( & view, & mut buffer) ;
5998 black_box ( & mut buffer) ;
6099 } ) ;
61100}
0 commit comments