blob: 48be23df79d025d861160cebdb874cfbe47fee97 [file] [log] [blame]
XNNPACK Teamb455b122019-09-27 18:10:33 -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 <cfloat>
8#include <cmath>
9#include <functional>
10#include <random>
11#include <vector>
12
Frank Barchardbb4c18b2019-09-30 11:05:52 -070013#include <benchmark/benchmark.h>
Marat Dukhan1631e3e2020-12-06 19:29:31 -080014#include "bench/spmm.h"
Frank Barchardbb4c18b2019-09-30 11:05:52 -070015#include "bench/utils.h"
XNNPACK Teamb455b122019-09-27 18:10:33 -070016#include <xnnpack/AlignedAllocator.h>
Marat Dukhan1dadbf72019-10-01 10:46:20 -070017#include <xnnpack/common.h>
Marat Dukhaneeaa7bd2019-10-25 17:31:25 -070018#include <xnnpack/params-init.h>
XNNPACK Teamb455b122019-09-27 18:10:33 -070019#include <xnnpack/params.h>
XNNPACK Teamb455b122019-09-27 18:10:33 -070020#include <xnnpack/spmm.h>
21
XNNPACK Teamb455b122019-09-27 18:10:33 -070022
23static void SpMMBenchmark(benchmark::State& state,
Marat Dukhan5b86c432020-12-06 19:15:03 -080024 xnn_f32_spmm_minmax_ukernel_function spmm, uint32_t mr, uint32_t nr, float sparsity,
25 benchmark::utils::IsaCheckFunction isa_check = nullptr)
XNNPACK Teamb455b122019-09-27 18:10:33 -070026{
Marat Dukhan5b86c432020-12-06 19:15:03 -080027 if (isa_check && !isa_check(state)) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070028 return;
29 }
30
31 const size_t mc = state.range(0);
32 const size_t nc = state.range(1);
33 const size_t kc = state.range(2);
34
35 std::random_device random_device;
36 auto rng = std::mt19937(random_device());
Marat Dukhan44f0ca72020-08-02 21:46:58 -070037 auto f32rng = std::bind(std::uniform_real_distribution<float>(), std::ref(rng));
XNNPACK Teamb455b122019-09-27 18:10:33 -070038
39 // if using blocks, generate the reduced matrix first and then extrude along
40 // the block dimension (n), to get the full matrix
Marat Dukhanb8ab4cb2019-10-03 15:08:04 -070041 size_t ncols = nc / nr + nc % nr;
XNNPACK Teamb455b122019-09-27 18:10:33 -070042 std::vector<float> b(ncols * kc);
43 std::vector<float> bias(nc);
44 std::vector<float> w;
45 std::vector<uint32_t> nmap;
46 std::vector<int32_t> dmap;
47 const size_t sparse_end = std::min(size_t(float(b.size()) * sparsity), b.size());
48 const size_t num_nonzeroes = nr * (b.size() - sparse_end);
49
50 const size_t w_elements = num_nonzeroes + nc;
51 const size_t c_elements = mc * nc;
52 const size_t dmap_elements = num_nonzeroes / nr;
53 const size_t nmap_elements = nc;
54 const size_t num_buffers = 1 +
Marat Dukhan42323232019-10-23 02:09:02 -070055 benchmark::utils::DivideRoundUp<size_t>(benchmark::utils::GetMaxCacheSize(),
XNNPACK Teamb455b122019-09-27 18:10:33 -070056 sizeof(float) * (w_elements + c_elements) + sizeof(uint32_t) * (dmap_elements + nmap_elements));
57
58 // Micro-kernel can access one element beyond w and dmap for software pipelining.
59 w.reserve(num_buffers * w_elements + 1);
60 dmap.reserve(num_buffers * dmap_elements + 1);
61 nmap.resize(num_buffers * nmap_elements);
62
63 std::vector<size_t> a_offsets(num_buffers);
64
65 for (size_t buffer_index = 0; buffer_index < num_buffers; buffer_index++) {
66 // Re-generate weights. Note: each re-generation produces the number of non-zeroes.
67 std::fill(b.begin(), b.begin() + sparse_end, 0.0f);
68 std::generate(b.begin() + sparse_end, b.end(), std::ref(f32rng));
69 std::shuffle(b.begin(), b.end(), rng);
70 std::generate(bias.begin(), bias.end(), std::ref(f32rng));
71
72 uint32_t first_j = 0, last_j = 0;
73 bool is_first_nonzero = true;
74 for (uint32_t i = 0; i < nc / nr; i++) {
75 for (uint32_t n = 0; n < nr; n++)
76 w.push_back(bias[nr * i + n]);
77 for (uint32_t j = 0; j < kc; j++) {
78 if (b[i * kc + j] != 0.0f) {
79 for (size_t l = 0; l < nr; l++)
80 w.push_back(b[i * kc + j] + static_cast<float>(i));
81 if (is_first_nonzero) {
82 first_j = j;
83 } else {
84 const ptrdiff_t increment = int32_t(j - last_j) * int32_t(mc) * int32_t(sizeof(float));
85 dmap.push_back(increment);
86 }
87 last_j = j;
88 is_first_nonzero = false;
89 nmap[buffer_index * nmap_elements + i] += 1;
90 }
91 }
92 }
93 for (uint32_t i = nc / nr; i < ncols; i++) {
94 w.push_back(bias[i]);
95 for (uint32_t j = 0; j < kc; j++) {
96 if (b[i * kc + j] != 0.0f) {
97 w.push_back(b[i * kc + j]);
98 if (is_first_nonzero) {
99 first_j = j;
100 } else {
101 const ptrdiff_t increment = int32_t(j - last_j) * int32_t(mc) * int32_t(sizeof(float));
102 dmap.push_back(increment);
103 }
104 last_j = j;
105 is_first_nonzero = false;
106 nmap[buffer_index * nmap_elements + i] += 1;
107 }
108 }
109 }
110 {
111 const ptrdiff_t increment = int32_t(first_j - last_j) * int32_t(mc) * int32_t(sizeof(float));
112 dmap.push_back(increment);
113 }
114
115 a_offsets[buffer_index] = first_j * mc;
116 }
117
118 // Micro-kernel can access one element beyond w and dmap for software pipelining.
119 w.resize(w.size() + 1);
120 dmap.resize(dmap.size() + 1);
121
122 std::vector<float, AlignedAllocator<float, 64>> a(kc * mc);
123 std::vector<float, AlignedAllocator<float, 64>> c(num_buffers * c_elements);
124
125 std::generate(a.begin(), a.end(), std::ref(f32rng));
126 std::fill(c.begin(), c.end(), nanf(""));
127
Marat Dukhanf56f4c42021-05-17 01:47:20 -0700128 xnn_f32_minmax_params params;
129 xnn_init_f32_minmax_params(&params, -std::numeric_limits<float>::infinity(), +std::numeric_limits<float>::infinity());
XNNPACK Teamb455b122019-09-27 18:10:33 -0700130
131 size_t buffer_index = 0;
132 for (auto _ : state) {
133 // Use circular buffers (exceeding cache size) and prefetch to control cache state:
134 // - A is always in L1 cache (if fits, otherwise L2, L3, etc)
135 // - W, Kmap, and Nmap is not in cache (for any cache level)
136 // - C is not in cache (for any cache level)
137 state.PauseTiming();
Marat Dukhan42323232019-10-23 02:09:02 -0700138 benchmark::utils::PrefetchToL1(a.data(), a.size() * sizeof(float));
XNNPACK Teamb455b122019-09-27 18:10:33 -0700139 buffer_index = (buffer_index + 1) % num_buffers;
140 state.ResumeTiming();
141
Marat Dukhane8bfcc82020-11-16 12:28:13 -0800142 spmm(mc * sizeof(float), nc,
XNNPACK Teamb455b122019-09-27 18:10:33 -0700143 a.data() + a_offsets[buffer_index],
144 w.data() + buffer_index * w_elements,
145 dmap.data() + buffer_index * dmap_elements,
146 nmap.data() + buffer_index * nmap_elements,
Marat Dukhane8bfcc82020-11-16 12:28:13 -0800147 c.data() + buffer_index * c_elements, mc * sizeof(float),
Frank Barcharde70dbeb2020-05-01 15:46:41 -0700148 &params);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700149 }
150
Marat Dukhand713e8a2020-12-04 14:23:12 -0800151 const uint64_t cpu_frequency = benchmark::utils::GetCurrentCpuFrequency();
152 if (cpu_frequency != 0) {
153 state.counters["cpufreq"] = cpu_frequency;
154 }
155
XNNPACK Teamb455b122019-09-27 18:10:33 -0700156 state.counters["FLOPS"] = benchmark::Counter(
157 uint64_t(state.iterations()) * 2 * mc * num_nonzeroes, benchmark::Counter::kIsRate);
158
159 state.counters["EffFLOPS"] = benchmark::Counter(
160 uint64_t(state.iterations()) * 2 * mc * nc * kc, benchmark::Counter::kIsRate);
161}
162
163
Marat Dukhan5b86c432020-12-06 19:15:03 -0800164#if XNN_ARCH_ARM || XNN_ARCH_ARM64
165 static void spmm80_4x1__neon(benchmark::State& state, const char* net) {
166 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__neon, 4, 1, 0.8f, benchmark::utils::CheckNEON);
167 }
168
169 static void spmm80_8x1__neon(benchmark::State& state, const char* net) {
170 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__neon, 8, 1, 0.8f, benchmark::utils::CheckNEON);
171 }
172
173 static void spmm80_12x1__neon(benchmark::State& state, const char* net) {
174 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_12x1__neon, 12, 1, 0.8f, benchmark::utils::CheckNEON);
175 }
176
177 static void spmm80_16x1__neon(benchmark::State& state, const char* net) {
178 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__neon, 16, 1, 0.8f, benchmark::utils::CheckNEON);
179 }
180
181 static void spmm80_32x1__neon(benchmark::State& state, const char* net) {
182 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__neon, 32, 1, 0.8f, benchmark::utils::CheckNEON);
183 }
184
185 static void spmm80_4x1__neon_x2(benchmark::State& state, const char* net) {
186 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__neon_x2, 4, 1, 0.8f, benchmark::utils::CheckNEON);
187 }
188
189 static void spmm80_8x1__neon_x2(benchmark::State& state, const char* net) {
190 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__neon_x2, 8, 1, 0.8f, benchmark::utils::CheckNEON);
191 }
192
193 static void spmm80_16x1__neon_x2(benchmark::State& state, const char* net) {
194 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__neon_x2, 16, 1, 0.8f, benchmark::utils::CheckNEON);
195 }
196
197 static void spmm80_32x1__neon_x2(benchmark::State& state, const char* net) {
198 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__neon_x2, 32, 1, 0.8f, benchmark::utils::CheckNEON);
199 }
200
201 static void spmm80_4x1__neon_pipelined(benchmark::State& state, const char* net) {
202 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__neon_pipelined, 4, 1, 0.8f, benchmark::utils::CheckNEON);
203 }
204
205 static void spmm80_8x1__neon_pipelined(benchmark::State& state, const char* net) {
206 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__neon_pipelined, 8, 1, 0.8f, benchmark::utils::CheckNEON);
207 }
208
209 static void spmm80_16x1__neon_pipelined(benchmark::State& state, const char* net) {
210 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__neon_pipelined, 16, 1, 0.8f, benchmark::utils::CheckNEON);
211 }
212
213 static void spmm80_32x1__neon_pipelined(benchmark::State& state, const char* net) {
214 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__neon_pipelined, 32, 1, 0.8f, benchmark::utils::CheckNEON);
215 }
216
Marat Dukhan1631e3e2020-12-06 19:29:31 -0800217 BENCHMARK_SPMM(spmm80_4x1__neon)
218 BENCHMARK_SPMM(spmm80_4x1__neon_pipelined)
219 BENCHMARK_SPMM(spmm80_4x1__neon_x2)
220 BENCHMARK_SPMM(spmm80_8x1__neon)
221 BENCHMARK_SPMM(spmm80_8x1__neon_pipelined)
222 BENCHMARK_SPMM(spmm80_8x1__neon_x2)
223 BENCHMARK_SPMM(spmm80_12x1__neon)
224 BENCHMARK_SPMM(spmm80_16x1__neon)
225 BENCHMARK_SPMM(spmm80_16x1__neon_pipelined)
226 BENCHMARK_SPMM(spmm80_16x1__neon_x2)
227 BENCHMARK_SPMM(spmm80_32x1__neon)
228 BENCHMARK_SPMM(spmm80_32x1__neon_pipelined)
229 BENCHMARK_SPMM(spmm80_32x1__neon_x2)
Marat Dukhan5b86c432020-12-06 19:15:03 -0800230#endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
231
Marat Dukhan1dadbf72019-10-01 10:46:20 -0700232#if XNN_ARCH_ARM64
XNNPACK Teamb455b122019-09-27 18:10:33 -0700233 static void spmm80_4x1__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700234 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__neonfma, 4, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700235 }
Frank Barchard846c0c62020-10-26 15:01:39 -0700236
XNNPACK Teamb455b122019-09-27 18:10:33 -0700237 static void spmm80_4x2__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700238 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x2__neonfma, 4, 2, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700239 }
Frank Barchard846c0c62020-10-26 15:01:39 -0700240
XNNPACK Teamb455b122019-09-27 18:10:33 -0700241 static void spmm80_4x4__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700242 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x4__neonfma, 4, 4, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700243 }
244
245 static void spmm80_8x1__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700246 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__neonfma, 8, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700247 }
248
249 static void spmm80_8x2__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700250 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x2__neonfma, 8, 2, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700251 }
252
253 static void spmm80_8x4__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700254 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x4__neonfma, 8, 4, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700255 }
256
257 static void spmm80_12x1__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700258 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_12x1__neonfma, 12, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700259 }
260
261 static void spmm80_12x2__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700262 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_12x2__neonfma, 12, 2, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700263 }
264
265 static void spmm80_12x4__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700266 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_12x4__neonfma, 12, 4, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700267 }
268
269 static void spmm80_16x1__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700270 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__neonfma, 16, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700271 }
272
273 static void spmm80_16x2__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700274 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x2__neonfma, 16, 2, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700275 }
276
277 static void spmm80_16x4__neonfma(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700278 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x4__neonfma, 16, 4, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700279 }
280
Frank Barchard846c0c62020-10-26 15:01:39 -0700281 static void spmm80_32x1__neonfma(benchmark::State& state, const char* net) {
282 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__neonfma, 32, 1, 0.8f);
283 }
284
285 static void spmm80_32x2__neonfma(benchmark::State& state, const char* net) {
286 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x2__neonfma, 32, 2, 0.8f);
287 }
288
289 static void spmm80_32x4__neonfma(benchmark::State& state, const char* net) {
290 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x4__neonfma, 32, 4, 0.8f);
291 }
292
Frank Barchardbeca6522020-10-30 22:34:35 -0700293 static void spmm80_4x1__neonfma_x2(benchmark::State& state, const char* net) {
294 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__neonfma_x2, 4, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700295 }
296
Frank Barchardbeca6522020-10-30 22:34:35 -0700297 static void spmm80_8x1__neonfma_x2(benchmark::State& state, const char* net) {
298 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__neonfma_x2, 8, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700299 }
300
Frank Barchardbeca6522020-10-30 22:34:35 -0700301 static void spmm80_16x1__neonfma_x2(benchmark::State& state, const char* net) {
302 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__neonfma_x2, 16, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700303 }
304
Frank Barchardbeca6522020-10-30 22:34:35 -0700305 static void spmm80_32x1__neonfma_x2(benchmark::State& state, const char* net) {
306 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__neonfma_x2, 32, 1, 0.8f);
Frank Barchard846c0c62020-10-26 15:01:39 -0700307 }
308
XNNPACK Teamb455b122019-09-27 18:10:33 -0700309 static void spmm80_4x1__neonfma_pipelined(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700310 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__neonfma_pipelined, 4, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700311 }
312
313 static void spmm80_8x1__neonfma_pipelined(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700314 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__neonfma_pipelined, 8, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700315 }
316
317 static void spmm80_16x1__neonfma_pipelined(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700318 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__neonfma_pipelined, 16, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700319 }
320
Frank Barchard846c0c62020-10-26 15:01:39 -0700321 static void spmm80_32x1__neonfma_pipelined(benchmark::State& state, const char* net) {
322 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__neonfma_pipelined, 32, 1, 0.8f);
323 }
324
Marat Dukhan1631e3e2020-12-06 19:29:31 -0800325 BENCHMARK_SPMM(spmm80_4x1__neonfma)
326 BENCHMARK_SPMM(spmm80_4x1__neonfma_pipelined)
327 BENCHMARK_SPMM(spmm80_4x1__neonfma_x2)
328 BENCHMARK_SPMM(spmm80_4x2__neonfma)
329 BENCHMARK_SPMM(spmm80_4x4__neonfma)
330 BENCHMARK_SPMM(spmm80_8x1__neonfma)
331 BENCHMARK_SPMM(spmm80_8x1__neonfma_pipelined)
332 BENCHMARK_SPMM(spmm80_8x1__neonfma_x2)
333 BENCHMARK_SPMM(spmm80_8x2__neonfma)
334 BENCHMARK_SPMM(spmm80_8x4__neonfma)
335 BENCHMARK_SPMM(spmm80_12x1__neonfma)
336 BENCHMARK_SPMM(spmm80_12x2__neonfma)
337 BENCHMARK_SPMM(spmm80_12x4__neonfma)
338 BENCHMARK_SPMM(spmm80_16x1__neonfma)
339 BENCHMARK_SPMM(spmm80_16x1__neonfma_pipelined)
340 BENCHMARK_SPMM(spmm80_16x1__neonfma_x2)
341 BENCHMARK_SPMM(spmm80_16x2__neonfma)
342 BENCHMARK_SPMM(spmm80_16x4__neonfma)
343 BENCHMARK_SPMM(spmm80_32x1__neonfma)
344 BENCHMARK_SPMM(spmm80_32x1__neonfma_pipelined)
345 BENCHMARK_SPMM(spmm80_32x1__neonfma_x2)
346 BENCHMARK_SPMM(spmm80_32x2__neonfma)
347 BENCHMARK_SPMM(spmm80_32x4__neonfma)
Marat Dukhan1dadbf72019-10-01 10:46:20 -0700348#endif // XNN_ARCH_ARM64
XNNPACK Teamb455b122019-09-27 18:10:33 -0700349
Marat Dukhan1dadbf72019-10-01 10:46:20 -0700350#if XNN_ARCH_X86 || XNN_ARCH_X86_64
XNNPACK Teamb455b122019-09-27 18:10:33 -0700351 static void spmm80_4x1__sse(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700352 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__sse, 4, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700353 }
354
355 static void spmm80_8x1__sse(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700356 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__sse, 8, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700357 }
358
Erich Elsen6e80fdc2020-06-09 15:35:37 -0700359 static void spmm80_16x1__sse(benchmark::State& state, const char* net) {
360 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__sse, 16, 1, 0.8f);
361 }
362
Frank Barchard846c0c62020-10-26 15:01:39 -0700363 static void spmm80_32x1__sse(benchmark::State& state, const char* net) {
364 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__sse, 32, 1, 0.8f);
365 }
366
Marat Dukhan1631e3e2020-12-06 19:29:31 -0800367 BENCHMARK_SPMM(spmm80_4x1__sse)
368 BENCHMARK_SPMM(spmm80_8x1__sse)
369 BENCHMARK_SPMM(spmm80_16x1__sse)
370 BENCHMARK_SPMM(spmm80_32x1__sse)
Marat Dukhan1dadbf72019-10-01 10:46:20 -0700371#endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
XNNPACK Teamb455b122019-09-27 18:10:33 -0700372
373static void spmm80_1x1__scalar(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700374 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_1x1__scalar, 1, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700375}
376
377static void spmm80_2x1__scalar(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700378 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_2x1__scalar, 2, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700379}
380
381static void spmm80_4x1__scalar(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700382 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__scalar, 4, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700383}
384
385static void spmm80_8x1__scalar(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700386 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__scalar, 8, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700387}
388
Erich Elsenc6afd9b2019-10-24 16:10:53 -0700389static void spmm80_8x2__scalar(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700390 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x2__scalar, 8, 2, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700391}
392
Erich Elsenc6afd9b2019-10-24 16:10:53 -0700393static void spmm80_8x4__scalar(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700394 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x4__scalar, 8, 4, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700395}
396
397static void spmm80_1x1__scalar_pipelined(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700398 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_1x1__scalar_pipelined, 1, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700399}
400
401static void spmm80_2x1__scalar_pipelined(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700402 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_2x1__scalar_pipelined, 2, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700403}
404
405static void spmm80_4x1__scalar_pipelined(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700406 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__scalar_pipelined, 4, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700407}
408
409static void spmm80_8x1__scalar_pipelined(benchmark::State& state, const char* net) {
Marat Dukhan355ab432020-04-09 19:01:52 -0700410 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__scalar_pipelined, 8, 1, 0.8f);
XNNPACK Teamb455b122019-09-27 18:10:33 -0700411}
412
Marat Dukhan1631e3e2020-12-06 19:29:31 -0800413BENCHMARK_SPMM(spmm80_1x1__scalar)
414BENCHMARK_SPMM(spmm80_2x1__scalar)
415BENCHMARK_SPMM(spmm80_4x1__scalar)
416BENCHMARK_SPMM(spmm80_8x1__scalar)
417BENCHMARK_SPMM(spmm80_8x2__scalar)
418BENCHMARK_SPMM(spmm80_8x4__scalar)
419BENCHMARK_SPMM(spmm80_1x1__scalar_pipelined)
420BENCHMARK_SPMM(spmm80_2x1__scalar_pipelined)
421BENCHMARK_SPMM(spmm80_4x1__scalar_pipelined)
422BENCHMARK_SPMM(spmm80_8x1__scalar_pipelined)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700423
Marat Dukhan4c617792021-12-21 15:47:58 -0800424#if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
Frank Barchard9e053402020-10-19 15:29:08 -0700425 static void spmm80_4x1__wasmsimd_arm(benchmark::State& state, const char* net) {
426 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_arm, 4, 1, 0.8f);
Erich Elsen6e80fdc2020-06-09 15:35:37 -0700427 }
Marat Dukhana199d492020-07-24 15:01:25 -0700428
Frank Barchard9e053402020-10-19 15:29:08 -0700429 static void spmm80_8x1__wasmsimd_arm(benchmark::State& state, const char* net) {
430 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_arm, 8, 1, 0.8f);
Erich Elsen6e80fdc2020-06-09 15:35:37 -0700431 }
Marat Dukhana199d492020-07-24 15:01:25 -0700432
Frank Barchard9e053402020-10-19 15:29:08 -0700433 static void spmm80_16x1__wasmsimd_arm(benchmark::State& state, const char* net) {
434 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_arm, 16, 1, 0.8f);
435 }
Frank Barchard846c0c62020-10-26 15:01:39 -0700436
437 static void spmm80_32x1__wasmsimd_arm(benchmark::State& state, const char* net) {
438 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_arm, 32, 1, 0.8f);
439 }
440
Frank Barchard9e053402020-10-19 15:29:08 -0700441 static void spmm80_4x1__wasmsimd_x86(benchmark::State& state, const char* net) {
442 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_x86, 4, 1, 0.8f);
Erich Elsen6e80fdc2020-06-09 15:35:37 -0700443 }
Marat Dukhana199d492020-07-24 15:01:25 -0700444
Frank Barchard9e053402020-10-19 15:29:08 -0700445 static void spmm80_8x1__wasmsimd_x86(benchmark::State& state, const char* net) {
446 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_x86, 8, 1, 0.8f);
447 }
448
449 static void spmm80_16x1__wasmsimd_x86(benchmark::State& state, const char* net) {
450 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_x86, 16, 1, 0.8f);
451 }
452
Frank Barchard846c0c62020-10-26 15:01:39 -0700453 static void spmm80_32x1__wasmsimd_x86(benchmark::State& state, const char* net) {
454 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_x86, 32, 1, 0.8f);
455 }
456
Frank Barchardbeca6522020-10-30 22:34:35 -0700457 static void spmm80_32x1__wasmsimd_arm_x2(benchmark::State& state, const char* net) {
458 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_arm_x2, 32, 1, 0.8f);
Frank Barchard846c0c62020-10-26 15:01:39 -0700459 }
460
Frank Barchardbeca6522020-10-30 22:34:35 -0700461 static void spmm80_4x1__wasmsimd_arm_x2(benchmark::State& state, const char* net) {
462 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_arm_x2, 4, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700463 }
464
Frank Barchardbeca6522020-10-30 22:34:35 -0700465 static void spmm80_8x1__wasmsimd_arm_x2(benchmark::State& state, const char* net) {
466 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_arm_x2, 8, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700467 }
468
Frank Barchardbeca6522020-10-30 22:34:35 -0700469 static void spmm80_16x1__wasmsimd_arm_x2(benchmark::State& state, const char* net) {
470 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_arm_x2, 16, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700471 }
Frank Barchard846c0c62020-10-26 15:01:39 -0700472
Frank Barchardbeca6522020-10-30 22:34:35 -0700473 static void spmm80_32x1__wasmsimd_x86_x2(benchmark::State& state, const char* net) {
474 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_x86_x2, 32, 1, 0.8f);
Frank Barchard846c0c62020-10-26 15:01:39 -0700475 }
476
Frank Barchardbeca6522020-10-30 22:34:35 -0700477 static void spmm80_4x1__wasmsimd_x86_x2(benchmark::State& state, const char* net) {
478 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_x86_x2, 4, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700479 }
480
Frank Barchardbeca6522020-10-30 22:34:35 -0700481 static void spmm80_8x1__wasmsimd_x86_x2(benchmark::State& state, const char* net) {
482 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_x86_x2, 8, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700483 }
484
Frank Barchardbeca6522020-10-30 22:34:35 -0700485 static void spmm80_16x1__wasmsimd_x86_x2(benchmark::State& state, const char* net) {
486 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_x86_x2, 16, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700487 }
488
Frank Barchardbeca6522020-10-30 22:34:35 -0700489 static void spmm80_32x1__wasmsimd_arm_x4(benchmark::State& state, const char* net) {
490 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_arm_x4, 32, 1, 0.8f);
Frank Barchard846c0c62020-10-26 15:01:39 -0700491 }
492
Frank Barchardbeca6522020-10-30 22:34:35 -0700493 static void spmm80_4x1__wasmsimd_arm_x4(benchmark::State& state, const char* net) {
494 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_arm_x4, 4, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700495 }
496
Frank Barchardbeca6522020-10-30 22:34:35 -0700497 static void spmm80_8x1__wasmsimd_arm_x4(benchmark::State& state, const char* net) {
498 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_arm_x4, 8, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700499 }
500
Frank Barchardbeca6522020-10-30 22:34:35 -0700501 static void spmm80_16x1__wasmsimd_arm_x4(benchmark::State& state, const char* net) {
502 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_arm_x4, 16, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700503 }
Frank Barchard846c0c62020-10-26 15:01:39 -0700504
Frank Barchardbeca6522020-10-30 22:34:35 -0700505 static void spmm80_32x1__wasmsimd_x86_x4(benchmark::State& state, const char* net) {
506 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_x86_x4, 32, 1, 0.8f);
Frank Barchard846c0c62020-10-26 15:01:39 -0700507 }
508
Frank Barchardbeca6522020-10-30 22:34:35 -0700509 static void spmm80_4x1__wasmsimd_x86_x4(benchmark::State& state, const char* net) {
510 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_x86_x4, 4, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700511 }
512
Frank Barchardbeca6522020-10-30 22:34:35 -0700513 static void spmm80_8x1__wasmsimd_x86_x4(benchmark::State& state, const char* net) {
514 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_x86_x4, 8, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700515 }
516
Frank Barchardbeca6522020-10-30 22:34:35 -0700517 static void spmm80_16x1__wasmsimd_x86_x4(benchmark::State& state, const char* net) {
518 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_x86_x4, 16, 1, 0.8f);
Frank Barchardc451e8a2020-10-21 17:13:12 -0700519 }
Frank Barchardc2c0d162020-11-03 15:46:30 -0800520 static void spmm80_4x1__wasmsimd_arm_pipelined(benchmark::State& state, const char* net) {
521 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_arm_pipelined, 4, 1, 0.8f);
522 }
523
524 static void spmm80_8x1__wasmsimd_arm_pipelined(benchmark::State& state, const char* net) {
525 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_arm_pipelined, 8, 1, 0.8f);
526 }
527
528 static void spmm80_16x1__wasmsimd_arm_pipelined(benchmark::State& state, const char* net) {
529 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_arm_pipelined, 16, 1, 0.8f);
530 }
531
532 static void spmm80_32x1__wasmsimd_arm_pipelined(benchmark::State& state, const char* net) {
533 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_arm_pipelined, 32, 1, 0.8f);
534 }
535
536 static void spmm80_4x1__wasmsimd_x86_pipelined(benchmark::State& state, const char* net) {
537 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_x86_pipelined, 4, 1, 0.8f);
538 }
539
540 static void spmm80_8x1__wasmsimd_x86_pipelined(benchmark::State& state, const char* net) {
541 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_x86_pipelined, 8, 1, 0.8f);
542 }
543
544 static void spmm80_16x1__wasmsimd_x86_pipelined(benchmark::State& state, const char* net) {
545 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_x86_pipelined, 16, 1, 0.8f);
546 }
547
548 static void spmm80_32x1__wasmsimd_x86_pipelined(benchmark::State& state, const char* net) {
549 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_x86_pipelined, 32, 1, 0.8f);
550 }
551
552 static void spmm80_32x1__wasmsimd_arm_pipelined_x2(benchmark::State& state, const char* net) {
553 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_arm_pipelined_x2, 32, 1, 0.8f);
554 }
555
556 static void spmm80_4x1__wasmsimd_arm_pipelined_x2(benchmark::State& state, const char* net) {
557 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_arm_pipelined_x2, 4, 1, 0.8f);
558 }
559
560 static void spmm80_8x1__wasmsimd_arm_pipelined_x2(benchmark::State& state, const char* net) {
561 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_arm_pipelined_x2, 8, 1, 0.8f);
562 }
563
564 static void spmm80_16x1__wasmsimd_arm_pipelined_x2(benchmark::State& state, const char* net) {
565 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_arm_pipelined_x2, 16, 1, 0.8f);
566 }
567
568 static void spmm80_32x1__wasmsimd_x86_pipelined_x2(benchmark::State& state, const char* net) {
569 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_32x1__wasmsimd_x86_pipelined_x2, 32, 1, 0.8f);
570 }
571
572 static void spmm80_4x1__wasmsimd_x86_pipelined_x2(benchmark::State& state, const char* net) {
573 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_4x1__wasmsimd_x86_pipelined_x2, 4, 1, 0.8f);
574 }
575
576 static void spmm80_8x1__wasmsimd_x86_pipelined_x2(benchmark::State& state, const char* net) {
577 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_8x1__wasmsimd_x86_pipelined_x2, 8, 1, 0.8f);
578 }
579
580 static void spmm80_16x1__wasmsimd_x86_pipelined_x2(benchmark::State& state, const char* net) {
581 SpMMBenchmark(state, xnn_f32_spmm_minmax_ukernel_16x1__wasmsimd_x86_pipelined_x2, 16, 1, 0.8f);
582 }
Frank Barchardc451e8a2020-10-21 17:13:12 -0700583
Marat Dukhan1631e3e2020-12-06 19:29:31 -0800584 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_arm)
585 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_arm_x2)
586 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_arm_x4)
587 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_x86)
588 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_x86_x2)
589 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_x86_x4)
590 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_arm)
591 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_arm_x2)
592 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_arm_x4)
593 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_x86)
594 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_x86_x2)
595 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_x86_x4)
596 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_arm)
597 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_arm_x2)
598 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_arm_x4)
599 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_x86)
600 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_x86_x2)
601 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_x86_x4)
602 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_arm)
603 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_arm_x2)
604 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_arm_x4)
605 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_x86)
606 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_x86_x2)
607 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_x86_x4)
608 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_arm_pipelined)
609 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_arm_pipelined_x2)
610 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_x86_pipelined)
611 BENCHMARK_SPMM(spmm80_4x1__wasmsimd_x86_pipelined_x2)
612 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_arm_pipelined)
613 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_arm_pipelined_x2)
614 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_x86_pipelined)
615 BENCHMARK_SPMM(spmm80_8x1__wasmsimd_x86_pipelined_x2)
616 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_arm_pipelined)
617 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_arm_pipelined_x2)
618 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_x86_pipelined)
619 BENCHMARK_SPMM(spmm80_16x1__wasmsimd_x86_pipelined_x2)
620 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_arm_pipelined)
621 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_arm_pipelined_x2)
622 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_x86_pipelined)
623 BENCHMARK_SPMM(spmm80_32x1__wasmsimd_x86_pipelined_x2)
Frank Barchardc2c0d162020-11-03 15:46:30 -0800624
Marat Dukhan4c617792021-12-21 15:47:58 -0800625#endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
Erich Elsen6e80fdc2020-06-09 15:35:37 -0700626
XNNPACK Teamb455b122019-09-27 18:10:33 -0700627#ifndef XNNPACK_BENCHMARK_NO_MAIN
628BENCHMARK_MAIN();
629#endif