1*4bdc9457SAndroid Build Coastguard Worker // Copyright (c) Facebook, Inc. and its affiliates.
2*4bdc9457SAndroid Build Coastguard Worker // All rights reserved.
3*4bdc9457SAndroid Build Coastguard Worker //
4*4bdc9457SAndroid Build Coastguard Worker // Copyright 2020 Google LLC
5*4bdc9457SAndroid Build Coastguard Worker //
6*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
7*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
8*4bdc9457SAndroid Build Coastguard Worker
9*4bdc9457SAndroid Build Coastguard Worker #include <algorithm>
10*4bdc9457SAndroid Build Coastguard Worker #include <array>
11*4bdc9457SAndroid Build Coastguard Worker #include <cmath>
12*4bdc9457SAndroid Build Coastguard Worker #include <functional>
13*4bdc9457SAndroid Build Coastguard Worker #include <limits>
14*4bdc9457SAndroid Build Coastguard Worker #include <random>
15*4bdc9457SAndroid Build Coastguard Worker #include <vector>
16*4bdc9457SAndroid Build Coastguard Worker
17*4bdc9457SAndroid Build Coastguard Worker #include <fp16.h>
18*4bdc9457SAndroid Build Coastguard Worker
19*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack.h>
20*4bdc9457SAndroid Build Coastguard Worker
21*4bdc9457SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
22*4bdc9457SAndroid Build Coastguard Worker #include "bench/utils.h"
23*4bdc9457SAndroid Build Coastguard Worker #ifdef BENCHMARK_TENSORFLOW_LITE
24*4bdc9457SAndroid Build Coastguard Worker #include "flatbuffers/include/flatbuffers/flatbuffers.h"
25*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/interpreter.h"
26*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/kernels/register.h"
27*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/model.h"
28*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/schema/schema_generated.h"
29*4bdc9457SAndroid Build Coastguard Worker #include "tensorflow/lite/version.h"
30*4bdc9457SAndroid Build Coastguard Worker #endif // BENCHMARK_TENSORFLOW_LITE
31*4bdc9457SAndroid Build Coastguard Worker
32*4bdc9457SAndroid Build Coastguard Worker
33*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_F16_OPERATORS
xnnpack_sigmoid_f16(benchmark::State & state)34*4bdc9457SAndroid Build Coastguard Worker static void xnnpack_sigmoid_f16(benchmark::State& state) {
35*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
36*4bdc9457SAndroid Build Coastguard Worker
37*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
38*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
39*4bdc9457SAndroid Build Coastguard Worker auto f32rng = std::bind(std::uniform_real_distribution<float>(-10.0f, 10.0f), std::ref(rng));
40*4bdc9457SAndroid Build Coastguard Worker auto f16rng = std::bind(fp16_ieee_from_fp32_value, f32rng);
41*4bdc9457SAndroid Build Coastguard Worker
42*4bdc9457SAndroid Build Coastguard Worker std::vector<uint16_t> input(batch_size + XNN_EXTRA_BYTES / sizeof(uint16_t));
43*4bdc9457SAndroid Build Coastguard Worker std::vector<uint16_t> output(batch_size);
44*4bdc9457SAndroid Build Coastguard Worker std::generate(input.begin(), input.end(), std::ref(f16rng));
45*4bdc9457SAndroid Build Coastguard Worker std::fill(output.begin(), output.end(), UINT16_C(0x7E00) /* NaN */);
46*4bdc9457SAndroid Build Coastguard Worker
47*4bdc9457SAndroid Build Coastguard Worker xnn_status status = xnn_initialize(nullptr /* allocator */);
48*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
49*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to initialize XNNPACK");
50*4bdc9457SAndroid Build Coastguard Worker return;
51*4bdc9457SAndroid Build Coastguard Worker }
52*4bdc9457SAndroid Build Coastguard Worker
53*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sigmoid_op = nullptr;
54*4bdc9457SAndroid Build Coastguard Worker status = xnn_create_sigmoid_nc_f16(
55*4bdc9457SAndroid Build Coastguard Worker 1 /* channels */, 1 /* input stride */, 1 /* output stride */,
56*4bdc9457SAndroid Build Coastguard Worker 0 /* flags */, &sigmoid_op);
57*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success || sigmoid_op == nullptr) {
58*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create Sigmoid operator");
59*4bdc9457SAndroid Build Coastguard Worker return;
60*4bdc9457SAndroid Build Coastguard Worker }
61*4bdc9457SAndroid Build Coastguard Worker
62*4bdc9457SAndroid Build Coastguard Worker status = xnn_setup_sigmoid_nc_f16(
63*4bdc9457SAndroid Build Coastguard Worker sigmoid_op, batch_size,
64*4bdc9457SAndroid Build Coastguard Worker input.data(), output.data(),
65*4bdc9457SAndroid Build Coastguard Worker nullptr /* thread pool */);
66*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
67*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to setup Sigmoid operator");
68*4bdc9457SAndroid Build Coastguard Worker return;
69*4bdc9457SAndroid Build Coastguard Worker }
70*4bdc9457SAndroid Build Coastguard Worker
71*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
72*4bdc9457SAndroid Build Coastguard Worker status = xnn_run_operator(sigmoid_op, nullptr /* thread pool */);
73*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
74*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to run Sigmoid operator");
75*4bdc9457SAndroid Build Coastguard Worker return;
76*4bdc9457SAndroid Build Coastguard Worker }
77*4bdc9457SAndroid Build Coastguard Worker }
78*4bdc9457SAndroid Build Coastguard Worker
79*4bdc9457SAndroid Build Coastguard Worker status = xnn_delete_operator(sigmoid_op);
80*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
81*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to delete Sigmoid operator");
82*4bdc9457SAndroid Build Coastguard Worker return;
83*4bdc9457SAndroid Build Coastguard Worker }
84*4bdc9457SAndroid Build Coastguard Worker
85*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
86*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
87*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
88*4bdc9457SAndroid Build Coastguard Worker }
89*4bdc9457SAndroid Build Coastguard Worker
90*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
91*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
92*4bdc9457SAndroid Build Coastguard Worker
93*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(uint16_t);
94*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
95*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
96*4bdc9457SAndroid Build Coastguard Worker }
97*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_F16_OPERATORS
98*4bdc9457SAndroid Build Coastguard Worker
xnnpack_sigmoid_f32(benchmark::State & state)99*4bdc9457SAndroid Build Coastguard Worker static void xnnpack_sigmoid_f32(benchmark::State& state) {
100*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
101*4bdc9457SAndroid Build Coastguard Worker
102*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
103*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
104*4bdc9457SAndroid Build Coastguard Worker auto f32rng = std::bind(std::uniform_real_distribution<float>(-10.0f, 10.0f), std::ref(rng));
105*4bdc9457SAndroid Build Coastguard Worker
106*4bdc9457SAndroid Build Coastguard Worker std::vector<float> input(batch_size + XNN_EXTRA_BYTES / sizeof(float));
107*4bdc9457SAndroid Build Coastguard Worker std::vector<float> output(batch_size);
108*4bdc9457SAndroid Build Coastguard Worker std::generate(input.begin(), input.end(), std::ref(f32rng));
109*4bdc9457SAndroid Build Coastguard Worker std::fill(output.begin(), output.end(), std::nanf(""));
110*4bdc9457SAndroid Build Coastguard Worker
111*4bdc9457SAndroid Build Coastguard Worker xnn_status status = xnn_initialize(nullptr /* allocator */);
112*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
113*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to initialize XNNPACK");
114*4bdc9457SAndroid Build Coastguard Worker return;
115*4bdc9457SAndroid Build Coastguard Worker }
116*4bdc9457SAndroid Build Coastguard Worker
117*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sigmoid_op = nullptr;
118*4bdc9457SAndroid Build Coastguard Worker status = xnn_create_sigmoid_nc_f32(
119*4bdc9457SAndroid Build Coastguard Worker 1 /* channels */, 1 /* input stride */, 1 /* output stride */,
120*4bdc9457SAndroid Build Coastguard Worker 0 /* flags */, &sigmoid_op);
121*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success || sigmoid_op == nullptr) {
122*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create Sigmoid operator");
123*4bdc9457SAndroid Build Coastguard Worker return;
124*4bdc9457SAndroid Build Coastguard Worker }
125*4bdc9457SAndroid Build Coastguard Worker
126*4bdc9457SAndroid Build Coastguard Worker status = xnn_setup_sigmoid_nc_f32(
127*4bdc9457SAndroid Build Coastguard Worker sigmoid_op, batch_size,
128*4bdc9457SAndroid Build Coastguard Worker input.data(), output.data(),
129*4bdc9457SAndroid Build Coastguard Worker nullptr /* thread pool */);
130*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
131*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to setup Sigmoid operator");
132*4bdc9457SAndroid Build Coastguard Worker return;
133*4bdc9457SAndroid Build Coastguard Worker }
134*4bdc9457SAndroid Build Coastguard Worker
135*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
136*4bdc9457SAndroid Build Coastguard Worker status = xnn_run_operator(sigmoid_op, nullptr /* thread pool */);
137*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
138*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to run Sigmoid operator");
139*4bdc9457SAndroid Build Coastguard Worker return;
140*4bdc9457SAndroid Build Coastguard Worker }
141*4bdc9457SAndroid Build Coastguard Worker }
142*4bdc9457SAndroid Build Coastguard Worker
143*4bdc9457SAndroid Build Coastguard Worker status = xnn_delete_operator(sigmoid_op);
144*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
145*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to delete Sigmoid operator");
146*4bdc9457SAndroid Build Coastguard Worker return;
147*4bdc9457SAndroid Build Coastguard Worker }
148*4bdc9457SAndroid Build Coastguard Worker
149*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
150*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
151*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
152*4bdc9457SAndroid Build Coastguard Worker }
153*4bdc9457SAndroid Build Coastguard Worker
154*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
155*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
156*4bdc9457SAndroid Build Coastguard Worker
157*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(float);
158*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
159*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
160*4bdc9457SAndroid Build Coastguard Worker }
161*4bdc9457SAndroid Build Coastguard Worker
162*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_QS8_OPERATORS
xnnpack_sigmoid_qs8(benchmark::State & state)163*4bdc9457SAndroid Build Coastguard Worker static void xnnpack_sigmoid_qs8(benchmark::State& state) {
164*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
165*4bdc9457SAndroid Build Coastguard Worker
166*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
167*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
168*4bdc9457SAndroid Build Coastguard Worker auto i8rng = std::bind(
169*4bdc9457SAndroid Build Coastguard Worker std::uniform_int_distribution<int32_t>(std::numeric_limits<int8_t>::min(), std::numeric_limits<int8_t>::max()),
170*4bdc9457SAndroid Build Coastguard Worker std::ref(rng));
171*4bdc9457SAndroid Build Coastguard Worker
172*4bdc9457SAndroid Build Coastguard Worker std::vector<int8_t> input(batch_size + XNN_EXTRA_BYTES / sizeof(int8_t));
173*4bdc9457SAndroid Build Coastguard Worker std::vector<int8_t> output(batch_size);
174*4bdc9457SAndroid Build Coastguard Worker std::generate(input.begin(), input.end(), std::ref(i8rng));
175*4bdc9457SAndroid Build Coastguard Worker std::fill(output.begin(), output.end(), INT8_C(0xA5));
176*4bdc9457SAndroid Build Coastguard Worker
177*4bdc9457SAndroid Build Coastguard Worker xnn_status status = xnn_initialize(nullptr /* allocator */);
178*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
179*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to initialize XNNPACK");
180*4bdc9457SAndroid Build Coastguard Worker return;
181*4bdc9457SAndroid Build Coastguard Worker }
182*4bdc9457SAndroid Build Coastguard Worker
183*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sigmoid_op = nullptr;
184*4bdc9457SAndroid Build Coastguard Worker status = xnn_create_sigmoid_nc_qs8(
185*4bdc9457SAndroid Build Coastguard Worker 1 /* channels */, 1 /* input stride */, 1 /* output stride */,
186*4bdc9457SAndroid Build Coastguard Worker 1 /* input zero point */, 1.0f /* input scale */,
187*4bdc9457SAndroid Build Coastguard Worker -128 /* output zero point */, 1.0f / 256.0f /* output scale */,
188*4bdc9457SAndroid Build Coastguard Worker std::numeric_limits<int8_t>::min() /* output min */, std::numeric_limits<int8_t>::max() /* output max */,
189*4bdc9457SAndroid Build Coastguard Worker 0 /* flags */, &sigmoid_op);
190*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success || sigmoid_op == nullptr) {
191*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create Sigmoid operator");
192*4bdc9457SAndroid Build Coastguard Worker return;
193*4bdc9457SAndroid Build Coastguard Worker }
194*4bdc9457SAndroid Build Coastguard Worker
195*4bdc9457SAndroid Build Coastguard Worker status = xnn_setup_sigmoid_nc_qs8(
196*4bdc9457SAndroid Build Coastguard Worker sigmoid_op, batch_size,
197*4bdc9457SAndroid Build Coastguard Worker input.data(), output.data(),
198*4bdc9457SAndroid Build Coastguard Worker nullptr /* thread pool */);
199*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
200*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to setup Sigmoid operator");
201*4bdc9457SAndroid Build Coastguard Worker return;
202*4bdc9457SAndroid Build Coastguard Worker }
203*4bdc9457SAndroid Build Coastguard Worker
204*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
205*4bdc9457SAndroid Build Coastguard Worker status = xnn_run_operator(sigmoid_op, nullptr /* thread pool */);
206*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
207*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to run Sigmoid operator");
208*4bdc9457SAndroid Build Coastguard Worker return;
209*4bdc9457SAndroid Build Coastguard Worker }
210*4bdc9457SAndroid Build Coastguard Worker }
211*4bdc9457SAndroid Build Coastguard Worker
212*4bdc9457SAndroid Build Coastguard Worker status = xnn_delete_operator(sigmoid_op);
213*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
214*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to delete Sigmoid operator");
215*4bdc9457SAndroid Build Coastguard Worker return;
216*4bdc9457SAndroid Build Coastguard Worker }
217*4bdc9457SAndroid Build Coastguard Worker
218*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
219*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
220*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
221*4bdc9457SAndroid Build Coastguard Worker }
222*4bdc9457SAndroid Build Coastguard Worker
223*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
224*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
225*4bdc9457SAndroid Build Coastguard Worker
226*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(int8_t);
227*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
228*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
229*4bdc9457SAndroid Build Coastguard Worker }
230*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_QS8_OPERATORS
231*4bdc9457SAndroid Build Coastguard Worker
232*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_QU8_OPERATORS
xnnpack_sigmoid_qu8(benchmark::State & state)233*4bdc9457SAndroid Build Coastguard Worker static void xnnpack_sigmoid_qu8(benchmark::State& state) {
234*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
235*4bdc9457SAndroid Build Coastguard Worker
236*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
237*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
238*4bdc9457SAndroid Build Coastguard Worker auto u8rng = std::bind(
239*4bdc9457SAndroid Build Coastguard Worker std::uniform_int_distribution<uint32_t>(0, std::numeric_limits<uint8_t>::max()), std::ref(rng));
240*4bdc9457SAndroid Build Coastguard Worker
241*4bdc9457SAndroid Build Coastguard Worker std::vector<uint8_t> input(batch_size + XNN_EXTRA_BYTES / sizeof(uint8_t));
242*4bdc9457SAndroid Build Coastguard Worker std::vector<uint8_t> output(batch_size);
243*4bdc9457SAndroid Build Coastguard Worker std::generate(input.begin(), input.end(), std::ref(u8rng));
244*4bdc9457SAndroid Build Coastguard Worker std::fill(output.begin(), output.end(), UINT8_C(0xA5));
245*4bdc9457SAndroid Build Coastguard Worker
246*4bdc9457SAndroid Build Coastguard Worker xnn_status status = xnn_initialize(nullptr /* allocator */);
247*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
248*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to initialize XNNPACK");
249*4bdc9457SAndroid Build Coastguard Worker return;
250*4bdc9457SAndroid Build Coastguard Worker }
251*4bdc9457SAndroid Build Coastguard Worker
252*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sigmoid_op = nullptr;
253*4bdc9457SAndroid Build Coastguard Worker status = xnn_create_sigmoid_nc_qu8(
254*4bdc9457SAndroid Build Coastguard Worker 1 /* channels */, 1 /* input stride */, 1 /* output stride */,
255*4bdc9457SAndroid Build Coastguard Worker 128 /* input zero point */, 1.0f /* input scale */,
256*4bdc9457SAndroid Build Coastguard Worker 0 /* output zero point */, 1.0f / 256.0f /* output scale */,
257*4bdc9457SAndroid Build Coastguard Worker std::numeric_limits<uint8_t>::min() /* output min */, std::numeric_limits<uint8_t>::max() /* output max */,
258*4bdc9457SAndroid Build Coastguard Worker 0 /* flags */, &sigmoid_op);
259*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success || sigmoid_op == nullptr) {
260*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create Sigmoid operator");
261*4bdc9457SAndroid Build Coastguard Worker return;
262*4bdc9457SAndroid Build Coastguard Worker }
263*4bdc9457SAndroid Build Coastguard Worker
264*4bdc9457SAndroid Build Coastguard Worker status = xnn_setup_sigmoid_nc_qu8(
265*4bdc9457SAndroid Build Coastguard Worker sigmoid_op, batch_size,
266*4bdc9457SAndroid Build Coastguard Worker input.data(), output.data(),
267*4bdc9457SAndroid Build Coastguard Worker nullptr /* thread pool */);
268*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
269*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to setup Sigmoid operator");
270*4bdc9457SAndroid Build Coastguard Worker return;
271*4bdc9457SAndroid Build Coastguard Worker }
272*4bdc9457SAndroid Build Coastguard Worker
273*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
274*4bdc9457SAndroid Build Coastguard Worker status = xnn_run_operator(sigmoid_op, nullptr /* thread pool */);
275*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
276*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to run Sigmoid operator");
277*4bdc9457SAndroid Build Coastguard Worker return;
278*4bdc9457SAndroid Build Coastguard Worker }
279*4bdc9457SAndroid Build Coastguard Worker }
280*4bdc9457SAndroid Build Coastguard Worker
281*4bdc9457SAndroid Build Coastguard Worker status = xnn_delete_operator(sigmoid_op);
282*4bdc9457SAndroid Build Coastguard Worker if (status != xnn_status_success) {
283*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to delete Sigmoid operator");
284*4bdc9457SAndroid Build Coastguard Worker return;
285*4bdc9457SAndroid Build Coastguard Worker }
286*4bdc9457SAndroid Build Coastguard Worker
287*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
288*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
289*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
290*4bdc9457SAndroid Build Coastguard Worker }
291*4bdc9457SAndroid Build Coastguard Worker
292*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
293*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
294*4bdc9457SAndroid Build Coastguard Worker
295*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(uint8_t);
296*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
297*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
298*4bdc9457SAndroid Build Coastguard Worker }
299*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_QU8_OPERATORS
300*4bdc9457SAndroid Build Coastguard Worker
301*4bdc9457SAndroid Build Coastguard Worker #ifdef BENCHMARK_TENSORFLOW_LITE
tflite_sigmoid_f32(benchmark::State & state)302*4bdc9457SAndroid Build Coastguard Worker static void tflite_sigmoid_f32(benchmark::State& state) {
303*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
304*4bdc9457SAndroid Build Coastguard Worker
305*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
306*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
307*4bdc9457SAndroid Build Coastguard Worker auto f32rng = std::bind(std::uniform_real_distribution<float>(-10.0f, 10.0f), std::ref(rng));
308*4bdc9457SAndroid Build Coastguard Worker
309*4bdc9457SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder builder;
310*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::OperatorCode> operator_code =
311*4bdc9457SAndroid Build Coastguard Worker CreateOperatorCode(builder, tflite::BuiltinOperator_LOGISTIC);
312*4bdc9457SAndroid Build Coastguard Worker
313*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Buffer>, 1> buffers{{
314*4bdc9457SAndroid Build Coastguard Worker tflite::CreateBuffer(builder, builder.CreateVector({})),
315*4bdc9457SAndroid Build Coastguard Worker }};
316*4bdc9457SAndroid Build Coastguard Worker
317*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> shape{{
318*4bdc9457SAndroid Build Coastguard Worker static_cast<int32_t>(batch_size)
319*4bdc9457SAndroid Build Coastguard Worker }};
320*4bdc9457SAndroid Build Coastguard Worker
321*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Tensor>, 2> tensors{{
322*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
323*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
324*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_FLOAT32),
325*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
326*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
327*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_FLOAT32),
328*4bdc9457SAndroid Build Coastguard Worker }};
329*4bdc9457SAndroid Build Coastguard Worker
330*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_inputs{{ 0 }};
331*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_outputs{{ 1 }};
332*4bdc9457SAndroid Build Coastguard Worker flatbuffers::Offset<tflite::Operator> op = tflite::CreateOperator(
333*4bdc9457SAndroid Build Coastguard Worker builder,
334*4bdc9457SAndroid Build Coastguard Worker 0 /* opcode_index */,
335*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_inputs.data(), op_inputs.size()),
336*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_outputs.data(), op_outputs.size()));
337*4bdc9457SAndroid Build Coastguard Worker
338*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_inputs{{ 0 }};
339*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_outputs{{ 1 }};
340*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::SubGraph> subgraph = tflite::CreateSubGraph(
341*4bdc9457SAndroid Build Coastguard Worker builder,
342*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(tensors.data(), tensors.size()),
343*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_inputs.data(), graph_inputs.size()),
344*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_outputs.data(), graph_outputs.size()),
345*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&op, 1));
346*4bdc9457SAndroid Build Coastguard Worker
347*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::Model> model_buffer = tflite::CreateModel(builder,
348*4bdc9457SAndroid Build Coastguard Worker TFLITE_SCHEMA_VERSION,
349*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&operator_code, 1),
350*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&subgraph, 1),
351*4bdc9457SAndroid Build Coastguard Worker builder.CreateString("Sigmoid model"),
352*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(buffers.data(), buffers.size()));
353*4bdc9457SAndroid Build Coastguard Worker
354*4bdc9457SAndroid Build Coastguard Worker builder.Finish(model_buffer);
355*4bdc9457SAndroid Build Coastguard Worker
356*4bdc9457SAndroid Build Coastguard Worker const tflite::Model* model = tflite::GetModel(builder.GetBufferPointer());
357*4bdc9457SAndroid Build Coastguard Worker tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
358*4bdc9457SAndroid Build Coastguard Worker tflite::InterpreterBuilder interpreterBuilder(model, resolver);
359*4bdc9457SAndroid Build Coastguard Worker std::unique_ptr<tflite::Interpreter> interpreter;
360*4bdc9457SAndroid Build Coastguard Worker if (interpreterBuilder(&interpreter) != kTfLiteOk || interpreter == nullptr) {
361*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create TFLite interpreter");
362*4bdc9457SAndroid Build Coastguard Worker return;
363*4bdc9457SAndroid Build Coastguard Worker }
364*4bdc9457SAndroid Build Coastguard Worker interpreter->SetNumThreads(1);
365*4bdc9457SAndroid Build Coastguard Worker
366*4bdc9457SAndroid Build Coastguard Worker if (interpreter->AllocateTensors() != kTfLiteOk) {
367*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to allocate tensors");
368*4bdc9457SAndroid Build Coastguard Worker return;
369*4bdc9457SAndroid Build Coastguard Worker }
370*4bdc9457SAndroid Build Coastguard Worker
371*4bdc9457SAndroid Build Coastguard Worker std::generate(
372*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<float>(0),
373*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<float>(0) + batch_size,
374*4bdc9457SAndroid Build Coastguard Worker std::ref(f32rng));
375*4bdc9457SAndroid Build Coastguard Worker
376*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
377*4bdc9457SAndroid Build Coastguard Worker if (interpreter->Invoke() != kTfLiteOk) {
378*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to invoke TFLite interpreter");
379*4bdc9457SAndroid Build Coastguard Worker return;
380*4bdc9457SAndroid Build Coastguard Worker }
381*4bdc9457SAndroid Build Coastguard Worker }
382*4bdc9457SAndroid Build Coastguard Worker
383*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
384*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
385*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
386*4bdc9457SAndroid Build Coastguard Worker }
387*4bdc9457SAndroid Build Coastguard Worker
388*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
389*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
390*4bdc9457SAndroid Build Coastguard Worker
391*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(float);
392*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
393*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
394*4bdc9457SAndroid Build Coastguard Worker
395*4bdc9457SAndroid Build Coastguard Worker interpreter.reset();
396*4bdc9457SAndroid Build Coastguard Worker }
397*4bdc9457SAndroid Build Coastguard Worker
tflite_sigmoid_qs8(benchmark::State & state)398*4bdc9457SAndroid Build Coastguard Worker static void tflite_sigmoid_qs8(benchmark::State& state) {
399*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
400*4bdc9457SAndroid Build Coastguard Worker
401*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
402*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
403*4bdc9457SAndroid Build Coastguard Worker auto i8rng = std::bind(
404*4bdc9457SAndroid Build Coastguard Worker std::uniform_int_distribution<int32_t>(std::numeric_limits<int8_t>::min(), std::numeric_limits<int8_t>::max()),
405*4bdc9457SAndroid Build Coastguard Worker std::ref(rng));
406*4bdc9457SAndroid Build Coastguard Worker
407*4bdc9457SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder builder;
408*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::OperatorCode> operator_code =
409*4bdc9457SAndroid Build Coastguard Worker CreateOperatorCode(builder, tflite::BuiltinOperator_LOGISTIC);
410*4bdc9457SAndroid Build Coastguard Worker
411*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Buffer>, 1> buffers{{
412*4bdc9457SAndroid Build Coastguard Worker tflite::CreateBuffer(builder, builder.CreateVector({})),
413*4bdc9457SAndroid Build Coastguard Worker }};
414*4bdc9457SAndroid Build Coastguard Worker
415*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> shape{{
416*4bdc9457SAndroid Build Coastguard Worker static_cast<int32_t>(batch_size)
417*4bdc9457SAndroid Build Coastguard Worker }};
418*4bdc9457SAndroid Build Coastguard Worker
419*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Tensor>, 2> tensors{{
420*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
421*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
422*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_INT8, 0 /* buffer */, 0 /* name */,
423*4bdc9457SAndroid Build Coastguard Worker tflite::CreateQuantizationParameters(builder,
424*4bdc9457SAndroid Build Coastguard Worker 0 /*min*/, 0 /*max*/,
425*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<float>({1.0f /* scale */}),
426*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int64_t>({1 /* zero point */}))),
427*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
428*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
429*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_INT8, 0 /* buffer */, 0 /* name */,
430*4bdc9457SAndroid Build Coastguard Worker tflite::CreateQuantizationParameters(builder,
431*4bdc9457SAndroid Build Coastguard Worker 0 /*min*/, 0 /*max*/,
432*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<float>({1.0f / 256.0f /* scale */}),
433*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int64_t>({-128 /* zero point */}))),
434*4bdc9457SAndroid Build Coastguard Worker }};
435*4bdc9457SAndroid Build Coastguard Worker
436*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_inputs{{ 0 }};
437*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_outputs{{ 1 }};
438*4bdc9457SAndroid Build Coastguard Worker flatbuffers::Offset<tflite::Operator> op = tflite::CreateOperator(
439*4bdc9457SAndroid Build Coastguard Worker builder,
440*4bdc9457SAndroid Build Coastguard Worker 0 /* opcode_index */,
441*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_inputs.data(), op_inputs.size()),
442*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_outputs.data(), op_outputs.size()));
443*4bdc9457SAndroid Build Coastguard Worker
444*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_inputs{{ 0 }};
445*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_outputs{{ 1 }};
446*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::SubGraph> subgraph = tflite::CreateSubGraph(
447*4bdc9457SAndroid Build Coastguard Worker builder,
448*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(tensors.data(), tensors.size()),
449*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_inputs.data(), graph_inputs.size()),
450*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_outputs.data(), graph_outputs.size()),
451*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&op, 1));
452*4bdc9457SAndroid Build Coastguard Worker
453*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::Model> model_buffer = tflite::CreateModel(builder,
454*4bdc9457SAndroid Build Coastguard Worker TFLITE_SCHEMA_VERSION,
455*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&operator_code, 1),
456*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&subgraph, 1),
457*4bdc9457SAndroid Build Coastguard Worker builder.CreateString("Sigmoid model"),
458*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(buffers.data(), buffers.size()));
459*4bdc9457SAndroid Build Coastguard Worker
460*4bdc9457SAndroid Build Coastguard Worker builder.Finish(model_buffer);
461*4bdc9457SAndroid Build Coastguard Worker
462*4bdc9457SAndroid Build Coastguard Worker const tflite::Model* model = tflite::GetModel(builder.GetBufferPointer());
463*4bdc9457SAndroid Build Coastguard Worker tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
464*4bdc9457SAndroid Build Coastguard Worker tflite::InterpreterBuilder interpreterBuilder(model, resolver);
465*4bdc9457SAndroid Build Coastguard Worker std::unique_ptr<tflite::Interpreter> interpreter;
466*4bdc9457SAndroid Build Coastguard Worker if (interpreterBuilder(&interpreter) != kTfLiteOk || interpreter == nullptr) {
467*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create TFLite interpreter");
468*4bdc9457SAndroid Build Coastguard Worker return;
469*4bdc9457SAndroid Build Coastguard Worker }
470*4bdc9457SAndroid Build Coastguard Worker interpreter->SetNumThreads(1);
471*4bdc9457SAndroid Build Coastguard Worker
472*4bdc9457SAndroid Build Coastguard Worker if (interpreter->AllocateTensors() != kTfLiteOk) {
473*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to allocate tensors");
474*4bdc9457SAndroid Build Coastguard Worker return;
475*4bdc9457SAndroid Build Coastguard Worker }
476*4bdc9457SAndroid Build Coastguard Worker
477*4bdc9457SAndroid Build Coastguard Worker std::generate(
478*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<int8_t>(0),
479*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<int8_t>(0) + batch_size,
480*4bdc9457SAndroid Build Coastguard Worker std::ref(i8rng));
481*4bdc9457SAndroid Build Coastguard Worker
482*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
483*4bdc9457SAndroid Build Coastguard Worker if (interpreter->Invoke() != kTfLiteOk) {
484*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to invoke TFLite interpreter");
485*4bdc9457SAndroid Build Coastguard Worker return;
486*4bdc9457SAndroid Build Coastguard Worker }
487*4bdc9457SAndroid Build Coastguard Worker }
488*4bdc9457SAndroid Build Coastguard Worker
489*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
490*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
491*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
492*4bdc9457SAndroid Build Coastguard Worker }
493*4bdc9457SAndroid Build Coastguard Worker
494*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
495*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
496*4bdc9457SAndroid Build Coastguard Worker
497*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(int8_t);
498*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
499*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
500*4bdc9457SAndroid Build Coastguard Worker
501*4bdc9457SAndroid Build Coastguard Worker interpreter.reset();
502*4bdc9457SAndroid Build Coastguard Worker }
503*4bdc9457SAndroid Build Coastguard Worker
tflite_sigmoid_qu8(benchmark::State & state)504*4bdc9457SAndroid Build Coastguard Worker static void tflite_sigmoid_qu8(benchmark::State& state) {
505*4bdc9457SAndroid Build Coastguard Worker const size_t batch_size = state.range(0);
506*4bdc9457SAndroid Build Coastguard Worker
507*4bdc9457SAndroid Build Coastguard Worker std::random_device random_device;
508*4bdc9457SAndroid Build Coastguard Worker auto rng = std::mt19937(random_device());
509*4bdc9457SAndroid Build Coastguard Worker auto u8rng = std::bind(
510*4bdc9457SAndroid Build Coastguard Worker std::uniform_int_distribution<uint32_t>(0, std::numeric_limits<uint8_t>::max()),
511*4bdc9457SAndroid Build Coastguard Worker std::ref(rng));
512*4bdc9457SAndroid Build Coastguard Worker
513*4bdc9457SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder builder;
514*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::OperatorCode> operator_code =
515*4bdc9457SAndroid Build Coastguard Worker CreateOperatorCode(builder, tflite::BuiltinOperator_LOGISTIC);
516*4bdc9457SAndroid Build Coastguard Worker
517*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Buffer>, 1> buffers{{
518*4bdc9457SAndroid Build Coastguard Worker tflite::CreateBuffer(builder, builder.CreateVector({})),
519*4bdc9457SAndroid Build Coastguard Worker }};
520*4bdc9457SAndroid Build Coastguard Worker
521*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> shape{{
522*4bdc9457SAndroid Build Coastguard Worker static_cast<int32_t>(batch_size)
523*4bdc9457SAndroid Build Coastguard Worker }};
524*4bdc9457SAndroid Build Coastguard Worker
525*4bdc9457SAndroid Build Coastguard Worker const std::array<flatbuffers::Offset<tflite::Tensor>, 2> tensors{{
526*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
527*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
528*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_UINT8, 0 /* buffer */, 0 /* name */,
529*4bdc9457SAndroid Build Coastguard Worker tflite::CreateQuantizationParameters(builder,
530*4bdc9457SAndroid Build Coastguard Worker 0 /*min*/, 0 /*max*/,
531*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<float>({1.0f /* scale */}),
532*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int64_t>({128 /* zero point */}))),
533*4bdc9457SAndroid Build Coastguard Worker tflite::CreateTensor(builder,
534*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(shape.data(), shape.size()),
535*4bdc9457SAndroid Build Coastguard Worker tflite::TensorType_UINT8, 0 /* buffer */, 0 /* name */,
536*4bdc9457SAndroid Build Coastguard Worker tflite::CreateQuantizationParameters(builder,
537*4bdc9457SAndroid Build Coastguard Worker 0 /*min*/, 0 /*max*/,
538*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<float>({1.0f / 256.0f /* scale */}),
539*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int64_t>({0 /* zero point */}))),
540*4bdc9457SAndroid Build Coastguard Worker }};
541*4bdc9457SAndroid Build Coastguard Worker
542*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_inputs{{ 0 }};
543*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> op_outputs{{ 1 }};
544*4bdc9457SAndroid Build Coastguard Worker flatbuffers::Offset<tflite::Operator> op = tflite::CreateOperator(
545*4bdc9457SAndroid Build Coastguard Worker builder,
546*4bdc9457SAndroid Build Coastguard Worker 0 /* opcode_index */,
547*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_inputs.data(), op_inputs.size()),
548*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(op_outputs.data(), op_outputs.size()));
549*4bdc9457SAndroid Build Coastguard Worker
550*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_inputs{{ 0 }};
551*4bdc9457SAndroid Build Coastguard Worker const std::array<int32_t, 1> graph_outputs{{ 1 }};
552*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::SubGraph> subgraph = tflite::CreateSubGraph(
553*4bdc9457SAndroid Build Coastguard Worker builder,
554*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(tensors.data(), tensors.size()),
555*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_inputs.data(), graph_inputs.size()),
556*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector<int32_t>(graph_outputs.data(), graph_outputs.size()),
557*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&op, 1));
558*4bdc9457SAndroid Build Coastguard Worker
559*4bdc9457SAndroid Build Coastguard Worker const flatbuffers::Offset<tflite::Model> model_buffer = tflite::CreateModel(builder,
560*4bdc9457SAndroid Build Coastguard Worker TFLITE_SCHEMA_VERSION,
561*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&operator_code, 1),
562*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(&subgraph, 1),
563*4bdc9457SAndroid Build Coastguard Worker builder.CreateString("Sigmoid model"),
564*4bdc9457SAndroid Build Coastguard Worker builder.CreateVector(buffers.data(), buffers.size()));
565*4bdc9457SAndroid Build Coastguard Worker
566*4bdc9457SAndroid Build Coastguard Worker builder.Finish(model_buffer);
567*4bdc9457SAndroid Build Coastguard Worker
568*4bdc9457SAndroid Build Coastguard Worker const tflite::Model* model = tflite::GetModel(builder.GetBufferPointer());
569*4bdc9457SAndroid Build Coastguard Worker tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
570*4bdc9457SAndroid Build Coastguard Worker tflite::InterpreterBuilder interpreterBuilder(model, resolver);
571*4bdc9457SAndroid Build Coastguard Worker std::unique_ptr<tflite::Interpreter> interpreter;
572*4bdc9457SAndroid Build Coastguard Worker if (interpreterBuilder(&interpreter) != kTfLiteOk || interpreter == nullptr) {
573*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to create TFLite interpreter");
574*4bdc9457SAndroid Build Coastguard Worker return;
575*4bdc9457SAndroid Build Coastguard Worker }
576*4bdc9457SAndroid Build Coastguard Worker interpreter->SetNumThreads(1);
577*4bdc9457SAndroid Build Coastguard Worker
578*4bdc9457SAndroid Build Coastguard Worker if (interpreter->AllocateTensors() != kTfLiteOk) {
579*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to allocate tensors");
580*4bdc9457SAndroid Build Coastguard Worker return;
581*4bdc9457SAndroid Build Coastguard Worker }
582*4bdc9457SAndroid Build Coastguard Worker
583*4bdc9457SAndroid Build Coastguard Worker std::generate(
584*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<uint8_t>(0),
585*4bdc9457SAndroid Build Coastguard Worker interpreter->typed_tensor<uint8_t>(0) + batch_size,
586*4bdc9457SAndroid Build Coastguard Worker std::ref(u8rng));
587*4bdc9457SAndroid Build Coastguard Worker
588*4bdc9457SAndroid Build Coastguard Worker for (auto _ : state) {
589*4bdc9457SAndroid Build Coastguard Worker if (interpreter->Invoke() != kTfLiteOk) {
590*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("failed to invoke TFLite interpreter");
591*4bdc9457SAndroid Build Coastguard Worker return;
592*4bdc9457SAndroid Build Coastguard Worker }
593*4bdc9457SAndroid Build Coastguard Worker }
594*4bdc9457SAndroid Build Coastguard Worker
595*4bdc9457SAndroid Build Coastguard Worker const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
596*4bdc9457SAndroid Build Coastguard Worker if (cpu_frequency != 0) {
597*4bdc9457SAndroid Build Coastguard Worker state.counters["cpufreq"] = cpu_frequency;
598*4bdc9457SAndroid Build Coastguard Worker }
599*4bdc9457SAndroid Build Coastguard Worker
600*4bdc9457SAndroid Build Coastguard Worker state.counters["elements"] =
601*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * batch_size, benchmark::Counter::kIsRate);
602*4bdc9457SAndroid Build Coastguard Worker
603*4bdc9457SAndroid Build Coastguard Worker const size_t bytes_per_iteration = 2 * batch_size * sizeof(uint8_t);
604*4bdc9457SAndroid Build Coastguard Worker state.counters["bytes"] =
605*4bdc9457SAndroid Build Coastguard Worker benchmark::Counter(uint64_t(state.iterations()) * bytes_per_iteration, benchmark::Counter::kIsRate);
606*4bdc9457SAndroid Build Coastguard Worker
607*4bdc9457SAndroid Build Coastguard Worker interpreter.reset();
608*4bdc9457SAndroid Build Coastguard Worker }
609*4bdc9457SAndroid Build Coastguard Worker #endif // BENCHMARK_TENSORFLOW_LITE
610*4bdc9457SAndroid Build Coastguard Worker
611*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_F16_OPERATORS
612*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(xnnpack_sigmoid_f16)
613*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<uint16_t, uint16_t>)
614*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
615*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_F16_OPERATORS
616*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(xnnpack_sigmoid_f32)
617*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<float, float>)
618*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
619*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_QS8_OPERATORS
620*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(xnnpack_sigmoid_qs8)
621*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<int8_t, int8_t>)
622*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
623*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_QS8_OPERATORS
624*4bdc9457SAndroid Build Coastguard Worker #ifndef XNN_NO_QU8_OPERATORS
625*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(xnnpack_sigmoid_qu8)
626*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<uint8_t, uint8_t>)
627*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
628*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_NO_QU8_OPERATORS
629*4bdc9457SAndroid Build Coastguard Worker
630*4bdc9457SAndroid Build Coastguard Worker #ifdef BENCHMARK_TENSORFLOW_LITE
631*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(tflite_sigmoid_f32)
632*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<float, float>)
633*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
634*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(tflite_sigmoid_qs8)
635*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<int8_t, int8_t>)
636*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
637*4bdc9457SAndroid Build Coastguard Worker BENCHMARK(tflite_sigmoid_qu8)
638*4bdc9457SAndroid Build Coastguard Worker ->Apply(benchmark::utils::UnaryElementwiseParameters<uint8_t, uint8_t>)
639*4bdc9457SAndroid Build Coastguard Worker ->UseRealTime();
640*4bdc9457SAndroid Build Coastguard Worker #endif // BENCHMARK_TENSORFLOW_LITE
641*4bdc9457SAndroid Build Coastguard Worker
642*4bdc9457SAndroid Build Coastguard Worker #ifndef XNNPACK_BENCHMARK_NO_MAIN
643*4bdc9457SAndroid Build Coastguard Worker BENCHMARK_MAIN();
644*4bdc9457SAndroid Build Coastguard Worker #endif
645