1 // 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 <gtest/gtest.h>
7
8 #include "binary-elementwise-operator-tester.h"
9
10 constexpr size_t kDim1 = 2;
11 constexpr size_t kDim2 = 3;
12 constexpr size_t kDim3 = 4;
13 constexpr size_t kDim4 = 5;
14 constexpr size_t kDim5 = 6;
15 constexpr size_t kDim6 = 7;
16
17
18 TEST(ADD_ND_QS8, 0d_x_0d) {
19 BinaryElementwiseOperatorTester()
20 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
21 .TestQS8();
22 }
23
24 TEST(ADD_ND_QS8, 1d_x_0d) {
25 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
26 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
27 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
28 BinaryElementwiseOperatorTester()
29 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
30 .input1_shape({input1_dim1})
31 .TestQS8();
32 }
33 }
34
35 TEST(ADD_ND_QS8, 0d_x_1d) {
36 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
37 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
38 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
39 BinaryElementwiseOperatorTester()
40 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
41 .input2_shape({input2_dim1})
42 .TestQS8();
43 }
44 }
45
46 TEST(ADD_ND_QS8, 1d_x_1d) {
47 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
48 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
49 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
50 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
51 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
52 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
53 BinaryElementwiseOperatorTester()
54 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
55 .input1_shape({input1_dim1})
56 .input2_shape({input2_dim1})
57 .TestQS8();
58 }
59 }
60 }
61
62 TEST(ADD_ND_QS8, 0d_x_2d) {
63 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
64 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
65 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
66 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
67 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
68 BinaryElementwiseOperatorTester()
69 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
70 .input2_shape({input2_dim2, input2_dim1})
71 .TestQS8();
72 }
73 }
74
75 TEST(ADD_ND_QS8, 1d_x_2d) {
76 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
77 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
78 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
79 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
80 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
81 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
82 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
83 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
84 BinaryElementwiseOperatorTester()
85 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
86 .input1_shape({input1_dim1})
87 .input2_shape({input2_dim2, input2_dim1})
88 .TestQS8();
89 }
90 }
91 }
92
93 TEST(ADD_ND_QS8, 2d_x_0d) {
94 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
95 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
96 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
97 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
98 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
99 BinaryElementwiseOperatorTester()
100 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
101 .input1_shape({input1_dim2, input1_dim1})
102 .TestQS8();
103 }
104 }
105
106 TEST(ADD_ND_QS8, 2d_x_1d) {
107 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
108 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
109 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
110 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
111 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
112 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
113 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
114 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
115 BinaryElementwiseOperatorTester()
116 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
117 .input1_shape({input1_dim2, input1_dim1})
118 .input2_shape({input2_dim1})
119 .TestQS8();
120 }
121 }
122 }
123
124 TEST(ADD_ND_QS8, 2d_x_2d) {
125 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
126 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
127 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
128 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
129 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
130 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
131 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
132 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
133 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
134 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
135 BinaryElementwiseOperatorTester()
136 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
137 .input1_shape({input1_dim2, input1_dim1})
138 .input2_shape({input2_dim2, input2_dim1})
139 .TestQS8();
140 }
141 }
142 }
143
144 TEST(ADD_ND_QS8, 0d_x_3d) {
145 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
146 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
147 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
148 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
149 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
150 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
151 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
152 BinaryElementwiseOperatorTester()
153 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
154 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
155 .TestQS8();
156 }
157 }
158
159 TEST(ADD_ND_QS8, 1d_x_3d) {
160 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
161 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
162 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
163 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
164 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
165 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
166 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
167 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
168 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
169 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
170 BinaryElementwiseOperatorTester()
171 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
172 .input1_shape({input1_dim1})
173 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
174 .TestQS8();
175 }
176 }
177 }
178
179 TEST(ADD_ND_QS8, 2d_x_3d) {
180 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
181 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
182 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
183 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
184 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
185 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
186 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
187 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
188 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
189 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
190 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
191 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
192 BinaryElementwiseOperatorTester()
193 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
194 .input1_shape({input1_dim2, input1_dim1})
195 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
196 .TestQS8();
197 }
198 }
199 }
200
201 TEST(ADD_ND_QS8, 3d_x_0d) {
202 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
203 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
204 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
205 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
206 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
207 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
208 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
209 BinaryElementwiseOperatorTester()
210 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
211 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
212 .TestQS8();
213 }
214 }
215
216 TEST(ADD_ND_QS8, 3d_x_1d) {
217 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
218 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
219 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
220 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
221 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
222 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
223 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
224 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
225 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
226 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
227 BinaryElementwiseOperatorTester()
228 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
229 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
230 .input2_shape({input2_dim1})
231 .TestQS8();
232 }
233 }
234 }
235
236 TEST(ADD_ND_QS8, 3d_x_2d) {
237 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
238 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
239 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
240 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
241 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
242 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
243 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
244 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
245 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
246 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
247 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
248 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
249 BinaryElementwiseOperatorTester()
250 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
251 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
252 .input2_shape({input2_dim2, input2_dim1})
253 .TestQS8();
254 }
255 }
256 }
257
258 TEST(ADD_ND_QS8, 3d_x_3d) {
259 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
260 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
261 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
262 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
263 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
264 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
265 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
266 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
267 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
268 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
269 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
270 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
271 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
272 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
273 BinaryElementwiseOperatorTester()
274 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
275 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
276 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
277 .TestQS8();
278 }
279 }
280 }
281
282 TEST(ADD_ND_QS8, 0d_x_4d) {
283 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
284 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
285 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
286 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
287 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
288 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
289 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
290 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
291 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
292 BinaryElementwiseOperatorTester()
293 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
294 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
295 .TestQS8();
296 }
297 }
298
299 TEST(ADD_ND_QS8, 1d_x_4d) {
300 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
301 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
302 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
303 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
304 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
305 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
306 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
307 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
308 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
309 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
310 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
311 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
312 BinaryElementwiseOperatorTester()
313 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
314 .input1_shape({input1_dim1})
315 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
316 .TestQS8();
317 }
318 }
319 }
320
321 TEST(ADD_ND_QS8, 2d_x_4d) {
322 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
323 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
324 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
325 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
326 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
327 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
328 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
329 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
330 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
331 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
332 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
333 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
334 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
335 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
336 BinaryElementwiseOperatorTester()
337 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
338 .input1_shape({input1_dim2, input1_dim1})
339 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
340 .TestQS8();
341 }
342 }
343 }
344
345 TEST(ADD_ND_QS8, 3d_x_4d) {
346 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
347 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
348 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
349 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
350 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
351 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
352 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
353 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
354 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
355 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
356 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
357 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
358 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
359 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
360 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
361 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
362 BinaryElementwiseOperatorTester()
363 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
364 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
365 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
366 .TestQS8();
367 }
368 }
369 }
370
371 TEST(ADD_ND_QS8, 4d_x_0d) {
372 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
373 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
374 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
375 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
376 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
377 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
378 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
379 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
380 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
381 BinaryElementwiseOperatorTester()
382 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
383 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
384 .TestQS8();
385 }
386 }
387
388 TEST(ADD_ND_QS8, 4d_x_1d) {
389 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
390 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
391 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
392 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
393 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
394 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
395 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
396 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
397 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
398 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
399 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
400 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
401 BinaryElementwiseOperatorTester()
402 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
403 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
404 .input2_shape({input2_dim1})
405 .TestQS8();
406 }
407 }
408 }
409
410 TEST(ADD_ND_QS8, 4d_x_2d) {
411 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
412 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
413 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
414 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
415 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
416 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
417 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
418 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
419 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
420 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
421 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
422 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
423 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
424 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
425 BinaryElementwiseOperatorTester()
426 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
427 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
428 .input2_shape({input2_dim2, input2_dim1})
429 .TestQS8();
430 }
431 }
432 }
433
434 TEST(ADD_ND_QS8, 4d_x_3d) {
435 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
436 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
437 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
438 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
439 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
440 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
441 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
442 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
443 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
444 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
445 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
446 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
447 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
448 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
449 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
450 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
451 BinaryElementwiseOperatorTester()
452 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
453 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
454 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
455 .TestQS8();
456 }
457 }
458 }
459
460 TEST(ADD_ND_QS8, 4d_x_4d) {
461 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
462 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
463 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
464 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
465 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
466 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
467 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
468 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
469 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
470 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
471 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
472 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
473 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
474 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
475 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
476 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
477 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
478 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
479 BinaryElementwiseOperatorTester()
480 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
481 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
482 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
483 .TestQS8();
484 }
485 }
486 }
487
488 TEST(ADD_ND_QS8, 0d_x_5d) {
489 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
490 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
491 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
492 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
493 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
494 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
495 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
496 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
497 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
498 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
499 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
500 BinaryElementwiseOperatorTester()
501 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
502 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
503 .TestQS8();
504 }
505 }
506
507 TEST(ADD_ND_QS8, 1d_x_5d) {
508 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
509 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
510 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
511 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
512 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
513 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
514 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
515 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
516 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
517 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
518 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
519 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
520 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
521 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
522 BinaryElementwiseOperatorTester()
523 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
524 .input1_shape({input1_dim1})
525 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
526 .TestQS8();
527 }
528 }
529 }
530
531 TEST(ADD_ND_QS8, 2d_x_5d) {
532 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
533 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
534 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
535 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
536 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
537 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
538 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
539 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
540 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
541 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
542 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
543 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
544 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
545 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
546 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
547 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
548 BinaryElementwiseOperatorTester()
549 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
550 .input1_shape({input1_dim2, input1_dim1})
551 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
552 .TestQS8();
553 }
554 }
555 }
556
557 TEST(ADD_ND_QS8, 3d_x_5d) {
558 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
559 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
560 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
561 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
562 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
563 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
564 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
565 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
566 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
567 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
568 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
569 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
570 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
571 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
572 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
573 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
574 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
575 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
576 BinaryElementwiseOperatorTester()
577 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
578 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
579 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
580 .TestQS8();
581 }
582 }
583 }
584
585 TEST(ADD_ND_QS8, 4d_x_5d) {
586 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
587 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
588 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
589 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
590 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
591 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
592 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
593 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
594 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
595 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
596 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
597 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
598 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
599 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
600 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
601 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
602 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
603 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
604 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
605 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
606 BinaryElementwiseOperatorTester()
607 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
608 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
609 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
610 .TestQS8();
611 }
612 }
613 }
614
615 TEST(ADD_ND_QS8, 5d_x_0d) {
616 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
617 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
618 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
619 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
620 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
621 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
622 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
623 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
624 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
625 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
626 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
627 BinaryElementwiseOperatorTester()
628 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
629 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
630 .TestQS8();
631 }
632 }
633
634 TEST(ADD_ND_QS8, 5d_x_1d) {
635 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
636 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
637 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
638 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
639 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
640 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
641 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
642 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
643 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
644 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
645 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
646 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
647 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
648 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
649 BinaryElementwiseOperatorTester()
650 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
651 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
652 .input2_shape({input2_dim1})
653 .TestQS8();
654 }
655 }
656 }
657
658 TEST(ADD_ND_QS8, 5d_x_2d) {
659 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
660 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
661 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
662 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
663 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
664 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
665 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
666 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
667 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
668 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
669 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
670 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
671 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
672 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
673 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
674 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
675 BinaryElementwiseOperatorTester()
676 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
677 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
678 .input2_shape({input2_dim2, input2_dim1})
679 .TestQS8();
680 }
681 }
682 }
683
684 TEST(ADD_ND_QS8, 5d_x_3d) {
685 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
686 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
687 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
688 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
689 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
690 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
691 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
692 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
693 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
694 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
695 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
696 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
697 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
698 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
699 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
700 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
701 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
702 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
703 BinaryElementwiseOperatorTester()
704 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
705 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
706 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
707 .TestQS8();
708 }
709 }
710 }
711
712 TEST(ADD_ND_QS8, 5d_x_4d) {
713 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
714 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
715 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
716 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
717 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
718 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
719 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
720 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
721 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
722 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
723 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
724 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
725 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
726 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
727 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
728 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
729 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
730 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
731 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
732 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
733 BinaryElementwiseOperatorTester()
734 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
735 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
736 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
737 .TestQS8();
738 }
739 }
740 }
741
742 TEST(ADD_ND_QS8, 5d_x_5d) {
743 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
744 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
745 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
746 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
747 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
748 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
749 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
750 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
751 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
752 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
753 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
754 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
755 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
756 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
757 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
758 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
759 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
760 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
761 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
762 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
763 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
764 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
765 BinaryElementwiseOperatorTester()
766 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
767 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
768 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
769 .iterations(1)
770 .TestQS8();
771 }
772 }
773 }
774
775 TEST(ADD_ND_QS8, 0d_x_6d) {
776 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
777 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
778 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
779 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
780 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
781 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
782 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
783 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
784 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
785 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
786 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
787 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
788 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
789 BinaryElementwiseOperatorTester()
790 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
791 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
792 .TestQS8();
793 }
794 }
795
796 TEST(ADD_ND_QS8, 1d_x_6d) {
797 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
798 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
799 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
800 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
801 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
802 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
803 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
804 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
805 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
806 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
807 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
808 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
809 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
810 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
811 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
812 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
813 BinaryElementwiseOperatorTester()
814 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
815 .input1_shape({input1_dim1})
816 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
817 .TestQS8();
818 }
819 }
820 }
821
822 TEST(ADD_ND_QS8, 2d_x_6d) {
823 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
824 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
825 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
826 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
827 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
828 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
829 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
830 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
831 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
832 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
833 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
834 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
835 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
836 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
837 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
838 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
839 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
840 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
841 BinaryElementwiseOperatorTester()
842 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
843 .input1_shape({input1_dim2, input1_dim1})
844 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
845 .TestQS8();
846 }
847 }
848 }
849
850 TEST(ADD_ND_QS8, 3d_x_6d) {
851 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
852 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
853 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
854 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
855 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
856 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
857 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
858 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
859 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
860 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
861 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
862 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
863 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
864 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
865 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
866 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
867 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
868 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
869 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
870 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
871 BinaryElementwiseOperatorTester()
872 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
873 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
874 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
875 .TestQS8();
876 }
877 }
878 }
879
880 TEST(ADD_ND_QS8, 4d_x_6d) {
881 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
882 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
883 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
884 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
885 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
886 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
887 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
888 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
889 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
890 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
891 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
892 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
893 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
894 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
895 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
896 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
897 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
898 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
899 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
900 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
901 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
902 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
903 BinaryElementwiseOperatorTester()
904 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
905 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
906 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
907 .TestQS8();
908 }
909 }
910 }
911
912 TEST(ADD_ND_QS8, 5d_x_6d) {
913 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
914 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
915 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
916 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
917 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
918 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
919 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
920 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
921 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
922 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
923 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
924 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
925 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
926 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
927 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
928 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
929 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
930 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
931 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
932 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
933 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
934 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
935 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
936 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
937 BinaryElementwiseOperatorTester()
938 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
939 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
940 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
941 .iterations(1)
942 .TestQS8();
943 }
944 }
945 }
946
947 TEST(ADD_ND_QS8, 6d_x_0d) {
948 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
949 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
950 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
951 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
952 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
953 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
954 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
955 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
956 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
957 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
958 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
959 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
960 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
961 BinaryElementwiseOperatorTester()
962 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
963 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
964 .TestQS8();
965 }
966 }
967
968 TEST(ADD_ND_QS8, 6d_x_1d) {
969 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
970 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
971 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
972 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
973 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
974 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
975 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
976 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
977 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
978 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
979 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
980 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
981 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
982 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
983 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
984 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
985 BinaryElementwiseOperatorTester()
986 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
987 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
988 .input2_shape({input2_dim1})
989 .TestQS8();
990 }
991 }
992 }
993
994 TEST(ADD_ND_QS8, 6d_x_2d) {
995 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
996 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
997 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
998 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
999 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1000 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1001 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1002 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1003 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1004 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1005 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1006 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1007 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1008 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1009 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1010 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1011 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1012 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1013 BinaryElementwiseOperatorTester()
1014 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1015 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1016 .input2_shape({input2_dim2, input2_dim1})
1017 .TestQS8();
1018 }
1019 }
1020 }
1021
1022 TEST(ADD_ND_QS8, 6d_x_3d) {
1023 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1024 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1025 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1026 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1027 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1028 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1029 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1030 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1031 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1032 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1033 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1034 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1035 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1036 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1037 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1038 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1039 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1040 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1041 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1042 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1043 BinaryElementwiseOperatorTester()
1044 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1045 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1046 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1047 .TestQS8();
1048 }
1049 }
1050 }
1051
1052 TEST(ADD_ND_QS8, 6d_x_4d) {
1053 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1054 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1055 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1056 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1057 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1058 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1059 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1060 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1061 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1062 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1063 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1064 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1065 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1066 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1067 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1068 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1069 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1070 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1071 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1072 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1073 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1074 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1075 BinaryElementwiseOperatorTester()
1076 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1077 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1078 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1079 .TestQS8();
1080 }
1081 }
1082 }
1083
1084 TEST(ADD_ND_QS8, 6d_x_5d) {
1085 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1086 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1087 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1088 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1089 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1090 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1091 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1092 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1093 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1094 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1095 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1096 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1097 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1098 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1099 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1100 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1101 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1102 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1103 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1104 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1105 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1106 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1107 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1108 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1109 BinaryElementwiseOperatorTester()
1110 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1111 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1112 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1113 .iterations(1)
1114 .TestQS8();
1115 }
1116 }
1117 }
1118
1119 TEST(ADD_ND_QS8, 6d_x_6d) {
1120 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1121 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
1122 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1123 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1124 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1125 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1126 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1127 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1128 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1129 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1130 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1131 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1132 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1133 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
1134 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1135 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1136 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1137 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1138 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1139 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1140 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1141 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1142 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1143 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1144 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1145 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
1146 BinaryElementwiseOperatorTester()
1147 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1148 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1149 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1150 .iterations(1)
1151 .TestQS8();
1152 }
1153 }
1154 }
1155
TEST(ADD_ND_QS8,input1_scale)1156 TEST(ADD_ND_QS8, input1_scale) {
1157 for (float input1_scale = 0.1f; input1_scale <= 10.0f; input1_scale *= 3.14f) {
1158 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1159 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1160 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1161 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1162 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1163 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1164 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1165 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1166 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1167 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1168 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1169 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1170 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1171 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1172 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1173 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1174 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1175 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1176 BinaryElementwiseOperatorTester()
1177 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1178 .input1_scale(input1_scale)
1179 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1180 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1181 .TestQS8();
1182 }
1183 }
1184 }
1185 }
1186
TEST(ADD_ND_QS8,input1_zero_point)1187 TEST(ADD_ND_QS8, input1_zero_point) {
1188 for (int32_t input1_zero_point = -128; input1_zero_point <= 127; input1_zero_point += 51) {
1189 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1190 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1191 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1192 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1193 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1194 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1195 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1196 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1197 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1198 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1199 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1200 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1201 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1202 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1203 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1204 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1205 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1206 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1207 BinaryElementwiseOperatorTester()
1208 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1209 .input1_zero_point(input1_zero_point)
1210 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1211 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1212 .TestQS8();
1213 }
1214 }
1215 }
1216 }
1217
TEST(ADD_ND_QS8,input2_scale)1218 TEST(ADD_ND_QS8, input2_scale) {
1219 for (float input2_scale = 0.1f; input2_scale <= 10.0f; input2_scale *= 3.14f) {
1220 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1221 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1222 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1223 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1224 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1225 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1226 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1227 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1228 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1229 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1230 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1231 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1232 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1233 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1234 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1235 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1236 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1237 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1238 BinaryElementwiseOperatorTester()
1239 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1240 .input1_scale(input2_scale)
1241 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1242 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1243 .TestQS8();
1244 }
1245 }
1246 }
1247 }
1248
TEST(ADD_ND_QS8,input2_zero_point)1249 TEST(ADD_ND_QS8, input2_zero_point) {
1250 for (int32_t input2_zero_point = -128; input2_zero_point <= 127; input2_zero_point += 51) {
1251 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1252 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1253 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1254 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1255 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1256 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1257 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1258 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1259 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1260 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1261 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1262 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1263 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1264 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1265 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1266 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1267 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1268 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1269 BinaryElementwiseOperatorTester()
1270 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1271 .input2_zero_point(input2_zero_point)
1272 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1273 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1274 .TestQS8();
1275 }
1276 }
1277 }
1278 }
1279
TEST(ADD_ND_QS8,output_scale)1280 TEST(ADD_ND_QS8, output_scale) {
1281 for (float output_scale = 0.1f; output_scale <= 10.0f; output_scale *= 3.14f) {
1282 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1283 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1284 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1285 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1286 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1287 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1288 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1289 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1290 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1291 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1292 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1293 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1294 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1295 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1296 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1297 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1298 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1299 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1300 BinaryElementwiseOperatorTester()
1301 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1302 .input1_scale(output_scale)
1303 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1304 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1305 .TestQS8();
1306 }
1307 }
1308 }
1309 }
1310
TEST(ADD_ND_QS8,output_zero_point)1311 TEST(ADD_ND_QS8, output_zero_point) {
1312 for (int32_t output_zero_point = -128; output_zero_point <= 127; output_zero_point += 51) {
1313 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1314 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1315 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1316 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1317 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1318 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1319 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1320 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1321 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1322 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1323 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1324 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1325 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1326 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1327 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1328 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1329 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1330 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1331 BinaryElementwiseOperatorTester()
1332 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1333 .output_zero_point(output_zero_point)
1334 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1335 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1336 .TestQS8();
1337 }
1338 }
1339 }
1340 }
1341
1342 TEST(ADD_ND_QU8, 0d_x_0d) {
1343 BinaryElementwiseOperatorTester()
1344 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1345 .TestQU8();
1346 }
1347
1348 TEST(ADD_ND_QU8, 1d_x_0d) {
1349 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1350 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1351 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1352 BinaryElementwiseOperatorTester()
1353 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1354 .input1_shape({input1_dim1})
1355 .TestQU8();
1356 }
1357 }
1358
1359 TEST(ADD_ND_QU8, 0d_x_1d) {
1360 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1361 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1362 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1363 BinaryElementwiseOperatorTester()
1364 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1365 .input2_shape({input2_dim1})
1366 .TestQU8();
1367 }
1368 }
1369
1370 TEST(ADD_ND_QU8, 1d_x_1d) {
1371 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1372 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1373 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1374 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1375 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1376 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1377 BinaryElementwiseOperatorTester()
1378 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1379 .input1_shape({input1_dim1})
1380 .input2_shape({input2_dim1})
1381 .TestQU8();
1382 }
1383 }
1384 }
1385
1386 TEST(ADD_ND_QU8, 0d_x_2d) {
1387 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1388 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1389 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1390 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1391 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1392 BinaryElementwiseOperatorTester()
1393 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1394 .input2_shape({input2_dim2, input2_dim1})
1395 .TestQU8();
1396 }
1397 }
1398
1399 TEST(ADD_ND_QU8, 1d_x_2d) {
1400 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1401 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1402 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1403 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1404 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1405 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1406 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1407 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1408 BinaryElementwiseOperatorTester()
1409 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1410 .input1_shape({input1_dim1})
1411 .input2_shape({input2_dim2, input2_dim1})
1412 .TestQU8();
1413 }
1414 }
1415 }
1416
1417 TEST(ADD_ND_QU8, 2d_x_0d) {
1418 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1419 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1420 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1421 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1422 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1423 BinaryElementwiseOperatorTester()
1424 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1425 .input1_shape({input1_dim2, input1_dim1})
1426 .TestQU8();
1427 }
1428 }
1429
1430 TEST(ADD_ND_QU8, 2d_x_1d) {
1431 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1432 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1433 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1434 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1435 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1436 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1437 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1438 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1439 BinaryElementwiseOperatorTester()
1440 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1441 .input1_shape({input1_dim2, input1_dim1})
1442 .input2_shape({input2_dim1})
1443 .TestQU8();
1444 }
1445 }
1446 }
1447
1448 TEST(ADD_ND_QU8, 2d_x_2d) {
1449 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1450 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1451 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1452 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1453 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1454 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1455 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1456 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1457 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1458 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1459 BinaryElementwiseOperatorTester()
1460 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1461 .input1_shape({input1_dim2, input1_dim1})
1462 .input2_shape({input2_dim2, input2_dim1})
1463 .TestQU8();
1464 }
1465 }
1466 }
1467
1468 TEST(ADD_ND_QU8, 0d_x_3d) {
1469 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1470 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1471 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1472 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1473 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1474 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1475 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1476 BinaryElementwiseOperatorTester()
1477 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1478 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1479 .TestQU8();
1480 }
1481 }
1482
1483 TEST(ADD_ND_QU8, 1d_x_3d) {
1484 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1485 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1486 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1487 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1488 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1489 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1490 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1491 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1492 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1493 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1494 BinaryElementwiseOperatorTester()
1495 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1496 .input1_shape({input1_dim1})
1497 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1498 .TestQU8();
1499 }
1500 }
1501 }
1502
1503 TEST(ADD_ND_QU8, 2d_x_3d) {
1504 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1505 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1506 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1507 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1508 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1509 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1510 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1511 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1512 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1513 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1514 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1515 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1516 BinaryElementwiseOperatorTester()
1517 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1518 .input1_shape({input1_dim2, input1_dim1})
1519 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1520 .TestQU8();
1521 }
1522 }
1523 }
1524
1525 TEST(ADD_ND_QU8, 3d_x_0d) {
1526 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1527 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1528 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1529 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1530 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1531 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1532 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1533 BinaryElementwiseOperatorTester()
1534 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1535 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1536 .TestQU8();
1537 }
1538 }
1539
1540 TEST(ADD_ND_QU8, 3d_x_1d) {
1541 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1542 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1543 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1544 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1545 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1546 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1547 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1548 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1549 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1550 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1551 BinaryElementwiseOperatorTester()
1552 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1553 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1554 .input2_shape({input2_dim1})
1555 .TestQU8();
1556 }
1557 }
1558 }
1559
1560 TEST(ADD_ND_QU8, 3d_x_2d) {
1561 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1562 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1563 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1564 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1565 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1566 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1567 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1568 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1569 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1570 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1571 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1572 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1573 BinaryElementwiseOperatorTester()
1574 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1575 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1576 .input2_shape({input2_dim2, input2_dim1})
1577 .TestQU8();
1578 }
1579 }
1580 }
1581
1582 TEST(ADD_ND_QU8, 3d_x_3d) {
1583 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1584 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1585 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1586 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1587 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1588 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1589 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1590 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1591 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1592 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1593 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1594 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1595 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1596 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1597 BinaryElementwiseOperatorTester()
1598 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1599 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1600 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1601 .TestQU8();
1602 }
1603 }
1604 }
1605
1606 TEST(ADD_ND_QU8, 0d_x_4d) {
1607 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1608 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1609 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1610 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1611 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1612 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1613 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1614 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1615 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1616 BinaryElementwiseOperatorTester()
1617 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1618 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1619 .TestQU8();
1620 }
1621 }
1622
1623 TEST(ADD_ND_QU8, 1d_x_4d) {
1624 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1625 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1626 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1627 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1628 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1629 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1630 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1631 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1632 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1633 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1634 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1635 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1636 BinaryElementwiseOperatorTester()
1637 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1638 .input1_shape({input1_dim1})
1639 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1640 .TestQU8();
1641 }
1642 }
1643 }
1644
1645 TEST(ADD_ND_QU8, 2d_x_4d) {
1646 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1647 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1648 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1649 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1650 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1651 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1652 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1653 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1654 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1655 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1656 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1657 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1658 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1659 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1660 BinaryElementwiseOperatorTester()
1661 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1662 .input1_shape({input1_dim2, input1_dim1})
1663 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1664 .TestQU8();
1665 }
1666 }
1667 }
1668
1669 TEST(ADD_ND_QU8, 3d_x_4d) {
1670 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1671 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1672 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1673 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1674 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1675 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1676 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1677 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1678 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1679 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1680 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1681 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1682 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1683 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1684 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1685 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1686 BinaryElementwiseOperatorTester()
1687 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1688 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1689 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1690 .TestQU8();
1691 }
1692 }
1693 }
1694
1695 TEST(ADD_ND_QU8, 4d_x_0d) {
1696 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1697 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1698 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1699 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1700 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1701 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1702 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1703 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1704 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1705 BinaryElementwiseOperatorTester()
1706 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1707 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1708 .TestQU8();
1709 }
1710 }
1711
1712 TEST(ADD_ND_QU8, 4d_x_1d) {
1713 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1714 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1715 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1716 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1717 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1718 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1719 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1720 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1721 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1722 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1723 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1724 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1725 BinaryElementwiseOperatorTester()
1726 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1727 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1728 .input2_shape({input2_dim1})
1729 .TestQU8();
1730 }
1731 }
1732 }
1733
1734 TEST(ADD_ND_QU8, 4d_x_2d) {
1735 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1736 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1737 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1738 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1739 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1740 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1741 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1742 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1743 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1744 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1745 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1746 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1747 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1748 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1749 BinaryElementwiseOperatorTester()
1750 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1751 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1752 .input2_shape({input2_dim2, input2_dim1})
1753 .TestQU8();
1754 }
1755 }
1756 }
1757
1758 TEST(ADD_ND_QU8, 4d_x_3d) {
1759 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1760 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1761 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1762 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1763 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1764 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1765 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1766 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1767 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1768 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1769 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1770 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1771 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1772 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1773 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1774 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1775 BinaryElementwiseOperatorTester()
1776 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1777 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1778 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1779 .TestQU8();
1780 }
1781 }
1782 }
1783
1784 TEST(ADD_ND_QU8, 4d_x_4d) {
1785 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1786 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1787 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1788 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1789 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1790 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1791 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1792 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1793 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1794 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1795 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1796 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1797 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1798 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1799 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1800 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1801 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1802 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1803 BinaryElementwiseOperatorTester()
1804 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1805 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1806 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1807 .TestQU8();
1808 }
1809 }
1810 }
1811
1812 TEST(ADD_ND_QU8, 0d_x_5d) {
1813 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1814 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1815 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1816 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1817 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1818 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1819 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1820 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1821 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1822 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1823 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1824 BinaryElementwiseOperatorTester()
1825 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1826 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1827 .TestQU8();
1828 }
1829 }
1830
1831 TEST(ADD_ND_QU8, 1d_x_5d) {
1832 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1833 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1834 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1835 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1836 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1837 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1838 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1839 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1840 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1841 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1842 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1843 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1844 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1845 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1846 BinaryElementwiseOperatorTester()
1847 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1848 .input1_shape({input1_dim1})
1849 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1850 .TestQU8();
1851 }
1852 }
1853 }
1854
1855 TEST(ADD_ND_QU8, 2d_x_5d) {
1856 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1857 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1858 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1859 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1860 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1861 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1862 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1863 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1864 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1865 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1866 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1867 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1868 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1869 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1870 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1871 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1872 BinaryElementwiseOperatorTester()
1873 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1874 .input1_shape({input1_dim2, input1_dim1})
1875 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1876 .TestQU8();
1877 }
1878 }
1879 }
1880
1881 TEST(ADD_ND_QU8, 3d_x_5d) {
1882 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1883 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1884 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1885 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1886 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1887 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1888 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1889 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1890 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1891 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1892 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1893 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1894 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1895 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1896 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1897 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1898 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1899 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1900 BinaryElementwiseOperatorTester()
1901 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1902 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1903 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1904 .TestQU8();
1905 }
1906 }
1907 }
1908
1909 TEST(ADD_ND_QU8, 4d_x_5d) {
1910 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1911 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1912 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1913 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1914 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1915 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1916 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1917 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1918 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1919 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1920 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1921 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1922 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1923 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1924 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1925 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1926 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1927 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1928 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1929 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1930 BinaryElementwiseOperatorTester()
1931 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1932 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1933 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1934 .TestQU8();
1935 }
1936 }
1937 }
1938
1939 TEST(ADD_ND_QU8, 5d_x_0d) {
1940 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1941 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1942 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1943 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1944 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1945 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1946 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1947 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1948 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1949 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1950 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1951 BinaryElementwiseOperatorTester()
1952 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1953 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1954 .TestQU8();
1955 }
1956 }
1957
1958 TEST(ADD_ND_QU8, 5d_x_1d) {
1959 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1960 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1961 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1962 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1963 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1964 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1965 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1966 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1967 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1968 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1969 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1970 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1971 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1972 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1973 BinaryElementwiseOperatorTester()
1974 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
1975 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1976 .input2_shape({input2_dim1})
1977 .TestQU8();
1978 }
1979 }
1980 }
1981
1982 TEST(ADD_ND_QU8, 5d_x_2d) {
1983 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1984 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1985 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1986 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1987 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1988 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1989 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1990 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1991 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1992 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1993 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1994 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1995 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1996 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1997 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1998 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1999 BinaryElementwiseOperatorTester()
2000 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2001 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2002 .input2_shape({input2_dim2, input2_dim1})
2003 .TestQU8();
2004 }
2005 }
2006 }
2007
2008 TEST(ADD_ND_QU8, 5d_x_3d) {
2009 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
2010 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2011 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2012 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2013 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2014 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2015 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2016 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2017 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2018 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2019 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2020 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2021 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2022 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2023 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2024 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2025 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2026 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2027 BinaryElementwiseOperatorTester()
2028 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2029 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2030 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2031 .TestQU8();
2032 }
2033 }
2034 }
2035
2036 TEST(ADD_ND_QU8, 5d_x_4d) {
2037 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
2038 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2039 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2040 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2041 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2042 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2043 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2044 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2045 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2046 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2047 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2048 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2049 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2050 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2051 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2052 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2053 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2054 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2055 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2056 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2057 BinaryElementwiseOperatorTester()
2058 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2059 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2060 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2061 .TestQU8();
2062 }
2063 }
2064 }
2065
2066 TEST(ADD_ND_QU8, 5d_x_5d) {
2067 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
2068 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
2069 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2070 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2071 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2072 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2073 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2074 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2075 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2076 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2077 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2078 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2079 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2080 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2081 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2082 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2083 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2084 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2085 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2086 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2087 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2088 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2089 BinaryElementwiseOperatorTester()
2090 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2091 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2092 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2093 .iterations(1)
2094 .TestQU8();
2095 }
2096 }
2097 }
2098
2099 TEST(ADD_ND_QU8, 0d_x_6d) {
2100 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2101 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2102 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2103 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2104 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2105 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2106 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2107 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2108 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2109 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2110 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2111 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2112 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2113 BinaryElementwiseOperatorTester()
2114 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2115 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2116 .TestQU8();
2117 }
2118 }
2119
2120 TEST(ADD_ND_QU8, 1d_x_6d) {
2121 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2122 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2123 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2124 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2125 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2126 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2127 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2128 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2129 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2130 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2131 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2132 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2133 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2134 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2135 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2136 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2137 BinaryElementwiseOperatorTester()
2138 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2139 .input1_shape({input1_dim1})
2140 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2141 .TestQU8();
2142 }
2143 }
2144 }
2145
2146 TEST(ADD_ND_QU8, 2d_x_6d) {
2147 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2148 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2149 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2150 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2151 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2152 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2153 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2154 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2155 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2156 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2157 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2158 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2159 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2160 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2161 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2162 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2163 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2164 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2165 BinaryElementwiseOperatorTester()
2166 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2167 .input1_shape({input1_dim2, input1_dim1})
2168 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2169 .TestQU8();
2170 }
2171 }
2172 }
2173
2174 TEST(ADD_ND_QU8, 3d_x_6d) {
2175 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2176 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2177 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2178 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2179 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2180 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2181 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2182 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2183 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2184 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2185 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2186 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2187 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2188 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2189 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2190 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2191 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2192 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2193 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2194 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2195 BinaryElementwiseOperatorTester()
2196 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2197 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2198 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2199 .TestQU8();
2200 }
2201 }
2202 }
2203
2204 TEST(ADD_ND_QU8, 4d_x_6d) {
2205 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2206 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2207 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2208 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2209 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2210 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2211 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2212 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2213 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2214 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2215 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2216 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2217 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2218 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2219 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2220 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2221 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2222 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2223 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2224 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2225 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2226 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2227 BinaryElementwiseOperatorTester()
2228 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2229 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2230 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2231 .TestQU8();
2232 }
2233 }
2234 }
2235
2236 TEST(ADD_ND_QU8, 5d_x_6d) {
2237 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
2238 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2239 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2240 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2241 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2242 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2243 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2244 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2245 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2246 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2247 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2248 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2249 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2250 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2251 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2252 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2253 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2254 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2255 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2256 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2257 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2258 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2259 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2260 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2261 BinaryElementwiseOperatorTester()
2262 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2263 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2264 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2265 .iterations(1)
2266 .TestQU8();
2267 }
2268 }
2269 }
2270
2271 TEST(ADD_ND_QU8, 6d_x_0d) {
2272 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2273 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2274 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2275 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2276 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2277 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2278 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2279 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2280 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2281 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2282 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2283 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2284 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2285 BinaryElementwiseOperatorTester()
2286 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2287 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2288 .TestQU8();
2289 }
2290 }
2291
2292 TEST(ADD_ND_QU8, 6d_x_1d) {
2293 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2294 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2295 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2296 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2297 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2298 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2299 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2300 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2301 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2302 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2303 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2304 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2305 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2306 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2307 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2308 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2309 BinaryElementwiseOperatorTester()
2310 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2311 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2312 .input2_shape({input2_dim1})
2313 .TestQU8();
2314 }
2315 }
2316 }
2317
2318 TEST(ADD_ND_QU8, 6d_x_2d) {
2319 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2320 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2321 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2322 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2323 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2324 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2325 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2326 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2327 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2328 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2329 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2330 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2331 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2332 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2333 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2334 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2335 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2336 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2337 BinaryElementwiseOperatorTester()
2338 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2339 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2340 .input2_shape({input2_dim2, input2_dim1})
2341 .TestQU8();
2342 }
2343 }
2344 }
2345
2346 TEST(ADD_ND_QU8, 6d_x_3d) {
2347 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2348 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2349 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2350 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2351 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2352 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2353 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2354 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2355 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2356 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2357 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2358 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2359 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2360 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2361 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2362 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2363 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2364 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2365 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2366 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2367 BinaryElementwiseOperatorTester()
2368 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2369 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2370 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2371 .TestQU8();
2372 }
2373 }
2374 }
2375
2376 TEST(ADD_ND_QU8, 6d_x_4d) {
2377 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2378 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2379 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2380 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2381 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2382 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2383 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2384 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2385 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2386 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2387 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2388 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2389 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2390 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2391 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2392 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2393 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2394 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2395 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2396 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2397 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2398 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2399 BinaryElementwiseOperatorTester()
2400 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2401 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2402 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2403 .TestQU8();
2404 }
2405 }
2406 }
2407
2408 TEST(ADD_ND_QU8, 6d_x_5d) {
2409 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2410 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
2411 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2412 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2413 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2414 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2415 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2416 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2417 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2418 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2419 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2420 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2421 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2422 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2423 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2424 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2425 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2426 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2427 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2428 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2429 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2430 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2431 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2432 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2433 BinaryElementwiseOperatorTester()
2434 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2435 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2436 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2437 .iterations(1)
2438 .TestQU8();
2439 }
2440 }
2441 }
2442
2443 TEST(ADD_ND_QU8, 6d_x_6d) {
2444 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2445 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2446 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2447 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2448 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2449 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2450 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2451 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2452 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2453 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2454 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2455 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2456 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2457 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2458 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2459 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2460 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2461 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2462 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2463 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2464 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2465 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2466 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2467 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2468 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2469 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2470 BinaryElementwiseOperatorTester()
2471 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2472 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2473 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2474 .iterations(1)
2475 .TestQU8();
2476 }
2477 }
2478 }
2479
TEST(ADD_ND_QU8,input1_scale)2480 TEST(ADD_ND_QU8, input1_scale) {
2481 for (float input1_scale = 0.1f; input1_scale <= 10.0f; input1_scale *= 3.14f) {
2482 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2483 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2484 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2485 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2486 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2487 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2488 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2489 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2490 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2491 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2492 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2493 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2494 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2495 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2496 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2497 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2498 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2499 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2500 BinaryElementwiseOperatorTester()
2501 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2502 .input1_scale(input1_scale)
2503 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2504 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2505 .TestQU8();
2506 }
2507 }
2508 }
2509 }
2510
TEST(ADD_ND_QU8,input1_zero_point)2511 TEST(ADD_ND_QU8, input1_zero_point) {
2512 for (int32_t input1_zero_point = 0; input1_zero_point <= 255; input1_zero_point += 51) {
2513 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2514 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2515 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2516 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2517 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2518 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2519 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2520 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2521 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2522 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2523 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2524 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2525 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2526 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2527 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2528 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2529 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2530 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2531 BinaryElementwiseOperatorTester()
2532 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2533 .input1_zero_point(input1_zero_point)
2534 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2535 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2536 .TestQU8();
2537 }
2538 }
2539 }
2540 }
2541
TEST(ADD_ND_QU8,input2_scale)2542 TEST(ADD_ND_QU8, input2_scale) {
2543 for (float input2_scale = 0.1f; input2_scale <= 10.0f; input2_scale *= 3.14f) {
2544 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2545 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2546 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2547 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2548 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2549 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2550 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2551 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2552 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2553 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2554 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2555 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2556 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2557 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2558 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2559 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2560 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2561 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2562 BinaryElementwiseOperatorTester()
2563 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2564 .input1_scale(input2_scale)
2565 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2566 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2567 .TestQU8();
2568 }
2569 }
2570 }
2571 }
2572
TEST(ADD_ND_QU8,input2_zero_point)2573 TEST(ADD_ND_QU8, input2_zero_point) {
2574 for (int32_t input2_zero_point = 0; input2_zero_point <= 255; input2_zero_point += 51) {
2575 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2576 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2577 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2578 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2579 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2580 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2581 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2582 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2583 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2584 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2585 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2586 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2587 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2588 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2589 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2590 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2591 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2592 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2593 BinaryElementwiseOperatorTester()
2594 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2595 .input2_zero_point(input2_zero_point)
2596 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2597 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2598 .TestQU8();
2599 }
2600 }
2601 }
2602 }
2603
TEST(ADD_ND_QU8,output_scale)2604 TEST(ADD_ND_QU8, output_scale) {
2605 for (float output_scale = 0.1f; output_scale <= 10.0f; output_scale *= 3.14f) {
2606 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2607 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2608 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2609 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2610 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2611 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2612 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2613 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2614 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2615 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2616 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2617 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2618 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2619 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2620 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2621 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2622 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2623 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2624 BinaryElementwiseOperatorTester()
2625 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2626 .input1_scale(output_scale)
2627 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2628 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2629 .TestQU8();
2630 }
2631 }
2632 }
2633 }
2634
TEST(ADD_ND_QU8,output_zero_point)2635 TEST(ADD_ND_QU8, output_zero_point) {
2636 for (int32_t output_zero_point = 0; output_zero_point <= 255; output_zero_point += 51) {
2637 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2638 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2639 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2640 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2641 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2642 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2643 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2644 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2645 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2646 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2647 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2648 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2649 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2650 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2651 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2652 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2653 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2654 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2655 BinaryElementwiseOperatorTester()
2656 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2657 .output_zero_point(output_zero_point)
2658 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2659 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2660 .TestQU8();
2661 }
2662 }
2663 }
2664 }
2665
2666 #ifndef XNN_EXCLUDE_F16_TESTS
2667 TEST(ADD_ND_F16, 0d_x_0d) {
2668 BinaryElementwiseOperatorTester()
2669 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2670 .TestF16();
2671 }
2672
2673 TEST(ADD_ND_F16, 1d_x_0d) {
2674 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2675 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2676 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2677 BinaryElementwiseOperatorTester()
2678 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2679 .input1_shape({input1_dim1})
2680 .TestF16();
2681 }
2682 }
2683
2684 TEST(ADD_ND_F16, 0d_x_1d) {
2685 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2686 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2687 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2688 BinaryElementwiseOperatorTester()
2689 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2690 .input2_shape({input2_dim1})
2691 .TestF16();
2692 }
2693 }
2694
2695 TEST(ADD_ND_F16, 1d_x_1d) {
2696 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2697 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2698 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2699 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2700 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2701 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2702 BinaryElementwiseOperatorTester()
2703 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2704 .input1_shape({input1_dim1})
2705 .input2_shape({input2_dim1})
2706 .TestF16();
2707 }
2708 }
2709 }
2710
2711 TEST(ADD_ND_F16, 0d_x_2d) {
2712 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2713 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2714 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2715 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2716 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2717 BinaryElementwiseOperatorTester()
2718 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2719 .input2_shape({input2_dim2, input2_dim1})
2720 .TestF16();
2721 }
2722 }
2723
2724 TEST(ADD_ND_F16, 1d_x_2d) {
2725 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2726 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2727 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2728 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2729 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2730 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2731 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2732 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2733 BinaryElementwiseOperatorTester()
2734 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2735 .input1_shape({input1_dim1})
2736 .input2_shape({input2_dim2, input2_dim1})
2737 .TestF16();
2738 }
2739 }
2740 }
2741
2742 TEST(ADD_ND_F16, 2d_x_0d) {
2743 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2744 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2745 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2746 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2747 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2748 BinaryElementwiseOperatorTester()
2749 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2750 .input1_shape({input1_dim2, input1_dim1})
2751 .TestF16();
2752 }
2753 }
2754
2755 TEST(ADD_ND_F16, 2d_x_1d) {
2756 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2757 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2758 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2759 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2760 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2761 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2762 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2763 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2764 BinaryElementwiseOperatorTester()
2765 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2766 .input1_shape({input1_dim2, input1_dim1})
2767 .input2_shape({input2_dim1})
2768 .TestF16();
2769 }
2770 }
2771 }
2772
2773 TEST(ADD_ND_F16, 2d_x_2d) {
2774 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2775 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2776 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2777 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2778 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2779 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2780 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2781 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2782 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2783 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2784 BinaryElementwiseOperatorTester()
2785 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2786 .input1_shape({input1_dim2, input1_dim1})
2787 .input2_shape({input2_dim2, input2_dim1})
2788 .TestF16();
2789 }
2790 }
2791 }
2792
2793 TEST(ADD_ND_F16, 0d_x_3d) {
2794 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2795 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2796 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2797 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2798 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2799 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2800 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2801 BinaryElementwiseOperatorTester()
2802 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2803 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2804 .TestF16();
2805 }
2806 }
2807
2808 TEST(ADD_ND_F16, 1d_x_3d) {
2809 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2810 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2811 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2812 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2813 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2814 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2815 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2816 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2817 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2818 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2819 BinaryElementwiseOperatorTester()
2820 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2821 .input1_shape({input1_dim1})
2822 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2823 .TestF16();
2824 }
2825 }
2826 }
2827
2828 TEST(ADD_ND_F16, 2d_x_3d) {
2829 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2830 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2831 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2832 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2833 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2834 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2835 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2836 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2837 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2838 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2839 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2840 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2841 BinaryElementwiseOperatorTester()
2842 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2843 .input1_shape({input1_dim2, input1_dim1})
2844 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2845 .TestF16();
2846 }
2847 }
2848 }
2849
2850 TEST(ADD_ND_F16, 3d_x_0d) {
2851 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2852 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2853 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2854 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2855 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2856 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2857 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2858 BinaryElementwiseOperatorTester()
2859 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2860 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2861 .TestF16();
2862 }
2863 }
2864
2865 TEST(ADD_ND_F16, 3d_x_1d) {
2866 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2867 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2868 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2869 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2870 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2871 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2872 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2873 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2874 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2875 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2876 BinaryElementwiseOperatorTester()
2877 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2878 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2879 .input2_shape({input2_dim1})
2880 .TestF16();
2881 }
2882 }
2883 }
2884
2885 TEST(ADD_ND_F16, 3d_x_2d) {
2886 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2887 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2888 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2889 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2890 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2891 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2892 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2893 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2894 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2895 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2896 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2897 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2898 BinaryElementwiseOperatorTester()
2899 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2900 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2901 .input2_shape({input2_dim2, input2_dim1})
2902 .TestF16();
2903 }
2904 }
2905 }
2906
2907 TEST(ADD_ND_F16, 3d_x_3d) {
2908 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2909 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2910 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2911 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2912 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2913 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2914 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2915 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2916 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2917 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2918 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2919 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2920 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2921 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2922 BinaryElementwiseOperatorTester()
2923 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2924 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2925 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2926 .TestF16();
2927 }
2928 }
2929 }
2930
2931 TEST(ADD_ND_F16, 0d_x_4d) {
2932 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2933 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2934 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2935 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2936 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2937 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2938 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2939 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2940 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2941 BinaryElementwiseOperatorTester()
2942 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2943 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2944 .TestF16();
2945 }
2946 }
2947
2948 TEST(ADD_ND_F16, 1d_x_4d) {
2949 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2950 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2951 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2952 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2953 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2954 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2955 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2956 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2957 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2958 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2959 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2960 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2961 BinaryElementwiseOperatorTester()
2962 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2963 .input1_shape({input1_dim1})
2964 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2965 .TestF16();
2966 }
2967 }
2968 }
2969
2970 TEST(ADD_ND_F16, 2d_x_4d) {
2971 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2972 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2973 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2974 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2975 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2976 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2977 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2978 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2979 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2980 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2981 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2982 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2983 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2984 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2985 BinaryElementwiseOperatorTester()
2986 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
2987 .input1_shape({input1_dim2, input1_dim1})
2988 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2989 .TestF16();
2990 }
2991 }
2992 }
2993
2994 TEST(ADD_ND_F16, 3d_x_4d) {
2995 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2996 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2997 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2998 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2999 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3000 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3001 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3002 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3003 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3004 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3005 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3006 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3007 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3008 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3009 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3010 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3011 BinaryElementwiseOperatorTester()
3012 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3013 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
3014 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3015 .TestF16();
3016 }
3017 }
3018 }
3019
3020 TEST(ADD_ND_F16, 4d_x_0d) {
3021 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3022 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3023 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3024 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3025 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3026 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3027 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3028 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3029 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3030 BinaryElementwiseOperatorTester()
3031 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3032 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3033 .TestF16();
3034 }
3035 }
3036
3037 TEST(ADD_ND_F16, 4d_x_1d) {
3038 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3039 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3040 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3041 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3042 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3043 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3044 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3045 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3046 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3047 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3048 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3049 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3050 BinaryElementwiseOperatorTester()
3051 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3052 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3053 .input2_shape({input2_dim1})
3054 .TestF16();
3055 }
3056 }
3057 }
3058
3059 TEST(ADD_ND_F16, 4d_x_2d) {
3060 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3061 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3062 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3063 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3064 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3065 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3066 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3067 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3068 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3069 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3070 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3071 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3072 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3073 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3074 BinaryElementwiseOperatorTester()
3075 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3076 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3077 .input2_shape({input2_dim2, input2_dim1})
3078 .TestF16();
3079 }
3080 }
3081 }
3082
3083 TEST(ADD_ND_F16, 4d_x_3d) {
3084 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3085 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3086 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3087 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3088 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3089 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3090 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3091 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3092 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3093 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3094 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3095 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3096 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3097 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3098 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3099 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3100 BinaryElementwiseOperatorTester()
3101 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3102 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3103 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3104 .TestF16();
3105 }
3106 }
3107 }
3108
3109 TEST(ADD_ND_F16, 4d_x_4d) {
3110 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3111 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
3112 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3113 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3114 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3115 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3116 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3117 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3118 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3119 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3120 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3121 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3122 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3123 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3124 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3125 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3126 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3127 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3128 BinaryElementwiseOperatorTester()
3129 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3130 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3131 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3132 .TestF16();
3133 }
3134 }
3135 }
3136
3137 TEST(ADD_ND_F16, 0d_x_5d) {
3138 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3139 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3140 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3141 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3142 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3143 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3144 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3145 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3146 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3147 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3148 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3149 BinaryElementwiseOperatorTester()
3150 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3151 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3152 .TestF16();
3153 }
3154 }
3155
3156 TEST(ADD_ND_F16, 1d_x_5d) {
3157 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3158 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3159 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3160 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3161 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3162 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3163 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3164 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3165 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3166 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3167 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3168 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3169 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3170 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3171 BinaryElementwiseOperatorTester()
3172 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3173 .input1_shape({input1_dim1})
3174 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3175 .TestF16();
3176 }
3177 }
3178 }
3179
3180 TEST(ADD_ND_F16, 2d_x_5d) {
3181 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3182 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3183 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3184 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3185 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3186 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3187 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3188 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3189 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3190 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3191 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3192 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3193 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3194 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3195 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3196 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3197 BinaryElementwiseOperatorTester()
3198 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3199 .input1_shape({input1_dim2, input1_dim1})
3200 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3201 .TestF16();
3202 }
3203 }
3204 }
3205
3206 TEST(ADD_ND_F16, 3d_x_5d) {
3207 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
3208 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3209 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3210 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3211 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3212 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3213 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3214 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3215 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3216 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3217 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3218 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3219 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3220 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3221 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3222 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3223 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3224 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3225 BinaryElementwiseOperatorTester()
3226 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3227 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
3228 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3229 .TestF16();
3230 }
3231 }
3232 }
3233
3234 TEST(ADD_ND_F16, 4d_x_5d) {
3235 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3236 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3237 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3238 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3239 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3240 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3241 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3242 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3243 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3244 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3245 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3246 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3247 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3248 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3249 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3250 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3251 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3252 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3253 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3254 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3255 BinaryElementwiseOperatorTester()
3256 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3257 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3258 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3259 .TestF16();
3260 }
3261 }
3262 }
3263
3264 TEST(ADD_ND_F16, 5d_x_0d) {
3265 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3266 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3267 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3268 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3269 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3270 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3271 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3272 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3273 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3274 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3275 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3276 BinaryElementwiseOperatorTester()
3277 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3278 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3279 .TestF16();
3280 }
3281 }
3282
3283 TEST(ADD_ND_F16, 5d_x_1d) {
3284 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3285 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3286 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3287 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3288 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3289 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3290 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3291 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3292 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3293 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3294 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3295 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3296 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3297 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3298 BinaryElementwiseOperatorTester()
3299 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3300 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3301 .input2_shape({input2_dim1})
3302 .TestF16();
3303 }
3304 }
3305 }
3306
3307 TEST(ADD_ND_F16, 5d_x_2d) {
3308 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3309 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3310 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3311 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3312 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3313 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3314 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3315 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3316 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3317 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3318 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3319 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3320 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3321 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3322 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3323 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3324 BinaryElementwiseOperatorTester()
3325 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3326 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3327 .input2_shape({input2_dim2, input2_dim1})
3328 .TestF16();
3329 }
3330 }
3331 }
3332
3333 TEST(ADD_ND_F16, 5d_x_3d) {
3334 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3335 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3336 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3337 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3338 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3339 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3340 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3341 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3342 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3343 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3344 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3345 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3346 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3347 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3348 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3349 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3350 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3351 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3352 BinaryElementwiseOperatorTester()
3353 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3354 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3355 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3356 .TestF16();
3357 }
3358 }
3359 }
3360
3361 TEST(ADD_ND_F16, 5d_x_4d) {
3362 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3363 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
3364 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3365 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3366 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3367 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3368 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3369 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3370 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3371 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3372 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3373 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3374 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3375 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3376 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3377 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3378 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3379 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3380 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3381 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3382 BinaryElementwiseOperatorTester()
3383 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3384 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3385 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3386 .TestF16();
3387 }
3388 }
3389 }
3390
3391 TEST(ADD_ND_F16, 5d_x_5d) {
3392 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3393 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3394 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3395 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3396 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3397 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3398 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3399 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3400 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3401 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3402 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3403 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3404 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3405 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3406 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3407 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3408 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3409 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3410 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3411 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3412 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3413 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3414 BinaryElementwiseOperatorTester()
3415 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3416 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3417 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3418 .iterations(1)
3419 .TestF16();
3420 }
3421 }
3422 }
3423
3424 TEST(ADD_ND_F16, 0d_x_6d) {
3425 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3426 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3427 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3428 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3429 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3430 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3431 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3432 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3433 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3434 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3435 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3436 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3437 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3438 BinaryElementwiseOperatorTester()
3439 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3440 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3441 .TestF16();
3442 }
3443 }
3444
3445 TEST(ADD_ND_F16, 1d_x_6d) {
3446 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3447 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3448 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3449 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3450 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3451 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3452 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3453 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3454 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3455 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3456 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3457 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3458 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3459 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3460 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3461 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3462 BinaryElementwiseOperatorTester()
3463 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3464 .input1_shape({input1_dim1})
3465 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3466 .TestF16();
3467 }
3468 }
3469 }
3470
3471 TEST(ADD_ND_F16, 2d_x_6d) {
3472 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3473 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3474 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3475 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3476 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3477 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3478 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3479 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3480 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3481 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3482 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3483 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3484 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3485 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3486 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3487 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3488 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3489 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3490 BinaryElementwiseOperatorTester()
3491 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3492 .input1_shape({input1_dim2, input1_dim1})
3493 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3494 .TestF16();
3495 }
3496 }
3497 }
3498
3499 TEST(ADD_ND_F16, 3d_x_6d) {
3500 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
3501 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3502 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3503 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3504 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3505 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3506 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3507 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3508 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3509 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3510 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3511 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3512 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3513 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3514 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3515 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3516 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3517 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3518 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3519 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3520 BinaryElementwiseOperatorTester()
3521 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3522 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
3523 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3524 .TestF16();
3525 }
3526 }
3527 }
3528
3529 TEST(ADD_ND_F16, 4d_x_6d) {
3530 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3531 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3532 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3533 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3534 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3535 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3536 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3537 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3538 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3539 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3540 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3541 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3542 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3543 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3544 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3545 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3546 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3547 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3548 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3549 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3550 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3551 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3552 BinaryElementwiseOperatorTester()
3553 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3554 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3555 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3556 .TestF16();
3557 }
3558 }
3559 }
3560
3561 TEST(ADD_ND_F16, 5d_x_6d) {
3562 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3563 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3564 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3565 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3566 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3567 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3568 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3569 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3570 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3571 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3572 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3573 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3574 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3575 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3576 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3577 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3578 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3579 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3580 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3581 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3582 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3583 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3584 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3585 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3586 BinaryElementwiseOperatorTester()
3587 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3588 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3589 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3590 .iterations(1)
3591 .TestF16();
3592 }
3593 }
3594 }
3595
3596 TEST(ADD_ND_F16, 6d_x_0d) {
3597 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3598 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3599 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3600 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3601 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3602 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3603 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3604 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3605 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3606 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3607 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3608 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3609 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3610 BinaryElementwiseOperatorTester()
3611 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3612 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3613 .TestF16();
3614 }
3615 }
3616
3617 TEST(ADD_ND_F16, 6d_x_1d) {
3618 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3619 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3620 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3621 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3622 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3623 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3624 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3625 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3626 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3627 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3628 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3629 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3630 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3631 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3632 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3633 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3634 BinaryElementwiseOperatorTester()
3635 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3636 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3637 .input2_shape({input2_dim1})
3638 .TestF16();
3639 }
3640 }
3641 }
3642
3643 TEST(ADD_ND_F16, 6d_x_2d) {
3644 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3645 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3646 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3647 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3648 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3649 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3650 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3651 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3652 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3653 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3654 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3655 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3656 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3657 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3658 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3659 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3660 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3661 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3662 BinaryElementwiseOperatorTester()
3663 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3664 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3665 .input2_shape({input2_dim2, input2_dim1})
3666 .TestF16();
3667 }
3668 }
3669 }
3670
3671 TEST(ADD_ND_F16, 6d_x_3d) {
3672 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3673 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3674 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3675 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3676 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3677 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3678 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3679 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3680 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3681 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3682 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3683 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3684 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3685 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3686 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3687 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3688 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3689 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3690 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3691 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3692 BinaryElementwiseOperatorTester()
3693 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3694 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3695 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3696 .TestF16();
3697 }
3698 }
3699 }
3700
3701 TEST(ADD_ND_F16, 6d_x_4d) {
3702 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3703 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
3704 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3705 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3706 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3707 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3708 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3709 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3710 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3711 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3712 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3713 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3714 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3715 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3716 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3717 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3718 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3719 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3720 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3721 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3722 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3723 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3724 BinaryElementwiseOperatorTester()
3725 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3726 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3727 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3728 .TestF16();
3729 }
3730 }
3731 }
3732
3733 TEST(ADD_ND_F16, 6d_x_5d) {
3734 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3735 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3736 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3737 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3738 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3739 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3740 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3741 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3742 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3743 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3744 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3745 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3746 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3747 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3748 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3749 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3750 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3751 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3752 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3753 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3754 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3755 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3756 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3757 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3758 BinaryElementwiseOperatorTester()
3759 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3760 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3761 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3762 .iterations(1)
3763 .TestF16();
3764 }
3765 }
3766 }
3767
3768 TEST(ADD_ND_F16, 6d_x_6d) {
3769 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3770 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3771 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3772 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3773 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3774 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3775 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3776 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3777 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3778 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3779 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3780 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3781 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3782 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3783 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3784 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3785 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3786 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3787 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3788 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3789 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3790 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3791 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3792 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3793 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3794 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3795 BinaryElementwiseOperatorTester()
3796 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3797 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3798 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3799 .iterations(1)
3800 .TestF16();
3801 }
3802 }
3803 }
3804 #endif // XNN_EXCLUDE_F16_TESTS
3805
3806 TEST(ADD_ND_F32, 0d_x_0d) {
3807 BinaryElementwiseOperatorTester()
3808 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3809 .TestF32();
3810 }
3811
3812 TEST(ADD_ND_F32, 1d_x_0d) {
3813 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3814 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3815 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3816 BinaryElementwiseOperatorTester()
3817 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3818 .input1_shape({input1_dim1})
3819 .TestF32();
3820 }
3821 }
3822
3823 TEST(ADD_ND_F32, 0d_x_1d) {
3824 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3825 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3826 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3827 BinaryElementwiseOperatorTester()
3828 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3829 .input2_shape({input2_dim1})
3830 .TestF32();
3831 }
3832 }
3833
3834 TEST(ADD_ND_F32, 1d_x_1d) {
3835 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3836 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3837 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3838 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3839 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3840 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3841 BinaryElementwiseOperatorTester()
3842 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3843 .input1_shape({input1_dim1})
3844 .input2_shape({input2_dim1})
3845 .TestF32();
3846 }
3847 }
3848 }
3849
3850 TEST(ADD_ND_F32, 0d_x_2d) {
3851 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3852 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3853 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3854 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3855 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3856 BinaryElementwiseOperatorTester()
3857 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3858 .input2_shape({input2_dim2, input2_dim1})
3859 .TestF32();
3860 }
3861 }
3862
3863 TEST(ADD_ND_F32, 1d_x_2d) {
3864 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3865 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3866 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3867 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3868 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3869 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3870 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3871 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3872 BinaryElementwiseOperatorTester()
3873 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3874 .input1_shape({input1_dim1})
3875 .input2_shape({input2_dim2, input2_dim1})
3876 .TestF32();
3877 }
3878 }
3879 }
3880
3881 TEST(ADD_ND_F32, 2d_x_0d) {
3882 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3883 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3884 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3885 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3886 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3887 BinaryElementwiseOperatorTester()
3888 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3889 .input1_shape({input1_dim2, input1_dim1})
3890 .TestF32();
3891 }
3892 }
3893
3894 TEST(ADD_ND_F32, 2d_x_1d) {
3895 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3896 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3897 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3898 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3899 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3900 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3901 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3902 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3903 BinaryElementwiseOperatorTester()
3904 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3905 .input1_shape({input1_dim2, input1_dim1})
3906 .input2_shape({input2_dim1})
3907 .TestF32();
3908 }
3909 }
3910 }
3911
3912 TEST(ADD_ND_F32, 2d_x_2d) {
3913 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3914 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3915 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3916 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3917 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3918 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3919 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3920 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3921 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3922 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3923 BinaryElementwiseOperatorTester()
3924 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3925 .input1_shape({input1_dim2, input1_dim1})
3926 .input2_shape({input2_dim2, input2_dim1})
3927 .TestF32();
3928 }
3929 }
3930 }
3931
3932 TEST(ADD_ND_F32, 0d_x_3d) {
3933 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3934 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3935 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3936 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3937 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3938 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3939 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3940 BinaryElementwiseOperatorTester()
3941 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3942 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3943 .TestF32();
3944 }
3945 }
3946
3947 TEST(ADD_ND_F32, 1d_x_3d) {
3948 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3949 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3950 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3951 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3952 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3953 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3954 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3955 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3956 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3957 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3958 BinaryElementwiseOperatorTester()
3959 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3960 .input1_shape({input1_dim1})
3961 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3962 .TestF32();
3963 }
3964 }
3965 }
3966
3967 TEST(ADD_ND_F32, 2d_x_3d) {
3968 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3969 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3970 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3971 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3972 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3973 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3974 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3975 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3976 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3977 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3978 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3979 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3980 BinaryElementwiseOperatorTester()
3981 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3982 .input1_shape({input1_dim2, input1_dim1})
3983 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3984 .TestF32();
3985 }
3986 }
3987 }
3988
3989 TEST(ADD_ND_F32, 3d_x_0d) {
3990 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
3991 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3992 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3993 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3994 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3995 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3996 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3997 BinaryElementwiseOperatorTester()
3998 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
3999 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4000 .TestF32();
4001 }
4002 }
4003
4004 TEST(ADD_ND_F32, 3d_x_1d) {
4005 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4006 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4007 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4008 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4009 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4010 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4011 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4012 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4013 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4014 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4015 BinaryElementwiseOperatorTester()
4016 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4017 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4018 .input2_shape({input2_dim1})
4019 .TestF32();
4020 }
4021 }
4022 }
4023
4024 TEST(ADD_ND_F32, 3d_x_2d) {
4025 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4026 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4027 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4028 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4029 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4030 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4031 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4032 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4033 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4034 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4035 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4036 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4037 BinaryElementwiseOperatorTester()
4038 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4039 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4040 .input2_shape({input2_dim2, input2_dim1})
4041 .TestF32();
4042 }
4043 }
4044 }
4045
4046 TEST(ADD_ND_F32, 3d_x_3d) {
4047 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4048 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4049 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4050 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4051 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4052 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4053 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4054 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4055 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4056 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4057 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4058 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4059 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4060 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4061 BinaryElementwiseOperatorTester()
4062 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4063 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4064 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4065 .TestF32();
4066 }
4067 }
4068 }
4069
4070 TEST(ADD_ND_F32, 0d_x_4d) {
4071 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4072 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4073 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4074 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4075 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4076 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4077 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4078 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4079 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4080 BinaryElementwiseOperatorTester()
4081 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4082 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4083 .TestF32();
4084 }
4085 }
4086
4087 TEST(ADD_ND_F32, 1d_x_4d) {
4088 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
4089 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4090 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4091 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4092 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4093 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4094 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4095 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4096 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4097 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4098 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4099 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4100 BinaryElementwiseOperatorTester()
4101 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4102 .input1_shape({input1_dim1})
4103 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4104 .TestF32();
4105 }
4106 }
4107 }
4108
4109 TEST(ADD_ND_F32, 2d_x_4d) {
4110 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
4111 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4112 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4113 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4114 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4115 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4116 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4117 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4118 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4119 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4120 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4121 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4122 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4123 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4124 BinaryElementwiseOperatorTester()
4125 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4126 .input1_shape({input1_dim2, input1_dim1})
4127 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4128 .TestF32();
4129 }
4130 }
4131 }
4132
4133 TEST(ADD_ND_F32, 3d_x_4d) {
4134 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4135 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4136 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4137 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4138 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4139 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4140 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4141 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4142 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4143 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4144 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4145 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4146 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4147 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4148 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4149 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4150 BinaryElementwiseOperatorTester()
4151 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4152 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4153 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4154 .TestF32();
4155 }
4156 }
4157 }
4158
4159 TEST(ADD_ND_F32, 4d_x_0d) {
4160 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4161 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4162 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4163 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4164 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4165 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4166 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4167 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4168 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4169 BinaryElementwiseOperatorTester()
4170 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4171 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4172 .TestF32();
4173 }
4174 }
4175
4176 TEST(ADD_ND_F32, 4d_x_1d) {
4177 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4178 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4179 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4180 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4181 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4182 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4183 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4184 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4185 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4186 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4187 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4188 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4189 BinaryElementwiseOperatorTester()
4190 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4191 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4192 .input2_shape({input2_dim1})
4193 .TestF32();
4194 }
4195 }
4196 }
4197
4198 TEST(ADD_ND_F32, 4d_x_2d) {
4199 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4200 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4201 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4202 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4203 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4204 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4205 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4206 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4207 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4208 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4209 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4210 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4211 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4212 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4213 BinaryElementwiseOperatorTester()
4214 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4215 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4216 .input2_shape({input2_dim2, input2_dim1})
4217 .TestF32();
4218 }
4219 }
4220 }
4221
4222 TEST(ADD_ND_F32, 4d_x_3d) {
4223 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4224 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4225 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4226 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4227 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4228 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4229 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4230 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4231 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4232 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4233 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4234 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4235 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4236 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4237 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4238 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4239 BinaryElementwiseOperatorTester()
4240 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4241 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4242 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4243 .TestF32();
4244 }
4245 }
4246 }
4247
4248 TEST(ADD_ND_F32, 4d_x_4d) {
4249 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4250 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4251 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4252 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4253 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4254 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4255 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4256 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4257 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4258 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4259 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4260 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4261 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4262 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4263 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4264 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4265 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4266 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4267 BinaryElementwiseOperatorTester()
4268 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4269 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4270 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4271 .TestF32();
4272 }
4273 }
4274 }
4275
4276 TEST(ADD_ND_F32, 0d_x_5d) {
4277 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4278 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4279 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4280 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4281 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4282 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4283 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4284 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4285 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4286 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4287 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4288 BinaryElementwiseOperatorTester()
4289 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4290 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4291 .TestF32();
4292 }
4293 }
4294
4295 TEST(ADD_ND_F32, 1d_x_5d) {
4296 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
4297 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4298 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4299 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4300 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4301 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4302 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4303 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4304 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4305 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4306 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4307 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4308 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4309 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4310 BinaryElementwiseOperatorTester()
4311 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4312 .input1_shape({input1_dim1})
4313 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4314 .TestF32();
4315 }
4316 }
4317 }
4318
4319 TEST(ADD_ND_F32, 2d_x_5d) {
4320 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
4321 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4322 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4323 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4324 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4325 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4326 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4327 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4328 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4329 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4330 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4331 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4332 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4333 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4334 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4335 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4336 BinaryElementwiseOperatorTester()
4337 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4338 .input1_shape({input1_dim2, input1_dim1})
4339 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4340 .TestF32();
4341 }
4342 }
4343 }
4344
4345 TEST(ADD_ND_F32, 3d_x_5d) {
4346 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4347 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4348 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4349 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4350 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4351 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4352 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4353 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4354 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4355 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4356 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4357 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4358 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4359 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4360 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4361 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4362 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4363 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4364 BinaryElementwiseOperatorTester()
4365 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4366 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4367 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4368 .TestF32();
4369 }
4370 }
4371 }
4372
4373 TEST(ADD_ND_F32, 4d_x_5d) {
4374 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4375 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4376 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4377 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4378 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4379 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4380 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4381 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4382 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4383 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4384 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4385 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4386 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4387 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4388 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4389 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4390 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4391 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4392 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4393 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4394 BinaryElementwiseOperatorTester()
4395 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4396 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4397 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4398 .TestF32();
4399 }
4400 }
4401 }
4402
4403 TEST(ADD_ND_F32, 5d_x_0d) {
4404 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4405 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4406 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4407 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4408 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4409 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4410 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4411 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4412 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4413 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4414 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4415 BinaryElementwiseOperatorTester()
4416 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4417 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4418 .TestF32();
4419 }
4420 }
4421
4422 TEST(ADD_ND_F32, 5d_x_1d) {
4423 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4424 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4425 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4426 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4427 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4428 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4429 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4430 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4431 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4432 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4433 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4434 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4435 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4436 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4437 BinaryElementwiseOperatorTester()
4438 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4439 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4440 .input2_shape({input2_dim1})
4441 .TestF32();
4442 }
4443 }
4444 }
4445
4446 TEST(ADD_ND_F32, 5d_x_2d) {
4447 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4448 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4449 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4450 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4451 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4452 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4453 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4454 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4455 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4456 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4457 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4458 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4459 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4460 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4461 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4462 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4463 BinaryElementwiseOperatorTester()
4464 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4465 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4466 .input2_shape({input2_dim2, input2_dim1})
4467 .TestF32();
4468 }
4469 }
4470 }
4471
4472 TEST(ADD_ND_F32, 5d_x_3d) {
4473 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4474 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4475 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4476 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4477 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4478 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4479 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4480 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4481 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4482 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4483 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4484 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4485 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4486 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4487 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4488 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4489 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4490 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4491 BinaryElementwiseOperatorTester()
4492 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4493 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4494 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4495 .TestF32();
4496 }
4497 }
4498 }
4499
4500 TEST(ADD_ND_F32, 5d_x_4d) {
4501 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4502 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4503 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4504 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4505 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4506 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4507 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4508 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4509 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4510 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4511 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4512 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4513 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4514 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4515 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4516 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4517 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4518 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4519 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4520 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4521 BinaryElementwiseOperatorTester()
4522 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4523 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4524 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4525 .TestF32();
4526 }
4527 }
4528 }
4529
4530 TEST(ADD_ND_F32, 5d_x_5d) {
4531 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4532 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4533 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4534 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4535 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4536 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4537 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4538 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4539 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4540 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4541 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4542 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4543 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4544 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4545 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4546 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4547 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4548 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4549 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4550 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4551 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4552 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4553 BinaryElementwiseOperatorTester()
4554 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4555 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4556 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4557 .iterations(1)
4558 .TestF32();
4559 }
4560 }
4561 }
4562
4563 TEST(ADD_ND_F32, 0d_x_6d) {
4564 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4565 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4566 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4567 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4568 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4569 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4570 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4571 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4572 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4573 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4574 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4575 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4576 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4577 BinaryElementwiseOperatorTester()
4578 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4579 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4580 .TestF32();
4581 }
4582 }
4583
4584 TEST(ADD_ND_F32, 1d_x_6d) {
4585 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
4586 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4587 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4588 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4589 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4590 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4591 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4592 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4593 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4594 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4595 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4596 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4597 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4598 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4599 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4600 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4601 BinaryElementwiseOperatorTester()
4602 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4603 .input1_shape({input1_dim1})
4604 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4605 .TestF32();
4606 }
4607 }
4608 }
4609
4610 TEST(ADD_ND_F32, 2d_x_6d) {
4611 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
4612 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4613 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4614 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4615 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4616 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4617 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4618 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4619 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4620 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4621 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4622 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4623 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4624 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4625 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4626 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4627 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4628 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4629 BinaryElementwiseOperatorTester()
4630 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4631 .input1_shape({input1_dim2, input1_dim1})
4632 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4633 .TestF32();
4634 }
4635 }
4636 }
4637
4638 TEST(ADD_ND_F32, 3d_x_6d) {
4639 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4640 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4641 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4642 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4643 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4644 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4645 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4646 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4647 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4648 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4649 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4650 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4651 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4652 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4653 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4654 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4655 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4656 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4657 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4658 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4659 BinaryElementwiseOperatorTester()
4660 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4661 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4662 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4663 .TestF32();
4664 }
4665 }
4666 }
4667
4668 TEST(ADD_ND_F32, 4d_x_6d) {
4669 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4670 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4671 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4672 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4673 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4674 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4675 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4676 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4677 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4678 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4679 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4680 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4681 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4682 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4683 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4684 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4685 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4686 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4687 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4688 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4689 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4690 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4691 BinaryElementwiseOperatorTester()
4692 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4693 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4694 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4695 .TestF32();
4696 }
4697 }
4698 }
4699
4700 TEST(ADD_ND_F32, 5d_x_6d) {
4701 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4702 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4703 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4704 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4705 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4706 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4707 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4708 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4709 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4710 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4711 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4712 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4713 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4714 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4715 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4716 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4717 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4718 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4719 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4720 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4721 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4722 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4723 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4724 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4725 BinaryElementwiseOperatorTester()
4726 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4727 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4728 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4729 .iterations(1)
4730 .TestF32();
4731 }
4732 }
4733 }
4734
4735 TEST(ADD_ND_F32, 6d_x_0d) {
4736 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4737 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4738 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4739 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4740 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4741 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4742 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4743 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4744 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4745 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4746 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4747 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4748 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4749 BinaryElementwiseOperatorTester()
4750 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4751 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4752 .TestF32();
4753 }
4754 }
4755
4756 TEST(ADD_ND_F32, 6d_x_1d) {
4757 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4758 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4759 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4760 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4761 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4762 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4763 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4764 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4765 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4766 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4767 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4768 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4769 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4770 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4771 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4772 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4773 BinaryElementwiseOperatorTester()
4774 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4775 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4776 .input2_shape({input2_dim1})
4777 .TestF32();
4778 }
4779 }
4780 }
4781
4782 TEST(ADD_ND_F32, 6d_x_2d) {
4783 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4784 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4785 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4786 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4787 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4788 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4789 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4790 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4791 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4792 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4793 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4794 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4795 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4796 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4797 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4798 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4799 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4800 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4801 BinaryElementwiseOperatorTester()
4802 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4803 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4804 .input2_shape({input2_dim2, input2_dim1})
4805 .TestF32();
4806 }
4807 }
4808 }
4809
4810 TEST(ADD_ND_F32, 6d_x_3d) {
4811 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4812 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4813 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4814 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4815 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4816 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4817 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4818 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4819 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4820 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4821 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4822 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4823 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4824 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4825 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4826 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4827 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4828 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4829 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4830 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4831 BinaryElementwiseOperatorTester()
4832 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4833 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4834 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4835 .TestF32();
4836 }
4837 }
4838 }
4839
4840 TEST(ADD_ND_F32, 6d_x_4d) {
4841 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4842 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4843 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4844 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4845 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4846 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4847 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4848 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4849 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4850 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4851 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4852 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4853 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4854 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4855 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4856 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4857 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4858 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4859 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4860 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4861 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4862 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4863 BinaryElementwiseOperatorTester()
4864 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4865 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4866 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4867 .TestF32();
4868 }
4869 }
4870 }
4871
4872 TEST(ADD_ND_F32, 6d_x_5d) {
4873 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4874 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4875 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4876 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4877 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4878 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4879 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4880 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4881 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4882 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4883 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4884 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4885 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4886 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4887 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4888 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4889 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4890 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4891 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4892 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4893 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4894 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4895 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4896 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4897 BinaryElementwiseOperatorTester()
4898 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4899 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4900 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4901 .iterations(1)
4902 .TestF32();
4903 }
4904 }
4905 }
4906
4907 TEST(ADD_ND_F32, 6d_x_6d) {
4908 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4909 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4910 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4911 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4912 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4913 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4914 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4915 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4916 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4917 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4918 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4919 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4920 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4921 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4922 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4923 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4924 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4925 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4926 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4927 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4928 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4929 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4930 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4931 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4932 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4933 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4934 BinaryElementwiseOperatorTester()
4935 .operation_type(BinaryElementwiseOperatorTester::OperationType::Add)
4936 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4937 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4938 .iterations(1)
4939 .TestF32();
4940 }
4941 }
4942 }
4943