1 /* benchmark_slidehash.cc -- benchmark slide_hash variants
2  * Copyright (C) 2022 Adam Stylinski, Nathan Moinvaziri
3  * For conditions of distribution and use, see copyright notice in zlib.h
4  */
5 
6 #include <limits.h>
7 
8 #include <benchmark/benchmark.h>
9 
10 extern "C" {
11 #  include "zbuild.h"
12 #  include "zutil_p.h"
13 #  include "deflate.h"
14 #  include "cpu_features.h"
15 }
16 
17 #define MAX_RANDOM_INTS 32768
18 
19 class slide_hash: public benchmark::Fixture {
20 private:
21     uint16_t *l0;
22     uint16_t *l1;
23     deflate_state *s_g;
24 
25 public:
SetUp(const::benchmark::State & state)26     void SetUp(const ::benchmark::State& state) {
27         l0 = (uint16_t *)zng_alloc(HASH_SIZE * sizeof(uint16_t));
28 
29         for (int32_t i = 0; i < HASH_SIZE; i++) {
30             l0[i] = rand();
31         }
32 
33         l1 = (uint16_t *)zng_alloc(MAX_RANDOM_INTS * sizeof(uint16_t));
34 
35         for (int32_t i = 0; i < MAX_RANDOM_INTS; i++) {
36             l1[i] = rand();
37         }
38 
39         deflate_state *s = (deflate_state*)malloc(sizeof(deflate_state));
40         s->head = l0;
41         s->prev = l1;
42         s_g = s;
43     }
44 
Bench(benchmark::State & state,slide_hash_func slide_hash)45     void Bench(benchmark::State& state, slide_hash_func slide_hash) {
46         s_g->w_size = (uint32_t)state.range(0);
47 
48         for (auto _ : state) {
49             slide_hash(s_g);
50             benchmark::DoNotOptimize(s_g);
51         }
52     }
53 
TearDown(const::benchmark::State & state)54     void TearDown(const ::benchmark::State& state) {
55         zng_free(l0);
56         zng_free(l1);
57     }
58 };
59 
60 #define BENCHMARK_SLIDEHASH(name, fptr, support_flag) \
61     BENCHMARK_DEFINE_F(slide_hash, name)(benchmark::State& state) { \
62         if (!support_flag) { \
63             state.SkipWithError("CPU does not support " #name); \
64         } \
65         Bench(state, fptr); \
66     } \
67     BENCHMARK_REGISTER_F(slide_hash, name)->RangeMultiplier(2)->Range(1024, MAX_RANDOM_INTS);
68 
69 BENCHMARK_SLIDEHASH(c, slide_hash_c, 1);
70 
71 #ifdef ARM_NEON_SLIDEHASH
72 BENCHMARK_SLIDEHASH(neon, slide_hash_neon, arm_cpu_has_neon);
73 #endif
74 #ifdef POWER8_VSX_SLIDEHASH
75 BENCHMARK_SLIDEHASH(power8, slide_hash_power8, power_cpu_has_arch_2_07);
76 #endif
77 #ifdef PPC_VMX_SLIDEHASH
78 BENCHMARK_SLIDEHASH(vmx, slide_hash_vmx, power_cpu_has_altivec);
79 #endif
80 
81 #ifdef X86_SSE2
82 BENCHMARK_SLIDEHASH(sse2, slide_hash_sse2, x86_cpu_has_sse2);
83 #endif
84 #ifdef X86_AVX2
85 BENCHMARK_SLIDEHASH(avx2, slide_hash_avx2, x86_cpu_has_avx2);
86 #endif
87