blob: d76454891c724ccfb4889a30c3c94f675c626256 [file] [log] [blame]
Marat Dukhanc068bb62019-10-04 13:24:39 -07001// Copyright 2019 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
12#include <xnnpack.h>
13
14#include <benchmark/benchmark.h>
15
Frank Barchardc712fa42019-10-31 14:00:21 -070016#include "bench/utils.h"
Marat Dukhanc068bb62019-10-04 13:24:39 -070017#include "models/models.h"
18
19
Marat Dukhanbad48fe2019-11-04 10:35:22 -080020static void End2EndBenchmark(
21 benchmark::State& state,
22 models::ExecutionPlanFactory model_factory)
23{
Marat Dukhan04f03be2019-11-19 12:36:47 -080024 if (xnn_initialize(nullptr /* allocator */) != xnn_status_success) {
Marat Dukhanc068bb62019-10-04 13:24:39 -070025 state.SkipWithError("failed to initialize XNNPACK");
26 return;
27 }
28
Marat Dukhanbad48fe2019-11-04 10:35:22 -080029 const size_t num_threads = state.range(0);
30 std::unique_ptr<pthreadpool, decltype(&pthreadpool_destroy)> threadpool(
31 pthreadpool_create(num_threads), pthreadpool_destroy);
32
33 auto execution_plan = model_factory(threadpool.get());
Marat Dukhanc068bb62019-10-04 13:24:39 -070034 if (execution_plan.empty()) {
Marat Dukhanbad48fe2019-11-04 10:35:22 -080035 state.SkipWithError("failed to create a model");
Marat Dukhanc068bb62019-10-04 13:24:39 -070036 return;
37 }
38
39 for (auto _ : state) {
40 for (const std::unique_ptr<xnn_operator, decltype(&xnn_delete_operator)>& op : execution_plan) {
Marat Dukhanbad48fe2019-11-04 10:35:22 -080041 xnn_status status = xnn_run_operator(op.get(), threadpool.get());
Marat Dukhanc068bb62019-10-04 13:24:39 -070042 if (status != xnn_status_success) {
Marat Dukhanbad48fe2019-11-04 10:35:22 -080043 state.SkipWithError("failed to run a model");
Marat Dukhanc068bb62019-10-04 13:24:39 -070044 return;
45 }
46 }
47 }
Marat Dukhand713e8a2020-12-04 14:23:12 -080048
49 const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
50 if (cpu_frequency != 0) {
51 state.counters["cpufreq"] = cpu_frequency;
52 }
Marat Dukhanc068bb62019-10-04 13:24:39 -070053}
54
Marat Dukhan270a2c42020-06-26 16:45:52 -070055static void FP32MobileNetV1(benchmark::State& state) {
56 End2EndBenchmark(state, models::FP32MobileNetV1);
Marat Dukhanbad48fe2019-11-04 10:35:22 -080057}
58
Marat Dukhan270a2c42020-06-26 16:45:52 -070059static void FP32MobileNetV2(benchmark::State& state) {
60 End2EndBenchmark(state, models::FP32MobileNetV2);
Marat Dukhanc068bb62019-10-04 13:24:39 -070061}
62
Marat Dukhan270a2c42020-06-26 16:45:52 -070063static void FP32MobileNetV3Large(benchmark::State& state) {
64 End2EndBenchmark(state, models::FP32MobileNetV3Large);
Marat Dukhanc08cdf52019-12-09 09:17:51 -080065}
66
Marat Dukhan270a2c42020-06-26 16:45:52 -070067static void FP32MobileNetV3Small(benchmark::State& state) {
68 End2EndBenchmark(state, models::FP32MobileNetV3Small);
Marat Dukhanc08cdf52019-12-09 09:17:51 -080069}
70
Marat Dukhan4cea2322021-03-09 09:35:36 -080071static void FP32Sparse80MobileNetV1(benchmark::State& state) {
72 End2EndBenchmark(state, [](pthreadpool_t threadpool) {
73 return models::FP32SparseMobileNetV1(0.8f, threadpool);
74 });
75}
76
77static void FP32Sparse80MobileNetV2(benchmark::State& state) {
78 End2EndBenchmark(state, [](pthreadpool_t threadpool) {
79 return models::FP32SparseMobileNetV2(0.8f, threadpool);
80 });
81}
82
83static void FP32Sparse80MobileNetV3Large(benchmark::State& state) {
84 End2EndBenchmark(state, [](pthreadpool_t threadpool) {
85 return models::FP32SparseMobileNetV3Large(0.8f, threadpool);
86 });
87}
88
89static void FP32Sparse80MobileNetV3Small(benchmark::State& state) {
90 End2EndBenchmark(state, [](pthreadpool_t threadpool) {
91 return models::FP32SparseMobileNetV3Small(0.8f, threadpool);
92 });
93}
94
Marat Dukhan270a2c42020-06-26 16:45:52 -070095static void FP16MobileNetV1(benchmark::State& state) {
96 End2EndBenchmark(state, models::FP16MobileNetV1);
97}
98
99static void FP16MobileNetV2(benchmark::State& state) {
100 End2EndBenchmark(state, models::FP16MobileNetV2);
101}
102
Marat Dukhan66f3ccd2020-09-14 16:09:38 -0700103static void FP16MobileNetV3Large(benchmark::State& state) {
104 End2EndBenchmark(state, models::FP16MobileNetV3Large);
105}
106
107static void FP16MobileNetV3Small(benchmark::State& state) {
108 End2EndBenchmark(state, models::FP16MobileNetV3Small);
109}
110
Marat Dukhane252f922021-08-31 08:57:41 -0700111static void QC8MobileNetV1(benchmark::State& state) {
112 End2EndBenchmark(state, models::QC8MobileNetV1);
113}
114
115static void QC8MobileNetV2(benchmark::State& state) {
116 End2EndBenchmark(state, models::QC8MobileNetV2);
117}
118
Marat Dukhan0743cdf2020-08-04 18:52:07 -0700119static void QS8MobileNetV1(benchmark::State& state) {
120 End2EndBenchmark(state, models::QS8MobileNetV1);
121}
122
Marat Dukhan70a96182020-09-03 17:13:58 -0700123static void QS8MobileNetV2(benchmark::State& state) {
124 End2EndBenchmark(state, models::QS8MobileNetV2);
125}
126
Marat Dukhan12a23bb2021-03-08 08:13:21 -0800127static void QU8MobileNetV1(benchmark::State& state) {
128 End2EndBenchmark(state, models::QU8MobileNetV1);
129}
130
Marat Dukhan036b2b12021-07-21 01:12:58 -0700131static void QU8MobileNetV2(benchmark::State& state) {
132 End2EndBenchmark(state, models::QU8MobileNetV2);
133}
134
Marat Dukhan270a2c42020-06-26 16:45:52 -0700135BENCHMARK(FP32MobileNetV1)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
136BENCHMARK(FP32MobileNetV2)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
137BENCHMARK(FP32MobileNetV3Large)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
138BENCHMARK(FP32MobileNetV3Small)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
139
Marat Dukhan4cea2322021-03-09 09:35:36 -0800140BENCHMARK(FP32Sparse80MobileNetV1)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
141BENCHMARK(FP32Sparse80MobileNetV2)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
142BENCHMARK(FP32Sparse80MobileNetV3Large)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
143BENCHMARK(FP32Sparse80MobileNetV3Small)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
144
Marat Dukhan270a2c42020-06-26 16:45:52 -0700145BENCHMARK(FP16MobileNetV1)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
146BENCHMARK(FP16MobileNetV2)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
Marat Dukhan66f3ccd2020-09-14 16:09:38 -0700147BENCHMARK(FP16MobileNetV3Large)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
148BENCHMARK(FP16MobileNetV3Small)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
Marat Dukhanc068bb62019-10-04 13:24:39 -0700149
Marat Dukhane252f922021-08-31 08:57:41 -0700150BENCHMARK(QC8MobileNetV1)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
151BENCHMARK(QC8MobileNetV2)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
152
Marat Dukhan0743cdf2020-08-04 18:52:07 -0700153BENCHMARK(QS8MobileNetV1)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
Marat Dukhan70a96182020-09-03 17:13:58 -0700154BENCHMARK(QS8MobileNetV2)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
Marat Dukhan0743cdf2020-08-04 18:52:07 -0700155
Marat Dukhan12a23bb2021-03-08 08:13:21 -0800156BENCHMARK(QU8MobileNetV1)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
Marat Dukhan036b2b12021-07-21 01:12:58 -0700157BENCHMARK(QU8MobileNetV2)->Apply(benchmark::utils::MultiThreadingParameters)->Unit(benchmark::kMicrosecond)->UseRealTime();
Marat Dukhan12a23bb2021-03-08 08:13:21 -0800158
Marat Dukhanc068bb62019-10-04 13:24:39 -0700159#ifndef XNNPACK_BENCHMARK_NO_MAIN
160BENCHMARK_MAIN();
Marat Dukhane252f922021-08-31 08:57:41 -0700161#endif