@@ -8,6 +8,9 @@ use rand::Rng;
88#[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
99use vortex_compute:: filter:: slice:: in_place:: avx512:: filter_in_place_avx512;
1010use vortex_compute:: filter:: slice:: in_place:: filter_in_place_scalar;
11+ #[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
12+ use vortex_compute:: filter:: slice:: out:: avx512:: filter_into_avx512;
13+ use vortex_compute:: filter:: slice:: out:: filter_into_scalar;
1114
1215fn main ( ) {
1316 divan:: main ( ) ;
@@ -32,46 +35,53 @@ fn create_random_mask(size: usize, probability: f64) -> Vec<u8> {
3235 mask
3336}
3437
35- // Benchmark different data sizes.
36- const SIZES : & [ usize ] = & [ 1 << 10 , 1 << 14 , 1 << 17 ] ;
38+ /// Benchmark different data sizes.
39+ const SIZES : & [ usize ] = & [ 1 << 10 , 1 << 11 , 1 << 14 , 1 << 17 ] ;
3740
38- // Different probability values to benchmark.
41+ /// Different probability values to benchmark.
3942const PROBABILITIES : & [ f64 ] = & [ 0.0 , 0.1 , 0.25 , 0.5 , 0.75 , 0.9 , 1.0 ] ;
4043
41- #[ divan:: bench( sample_size = 64 , args = SIZES . iter( ) . copied( ) . cartesian_product( PROBABILITIES . iter( ) . copied( ) ) ) ]
42- fn random_probability_scalar ( bencher : divan:: Bencher , ( size, probability) : ( usize , f64 ) ) {
44+ /// The number of samples per benchmark.
45+ const SAMPLE_SIZE : u32 = 64 ;
46+
47+ #[ divan:: bench( sample_size = SAMPLE_SIZE , args = SIZES . iter( ) . copied( ) . cartesian_product( PROBABILITIES . iter( ) . copied( ) ) ) ]
48+ fn in_place_scalar ( bencher : divan:: Bencher , ( size, probability) : ( usize , f64 ) ) {
4349 let mask = create_random_mask ( size, probability) ;
4450 bencher
4551 . with_inputs ( || ( 0 ..size as i32 ) . collect :: < Vec < _ > > ( ) )
4652 . bench_values ( |mut data| filter_in_place_scalar ( & mut data, & mask) )
4753}
4854
4955#[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
50- #[ divan:: bench( sample_size = 64 , args = SIZES . iter( ) . copied( ) . cartesian_product( PROBABILITIES . iter( ) . copied( ) ) ) ]
51- fn random_probability_avx512 ( bencher : divan:: Bencher , ( size, probability) : ( usize , f64 ) ) {
56+ #[ divan:: bench( sample_size = SAMPLE_SIZE , args = SIZES . iter( ) . copied( ) . cartesian_product( PROBABILITIES . iter( ) . copied( ) ) ) ]
57+ fn in_place_avx512 ( bencher : divan:: Bencher , ( size, probability) : ( usize , f64 ) ) {
5258 let mask = create_random_mask ( size, probability) ;
5359 bencher
5460 . with_inputs ( || ( 0 ..size as i32 ) . collect :: < Vec < _ > > ( ) )
5561 . bench_values ( |mut data| unsafe { filter_in_place_avx512 ( & mut data, & mask) } )
5662}
5763
58- const LARGE_SIZE : usize = 1024 * 1024 ; // 4 MB
59-
60- #[ divan:: bench( sample_size = 16 , args = PROBABILITIES ) ]
61- fn scalar_throughput ( bencher : divan:: Bencher , probability : f64 ) {
62- let mask = create_random_mask ( LARGE_SIZE , probability) ;
64+ #[ divan:: bench( sample_size = SAMPLE_SIZE , args = SIZES . iter( ) . copied( ) . cartesian_product( PROBABILITIES . iter( ) . copied( ) ) ) ]
65+ fn out_scalar ( bencher : divan:: Bencher , ( size, probability) : ( usize , f64 ) ) {
66+ let mask = create_random_mask ( size, probability) ;
6367 bencher
64- . counter ( divan:: counter:: BytesCount :: new ( LARGE_SIZE * 4 ) )
65- . with_inputs ( || ( 0 ..LARGE_SIZE as i32 ) . collect :: < Vec < _ > > ( ) )
66- . bench_values ( |mut data| filter_in_place_scalar ( & mut data, & mask) )
68+ . with_inputs ( || {
69+ let src = ( 0 ..size as i32 ) . collect :: < Vec < _ > > ( ) ;
70+ let dest = vec ! [ 0i32 ; size] ;
71+ ( src, dest)
72+ } )
73+ . bench_values ( |( src, mut dest) | filter_into_scalar ( & src, & mut dest, & mask) )
6774}
6875
69- #[ divan:: bench( sample_size = 16 , args = PROBABILITIES ) ]
7076#[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
71- fn avx512_throughput ( bencher : divan:: Bencher , probability : f64 ) {
72- let mask = create_random_mask ( LARGE_SIZE , probability) ;
77+ #[ divan:: bench( sample_size = SAMPLE_SIZE , args = SIZES . iter( ) . copied( ) . cartesian_product( PROBABILITIES . iter( ) . copied( ) ) ) ]
78+ fn out_avx512 ( bencher : divan:: Bencher , ( size, probability) : ( usize , f64 ) ) {
79+ let mask = create_random_mask ( size, probability) ;
7380 bencher
74- . counter ( divan:: counter:: BytesCount :: new ( LARGE_SIZE * 4 ) )
75- . with_inputs ( || ( 0 ..LARGE_SIZE as i32 ) . collect :: < Vec < _ > > ( ) )
76- . bench_values ( |mut data| unsafe { filter_in_place_avx512 ( & mut data, & mask) } )
81+ . with_inputs ( || {
82+ let src = ( 0 ..size as i32 ) . collect :: < Vec < _ > > ( ) ;
83+ let dest = vec ! [ 0i32 ; size] ;
84+ ( src, dest)
85+ } )
86+ . bench_values ( |( src, mut dest) | unsafe { filter_into_avx512 ( & src, & mut dest, & mask) } )
7787}
0 commit comments