blob: 8a375afb606293e35f46aa471dfd16fc7698387d [file] [log] [blame]
Frank Barchardc2010062020-07-19 10:04:12 -07001// Copyright 2020 Google LLC
2//
3// This source code is licensed under the BSD-style license found in the
4// LICENSE file in the root directory of this source tree.
5
6#include <algorithm>
7#include <cmath>
8#include <functional>
9#include <random>
10#include <vector>
11
Frank Barchardc2010062020-07-19 10:04:12 -070012#include <benchmark/benchmark.h>
13#include <fp16/fp16.h>
14#include "bench/utils.h"
15#include <xnnpack/AlignedAllocator.h>
16#include <xnnpack/common.h>
17#include <xnnpack/params.h>
18#include <xnnpack/vunary.h>
19
20
21static void f16_relu(
22 benchmark::State& state,
23 xnn_f16_relu_ukernel_function f16_relu,
24 benchmark::utils::IsaCheckFunction isa_check = nullptr)
25{
Frank Barchardc2010062020-07-19 10:04:12 -070026 if (isa_check && !isa_check(state)) {
27 return;
28 }
29
Marat Dukhand713e8a2020-12-04 14:23:12 -080030 const size_t elements = state.range(0);
Frank Barchardc2010062020-07-19 10:04:12 -070031
32 std::random_device random_device;
33 auto rng = std::mt19937(random_device());
Marat Dukhan44f0ca72020-08-02 21:46:58 -070034 auto f32rng = std::bind(std::uniform_real_distribution<float>(-10.0f, 10.0f), std::ref(rng));
Frank Barchardc2010062020-07-19 10:04:12 -070035 auto f16rng = std::bind(fp16_ieee_from_fp32_value, f32rng);
36
Marat Dukhand713e8a2020-12-04 14:23:12 -080037 std::vector<uint16_t, AlignedAllocator<uint16_t, 64>> x(elements);
Frank Barchardc2010062020-07-19 10:04:12 -070038 std::generate(x.begin(), x.end(), std::ref(f16rng));
Marat Dukhand713e8a2020-12-04 14:23:12 -080039 std::vector<uint16_t, AlignedAllocator<uint16_t, 64>> y(elements);
Frank Barchardc2010062020-07-19 10:04:12 -070040 std::generate(x.begin(), x.end(), std::ref(f16rng));
41
42 for (auto _ : state) {
Marat Dukhand713e8a2020-12-04 14:23:12 -080043 f16_relu(elements * sizeof(uint16_t), x.data(), y.data(), NULL);
Frank Barchardc2010062020-07-19 10:04:12 -070044 }
45
Marat Dukhand713e8a2020-12-04 14:23:12 -080046 const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
47 if (cpu_frequency != 0) {
48 state.counters["cpufreq"] = cpu_frequency;
49 }
Frank Barchardc2010062020-07-19 10:04:12 -070050
Marat Dukhand713e8a2020-12-04 14:23:12 -080051 const size_t elements_per_iteration = elements;
Frank Barchardc2010062020-07-19 10:04:12 -070052 state.counters["elements"] =
Marat Dukhand713e8a2020-12-04 14:23:12 -080053 benchmark::Counter(uint64_t(state.iterations()) * elements_per_iteration, benchmark::Counter::kIsRate);
Frank Barchardc2010062020-07-19 10:04:12 -070054
Marat Dukhand713e8a2020-12-04 14:23:12 -080055 const size_t bytes_per_iteration = 2 * elements * sizeof(uint16_t);
Frank Barchardc2010062020-07-19 10:04:12 -070056 state.counters["bytes"] =
Marat Dukhand713e8a2020-12-04 14:23:12 -080057 benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
Frank Barchardc2010062020-07-19 10:04:12 -070058}
59
60#if XNN_ARCH_ARM64
61 BENCHMARK_CAPTURE(f16_relu, neonfp16arith_x8, xnn_f16_relu_ukernel__neonfp16arith_x8, benchmark::utils::CheckNEONFP16ARITH)
62 ->RangeMultiplier(10)
63 ->Range(1000, 100000000)
64 ->UseRealTime();
65 BENCHMARK_CAPTURE(f16_relu, neonfp16arith_x16, xnn_f16_relu_ukernel__neonfp16arith_x16, benchmark::utils::CheckNEONFP16ARITH)
66 ->RangeMultiplier(10)
67 ->Range(1000, 100000000)
68 ->UseRealTime();
69#endif // XNN_ARCH_ARM64
70
71
72#ifndef XNNPACK_BENCHMARK_NO_MAIN
73BENCHMARK_MAIN();
74#endif