blob: 2f6bd1e60fde92a5a4c6b1071292caf582ed7aca [file] [log] [blame]
XNNPACK Teamb455b122019-09-27 18:10:33 -07001// Copyright (c) Facebook, Inc. and its affiliates.
2// All rights reserved.
3//
4// Copyright 2019 Google LLC
5//
6// This source code is licensed under the BSD-style license found in the
7// LICENSE file in the root directory of this source tree.
8
9#pragma once
10
11#include <benchmark/benchmark.h>
12
13
14#define BENCHMARK_DWCONV(dwconv_fn) \
15 BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v1, "MobileNet v1")->Apply(MobileNetV1DWConvArguments)->UseRealTime(); \
16 BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v2, "MobileNet v2")->Apply(MobileNetV2DWConvArguments)->UseRealTime(); \
17 BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v3_small, "MobileNet v3 Small")->Apply(MobileNetV3SmallDWConvArguments)->UseRealTime(); \
18 BENCHMARK_CAPTURE(dwconv_fn, mobilenet_v3_large, "MobileNet v3 Large")->Apply(MobileNetV3LargeDWConvArguments)->UseRealTime(); \
19 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g1, "ShuffleNet v1 (1 group)")->Apply(ShuffleNetV1G1DWConvArguments)->UseRealTime(); \
20 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g2, "ShuffleNet v1 (2 groups)")->Apply(ShuffleNetV1G2DWConvArguments)->UseRealTime(); \
21 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g3, "ShuffleNet v1 (3 groups)")->Apply(ShuffleNetV1G3DWConvArguments)->UseRealTime(); \
22 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g4, "ShuffleNet v1 (4 groups)")->Apply(ShuffleNetV1G4DWConvArguments)->UseRealTime(); \
23 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v1_g8, "ShuffleNet v1 (8 groups)")->Apply(ShuffleNetV1G8DWConvArguments)->UseRealTime(); \
24 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x05, "ShuffleNet v2 0.5X")->Apply(ShuffleNetV2X05DWConvArguments)->UseRealTime(); \
25 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x10, "ShuffleNet v2 1.0X")->Apply(ShuffleNetV2X10DWConvArguments)->UseRealTime(); \
26 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x15, "ShuffleNet v2 1.5X")->Apply(ShuffleNetV2X15DWConvArguments)->UseRealTime(); \
27 BENCHMARK_CAPTURE(dwconv_fn, shufflenet_v2_x20, "ShuffleNet v2 2.0X")->Apply(ShuffleNetV2X20DWConvArguments)->UseRealTime();
28
29
30// ShuffleNet v1 with 1 group.
31static void ShuffleNetV1G1DWConvArguments(benchmark::internal::Benchmark* b) {
32 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
33
34 /********* Stage 2: stride-2 unit *********/
35 /* H W KH KW PH PW S D G */
36 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 36});
37 /********* Stage 2: stride-1 units ********/
38 /* H W KH KW PH PW S D G */
39 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 36});
40 /********* Stage 3: stride-2 unit *********/
41 /* H W KH KW PH PW S D G */
42 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 72});
43 /********* Stage 3: stride-1 units ********/
44 /* H W KH KW PH PW S D G */
45 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 72});
46 /********* Stage 4: stride-2 unit *********/
47 /* H W KH KW PH PW S D G */
48 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 144});
49 /********* Stage 4: stride-1 units ********/
50 /* H W KH KW PH PW S D G */
51 b->Args({ 7, 7, 3, 3, 2, 2, 2, 1, 144});
52}
53
54// ShuffleNet v1 with 2 groups.
55static void ShuffleNetV1G2DWConvArguments(benchmark::internal::Benchmark* b) {
56 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
57
58 /********* Stage 2: stride-2 unit *********/
59 /* H W KH KW PH PW S D G */
60 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 50});
61 /********* Stage 2: stride-1 units ********/
62 /* H W KH KW PH PW S D G */
63 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 50});
64 /********* Stage 3: stride-2 unit *********/
65 /* H W KH KW PH PW S D G */
66 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 100});
67 /********* Stage 3: stride-1 units ********/
68 /* H W KH KW PH PW S D G */
69 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 100});
70 /********* Stage 4: stride-2 unit *********/
71 /* H W KH KW PH PW S D G */
72 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 200});
73 /********* Stage 4: stride-1 units ********/
74 /* H W KH KW PH PW S D G */
75 b->Args({ 7, 7, 3, 3, 2, 2, 2, 1, 200});
76}
77
78// ShuffleNet v1 with 3 groups.
79static void ShuffleNetV1G3DWConvArguments(benchmark::internal::Benchmark* b) {
80 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
81
82 /********* Stage 2: stride-2 unit **********/
83 /* H W KH KW PH PW S D G */
84 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 60});
85 /********* Stage 2: stride-1 units *********/
86 /* H W KH KW PH PW S D G */
87 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 60});
88 /********* Stage 3: stride-2 unit **********/
89 /* H W KH KW PH PW S D G */
90 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 120});
91 /********* Stage 3: stride-1 units *********/
92 /* H W KH KW PH PW S D G */
93 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 120});
94 /********* Stage 4: stride-2 unit **********/
95 /* H W KH KW PH PW S D G */
96 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 240});
97 /********* Stage 4: stride-1 units *********/
98 /* H W KH KW PH PW S D G */
99 b->Args({ 7, 7, 3, 3, 2, 2, 2, 1, 240});
100}
101
102// ShuffleNet v1 with 4 groups.
103static void ShuffleNetV1G4DWConvArguments(benchmark::internal::Benchmark* b) {
104 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
105
106 /********* Stage 2: stride-2 unit *********/
107 /* H W KH KW PH PW S D G */
108 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 68});
109 /********* Stage 2: stride-1 units ********/
110 /* H W KH KW PH PW S D G */
111 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 68});
112 /********* Stage 3: stride-2 unit *********/
113 /* H W KH KW PH PW S D G */
114 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 136});
115 /********* Stage 3: stride-1 units ********/
116 /* H W KH KW PH PW S D G */
117 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 136});
118 /********* Stage 4: stride-2 unit *********/
119 /* H W KH KW PH PW S D G */
120 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 272});
121 /********* Stage 4: stride-1 units ********/
122 /* H W KH KW PH PW S D G */
123 b->Args({ 7, 7, 3, 3, 2, 2, 2, 1, 272});
124}
125
126// ShuffleNet v1 with 8 groups.
127static void ShuffleNetV1G8DWConvArguments(benchmark::internal::Benchmark* b) {
128 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
129
130 /********* Stage 2: stride-2 unit *********/
131 /* H W KH KW PH PW S D G */
132 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 96});
133 /********* Stage 2: stride-1 units ********/
134 /* H W KH KW PH PW S D G */
135 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 96});
136 /********* Stage 3: stride-2 unit *********/
137 /* H W KH KW PH PW S D G */
138 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 192});
139 /********* Stage 3: stride-1 units ********/
140 /* H W KH KW PH PW S D G */
141 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 192});
142 /********* Stage 4: stride-2 unit *********/
143 /* H W KH KW PH PW S D G */
144 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 384});
145 /********* Stage 4: stride-1 units ********/
146 /* H W KH KW PH PW S D G */
147 b->Args({ 7, 7, 3, 3, 2, 2, 2, 1, 384});
148}
149
150// ShuffleNet v2 (0.5X scale)
151static void ShuffleNetV2X05DWConvArguments(benchmark::internal::Benchmark* b) {
152 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
153
154 /**************** Stage 2 *****************/
155 /* H W KH KW PH PW S D G */
156 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 24});
157 b->Args({28, 28, 3, 3, 2, 2, 1, 1, 24});
158 /**************** Stage 3 *****************/
159 /* H W KH KW PH PW S D G */
160 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 48});
161 b->Args({14, 14, 3, 3, 2, 2, 1, 1, 48});
162 /**************** Stage 4 *****************/
163 /* H W KH KW PH PW S D G */
164 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 96});
165 b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 96});
166}
167
168// ShuffleNet v2 (1.0X scale)
169static void ShuffleNetV2X10DWConvArguments(benchmark::internal::Benchmark* b) {
170 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
171
172 /**************** Stage 2 *****************/
173 /* H W KH KW PH PW S D G */
174 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 24});
175 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 58});
176 b->Args({28, 28, 3, 3, 2, 2, 1, 1, 58});
177 /**************** Stage 3 *****************/
178 /* H W KH KW PH PW S D G */
179 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 116});
180 b->Args({14, 14, 3, 3, 2, 2, 1, 1, 116});
181 /**************** Stage 4 *****************/
182 /* H W KH KW PH PW S D G */
183 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 232});
184 b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 232});
185}
186
187// ShuffleNet v2 (1.5X scale)
188static void ShuffleNetV2X15DWConvArguments(benchmark::internal::Benchmark* b) {
189 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
190
191 /**************** Stage 2 *****************/
192 /* H W KH KW PH PW S D G */
193 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 24});
194 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 88});
195 b->Args({28, 28, 3, 3, 2, 2, 1, 1, 88});
196 /**************** Stage 3 *****************/
197 /* H W KH KW PH PW S D G */
198 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 176});
199 b->Args({14, 14, 3, 3, 2, 2, 1, 1, 176});
200 /**************** Stage 4 *****************/
201 /* H W KH KW PH PW S D G */
202 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 352});
203 b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 352});
204}
205
206// ShuffleNet v2 (2.0X scale)
207static void ShuffleNetV2X20DWConvArguments(benchmark::internal::Benchmark* b) {
208 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
209
210 /***************** Stage 2 ****************/
211 /* H W KH KW PH PW S D G */
212 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 24});
213 b->Args({56, 56, 3, 3, 2, 2, 2, 1, 122});
214 b->Args({28, 28, 3, 3, 2, 2, 1, 1, 122});
215 /***************** Stage 3 ****************/
216 /* H W KH KW PH PW S D G */
217 b->Args({28, 28, 3, 3, 2, 2, 2, 1, 244});
218 b->Args({14, 14, 3, 3, 2, 2, 1, 1, 244});
219 /***************** Stage 4 ****************/
220 /* H W KH KW PH PW S D G */
221 b->Args({14, 14, 3, 3, 2, 2, 2, 1, 488});
222 b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 488});
223}
224
225static void MobileNetV1DWConvArguments(benchmark::internal::Benchmark* b) {
226 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
227
228 /* H W KH KW PH PW S D G */
229 b->Args({112, 112, 3, 3, 2, 2, 1, 1, 32});
230 b->Args({112, 112, 3, 3, 2, 2, 2, 1, 64});
231 b->Args({ 56, 56, 3, 3, 2, 2, 1, 1, 128});
232 b->Args({ 56, 56, 3, 3, 2, 2, 2, 1, 128});
233 b->Args({ 28, 28, 3, 3, 2, 2, 1, 1, 256});
234 b->Args({ 28, 28, 3, 3, 2, 2, 2, 1, 256});
235 b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 512});
236 b->Args({ 14, 14, 3, 3, 2, 2, 2, 1, 512});
237 b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 1024});
238}
239
240static void MobileNetV2DWConvArguments(benchmark::internal::Benchmark* b) {
241 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
242
243 /**************** Bottleneck 1 ***************/
244 /* H W KH KW PH PW S D G */
245 b->Args({112, 112, 3, 3, 2, 2, 1, 1, 32});
246
247 /**************** Bottleneck 2 ***************/
248 /* H W KH KW PH PW S D G */
249 b->Args({112, 112, 3, 3, 2, 2, 2, 1, 96});
250 b->Args({ 56, 56, 3, 3, 2, 2, 1, 1, 144});
251
252 /**************** Bottleneck 3 ***************/
253 /* H W KH KW PH PW S D G */
254 b->Args({ 56, 56, 3, 3, 2, 2, 2, 1, 144});
255 b->Args({ 28, 28, 3, 3, 2, 2, 1, 1, 192});
256//b->Args({ 28, 28, 3, 3, 2, 2, 1, 1, 192});
257
258 /**************** Bottleneck 4 ***************/
259 /* H W KH KW PH PW S D G */
260 b->Args({ 28, 28, 3, 3, 2, 2, 2, 1, 192});
261 b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 384});
262//b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 384});
263//b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 384});
264
265 /**************** Bottleneck 5 ***************/
266 /* H W KH KW PH PW S D G */
267//b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 384});
268 b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 576});
269//b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 576});
270
271 /**************** Bottleneck 6 ***************/
272 /* H W KH KW PH PW S D G */
273 b->Args({ 14, 14, 3, 3, 2, 2, 2, 1, 576});
274 b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 960});
275//b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 960});
276
277 /**************** Bottleneck 7 ***************/
278 /* H W KH KW PH PW S D G */
279//b->Args({ 7, 7, 3, 3, 2, 2, 1, 1, 960});
280}
281
282static void MobileNetV3SmallDWConvArguments(benchmark::internal::Benchmark* b) {
283 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
284
285 /*************** Bottleneck 1 ***************/
286 /* H W KH KW PH PW S D G */
287 b->Args({112, 112, 3, 3, 2, 2, 2, 1, 16});
288 /*************** Bottleneck 2 ***************/
289 /* H W KH KW PH PW S D G */
290 b->Args({ 56, 56, 3, 3, 2, 2, 2, 1, 72});
291 /*************** Bottleneck 3 ***************/
292 /* H W KH KW PH PW S D G */
293 b->Args({ 28, 28, 3, 3, 2, 2, 1, 1, 88});
294 /*************** Bottleneck 4 ***************/
295 /* H W KH KW PH PW S D G */
296 b->Args({ 28, 28, 5, 5, 4, 4, 2, 1, 96});
297 /*************** Bottleneck 5 ***************/
298 /* H W KH KW PH PW S D G */
299 b->Args({ 14, 14, 5, 5, 4, 4, 1, 1, 240});
300 /*************** Bottleneck 6 ***************/
301 /* H W KH KW PH PW S D G */
302//b->Args({ 14, 14, 5, 5, 4, 4, 1, 1, 240});
303 /*************** Bottleneck 7 ***************/
304 /* H W KH KW PH PW S D G */
305 b->Args({ 14, 14, 5, 5, 4, 4, 1, 1, 120});
306 /*************** Bottleneck 8 ***************/
307 /* H W KH KW PH PW S D G */
308 b->Args({ 14, 14, 5, 5, 4, 4, 1, 1, 144});
309 /*************** Bottleneck 9 ***************/
310 /* H W KH KW PH PW S D G */
311 b->Args({ 14, 14, 5, 5, 4, 4, 2, 1, 288});
312 /*************** Bottleneck 10 **************/
313 /* H W KH KW PH PW S D G */
314 b->Args({ 7, 7, 5, 5, 4, 4, 1, 1, 576});
315 /*************** Bottleneck 11 **************/
316 /* H W KH KW PH PW S D G */
317//b->Args({ 7, 7, 5, 5, 4, 4, 1, 1, 576});
318}
319
320static void MobileNetV3LargeDWConvArguments(benchmark::internal::Benchmark* b) {
321 b->ArgNames({"H", "W", "KH", "KW", "PH", "PW", "S", "D", "G"});
322
323 /*************** Bottleneck 1 ***************/
324 /* H W KH KW PH PW S D G */
325 b->Args({112, 112, 3, 3, 2, 2, 1, 1, 16});
326 /*************** Bottleneck 2 ***************/
327 /* H W KH KW PH PW S D G */
328 b->Args({112, 112, 3, 3, 2, 2, 2, 1, 64});
329 /*************** Bottleneck 3 ***************/
330 /* H W KH KW PH PW S D G */
331 b->Args({ 56, 56, 3, 3, 2, 2, 1, 1, 72});
332 /*************** Bottleneck 4 ***************/
333 /* H W KH KW PH PW S D G */
334 b->Args({ 56, 56, 5, 5, 4, 4, 2, 1, 72});
335 /*************** Bottleneck 5 ***************/
336 /* H W KH KW PH PW S D G */
337 b->Args({ 28, 28, 5, 5, 4, 4, 1, 1, 120});
338 /*************** Bottleneck 6 ***************/
339 /* H W KH KW PH PW S D G */
340//b->Args({ 28, 28, 5, 5, 4, 4, 1, 1, 120});
341 /*************** Bottleneck 7 ***************/
342 /* H W KH KW PH PW S D G */
343 b->Args({ 28, 28, 3, 3, 2, 2, 2, 1, 240});
344 /*************** Bottleneck 8 ***************/
345 /* H W KH KW PH PW S D G */
346 b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 200});
347 /*************** Bottleneck 9 ***************/
348 /* H W KH KW PH PW S D G */
349 b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 184});
350 /*************** Bottleneck 10 **************/
351 /* H W KH KW PH PW S D G */
352//b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 184});
353 /*************** Bottleneck 11 **************/
354 /* H W KH KW PH PW S D G */
355 b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 480});
356 /*************** Bottleneck 12 **************/
357 /* H W KH KW PH PW S D G */
358 b->Args({ 14, 14, 3, 3, 2, 2, 1, 1, 672});
359 /*************** Bottleneck 13 **************/
360 /* H W KH KW PH PW S D G */
361 b->Args({ 14, 14, 5, 5, 4, 4, 2, 1, 672});
362 /*************** Bottleneck 14 **************/
363 /* H W KH KW PH PW S D G */
364 b->Args({ 7, 7, 5, 5, 4, 4, 1, 1, 960});
365 /*************** Bottleneck 15 **************/
366 /* H W KH KW PH PW S D G */
367//b->Args({ 7, 7, 5, 5, 4, 4, 1, 1, 960});
368}