1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2020 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker
6*4bdc9457SAndroid Build Coastguard Worker #include <algorithm>
7*4bdc9457SAndroid Build Coastguard Worker #include <array>
8*4bdc9457SAndroid Build Coastguard Worker #include <cmath>
9*4bdc9457SAndroid Build Coastguard Worker #include <functional>
10*4bdc9457SAndroid Build Coastguard Worker #include <limits>
11*4bdc9457SAndroid Build Coastguard Worker #include <random>
12*4bdc9457SAndroid Build Coastguard Worker #include <vector>
13*4bdc9457SAndroid Build Coastguard Worker
14*4bdc9457SAndroid Build Coastguard Worker #include <fp16.h>
15*4bdc9457SAndroid Build Coastguard Worker
16*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack.h>
17*4bdc9457SAndroid Build Coastguard Worker
18*4bdc9457SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
19*4bdc9457SAndroid Build Coastguard Worker #include "bench/utils.h"
20*4bdc9457SAndroid Build Coastguard Worker #ifdef BENCHMARK_TENSORFLOW_LITE
21*4bdc9457SAndroid Build Coastguard Worker #include "flatbuffers/include/flatbuffers/flatbuffers.h"
22*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/interpreter.h"
23*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/kernels/register.h"
24*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/model.h"
25*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/schema/schema_generated.h"
26*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/version.h"
27*4bdc9457SAndroid Build Coastguard Worker #endif // BENCHMARK_TENSORFLOW_LITE
28*4bdc9457SAndroid Build Coastguard Worker
29*4bdc9457SAndroid Build Coastguard Worker
xnnpack_hardswish_f32(benchmark::State & state)30*4bdc9457SAndroid Build Coastguard Worker static void xnnpack_hardswish_f32(benchmark::State& state) {
31*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
32*4bdc9457SAndroid Build Coastguard Worker
33*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
34*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
35*4bdc9457SAndroid Build Coastguard Worker auto f32rng = std::bind(std::uniform_real_distribution<float>(-5.0f, 5.0f), std::ref(rng));
36*4bdc9457SAndroid Build Coastguard Worker
37*4bdc9457SAndroid Build Coastguard Worker std::vector<float> input(batch_size + XNN_EXTRA_BYTES / sizeof(float));
38*4bdc9457SAndroid Build Coastguard Worker std::vector<float> output(batch_size);
39*4bdc9457SAndroid Build Coastguard Worker std::generate(input.begin(), input.end(), std::ref(f32rng));
40*4bdc9457SAndroid Build Coastguard Worker std::fill(output.begin(), output.end(), std::nanf(""));
41*4bdc9457SAndroid Build Coastguard Worker
42*4bdc9457SAndroid Build Coastguard Worker xnn_status status = xnn_initialize(nullptr /* allocator */);
43*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
44*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to initialize XNNPACK");
45*4bdc9457SAndroid Build Coastguard Worker return;
46*4bdc9457SAndroid Build Coastguard Worker }
47*4bdc9457SAndroid Build Coastguard Worker
48*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t hardswish_op = nullptr;
49*4bdc9457SAndroid Build Coastguard Worker status = xnn_create_hardswish_nc_f32(
50*4bdc9457SAndroid Build Coastguard Worker 1 /* channels */, 1 /* input stride */, 1 /* output stride */,
51*4bdc9457SAndroid Build Coastguard Worker 0 /* flags */, &hardswish_op);
52*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success || hardswish_op == nullptr) {
53*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create HardSwish operator");
54*4bdc9457SAndroid Build Coastguard Worker return;
55*4bdc9457SAndroid Build Coastguard Worker }
56*4bdc9457SAndroid Build Coastguard Worker
57*4bdc9457SAndroid Build Coastguard Worker status = xnn_setup_hardswish_nc_f32(
58*4bdc9457SAndroid Build Coastguard Worker hardswish_op, batch_size,
59*4bdc9457SAndroid Build Coastguard Worker input.data(), output.data(),
60*4bdc9457SAndroid Build Coastguard Worker nullptr /* thread pool */);
61*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
62*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to setup HardSwish operator");
63*4bdc9457SAndroid Build Coastguard Worker return;
64*4bdc9457SAndroid Build Coastguard Worker }
65*4bdc9457SAndroid Build Coastguard Worker
66*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
67*4bdc9457SAndroid Build Coastguard Worker status = xnn_run_operator(hardswish_op, nullptr /* thread pool */);
68*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
69*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to run HardSwish operator");
70*4bdc9457SAndroid Build Coastguard Worker return;
71*4bdc9457SAndroid Build Coastguard Worker }
72*4bdc9457SAndroid Build Coastguard Worker }
73*4bdc9457SAndroid Build Coastguard Worker
74*4bdc9457SAndroid Build Coastguard Worker status = xnn_delete_operator(hardswish_op);
75*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
76*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to delete HardSwish operator");
77*4bdc9457SAndroid Build Coastguard Worker return;
78*4bdc9457SAndroid Build Coastguard Worker }
79*4bdc9457SAndroid Build Coastguard Worker
80*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
81*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
82*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
83*4bdc9457SAndroid Build Coastguard Worker }
84*4bdc9457SAndroid Build Coastguard Worker
85*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
86*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
87*4bdc9457SAndroid Build Coastguard Worker
88*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(float);
89*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
90*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
91*4bdc9457SAndroid Build Coastguard Worker }
92*4bdc9457SAndroid Build Coastguard Worker
93*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_F16_OPERATORS
xnnpack_hardswish_f16(benchmark::State & state)94*4bdc9457SAndroid Build Coastguard Worker static void xnnpack_hardswish_f16(benchmark::State& state) {
95*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
96*4bdc9457SAndroid Build Coastguard Worker
97*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
98*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
99*4bdc9457SAndroid Build Coastguard Worker auto f32rng = std::bind(std::uniform_real_distribution<float>(-10.0f, 10.0f), std::ref(rng));
100*4bdc9457SAndroid Build Coastguard Worker auto f16rng = std::bind(fp16_ieee_from_fp32_value, f32rng);
101*4bdc9457SAndroid Build Coastguard Worker
102*4bdc9457SAndroid Build Coastguard Worker std::vector<uint16_t> input(batch_size + XNN_EXTRA_BYTES / sizeof(uint16_t));
103*4bdc9457SAndroid Build Coastguard Worker std::vector<uint16_t> output(batch_size);
104*4bdc9457SAndroid Build Coastguard Worker std::generate(input.begin(), input.end(), std::ref(f16rng));
105*4bdc9457SAndroid Build Coastguard Worker std::fill(output.begin(), output.end(), std::nanf(""));
106*4bdc9457SAndroid Build Coastguard Worker
107*4bdc9457SAndroid Build Coastguard Worker xnn_status status = xnn_initialize(nullptr /* allocator */);
108*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
109*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to initialize XNNPACK");
110*4bdc9457SAndroid Build Coastguard Worker return;
111*4bdc9457SAndroid Build Coastguard Worker }
112*4bdc9457SAndroid Build Coastguard Worker
113*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t hardswish_op = nullptr;
114*4bdc9457SAndroid Build Coastguard Worker status = xnn_create_hardswish_nc_f16(
115*4bdc9457SAndroid Build Coastguard Worker 1 /* channels */, 1 /* input stride */, 1 /* output stride */,
116*4bdc9457SAndroid Build Coastguard Worker 0 /* flags */, &hardswish_op);
117*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success || hardswish_op == nullptr) {
118*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create HardSwish operator");
119*4bdc9457SAndroid Build Coastguard Worker return;
120*4bdc9457SAndroid Build Coastguard Worker }
121*4bdc9457SAndroid Build Coastguard Worker
122*4bdc9457SAndroid Build Coastguard Worker status = xnn_setup_hardswish_nc_f16(
123*4bdc9457SAndroid Build Coastguard Worker hardswish_op, batch_size,
124*4bdc9457SAndroid Build Coastguard Worker input.data(), output.data(),
125*4bdc9457SAndroid Build Coastguard Worker nullptr /* thread pool */);
126*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
127*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to setup HardSwish operator");
128*4bdc9457SAndroid Build Coastguard Worker return;
129*4bdc9457SAndroid Build Coastguard Worker }
130*4bdc9457SAndroid Build Coastguard Worker
131*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
132*4bdc9457SAndroid Build Coastguard Worker status = xnn_run_operator(hardswish_op, nullptr /* thread pool */);
133*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
134*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to run HardSwish operator");
135*4bdc9457SAndroid Build Coastguard Worker return;
136*4bdc9457SAndroid Build Coastguard Worker }
137*4bdc9457SAndroid Build Coastguard Worker }
138*4bdc9457SAndroid Build Coastguard Worker
139*4bdc9457SAndroid Build Coastguard Worker status = xnn_delete_operator(hardswish_op);
140*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
141*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to delete HardSwish operator");
142*4bdc9457SAndroid Build Coastguard Worker return;
143*4bdc9457SAndroid Build Coastguard Worker }
144*4bdc9457SAndroid Build Coastguard Worker
145*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
146*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
147*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
148*4bdc9457SAndroid Build Coastguard Worker }
149*4bdc9457SAndroid Build Coastguard Worker
150*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
151*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
152*4bdc9457SAndroid Build Coastguard Worker
153*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(uint16_t);
154*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
155*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
156*4bdc9457SAndroid Build Coastguard Worker }
157*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_F16_OPERATORS
158*4bdc9457SAndroid Build Coastguard Worker
159*4bdc9457SAndroid Build Coastguard Worker #ifdef BENCHMARK_TENSORFLOW_LITE
tflite_hardswish_f32(benchmark::State & state)160*4bdc9457SAndroid Build Coastguard Worker static void tflite_hardswish_f32(benchmark::State& state) {
161*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
162*4bdc9457SAndroid Build Coastguard Worker
163*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
164*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
165*4bdc9457SAndroid Build Coastguard Worker auto f32rng = std::bind(std::uniform_real_distribution<float>(-5.0f, 5.0f), std::ref(rng));
166*4bdc9457SAndroid Build Coastguard Worker
167*4bdc9457SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder builder;
168*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::OperatorCode> operator_code =
169*4bdc9457SAndroid Build Coastguard Worker CreateOperatorCode(builder, tflite::BuiltinOperator_HARD_SWISH);
170*4bdc9457SAndroid Build Coastguard Worker
171*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Buffer>, 1> buffers{{
172*4bdc9457SAndroid Build Coastguard Worker tflite::CreateBuffer(builder, builder.CreateVector({})),
173*4bdc9457SAndroid Build Coastguard Worker }};
174*4bdc9457SAndroid Build Coastguard Worker
175*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> shape{{
176*4bdc9457SAndroid Build Coastguard Worker static_cast<int32_t>(batch_size)
177*4bdc9457SAndroid Build Coastguard Worker }};
178*4bdc9457SAndroid Build Coastguard Worker
179*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Tensor>, 2> tensors{{
180*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
181*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
182*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_FLOAT32),
183*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
184*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
185*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_FLOAT32),
186*4bdc9457SAndroid Build Coastguard Worker }};
187*4bdc9457SAndroid Build Coastguard Worker
188*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_inputs{{ 0 }};
189*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_outputs{{ 1 }};
190*4bdc9457SAndroid Build Coastguard Worker flatbuffers::Offset<tflite::Operator> op = tflite::CreateOperator(
191*4bdc9457SAndroid Build Coastguard Worker builder,
192*4bdc9457SAndroid Build Coastguard Worker 0 /* opcode_index */,
193*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_inputs.data(), op_inputs.size()),
194*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_outputs.data(), op_outputs.size()));
195*4bdc9457SAndroid Build Coastguard Worker
196*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_inputs{{ 0 }};
197*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_outputs{{ 1 }};
198*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::SubGraph> subgraph = tflite::CreateSubGraph(
199*4bdc9457SAndroid Build Coastguard Worker builder,
200*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(tensors.data(), tensors.size()),
201*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_inputs.data(), graph_inputs.size()),
202*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_outputs.data(), graph_outputs.size()),
203*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&op, 1));
204*4bdc9457SAndroid Build Coastguard Worker
205*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::Model> model_buffer = tflite::CreateModel(builder,
206*4bdc9457SAndroid Build Coastguard Worker TFLITE_SCHEMA_VERSION,
207*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&operator_code, 1),
208*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&subgraph, 1),
209*4bdc9457SAndroid Build Coastguard Worker builder.CreateString("HardSwish model"),
210*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(buffers.data(), buffers.size()));
211*4bdc9457SAndroid Build Coastguard Worker
212*4bdc9457SAndroid Build Coastguard Worker builder.Finish(model_buffer);
213*4bdc9457SAndroid Build Coastguard Worker
214*4bdc9457SAndroid Build Coastguard Worker const tflite::Model* model = tflite::GetModel(builder.GetBufferPointer());
215*4bdc9457SAndroid Build Coastguard Worker tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
216*4bdc9457SAndroid Build Coastguard Worker tflite::InterpreterBuilder interpreterBuilder(model, resolver);
217*4bdc9457SAndroid Build Coastguard Worker std::unique_ptr<tflite::Interpreter> interpreter;
218*4bdc9457SAndroid Build Coastguard Worker if (interpreterBuilder(&interpreter) != kTfLiteOk || interpreter == nullptr) {
219*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create TFLite interpreter");
220*4bdc9457SAndroid Build Coastguard Worker return;
221*4bdc9457SAndroid Build Coastguard Worker }
222*4bdc9457SAndroid Build Coastguard Worker interpreter->SetNumThreads(1);
223*4bdc9457SAndroid Build Coastguard Worker
224*4bdc9457SAndroid Build Coastguard Worker if (interpreter->AllocateTensors() != kTfLiteOk) {
225*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to allocate tensors");
226*4bdc9457SAndroid Build Coastguard Worker return;
227*4bdc9457SAndroid Build Coastguard Worker }
228*4bdc9457SAndroid Build Coastguard Worker
229*4bdc9457SAndroid Build Coastguard Worker std::generate(
230*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<float>(0),
231*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<float>(0) + batch_size,
232*4bdc9457SAndroid Build Coastguard Worker std::ref(f32rng));
233*4bdc9457SAndroid Build Coastguard Worker
234*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
235*4bdc9457SAndroid Build Coastguard Worker if (interpreter->Invoke() != kTfLiteOk) {
236*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to invoke TFLite interpreter");
237*4bdc9457SAndroid Build Coastguard Worker return;
238*4bdc9457SAndroid Build Coastguard Worker }
239*4bdc9457SAndroid Build Coastguard Worker }
240*4bdc9457SAndroid Build Coastguard Worker
241*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
242*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
243*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
244*4bdc9457SAndroid Build Coastguard Worker }
245*4bdc9457SAndroid Build Coastguard Worker
246*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
247*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
248*4bdc9457SAndroid Build Coastguard Worker
249*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(float);
250*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
251*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
252*4bdc9457SAndroid Build Coastguard Worker
253*4bdc9457SAndroid Build Coastguard Worker interpreter.reset();
254*4bdc9457SAndroid Build Coastguard Worker }
255*4bdc9457SAndroid Build Coastguard Worker #endif // BENCHMARK_TENSORFLOW_LITE
256*4bdc9457SAndroid Build Coastguard Worker
257*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(xnnpack_hardswish_f32)
258*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<float, float>)
259*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
260*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_F16_OPERATORS
261*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(xnnpack_hardswish_f16)
262*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<uint16_t, uint16_t>)
263*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
264*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_F16_OPERATORS
265*4bdc9457SAndroid Build Coastguard Worker
266*4bdc9457SAndroid Build Coastguard Worker #ifdef BENCHMARK_TENSORFLOW_LITE
267*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(tflite_hardswish_f32)
268*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<float, float>)
269*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
270*4bdc9457SAndroid Build Coastguard Worker #endif // BENCHMARK_TENSORFLOW_LITE
271*4bdc9457SAndroid Build Coastguard Worker
272*4bdc9457SAndroid Build Coastguard Worker #ifndef XNNPACK_BENCHMARK_NO_MAIN
273*4bdc9457SAndroid Build Coastguard Worker BENCHMARK_MAIN();
274*4bdc9457SAndroid Build Coastguard Worker #endif
275