1*b9df5ad1SAndroid Build Coastguard Worker /*
2*b9df5ad1SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*b9df5ad1SAndroid Build Coastguard Worker *
4*b9df5ad1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b9df5ad1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b9df5ad1SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b9df5ad1SAndroid Build Coastguard Worker *
8*b9df5ad1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b9df5ad1SAndroid Build Coastguard Worker *
10*b9df5ad1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b9df5ad1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b9df5ad1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b9df5ad1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b9df5ad1SAndroid Build Coastguard Worker * limitations under the License.
15*b9df5ad1SAndroid Build Coastguard Worker */
16*b9df5ad1SAndroid Build Coastguard Worker
17*b9df5ad1SAndroid Build Coastguard Worker #include <cstddef>
18*b9df5ad1SAndroid Build Coastguard Worker #include <random>
19*b9df5ad1SAndroid Build Coastguard Worker #include <vector>
20*b9df5ad1SAndroid Build Coastguard Worker
21*b9df5ad1SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
22*b9df5ad1SAndroid Build Coastguard Worker
23*b9df5ad1SAndroid Build Coastguard Worker #include <audio_utils/primitives.h>
24*b9df5ad1SAndroid Build Coastguard Worker
BM_MemcpyToFloatFromFloatWithClamping(benchmark::State & state)25*b9df5ad1SAndroid Build Coastguard Worker static void BM_MemcpyToFloatFromFloatWithClamping(benchmark::State& state) {
26*b9df5ad1SAndroid Build Coastguard Worker const size_t count = state.range(0);
27*b9df5ad1SAndroid Build Coastguard Worker const float srcMax = state.range(1);
28*b9df5ad1SAndroid Build Coastguard Worker const float absMax = 1.413;
29*b9df5ad1SAndroid Build Coastguard Worker
30*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> src(count);
31*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> dst(count);
32*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> expected(count);
33*b9df5ad1SAndroid Build Coastguard Worker
34*b9df5ad1SAndroid Build Coastguard Worker // Initialize src buffer with deterministic pseudo-random values
35*b9df5ad1SAndroid Build Coastguard Worker std::minstd_rand gen(count);
36*b9df5ad1SAndroid Build Coastguard Worker std::uniform_real_distribution<> dis(-srcMax, srcMax);
37*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < count; i++) {
38*b9df5ad1SAndroid Build Coastguard Worker src[i] = dis(gen);
39*b9df5ad1SAndroid Build Coastguard Worker expected[i] = fmin(absMax, fmax(-absMax, src[i]));
40*b9df5ad1SAndroid Build Coastguard Worker }
41*b9df5ad1SAndroid Build Coastguard Worker
42*b9df5ad1SAndroid Build Coastguard Worker // Run the test
43*b9df5ad1SAndroid Build Coastguard Worker while (state.KeepRunning()) {
44*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(src.data());
45*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(dst.data());
46*b9df5ad1SAndroid Build Coastguard Worker memcpy_to_float_from_float_with_clamping(dst.data(), src.data(), count, 1.413);
47*b9df5ad1SAndroid Build Coastguard Worker benchmark::ClobberMemory();
48*b9df5ad1SAndroid Build Coastguard Worker }
49*b9df5ad1SAndroid Build Coastguard Worker
50*b9df5ad1SAndroid Build Coastguard Worker if (expected != dst) {
51*b9df5ad1SAndroid Build Coastguard Worker state.SkipWithError("Incorrect clamping!");
52*b9df5ad1SAndroid Build Coastguard Worker }
53*b9df5ad1SAndroid Build Coastguard Worker state.SetComplexityN(state.range(0));
54*b9df5ad1SAndroid Build Coastguard Worker }
55*b9df5ad1SAndroid Build Coastguard Worker
56*b9df5ad1SAndroid Build Coastguard Worker BENCHMARK(BM_MemcpyToFloatFromFloatWithClamping)->RangeMultiplier(2)->Ranges({{10, 8<<12}, {1, 2}});
57*b9df5ad1SAndroid Build Coastguard Worker
BM_MemcpyFloat(benchmark::State & state)58*b9df5ad1SAndroid Build Coastguard Worker static void BM_MemcpyFloat(benchmark::State& state) {
59*b9df5ad1SAndroid Build Coastguard Worker const size_t count = state.range(0);
60*b9df5ad1SAndroid Build Coastguard Worker
61*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> src(count);
62*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> dst(count);
63*b9df5ad1SAndroid Build Coastguard Worker
64*b9df5ad1SAndroid Build Coastguard Worker // Initialize src buffer with deterministic pseudo-random values
65*b9df5ad1SAndroid Build Coastguard Worker std::minstd_rand gen(count);
66*b9df5ad1SAndroid Build Coastguard Worker std::uniform_real_distribution<> dis;
67*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < count; i++) {
68*b9df5ad1SAndroid Build Coastguard Worker src[i] = dis(gen);
69*b9df5ad1SAndroid Build Coastguard Worker }
70*b9df5ad1SAndroid Build Coastguard Worker
71*b9df5ad1SAndroid Build Coastguard Worker // Run the test
72*b9df5ad1SAndroid Build Coastguard Worker while (state.KeepRunning()) {
73*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(src.data());
74*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(dst.data());
75*b9df5ad1SAndroid Build Coastguard Worker memcpy(dst.data(), src.data(), count * sizeof(float));
76*b9df5ad1SAndroid Build Coastguard Worker benchmark::ClobberMemory();
77*b9df5ad1SAndroid Build Coastguard Worker }
78*b9df5ad1SAndroid Build Coastguard Worker
79*b9df5ad1SAndroid Build Coastguard Worker if (src != dst) {
80*b9df5ad1SAndroid Build Coastguard Worker state.SkipWithError("Incorrect memcpy!");
81*b9df5ad1SAndroid Build Coastguard Worker }
82*b9df5ad1SAndroid Build Coastguard Worker state.SetComplexityN(state.range(0));
83*b9df5ad1SAndroid Build Coastguard Worker }
84*b9df5ad1SAndroid Build Coastguard Worker
85*b9df5ad1SAndroid Build Coastguard Worker BENCHMARK(BM_MemcpyFloat)->RangeMultiplier(2)->Ranges({{10, 8<<12}});
86*b9df5ad1SAndroid Build Coastguard Worker
BM_MemcpyToFloatFromI16(benchmark::State & state)87*b9df5ad1SAndroid Build Coastguard Worker static void BM_MemcpyToFloatFromI16(benchmark::State& state) {
88*b9df5ad1SAndroid Build Coastguard Worker const size_t count = state.range(0);
89*b9df5ad1SAndroid Build Coastguard Worker
90*b9df5ad1SAndroid Build Coastguard Worker std::vector<int16_t> src(count);
91*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> dst(count);
92*b9df5ad1SAndroid Build Coastguard Worker
93*b9df5ad1SAndroid Build Coastguard Worker // Initialize src buffer with deterministic pseudo-random values
94*b9df5ad1SAndroid Build Coastguard Worker std::minstd_rand gen(count);
95*b9df5ad1SAndroid Build Coastguard Worker std::uniform_int_distribution<> dis(INT16_MIN, INT16_MAX);
96*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < count; i++) {
97*b9df5ad1SAndroid Build Coastguard Worker src[i] = dis(gen);
98*b9df5ad1SAndroid Build Coastguard Worker }
99*b9df5ad1SAndroid Build Coastguard Worker
100*b9df5ad1SAndroid Build Coastguard Worker // Run the test
101*b9df5ad1SAndroid Build Coastguard Worker while (state.KeepRunning()) {
102*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(src.data());
103*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(dst.data());
104*b9df5ad1SAndroid Build Coastguard Worker memcpy_to_float_from_i16(dst.data(), src.data(), count);
105*b9df5ad1SAndroid Build Coastguard Worker benchmark::ClobberMemory();
106*b9df5ad1SAndroid Build Coastguard Worker }
107*b9df5ad1SAndroid Build Coastguard Worker
108*b9df5ad1SAndroid Build Coastguard Worker state.SetComplexityN(state.range(0));
109*b9df5ad1SAndroid Build Coastguard Worker }
110*b9df5ad1SAndroid Build Coastguard Worker
111*b9df5ad1SAndroid Build Coastguard Worker BENCHMARK(BM_MemcpyToFloatFromI16)->RangeMultiplier(2)->Ranges({{10, 8<<12}});
112*b9df5ad1SAndroid Build Coastguard Worker
113*b9df5ad1SAndroid Build Coastguard Worker
BM_MemcpyToI16FromFloat(benchmark::State & state)114*b9df5ad1SAndroid Build Coastguard Worker static void BM_MemcpyToI16FromFloat(benchmark::State& state) {
115*b9df5ad1SAndroid Build Coastguard Worker const size_t count = state.range(0);
116*b9df5ad1SAndroid Build Coastguard Worker
117*b9df5ad1SAndroid Build Coastguard Worker std::vector<float> src(count);
118*b9df5ad1SAndroid Build Coastguard Worker std::vector<int16_t> dst(count);
119*b9df5ad1SAndroid Build Coastguard Worker
120*b9df5ad1SAndroid Build Coastguard Worker // Initialize src buffer with deterministic pseudo-random values
121*b9df5ad1SAndroid Build Coastguard Worker std::minstd_rand gen(count);
122*b9df5ad1SAndroid Build Coastguard Worker std::uniform_real_distribution<> dis;
123*b9df5ad1SAndroid Build Coastguard Worker for (size_t i = 0; i < count; i++) {
124*b9df5ad1SAndroid Build Coastguard Worker src[i] = dis(gen);
125*b9df5ad1SAndroid Build Coastguard Worker }
126*b9df5ad1SAndroid Build Coastguard Worker
127*b9df5ad1SAndroid Build Coastguard Worker // Run the test
128*b9df5ad1SAndroid Build Coastguard Worker while (state.KeepRunning()) {
129*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(src.data());
130*b9df5ad1SAndroid Build Coastguard Worker benchmark::DoNotOptimize(dst.data());
131*b9df5ad1SAndroid Build Coastguard Worker memcpy_to_i16_from_float(dst.data(), src.data(), count);
132*b9df5ad1SAndroid Build Coastguard Worker benchmark::ClobberMemory();
133*b9df5ad1SAndroid Build Coastguard Worker }
134*b9df5ad1SAndroid Build Coastguard Worker
135*b9df5ad1SAndroid Build Coastguard Worker state.SetComplexityN(state.range(0));
136*b9df5ad1SAndroid Build Coastguard Worker }
137*b9df5ad1SAndroid Build Coastguard Worker
138*b9df5ad1SAndroid Build Coastguard Worker BENCHMARK(BM_MemcpyToI16FromFloat)->RangeMultiplier(2)->Ranges({{10, 8<<12}});
139*b9df5ad1SAndroid Build Coastguard Worker
140*b9df5ad1SAndroid Build Coastguard Worker BENCHMARK_MAIN();
141