1 #![feature(test)]
2
3 extern crate test;
4 use test::Bencher;
5
6 use ndarray::prelude::*;
7 use ndarray::NdProducer;
8
9 #[bench]
chunk2x2_iter_sum(bench: &mut Bencher)10 fn chunk2x2_iter_sum(bench: &mut Bencher) {
11 let a = Array::<f32, _>::zeros((256, 256));
12 let chunksz = (2, 2);
13 let mut sum = Array::zeros(a.exact_chunks(chunksz).raw_dim());
14 bench.iter(|| {
15 azip!((a in a.exact_chunks(chunksz), sum in &mut sum) {
16 *sum = a.iter().sum::<f32>();
17 });
18 });
19 }
20
21 #[bench]
chunk2x2_sum(bench: &mut Bencher)22 fn chunk2x2_sum(bench: &mut Bencher) {
23 let a = Array::<f32, _>::zeros((256, 256));
24 let chunksz = (2, 2);
25 let mut sum = Array::zeros(a.exact_chunks(chunksz).raw_dim());
26 bench.iter(|| {
27 azip!((a in a.exact_chunks(chunksz), sum in &mut sum) {
28 *sum = a.sum();
29 });
30 });
31 }
32
33 #[bench]
chunk2x2_sum_get1(bench: &mut Bencher)34 fn chunk2x2_sum_get1(bench: &mut Bencher) {
35 let a = Array::<f32, _>::zeros((256, 256));
36 let chunksz = (2, 2);
37 let mut sum = Array::<f32, _>::zeros(a.exact_chunks(chunksz).raw_dim());
38 bench.iter(|| {
39 let (m, n) = a.dim();
40 for i in 0..m {
41 for j in 0..n {
42 sum[[i / 2, j / 2]] += a[[i, j]];
43 }
44 }
45 });
46 }
47
48 #[bench]
chunk2x2_sum_uget1(bench: &mut Bencher)49 fn chunk2x2_sum_uget1(bench: &mut Bencher) {
50 let a = Array::<f32, _>::zeros((256, 256));
51 let chunksz = (2, 2);
52 let mut sum = Array::<f32, _>::zeros(a.exact_chunks(chunksz).raw_dim());
53 bench.iter(|| {
54 let (m, n) = a.dim();
55 for i in 0..m {
56 for j in 0..n {
57 unsafe {
58 *sum.uget_mut([i / 2, j / 2]) += *a.uget([i, j]);
59 }
60 }
61 }
62 });
63 }
64
65 #[bench]
66 #[allow(clippy::identity_op)]
chunk2x2_sum_get2(bench: &mut Bencher)67 fn chunk2x2_sum_get2(bench: &mut Bencher) {
68 let a = Array::<f32, _>::zeros((256, 256));
69 let chunksz = (2, 2);
70 let mut sum = Array::<f32, _>::zeros(a.exact_chunks(chunksz).raw_dim());
71 bench.iter(|| {
72 let (m, n) = sum.dim();
73 for i in 0..m {
74 for j in 0..n {
75 sum[[i, j]] += a[[i * 2 + 0, j * 2 + 0]];
76 sum[[i, j]] += a[[i * 2 + 0, j * 2 + 1]];
77 sum[[i, j]] += a[[i * 2 + 1, j * 2 + 1]];
78 sum[[i, j]] += a[[i * 2 + 1, j * 2 + 0]];
79 }
80 }
81 });
82 }
83