blob: 0215f47dc4bf5521ef18a777dbab1cc920f61e18 [file] [log] [blame]
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <audio_utils/ChannelMix.h>
#include <random>
#include <vector>
#include <benchmark/benchmark.h>
#include <log/log.h>
static constexpr audio_channel_mask_t kChannelPositionMasks[] = {
AUDIO_CHANNEL_OUT_FRONT_LEFT,
AUDIO_CHANNEL_OUT_FRONT_CENTER,
AUDIO_CHANNEL_OUT_STEREO,
AUDIO_CHANNEL_OUT_2POINT1,
AUDIO_CHANNEL_OUT_2POINT0POINT2,
AUDIO_CHANNEL_OUT_QUAD, // AUDIO_CHANNEL_OUT_QUAD_BACK
AUDIO_CHANNEL_OUT_QUAD_SIDE,
AUDIO_CHANNEL_OUT_SURROUND,
AUDIO_CHANNEL_OUT_2POINT1POINT2,
AUDIO_CHANNEL_OUT_3POINT0POINT2,
AUDIO_CHANNEL_OUT_PENTA,
AUDIO_CHANNEL_OUT_3POINT1POINT2,
AUDIO_CHANNEL_OUT_5POINT1, // AUDIO_CHANNEL_OUT_5POINT1_BACK
AUDIO_CHANNEL_OUT_5POINT1_SIDE,
AUDIO_CHANNEL_OUT_6POINT1,
AUDIO_CHANNEL_OUT_5POINT1POINT2,
AUDIO_CHANNEL_OUT_7POINT1,
AUDIO_CHANNEL_OUT_5POINT1POINT4,
AUDIO_CHANNEL_OUT_7POINT1POINT2,
AUDIO_CHANNEL_OUT_7POINT1POINT4,
AUDIO_CHANNEL_OUT_13POINT_360RA,
AUDIO_CHANNEL_OUT_22POINT2,
};
/*
$ adb shell /data/benchmarktest64/channelmix_benchmark/channelmix_benchmark
Pixel 7 arm64 benchmark
-----------------------------------------------------------
Benchmark Time CPU Iterations
-----------------------------------------------------------
channelmix_benchmark:
#BM_ChannelMix_Stereo/0 2266 ns 2251 ns 310903
#BM_ChannelMix_Stereo/1 2262 ns 2251 ns 310898
#BM_ChannelMix_Stereo/2 255 ns 254 ns 2754285
#BM_ChannelMix_Stereo/3 2969 ns 2954 ns 235901
#BM_ChannelMix_Stereo/4 3350 ns 3334 ns 209901
#BM_ChannelMix_Stereo/5 814 ns 810 ns 863246
#BM_ChannelMix_Stereo/6 814 ns 810 ns 863255
#BM_ChannelMix_Stereo/7 3349 ns 3328 ns 210234
#BM_ChannelMix_Stereo/8 3671 ns 3654 ns 191555
#BM_ChannelMix_Stereo/9 3680 ns 3654 ns 191583
#BM_ChannelMix_Stereo/10 3667 ns 3650 ns 191738
#BM_ChannelMix_Stereo/11 4109 ns 4089 ns 171118
#BM_ChannelMix_Stereo/12 1209 ns 1203 ns 581812
#BM_ChannelMix_Stereo/13 1209 ns 1203 ns 581666
#BM_ChannelMix_Stereo/14 4694 ns 4674 ns 149798
#BM_ChannelMix_Stereo/15 1306 ns 1301 ns 537843
#BM_ChannelMix_Stereo/16 1307 ns 1301 ns 537898
#BM_ChannelMix_Stereo/17 2059 ns 2050 ns 341145
#BM_ChannelMix_Stereo/18 2053 ns 2043 ns 342709
#BM_ChannelMix_Stereo/19 2462 ns 2451 ns 285554
#BM_ChannelMix_Stereo/20 7889 ns 7853 ns 89005
#BM_ChannelMix_Stereo/21 6133 ns 6104 ns 114499
#BM_ChannelMix_5Point1/0 1676 ns 1665 ns 420195
#BM_ChannelMix_5Point1/1 1675 ns 1667 ns 419527
#BM_ChannelMix_5Point1/2 537 ns 535 ns 1310551
#BM_ChannelMix_5Point1/3 3039 ns 3024 ns 231306
#BM_ChannelMix_5Point1/4 3763 ns 3744 ns 186929
#BM_ChannelMix_5Point1/5 698 ns 695 ns 990457
#BM_ChannelMix_5Point1/6 661 ns 657 ns 1058724
#BM_ChannelMix_5Point1/7 3766 ns 3748 ns 186771
#BM_ChannelMix_5Point1/8 4395 ns 4374 ns 159819
#BM_ChannelMix_5Point1/9 4389 ns 4369 ns 160144
#BM_ChannelMix_5Point1/10 4390 ns 4369 ns 160196
#BM_ChannelMix_5Point1/11 5111 ns 5084 ns 137574
#BM_ChannelMix_5Point1/12 652 ns 649 ns 1086857
#BM_ChannelMix_5Point1/13 653 ns 649 ns 1072477
#BM_ChannelMix_5Point1/14 5762 ns 5734 ns 122129
#BM_ChannelMix_5Point1/15 778 ns 774 ns 903415
#BM_ChannelMix_5Point1/16 778 ns 775 ns 903085
#BM_ChannelMix_5Point1/17 1220 ns 1214 ns 575908
#BM_ChannelMix_5Point1/18 1015 ns 1006 ns 694142
#BM_ChannelMix_5Point1/19 1382 ns 1373 ns 509721
#BM_ChannelMix_5Point1/20 10184 ns 10076 ns 69550
#BM_ChannelMix_5Point1/21 5401 ns 5362 ns 130580
#BM_ChannelMix_7Point1/0 1644 ns 1632 ns 428673
#BM_ChannelMix_7Point1/1 1640 ns 1633 ns 428639
#BM_ChannelMix_7Point1/2 722 ns 719 ns 973262
#BM_ChannelMix_7Point1/3 3076 ns 3062 ns 228509
#BM_ChannelMix_7Point1/4 3902 ns 3884 ns 180207
#BM_ChannelMix_7Point1/5 727 ns 723 ns 968505
#BM_ChannelMix_7Point1/6 3905 ns 3886 ns 180132
#BM_ChannelMix_7Point1/7 3903 ns 3886 ns 180110
#BM_ChannelMix_7Point1/8 4723 ns 4700 ns 148911
#BM_ChannelMix_7Point1/9 4727 ns 4704 ns 148850
#BM_ChannelMix_7Point1/10 4723 ns 4702 ns 148944
#BM_ChannelMix_7Point1/11 5518 ns 5492 ns 127454
#BM_ChannelMix_7Point1/12 723 ns 720 ns 971533
#BM_ChannelMix_7Point1/13 5520 ns 5492 ns 127444
#BM_ChannelMix_7Point1/14 6299 ns 6270 ns 111619
#BM_ChannelMix_7Point1/15 561 ns 559 ns 1266804
#BM_ChannelMix_7Point1/16 563 ns 559 ns 1254781
#BM_ChannelMix_7Point1/17 1240 ns 1234 ns 561452
#BM_ChannelMix_7Point1/18 1100 ns 1095 ns 638789
#BM_ChannelMix_7Point1/19 1525 ns 1518 ns 460122
#BM_ChannelMix_7Point1/20 10998 ns 10950 ns 63928
#BM_ChannelMix_7Point1/21 4656 ns 4621 ns 151487
#BM_ChannelMix_7Point1Point4/0 2301 ns 2290 ns 305500
#BM_ChannelMix_7Point1Point4/1 2301 ns 2290 ns 305620
#BM_ChannelMix_7Point1Point4/2 913 ns 908 ns 770049
#BM_ChannelMix_7Point1Point4/3 4232 ns 4212 ns 166032
#BM_ChannelMix_7Point1Point4/4 5241 ns 5216 ns 134179
#BM_ChannelMix_7Point1Point4/5 1084 ns 1079 ns 648761
#BM_ChannelMix_7Point1Point4/6 5243 ns 5219 ns 134126
#BM_ChannelMix_7Point1Point4/7 5250 ns 5226 ns 133968
#BM_ChannelMix_7Point1Point4/8 6225 ns 6194 ns 112973
#BM_ChannelMix_7Point1Point4/9 6223 ns 6193 ns 112985
#BM_ChannelMix_7Point1Point4/10 6223 ns 6193 ns 113047
#BM_ChannelMix_7Point1Point4/11 7416 ns 7380 ns 94840
#BM_ChannelMix_7Point1Point4/12 903 ns 899 ns 778228
#BM_ChannelMix_7Point1Point4/13 7414 ns 7380 ns 94835
#BM_ChannelMix_7Point1Point4/14 8354 ns 8314 ns 84219
#BM_ChannelMix_7Point1Point4/15 818 ns 815 ns 865119
#BM_ChannelMix_7Point1Point4/16 820 ns 816 ns 854456
#BM_ChannelMix_7Point1Point4/17 1106 ns 1100 ns 636240
#BM_ChannelMix_7Point1Point4/18 1104 ns 1099 ns 636313
#BM_ChannelMix_7Point1Point4/19 1151 ns 1145 ns 611497
#BM_ChannelMix_7Point1Point4/20 14454 ns 14385 ns 48561
#BM_ChannelMix_7Point1Point4/21 5982 ns 5954 ns 117562
*/
template<audio_channel_mask_t OUTPUT_CHANNEL_MASK>
static void BenchmarkChannelMix(benchmark::State& state) {
const audio_channel_mask_t channelMask = kChannelPositionMasks[state.range(0)];
using namespace ::android::audio_utils::channels;
ChannelMix<OUTPUT_CHANNEL_MASK> channelMix(channelMask);
const size_t outChannels = audio_channel_count_from_out_mask(OUTPUT_CHANNEL_MASK);
constexpr size_t frameCount = 1024;
size_t inChannels = audio_channel_count_from_out_mask(channelMask);
std::vector<float> input(inChannels * frameCount);
std::vector<float> output(outChannels * frameCount);
constexpr float amplitude = 0.01f;
std::minstd_rand gen(channelMask);
std::uniform_real_distribution<> dis(-amplitude, amplitude);
for (auto& in : input) {
in = dis(gen);
}
assert(channelMix.getInputChannelMask() != AUDIO_CHANNEL_NONE);
// Run the test
for (auto _ : state) {
benchmark::DoNotOptimize(input.data());
benchmark::DoNotOptimize(output.data());
channelMix.process(input.data(), output.data(), frameCount, false /* accumulate */);
benchmark::ClobberMemory();
}
state.SetComplexityN(inChannels);
state.SetLabel(audio_channel_out_mask_to_string(channelMask));
}
static void BM_ChannelMix_Stereo(benchmark::State& state) {
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_STEREO>(state);
}
static void BM_ChannelMix_5Point1(benchmark::State& state) {
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_5POINT1>(state);
}
static void BM_ChannelMix_7Point1(benchmark::State& state) {
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_7POINT1>(state);
}
static void BM_ChannelMix_7Point1Point4(benchmark::State& state) {
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_7POINT1POINT4>(state);
}
static void ChannelMixArgs(benchmark::internal::Benchmark* b) {
for (int i = 0; i < (int)std::size(kChannelPositionMasks); i++) {
b->Args({i});
}
}
BENCHMARK(BM_ChannelMix_Stereo)->Apply(ChannelMixArgs);
BENCHMARK(BM_ChannelMix_5Point1)->Apply(ChannelMixArgs);
BENCHMARK(BM_ChannelMix_7Point1)->Apply(ChannelMixArgs);
BENCHMARK(BM_ChannelMix_7Point1Point4)->Apply(ChannelMixArgs);
BENCHMARK_MAIN();