1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "System/LRUCache.hpp"
16*03ce13f7SAndroid Build Coastguard Worker
17*03ce13f7SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
18*03ce13f7SAndroid Build Coastguard Worker
19*03ce13f7SAndroid Build Coastguard Worker #include <array>
20*03ce13f7SAndroid Build Coastguard Worker
21*03ce13f7SAndroid Build Coastguard Worker namespace {
22*03ce13f7SAndroid Build Coastguard Worker
23*03ce13f7SAndroid Build Coastguard Worker // https://en.wikipedia.org/wiki/Xorshift
24*03ce13f7SAndroid Build Coastguard Worker class FastRnd
25*03ce13f7SAndroid Build Coastguard Worker {
26*03ce13f7SAndroid Build Coastguard Worker public:
operator ()()27*03ce13f7SAndroid Build Coastguard Worker inline size_t operator()()
28*03ce13f7SAndroid Build Coastguard Worker {
29*03ce13f7SAndroid Build Coastguard Worker x ^= x << 13;
30*03ce13f7SAndroid Build Coastguard Worker x ^= x >> 7;
31*03ce13f7SAndroid Build Coastguard Worker x ^= x << 17;
32*03ce13f7SAndroid Build Coastguard Worker return x;
33*03ce13f7SAndroid Build Coastguard Worker }
34*03ce13f7SAndroid Build Coastguard Worker
35*03ce13f7SAndroid Build Coastguard Worker private:
36*03ce13f7SAndroid Build Coastguard Worker size_t x = 3243298;
37*03ce13f7SAndroid Build Coastguard Worker };
38*03ce13f7SAndroid Build Coastguard Worker
39*03ce13f7SAndroid Build Coastguard Worker struct ComplexKey
40*03ce13f7SAndroid Build Coastguard Worker {
41*03ce13f7SAndroid Build Coastguard Worker std::array<size_t, 8> words;
42*03ce13f7SAndroid Build Coastguard Worker };
43*03ce13f7SAndroid Build Coastguard Worker
operator ==(const ComplexKey & a,const ComplexKey & b)44*03ce13f7SAndroid Build Coastguard Worker bool operator==(const ComplexKey &a, const ComplexKey &b)
45*03ce13f7SAndroid Build Coastguard Worker {
46*03ce13f7SAndroid Build Coastguard Worker for(size_t w = 0; w < a.words.size(); w++)
47*03ce13f7SAndroid Build Coastguard Worker {
48*03ce13f7SAndroid Build Coastguard Worker if(a.words[w] != b.words[w]) { return false; }
49*03ce13f7SAndroid Build Coastguard Worker }
50*03ce13f7SAndroid Build Coastguard Worker return true;
51*03ce13f7SAndroid Build Coastguard Worker }
52*03ce13f7SAndroid Build Coastguard Worker
53*03ce13f7SAndroid Build Coastguard Worker struct ComplexKeyHash
54*03ce13f7SAndroid Build Coastguard Worker {
operator ()__anonf6cd64640111::ComplexKeyHash55*03ce13f7SAndroid Build Coastguard Worker size_t operator()(const ComplexKey &key) const
56*03ce13f7SAndroid Build Coastguard Worker {
57*03ce13f7SAndroid Build Coastguard Worker size_t hash = 12227;
58*03ce13f7SAndroid Build Coastguard Worker for(size_t w = 0; w < key.words.size(); w++)
59*03ce13f7SAndroid Build Coastguard Worker {
60*03ce13f7SAndroid Build Coastguard Worker hash = hash * 11801 + key.words[w];
61*03ce13f7SAndroid Build Coastguard Worker }
62*03ce13f7SAndroid Build Coastguard Worker return hash;
63*03ce13f7SAndroid Build Coastguard Worker }
64*03ce13f7SAndroid Build Coastguard Worker };
65*03ce13f7SAndroid Build Coastguard Worker
66*03ce13f7SAndroid Build Coastguard Worker } // namespace
67*03ce13f7SAndroid Build Coastguard Worker
68*03ce13f7SAndroid Build Coastguard Worker class LRUCacheBenchmark : public benchmark::Fixture
69*03ce13f7SAndroid Build Coastguard Worker {
70*03ce13f7SAndroid Build Coastguard Worker public:
SetUp(const::benchmark::State & state)71*03ce13f7SAndroid Build Coastguard Worker void SetUp(const ::benchmark::State &state)
72*03ce13f7SAndroid Build Coastguard Worker {
73*03ce13f7SAndroid Build Coastguard Worker size = state.range(0);
74*03ce13f7SAndroid Build Coastguard Worker }
75*03ce13f7SAndroid Build Coastguard Worker
TearDown(const::benchmark::State & state)76*03ce13f7SAndroid Build Coastguard Worker void TearDown(const ::benchmark::State &state) {}
77*03ce13f7SAndroid Build Coastguard Worker
78*03ce13f7SAndroid Build Coastguard Worker size_t size;
79*03ce13f7SAndroid Build Coastguard Worker };
80*03ce13f7SAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(LRUCacheBenchmark,AddInt)81*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(LRUCacheBenchmark, AddInt)
82*03ce13f7SAndroid Build Coastguard Worker (benchmark::State &state)
83*03ce13f7SAndroid Build Coastguard Worker {
84*03ce13f7SAndroid Build Coastguard Worker sw::LRUCache<size_t, size_t> cache(size);
85*03ce13f7SAndroid Build Coastguard Worker FastRnd rnd;
86*03ce13f7SAndroid Build Coastguard Worker
87*03ce13f7SAndroid Build Coastguard Worker int i = 0;
88*03ce13f7SAndroid Build Coastguard Worker for(auto _ : state)
89*03ce13f7SAndroid Build Coastguard Worker {
90*03ce13f7SAndroid Build Coastguard Worker cache.add(rnd() % size, i);
91*03ce13f7SAndroid Build Coastguard Worker i++;
92*03ce13f7SAndroid Build Coastguard Worker }
93*03ce13f7SAndroid Build Coastguard Worker }
94*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(LRUCacheBenchmark, AddInt)->RangeMultiplier(8)->Range(1, 0x100000)->ArgName("cache-size");
95*03ce13f7SAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(LRUCacheBenchmark,GetIntCacheHit)96*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(LRUCacheBenchmark, GetIntCacheHit)
97*03ce13f7SAndroid Build Coastguard Worker (benchmark::State &state)
98*03ce13f7SAndroid Build Coastguard Worker {
99*03ce13f7SAndroid Build Coastguard Worker sw::LRUCache<size_t, size_t> cache(size);
100*03ce13f7SAndroid Build Coastguard Worker FastRnd rnd;
101*03ce13f7SAndroid Build Coastguard Worker
102*03ce13f7SAndroid Build Coastguard Worker for(size_t i = 0; i < size; i++)
103*03ce13f7SAndroid Build Coastguard Worker {
104*03ce13f7SAndroid Build Coastguard Worker cache.add(i, i);
105*03ce13f7SAndroid Build Coastguard Worker }
106*03ce13f7SAndroid Build Coastguard Worker
107*03ce13f7SAndroid Build Coastguard Worker for(auto _ : state)
108*03ce13f7SAndroid Build Coastguard Worker {
109*03ce13f7SAndroid Build Coastguard Worker cache.lookup(rnd() % size);
110*03ce13f7SAndroid Build Coastguard Worker }
111*03ce13f7SAndroid Build Coastguard Worker }
112*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(LRUCacheBenchmark, GetIntCacheHit)->RangeMultiplier(8)->Range(1, 0x100000)->ArgName("cache-size");
113*03ce13f7SAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(LRUCacheBenchmark,GetIntCacheMiss)114*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(LRUCacheBenchmark, GetIntCacheMiss)
115*03ce13f7SAndroid Build Coastguard Worker (benchmark::State &state)
116*03ce13f7SAndroid Build Coastguard Worker {
117*03ce13f7SAndroid Build Coastguard Worker sw::LRUCache<size_t, size_t> cache(size);
118*03ce13f7SAndroid Build Coastguard Worker FastRnd rnd;
119*03ce13f7SAndroid Build Coastguard Worker for(size_t i = 0; i < size; i++)
120*03ce13f7SAndroid Build Coastguard Worker {
121*03ce13f7SAndroid Build Coastguard Worker cache.add(size + i, i);
122*03ce13f7SAndroid Build Coastguard Worker }
123*03ce13f7SAndroid Build Coastguard Worker
124*03ce13f7SAndroid Build Coastguard Worker for(auto _ : state)
125*03ce13f7SAndroid Build Coastguard Worker {
126*03ce13f7SAndroid Build Coastguard Worker cache.lookup(rnd() % size);
127*03ce13f7SAndroid Build Coastguard Worker }
128*03ce13f7SAndroid Build Coastguard Worker }
129*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(LRUCacheBenchmark, GetIntCacheMiss)->RangeMultiplier(8)->Range(1, 0x100000)->ArgName("cache-size");
130*03ce13f7SAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(LRUCacheBenchmark,AddRandomComplexKey)131*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(LRUCacheBenchmark, AddRandomComplexKey)
132*03ce13f7SAndroid Build Coastguard Worker (benchmark::State &state)
133*03ce13f7SAndroid Build Coastguard Worker {
134*03ce13f7SAndroid Build Coastguard Worker sw::LRUCache<ComplexKey, size_t, ComplexKeyHash> cache(size);
135*03ce13f7SAndroid Build Coastguard Worker FastRnd rnd;
136*03ce13f7SAndroid Build Coastguard Worker
137*03ce13f7SAndroid Build Coastguard Worker int i = 0;
138*03ce13f7SAndroid Build Coastguard Worker for(auto _ : state)
139*03ce13f7SAndroid Build Coastguard Worker {
140*03ce13f7SAndroid Build Coastguard Worker ComplexKey key;
141*03ce13f7SAndroid Build Coastguard Worker for(size_t w = 0; w < key.words.size(); w++)
142*03ce13f7SAndroid Build Coastguard Worker {
143*03ce13f7SAndroid Build Coastguard Worker key.words[w] = rnd() & 1;
144*03ce13f7SAndroid Build Coastguard Worker }
145*03ce13f7SAndroid Build Coastguard Worker
146*03ce13f7SAndroid Build Coastguard Worker cache.add(key, i);
147*03ce13f7SAndroid Build Coastguard Worker i++;
148*03ce13f7SAndroid Build Coastguard Worker }
149*03ce13f7SAndroid Build Coastguard Worker }
150*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(LRUCacheBenchmark, AddRandomComplexKey)->RangeMultiplier(8)->Range(1, 0x100000)->ArgName("cache-size");
151*03ce13f7SAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(LRUCacheBenchmark,GetComplexKeyCacheHit)152*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(LRUCacheBenchmark, GetComplexKeyCacheHit)
153*03ce13f7SAndroid Build Coastguard Worker (benchmark::State &state)
154*03ce13f7SAndroid Build Coastguard Worker {
155*03ce13f7SAndroid Build Coastguard Worker sw::LRUCache<ComplexKey, size_t, ComplexKeyHash> cache(size);
156*03ce13f7SAndroid Build Coastguard Worker FastRnd rnd;
157*03ce13f7SAndroid Build Coastguard Worker
158*03ce13f7SAndroid Build Coastguard Worker for(size_t i = 0; i < size; i++)
159*03ce13f7SAndroid Build Coastguard Worker {
160*03ce13f7SAndroid Build Coastguard Worker ComplexKey key;
161*03ce13f7SAndroid Build Coastguard Worker for(size_t w = 0; w < key.words.size(); w++)
162*03ce13f7SAndroid Build Coastguard Worker {
163*03ce13f7SAndroid Build Coastguard Worker key.words[w] = (1ull << w);
164*03ce13f7SAndroid Build Coastguard Worker }
165*03ce13f7SAndroid Build Coastguard Worker cache.add(key, i);
166*03ce13f7SAndroid Build Coastguard Worker }
167*03ce13f7SAndroid Build Coastguard Worker
168*03ce13f7SAndroid Build Coastguard Worker for(auto _ : state)
169*03ce13f7SAndroid Build Coastguard Worker {
170*03ce13f7SAndroid Build Coastguard Worker auto i = rnd() & size;
171*03ce13f7SAndroid Build Coastguard Worker
172*03ce13f7SAndroid Build Coastguard Worker ComplexKey key;
173*03ce13f7SAndroid Build Coastguard Worker for(size_t w = 0; w < key.words.size(); w++)
174*03ce13f7SAndroid Build Coastguard Worker {
175*03ce13f7SAndroid Build Coastguard Worker key.words[w] = i & (1ull << w);
176*03ce13f7SAndroid Build Coastguard Worker }
177*03ce13f7SAndroid Build Coastguard Worker cache.lookup(key);
178*03ce13f7SAndroid Build Coastguard Worker }
179*03ce13f7SAndroid Build Coastguard Worker }
180*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(LRUCacheBenchmark, GetComplexKeyCacheHit)->RangeMultiplier(8)->Range(1, 0x100000)->ArgName("cache-size");
181*03ce13f7SAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(LRUCacheBenchmark,GetComplexKeyCacheMiss)182*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(LRUCacheBenchmark, GetComplexKeyCacheMiss)
183*03ce13f7SAndroid Build Coastguard Worker (benchmark::State &state)
184*03ce13f7SAndroid Build Coastguard Worker {
185*03ce13f7SAndroid Build Coastguard Worker sw::LRUCache<ComplexKey, size_t, ComplexKeyHash> cache(size);
186*03ce13f7SAndroid Build Coastguard Worker FastRnd rnd;
187*03ce13f7SAndroid Build Coastguard Worker
188*03ce13f7SAndroid Build Coastguard Worker for(size_t i = 0; i < size; i++)
189*03ce13f7SAndroid Build Coastguard Worker {
190*03ce13f7SAndroid Build Coastguard Worker ComplexKey key;
191*03ce13f7SAndroid Build Coastguard Worker for(size_t w = 0; w < key.words.size(); w++)
192*03ce13f7SAndroid Build Coastguard Worker {
193*03ce13f7SAndroid Build Coastguard Worker key.words[w] = 8 + (1ull << w);
194*03ce13f7SAndroid Build Coastguard Worker }
195*03ce13f7SAndroid Build Coastguard Worker cache.add(key, i);
196*03ce13f7SAndroid Build Coastguard Worker }
197*03ce13f7SAndroid Build Coastguard Worker
198*03ce13f7SAndroid Build Coastguard Worker for(auto _ : state)
199*03ce13f7SAndroid Build Coastguard Worker {
200*03ce13f7SAndroid Build Coastguard Worker auto i = rnd() & size;
201*03ce13f7SAndroid Build Coastguard Worker
202*03ce13f7SAndroid Build Coastguard Worker ComplexKey key;
203*03ce13f7SAndroid Build Coastguard Worker for(size_t w = 0; w < key.words.size(); w++)
204*03ce13f7SAndroid Build Coastguard Worker {
205*03ce13f7SAndroid Build Coastguard Worker key.words[w] = i & (1ull << w);
206*03ce13f7SAndroid Build Coastguard Worker }
207*03ce13f7SAndroid Build Coastguard Worker cache.lookup(key);
208*03ce13f7SAndroid Build Coastguard Worker }
209*03ce13f7SAndroid Build Coastguard Worker }
210*03ce13f7SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(LRUCacheBenchmark, GetComplexKeyCacheMiss)->RangeMultiplier(8)->Range(1, 0x100000)->ArgName("cache-size");
211