blob: 31fb7f32a51cb4f5cdf13f28dc6bfa2ab1f96a3c [file] [log] [blame]
Marat Dukhanca2733c2019-11-15 23:21:17 -08001// 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
Marat Dukhanb1a0fc32019-12-02 19:32:02 -08008#include "binary-elementwise-operator-tester.h"
Marat Dukhanca2733c2019-11-15 23:21:17 -08009
Marat Dukhanab4af572019-12-03 11:11:18 -080010constexpr size_t kDim1 = 2;
11constexpr size_t kDim2 = 3;
12constexpr size_t kDim3 = 4;
13constexpr size_t kDim4 = 5;
Marat Dukhanfc2b96e2019-12-03 12:04:04 -080014constexpr size_t kDim5 = 6;
15constexpr size_t kDim6 = 7;
Marat Dukhanca2733c2019-11-15 23:21:17 -080016
Marat Dukhanab4af572019-12-03 11:11:18 -080017
Marat Dukhan0853b8a2021-08-03 01:01:53 -070018TEST(MULTIPLY_ND_QS8, 0d_x_0d) {
19 BinaryElementwiseOperatorTester()
20 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
21 .TestQS8();
22}
23
24TEST(MULTIPLY_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::Multiply)
30 .input1_shape({input1_dim1})
31 .TestQS8();
32 }
33}
34
35TEST(MULTIPLY_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::Multiply)
41 .input2_shape({input2_dim1})
42 .TestQS8();
43 }
44}
45
46TEST(MULTIPLY_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::Multiply)
55 .input1_shape({input1_dim1})
56 .input2_shape({input2_dim1})
57 .TestQS8();
58 }
59 }
60}
61
62TEST(MULTIPLY_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::Multiply)
70 .input2_shape({input2_dim2, input2_dim1})
71 .TestQS8();
72 }
73}
74
75TEST(MULTIPLY_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::Multiply)
86 .input1_shape({input1_dim1})
87 .input2_shape({input2_dim2, input2_dim1})
88 .TestQS8();
89 }
90 }
91}
92
93TEST(MULTIPLY_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::Multiply)
101 .input1_shape({input1_dim2, input1_dim1})
102 .TestQS8();
103 }
104}
105
106TEST(MULTIPLY_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::Multiply)
117 .input1_shape({input1_dim2, input1_dim1})
118 .input2_shape({input2_dim1})
119 .TestQS8();
120 }
121 }
122}
123
124TEST(MULTIPLY_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::Multiply)
137 .input1_shape({input1_dim2, input1_dim1})
138 .input2_shape({input2_dim2, input2_dim1})
139 .TestQS8();
140 }
141 }
142}
143
144TEST(MULTIPLY_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::Multiply)
154 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
155 .TestQS8();
156 }
157}
158
159TEST(MULTIPLY_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::Multiply)
172 .input1_shape({input1_dim1})
173 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
174 .TestQS8();
175 }
176 }
177}
178
179TEST(MULTIPLY_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::Multiply)
194 .input1_shape({input1_dim2, input1_dim1})
195 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
196 .TestQS8();
197 }
198 }
199}
200
201TEST(MULTIPLY_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::Multiply)
211 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
212 .TestQS8();
213 }
214}
215
216TEST(MULTIPLY_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::Multiply)
229 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
230 .input2_shape({input2_dim1})
231 .TestQS8();
232 }
233 }
234}
235
236TEST(MULTIPLY_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::Multiply)
251 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
252 .input2_shape({input2_dim2, input2_dim1})
253 .TestQS8();
254 }
255 }
256}
257
258TEST(MULTIPLY_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::Multiply)
275 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
276 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
277 .TestQS8();
278 }
279 }
280}
281
282TEST(MULTIPLY_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::Multiply)
294 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
295 .TestQS8();
296 }
297}
298
299TEST(MULTIPLY_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::Multiply)
314 .input1_shape({input1_dim1})
315 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
316 .TestQS8();
317 }
318 }
319}
320
321TEST(MULTIPLY_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::Multiply)
338 .input1_shape({input1_dim2, input1_dim1})
339 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
340 .TestQS8();
341 }
342 }
343}
344
345TEST(MULTIPLY_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::Multiply)
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
371TEST(MULTIPLY_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::Multiply)
383 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
384 .TestQS8();
385 }
386}
387
388TEST(MULTIPLY_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::Multiply)
403 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
404 .input2_shape({input2_dim1})
405 .TestQS8();
406 }
407 }
408}
409
410TEST(MULTIPLY_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::Multiply)
427 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
428 .input2_shape({input2_dim2, input2_dim1})
429 .TestQS8();
430 }
431 }
432}
433
434TEST(MULTIPLY_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::Multiply)
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
460TEST(MULTIPLY_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::Multiply)
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
488TEST(MULTIPLY_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::Multiply)
502 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
503 .TestQS8();
504 }
505}
506
507TEST(MULTIPLY_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::Multiply)
524 .input1_shape({input1_dim1})
525 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
526 .TestQS8();
527 }
528 }
529}
530
531TEST(MULTIPLY_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::Multiply)
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
557TEST(MULTIPLY_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::Multiply)
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
585TEST(MULTIPLY_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::Multiply)
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
615TEST(MULTIPLY_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::Multiply)
629 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
630 .TestQS8();
631 }
632}
633
634TEST(MULTIPLY_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::Multiply)
651 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
652 .input2_shape({input2_dim1})
653 .TestQS8();
654 }
655 }
656}
657
658TEST(MULTIPLY_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::Multiply)
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
684TEST(MULTIPLY_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::Multiply)
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
712TEST(MULTIPLY_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::Multiply)
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
742TEST(MULTIPLY_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::Multiply)
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
775TEST(MULTIPLY_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::Multiply)
791 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
792 .TestQS8();
793 }
794}
795
796TEST(MULTIPLY_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::Multiply)
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
822TEST(MULTIPLY_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::Multiply)
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
850TEST(MULTIPLY_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::Multiply)
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
880TEST(MULTIPLY_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::Multiply)
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
912TEST(MULTIPLY_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::Multiply)
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
947TEST(MULTIPLY_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::Multiply)
963 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
964 .TestQS8();
965 }
966}
967
968TEST(MULTIPLY_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::Multiply)
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
994TEST(MULTIPLY_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::Multiply)
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
1022TEST(MULTIPLY_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::Multiply)
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
1052TEST(MULTIPLY_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::Multiply)
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
1084TEST(MULTIPLY_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::Multiply)
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
1119TEST(MULTIPLY_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::Multiply)
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
1156TEST(MULTIPLY_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::Multiply)
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
1187TEST(MULTIPLY_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::Multiply)
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
1218TEST(MULTIPLY_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::Multiply)
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
1249TEST(MULTIPLY_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::Multiply)
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
1280TEST(MULTIPLY_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::Multiply)
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
1311TEST(MULTIPLY_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::Multiply)
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
1342TEST(MULTIPLY_ND_QU8, 0d_x_0d) {
1343 BinaryElementwiseOperatorTester()
1344 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
1345 .TestQU8();
1346}
1347
1348TEST(MULTIPLY_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::Multiply)
1354 .input1_shape({input1_dim1})
1355 .TestQU8();
1356 }
1357}
1358
1359TEST(MULTIPLY_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::Multiply)
1365 .input2_shape({input2_dim1})
1366 .TestQU8();
1367 }
1368}
1369
1370TEST(MULTIPLY_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::Multiply)
1379 .input1_shape({input1_dim1})
1380 .input2_shape({input2_dim1})
1381 .TestQU8();
1382 }
1383 }
1384}
1385
1386TEST(MULTIPLY_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::Multiply)
1394 .input2_shape({input2_dim2, input2_dim1})
1395 .TestQU8();
1396 }
1397}
1398
1399TEST(MULTIPLY_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::Multiply)
1410 .input1_shape({input1_dim1})
1411 .input2_shape({input2_dim2, input2_dim1})
1412 .TestQU8();
1413 }
1414 }
1415}
1416
1417TEST(MULTIPLY_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::Multiply)
1425 .input1_shape({input1_dim2, input1_dim1})
1426 .TestQU8();
1427 }
1428}
1429
1430TEST(MULTIPLY_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::Multiply)
1441 .input1_shape({input1_dim2, input1_dim1})
1442 .input2_shape({input2_dim1})
1443 .TestQU8();
1444 }
1445 }
1446}
1447
1448TEST(MULTIPLY_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::Multiply)
1461 .input1_shape({input1_dim2, input1_dim1})
1462 .input2_shape({input2_dim2, input2_dim1})
1463 .TestQU8();
1464 }
1465 }
1466}
1467
1468TEST(MULTIPLY_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::Multiply)
1478 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1479 .TestQU8();
1480 }
1481}
1482
1483TEST(MULTIPLY_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::Multiply)
1496 .input1_shape({input1_dim1})
1497 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1498 .TestQU8();
1499 }
1500 }
1501}
1502
1503TEST(MULTIPLY_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::Multiply)
1518 .input1_shape({input1_dim2, input1_dim1})
1519 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1520 .TestQU8();
1521 }
1522 }
1523}
1524
1525TEST(MULTIPLY_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::Multiply)
1535 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1536 .TestQU8();
1537 }
1538}
1539
1540TEST(MULTIPLY_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::Multiply)
1553 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1554 .input2_shape({input2_dim1})
1555 .TestQU8();
1556 }
1557 }
1558}
1559
1560TEST(MULTIPLY_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::Multiply)
1575 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1576 .input2_shape({input2_dim2, input2_dim1})
1577 .TestQU8();
1578 }
1579 }
1580}
1581
1582TEST(MULTIPLY_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::Multiply)
1599 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1600 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1601 .TestQU8();
1602 }
1603 }
1604}
1605
1606TEST(MULTIPLY_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::Multiply)
1618 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1619 .TestQU8();
1620 }
1621}
1622
1623TEST(MULTIPLY_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::Multiply)
1638 .input1_shape({input1_dim1})
1639 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1640 .TestQU8();
1641 }
1642 }
1643}
1644
1645TEST(MULTIPLY_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::Multiply)
1662 .input1_shape({input1_dim2, input1_dim1})
1663 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1664 .TestQU8();
1665 }
1666 }
1667}
1668
1669TEST(MULTIPLY_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::Multiply)
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
1695TEST(MULTIPLY_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::Multiply)
1707 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1708 .TestQU8();
1709 }
1710}
1711
1712TEST(MULTIPLY_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::Multiply)
1727 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1728 .input2_shape({input2_dim1})
1729 .TestQU8();
1730 }
1731 }
1732}
1733
1734TEST(MULTIPLY_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::Multiply)
1751 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1752 .input2_shape({input2_dim2, input2_dim1})
1753 .TestQU8();
1754 }
1755 }
1756}
1757
1758TEST(MULTIPLY_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::Multiply)
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
1784TEST(MULTIPLY_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::Multiply)
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
1812TEST(MULTIPLY_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::Multiply)
1826 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1827 .TestQU8();
1828 }
1829}
1830
1831TEST(MULTIPLY_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::Multiply)
1848 .input1_shape({input1_dim1})
1849 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1850 .TestQU8();
1851 }
1852 }
1853}
1854
1855TEST(MULTIPLY_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::Multiply)
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
1881TEST(MULTIPLY_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::Multiply)
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
1909TEST(MULTIPLY_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::Multiply)
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
1939TEST(MULTIPLY_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::Multiply)
1953 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1954 .TestQU8();
1955 }
1956}
1957
1958TEST(MULTIPLY_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::Multiply)
1975 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1976 .input2_shape({input2_dim1})
1977 .TestQU8();
1978 }
1979 }
1980}
1981
1982TEST(MULTIPLY_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::Multiply)
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
2008TEST(MULTIPLY_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::Multiply)
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
2036TEST(MULTIPLY_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::Multiply)
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
2066TEST(MULTIPLY_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::Multiply)
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
2099TEST(MULTIPLY_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::Multiply)
2115 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2116 .TestQU8();
2117 }
2118}
2119
2120TEST(MULTIPLY_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::Multiply)
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
2146TEST(MULTIPLY_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::Multiply)
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
2174TEST(MULTIPLY_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::Multiply)
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
2204TEST(MULTIPLY_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::Multiply)
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
2236TEST(MULTIPLY_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::Multiply)
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
2271TEST(MULTIPLY_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::Multiply)
2287 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2288 .TestQU8();
2289 }
2290}
2291
2292TEST(MULTIPLY_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::Multiply)
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
2318TEST(MULTIPLY_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::Multiply)
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
2346TEST(MULTIPLY_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::Multiply)
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
2376TEST(MULTIPLY_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::Multiply)
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
2408TEST(MULTIPLY_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::Multiply)
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
2443TEST(MULTIPLY_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::Multiply)
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
2480TEST(MULTIPLY_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::Multiply)
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
2511TEST(MULTIPLY_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::Multiply)
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
2542TEST(MULTIPLY_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::Multiply)
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
2573TEST(MULTIPLY_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::Multiply)
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
2604TEST(MULTIPLY_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::Multiply)
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
2635TEST(MULTIPLY_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::Multiply)
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
Frank Barchard0ea6a772020-09-09 15:26:31 -07002666TEST(MULTIPLY_ND_F16, 0d_x_0d) {
2667 BinaryElementwiseOperatorTester()
2668 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2669 .TestF16();
2670}
2671
2672TEST(MULTIPLY_ND_F16, 1d_x_0d) {
2673 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2674 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2675 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2676 BinaryElementwiseOperatorTester()
2677 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2678 .input1_shape({input1_dim1})
2679 .TestF16();
2680 }
2681}
2682
2683TEST(MULTIPLY_ND_F16, 0d_x_1d) {
2684 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2685 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2686 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2687 BinaryElementwiseOperatorTester()
2688 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2689 .input2_shape({input2_dim1})
2690 .TestF16();
2691 }
2692}
2693
2694TEST(MULTIPLY_ND_F16, 1d_x_1d) {
2695 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2696 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2697 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2698 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2699 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2700 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2701 BinaryElementwiseOperatorTester()
2702 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2703 .input1_shape({input1_dim1})
2704 .input2_shape({input2_dim1})
2705 .TestF16();
2706 }
2707 }
2708}
2709
2710TEST(MULTIPLY_ND_F16, 0d_x_2d) {
2711 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2712 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2713 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2714 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2715 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2716 BinaryElementwiseOperatorTester()
2717 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2718 .input2_shape({input2_dim2, input2_dim1})
2719 .TestF16();
2720 }
2721}
2722
2723TEST(MULTIPLY_ND_F16, 1d_x_2d) {
2724 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2725 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2726 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2727 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2728 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2729 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2730 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2731 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2732 BinaryElementwiseOperatorTester()
2733 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2734 .input1_shape({input1_dim1})
2735 .input2_shape({input2_dim2, input2_dim1})
2736 .TestF16();
2737 }
2738 }
2739}
2740
2741TEST(MULTIPLY_ND_F16, 2d_x_0d) {
2742 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2743 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2744 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2745 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2746 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2747 BinaryElementwiseOperatorTester()
2748 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2749 .input1_shape({input1_dim2, input1_dim1})
2750 .TestF16();
2751 }
2752}
2753
2754TEST(MULTIPLY_ND_F16, 2d_x_1d) {
2755 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2756 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2757 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2758 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2759 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2760 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2761 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2762 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2763 BinaryElementwiseOperatorTester()
2764 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2765 .input1_shape({input1_dim2, input1_dim1})
2766 .input2_shape({input2_dim1})
2767 .TestF16();
2768 }
2769 }
2770}
2771
2772TEST(MULTIPLY_ND_F16, 2d_x_2d) {
2773 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2774 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2775 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2776 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2777 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2778 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2779 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2780 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2781 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2782 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2783 BinaryElementwiseOperatorTester()
2784 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2785 .input1_shape({input1_dim2, input1_dim1})
2786 .input2_shape({input2_dim2, input2_dim1})
2787 .TestF16();
2788 }
2789 }
2790}
2791
2792TEST(MULTIPLY_ND_F16, 0d_x_3d) {
2793 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2794 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2795 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2796 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2797 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2798 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2799 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2800 BinaryElementwiseOperatorTester()
2801 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2802 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2803 .TestF16();
2804 }
2805}
2806
2807TEST(MULTIPLY_ND_F16, 1d_x_3d) {
2808 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2809 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2810 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2811 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2812 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2813 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2814 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2815 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2816 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2817 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2818 BinaryElementwiseOperatorTester()
2819 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2820 .input1_shape({input1_dim1})
2821 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2822 .TestF16();
2823 }
2824 }
2825}
2826
2827TEST(MULTIPLY_ND_F16, 2d_x_3d) {
2828 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2829 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2830 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2831 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2832 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2833 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2834 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2835 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2836 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2837 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2838 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2839 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2840 BinaryElementwiseOperatorTester()
2841 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2842 .input1_shape({input1_dim2, input1_dim1})
2843 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2844 .TestF16();
2845 }
2846 }
2847}
2848
2849TEST(MULTIPLY_ND_F16, 3d_x_0d) {
2850 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2851 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2852 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2853 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2854 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2855 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2856 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2857 BinaryElementwiseOperatorTester()
2858 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2859 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2860 .TestF16();
2861 }
2862}
2863
2864TEST(MULTIPLY_ND_F16, 3d_x_1d) {
2865 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2866 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2867 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2868 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2869 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2870 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2871 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2872 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2873 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2874 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2875 BinaryElementwiseOperatorTester()
2876 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2877 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2878 .input2_shape({input2_dim1})
2879 .TestF16();
2880 }
2881 }
2882}
2883
2884TEST(MULTIPLY_ND_F16, 3d_x_2d) {
2885 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2886 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2887 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2888 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2889 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2890 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2891 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2892 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2893 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2894 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2895 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2896 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2897 BinaryElementwiseOperatorTester()
2898 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2899 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2900 .input2_shape({input2_dim2, input2_dim1})
2901 .TestF16();
2902 }
2903 }
2904}
2905
2906TEST(MULTIPLY_ND_F16, 3d_x_3d) {
2907 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2908 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2909 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2910 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2911 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2912 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2913 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2914 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2915 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2916 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2917 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2918 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2919 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2920 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2921 BinaryElementwiseOperatorTester()
2922 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2923 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2924 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2925 .TestF16();
2926 }
2927 }
2928}
2929
2930TEST(MULTIPLY_ND_F16, 0d_x_4d) {
2931 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2932 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2933 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2934 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2935 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2936 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2937 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2938 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2939 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2940 BinaryElementwiseOperatorTester()
2941 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2942 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2943 .TestF16();
2944 }
2945}
2946
2947TEST(MULTIPLY_ND_F16, 1d_x_4d) {
2948 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
2949 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2950 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2951 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2952 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2953 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2954 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2955 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2956 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2957 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2958 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2959 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2960 BinaryElementwiseOperatorTester()
2961 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2962 .input1_shape({input1_dim1})
2963 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2964 .TestF16();
2965 }
2966 }
2967}
2968
2969TEST(MULTIPLY_ND_F16, 2d_x_4d) {
2970 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
2971 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2972 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2973 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2974 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2975 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2976 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2977 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2978 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2979 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2980 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2981 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2982 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2983 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2984 BinaryElementwiseOperatorTester()
2985 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
2986 .input1_shape({input1_dim2, input1_dim1})
2987 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2988 .TestF16();
2989 }
2990 }
2991}
2992
2993TEST(MULTIPLY_ND_F16, 3d_x_4d) {
2994 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
2995 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2996 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2997 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2998 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2999 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3000 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3001 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3002 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3003 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3004 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3005 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3006 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3007 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3008 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3009 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3010 BinaryElementwiseOperatorTester()
3011 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3012 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
3013 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3014 .TestF16();
3015 }
3016 }
3017}
3018
3019TEST(MULTIPLY_ND_F16, 4d_x_0d) {
3020 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3021 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3022 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3023 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3024 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3025 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3026 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3027 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3028 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3029 BinaryElementwiseOperatorTester()
3030 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3031 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3032 .TestF16();
3033 }
3034}
3035
3036TEST(MULTIPLY_ND_F16, 4d_x_1d) {
3037 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3038 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3039 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3040 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3041 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3042 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3043 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3044 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3045 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3046 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3047 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3048 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3049 BinaryElementwiseOperatorTester()
3050 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3051 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3052 .input2_shape({input2_dim1})
3053 .TestF16();
3054 }
3055 }
3056}
3057
3058TEST(MULTIPLY_ND_F16, 4d_x_2d) {
3059 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3060 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3061 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3062 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3063 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3064 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3065 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3066 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3067 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3068 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3069 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3070 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3071 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3072 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3073 BinaryElementwiseOperatorTester()
3074 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3075 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3076 .input2_shape({input2_dim2, input2_dim1})
3077 .TestF16();
3078 }
3079 }
3080}
3081
3082TEST(MULTIPLY_ND_F16, 4d_x_3d) {
3083 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3084 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3085 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3086 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3087 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3088 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3089 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3090 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3091 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3092 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3093 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3094 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3095 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3096 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3097 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3098 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3099 BinaryElementwiseOperatorTester()
3100 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3101 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3102 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3103 .TestF16();
3104 }
3105 }
3106}
3107
3108TEST(MULTIPLY_ND_F16, 4d_x_4d) {
3109 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3110 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
3111 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3112 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3113 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3114 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3115 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3116 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3117 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3118 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3119 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3120 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3121 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3122 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3123 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3124 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3125 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3126 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3127 BinaryElementwiseOperatorTester()
3128 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3129 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3130 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3131 .TestF16();
3132 }
3133 }
3134}
3135
3136TEST(MULTIPLY_ND_F16, 0d_x_5d) {
3137 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3138 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3139 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3140 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3141 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3142 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3143 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3144 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3145 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3146 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3147 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3148 BinaryElementwiseOperatorTester()
3149 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3150 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3151 .TestF16();
3152 }
3153}
3154
3155TEST(MULTIPLY_ND_F16, 1d_x_5d) {
3156 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3157 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3158 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3159 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3160 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3161 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3162 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3163 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3164 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3165 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3166 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3167 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3168 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3169 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3170 BinaryElementwiseOperatorTester()
3171 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3172 .input1_shape({input1_dim1})
3173 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3174 .TestF16();
3175 }
3176 }
3177}
3178
3179TEST(MULTIPLY_ND_F16, 2d_x_5d) {
3180 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3181 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3182 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3183 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3184 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3185 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3186 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3187 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3188 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3189 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3190 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3191 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3192 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3193 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3194 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3195 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3196 BinaryElementwiseOperatorTester()
3197 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3198 .input1_shape({input1_dim2, input1_dim1})
3199 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3200 .TestF16();
3201 }
3202 }
3203}
3204
3205TEST(MULTIPLY_ND_F16, 3d_x_5d) {
3206 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
3207 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3208 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3209 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3210 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3211 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3212 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3213 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3214 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3215 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3216 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3217 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3218 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3219 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3220 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3221 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3222 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3223 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3224 BinaryElementwiseOperatorTester()
3225 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3226 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
3227 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3228 .TestF16();
3229 }
3230 }
3231}
3232
3233TEST(MULTIPLY_ND_F16, 4d_x_5d) {
3234 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3235 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3236 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3237 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3238 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3239 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3240 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3241 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3242 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3243 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3244 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3245 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3246 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3247 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3248 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3249 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3250 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3251 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3252 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3253 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3254 BinaryElementwiseOperatorTester()
3255 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3256 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3257 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3258 .TestF16();
3259 }
3260 }
3261}
3262
3263TEST(MULTIPLY_ND_F16, 5d_x_0d) {
3264 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3265 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3266 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3267 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3268 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3269 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3270 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3271 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3272 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3273 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3274 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3275 BinaryElementwiseOperatorTester()
3276 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3277 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3278 .TestF16();
3279 }
3280}
3281
3282TEST(MULTIPLY_ND_F16, 5d_x_1d) {
3283 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3284 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3285 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3286 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3287 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3288 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3289 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3290 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3291 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3292 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3293 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3294 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3295 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3296 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3297 BinaryElementwiseOperatorTester()
3298 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3299 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3300 .input2_shape({input2_dim1})
3301 .TestF16();
3302 }
3303 }
3304}
3305
3306TEST(MULTIPLY_ND_F16, 5d_x_2d) {
3307 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3308 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3309 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3310 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3311 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3312 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3313 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3314 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3315 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3316 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3317 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3318 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3319 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3320 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3321 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3322 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3323 BinaryElementwiseOperatorTester()
3324 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3325 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3326 .input2_shape({input2_dim2, input2_dim1})
3327 .TestF16();
3328 }
3329 }
3330}
3331
3332TEST(MULTIPLY_ND_F16, 5d_x_3d) {
3333 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3334 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3335 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3336 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3337 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3338 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3339 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3340 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3341 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3342 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3343 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3344 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3345 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3346 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3347 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3348 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3349 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3350 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3351 BinaryElementwiseOperatorTester()
3352 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3353 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3354 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3355 .TestF16();
3356 }
3357 }
3358}
3359
3360TEST(MULTIPLY_ND_F16, 5d_x_4d) {
3361 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3362 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
3363 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3364 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3365 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3366 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3367 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3368 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3369 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3370 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3371 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3372 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3373 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3374 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3375 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3376 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3377 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3378 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3379 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3380 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3381 BinaryElementwiseOperatorTester()
3382 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3383 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3384 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3385 .TestF16();
3386 }
3387 }
3388}
3389
3390TEST(MULTIPLY_ND_F16, 5d_x_5d) {
3391 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3392 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3393 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3394 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3395 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3396 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3397 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3398 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3399 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3400 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3401 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3402 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3403 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3404 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3405 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3406 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3407 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3408 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3409 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3410 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3411 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3412 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3413 BinaryElementwiseOperatorTester()
3414 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3415 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3416 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3417 .iterations(1)
3418 .TestF16();
3419 }
3420 }
3421}
3422
3423TEST(MULTIPLY_ND_F16, 0d_x_6d) {
3424 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3425 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3426 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3427 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3428 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3429 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3430 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3431 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3432 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3433 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3434 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3435 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3436 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3437 BinaryElementwiseOperatorTester()
3438 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3439 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3440 .TestF16();
3441 }
3442}
3443
3444TEST(MULTIPLY_ND_F16, 1d_x_6d) {
3445 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3446 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3447 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3448 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3449 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3450 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3451 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3452 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3453 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3454 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3455 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3456 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3457 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3458 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3459 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3460 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3461 BinaryElementwiseOperatorTester()
3462 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3463 .input1_shape({input1_dim1})
3464 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3465 .TestF16();
3466 }
3467 }
3468}
3469
3470TEST(MULTIPLY_ND_F16, 2d_x_6d) {
3471 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3472 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3473 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3474 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3475 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3476 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3477 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3478 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3479 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3480 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3481 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3482 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3483 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3484 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3485 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3486 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3487 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3488 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3489 BinaryElementwiseOperatorTester()
3490 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3491 .input1_shape({input1_dim2, input1_dim1})
3492 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3493 .TestF16();
3494 }
3495 }
3496}
3497
3498TEST(MULTIPLY_ND_F16, 3d_x_6d) {
3499 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
3500 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3501 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3502 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3503 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3504 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3505 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3506 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3507 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3508 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3509 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3510 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3511 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3512 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3513 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3514 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3515 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3516 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3517 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3518 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3519 BinaryElementwiseOperatorTester()
3520 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3521 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
3522 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3523 .TestF16();
3524 }
3525 }
3526}
3527
3528TEST(MULTIPLY_ND_F16, 4d_x_6d) {
3529 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
3530 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3531 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3532 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3533 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3534 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3535 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3536 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3537 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3538 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3539 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3540 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3541 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3542 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3543 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3544 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3545 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3546 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3547 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3548 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3549 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3550 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3551 BinaryElementwiseOperatorTester()
3552 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3553 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3554 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3555 .TestF16();
3556 }
3557 }
3558}
3559
3560TEST(MULTIPLY_ND_F16, 5d_x_6d) {
3561 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
3562 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3563 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3564 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3565 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3566 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3567 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3568 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3569 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3570 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3571 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3572 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3573 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3574 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3575 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3576 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3577 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3578 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3579 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3580 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3581 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3582 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3583 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3584 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3585 BinaryElementwiseOperatorTester()
3586 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3587 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3588 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3589 .iterations(1)
3590 .TestF16();
3591 }
3592 }
3593}
3594
3595TEST(MULTIPLY_ND_F16, 6d_x_0d) {
3596 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3597 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3598 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3599 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3600 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3601 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3602 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3603 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3604 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3605 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3606 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3607 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3608 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3609 BinaryElementwiseOperatorTester()
3610 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3611 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3612 .TestF16();
3613 }
3614}
3615
3616TEST(MULTIPLY_ND_F16, 6d_x_1d) {
3617 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3618 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3619 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3620 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3621 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3622 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3623 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3624 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3625 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3626 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3627 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3628 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3629 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3630 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3631 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3632 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3633 BinaryElementwiseOperatorTester()
3634 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3635 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3636 .input2_shape({input2_dim1})
3637 .TestF16();
3638 }
3639 }
3640}
3641
3642TEST(MULTIPLY_ND_F16, 6d_x_2d) {
3643 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3644 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3645 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3646 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3647 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3648 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3649 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3650 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3651 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3652 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3653 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3654 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3655 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3656 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3657 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3658 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3659 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3660 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3661 BinaryElementwiseOperatorTester()
3662 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3663 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3664 .input2_shape({input2_dim2, input2_dim1})
3665 .TestF16();
3666 }
3667 }
3668}
3669
3670TEST(MULTIPLY_ND_F16, 6d_x_3d) {
3671 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3672 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3673 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3674 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3675 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3676 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3677 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3678 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3679 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3680 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3681 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3682 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3683 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3684 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3685 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3686 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3687 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3688 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3689 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3690 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3691 BinaryElementwiseOperatorTester()
3692 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3693 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3694 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3695 .TestF16();
3696 }
3697 }
3698}
3699
3700TEST(MULTIPLY_ND_F16, 6d_x_4d) {
3701 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3702 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
3703 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3704 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3705 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3706 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3707 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3708 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3709 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3710 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3711 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3712 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3713 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3714 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3715 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3716 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3717 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3718 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3719 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3720 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3721 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3722 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3723 BinaryElementwiseOperatorTester()
3724 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3725 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3726 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3727 .TestF16();
3728 }
3729 }
3730}
3731
3732TEST(MULTIPLY_ND_F16, 6d_x_5d) {
3733 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3734 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
3735 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3736 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3737 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3738 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3739 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3740 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3741 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3742 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3743 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3744 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3745 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3746 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3747 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3748 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3749 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3750 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3751 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3752 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3753 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3754 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3755 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3756 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3757 BinaryElementwiseOperatorTester()
3758 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3759 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3760 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3761 .iterations(1)
3762 .TestF16();
3763 }
3764 }
3765}
3766
3767TEST(MULTIPLY_ND_F16, 6d_x_6d) {
3768 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
3769 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
3770 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3771 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3772 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3773 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
3774 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
3775 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
3776 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3777 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3778 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3779 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
3780 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
3781 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
3782 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3783 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3784 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3785 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
3786 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
3787 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
3788 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3789 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3790 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3791 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
3792 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
3793 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
3794 BinaryElementwiseOperatorTester()
3795 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3796 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
3797 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
3798 .iterations(1)
3799 .TestF16();
3800 }
3801 }
3802}
3803
Marat Dukhanab4af572019-12-03 11:11:18 -08003804TEST(MULTIPLY_ND_F32, 0d_x_0d) {
Marat Dukhanb1a0fc32019-12-02 19:32:02 -08003805 BinaryElementwiseOperatorTester()
3806 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
Marat Dukhanca2733c2019-11-15 23:21:17 -08003807 .TestF32();
3808}
3809
Marat Dukhanab4af572019-12-03 11:11:18 -08003810TEST(MULTIPLY_ND_F32, 1d_x_0d) {
3811 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3812 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3813 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3814 BinaryElementwiseOperatorTester()
3815 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3816 .input1_shape({input1_dim1})
3817 .TestF32();
3818 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003819}
3820
Marat Dukhanab4af572019-12-03 11:11:18 -08003821TEST(MULTIPLY_ND_F32, 0d_x_1d) {
3822 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3823 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3824 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3825 BinaryElementwiseOperatorTester()
3826 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3827 .input2_shape({input2_dim1})
3828 .TestF32();
3829 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003830}
3831
Marat Dukhanab4af572019-12-03 11:11:18 -08003832TEST(MULTIPLY_ND_F32, 1d_x_1d) {
3833 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3834 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3835 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3836 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3837 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3838 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3839 BinaryElementwiseOperatorTester()
3840 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3841 .input1_shape({input1_dim1})
3842 .input2_shape({input2_dim1})
3843 .TestF32();
3844 }
3845 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003846}
3847
Marat Dukhanab4af572019-12-03 11:11:18 -08003848TEST(MULTIPLY_ND_F32, 0d_x_2d) {
3849 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3850 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3851 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3852 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3853 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3854 BinaryElementwiseOperatorTester()
3855 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3856 .input2_shape({input2_dim2, input2_dim1})
3857 .TestF32();
3858 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003859}
3860
Marat Dukhanab4af572019-12-03 11:11:18 -08003861TEST(MULTIPLY_ND_F32, 1d_x_2d) {
3862 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3863 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3864 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3865 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3866 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3867 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3868 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3869 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3870 BinaryElementwiseOperatorTester()
3871 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3872 .input1_shape({input1_dim1})
3873 .input2_shape({input2_dim2, input2_dim1})
3874 .TestF32();
3875 }
3876 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003877}
3878
Marat Dukhanab4af572019-12-03 11:11:18 -08003879TEST(MULTIPLY_ND_F32, 2d_x_0d) {
3880 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3881 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3882 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3883 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3884 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3885 BinaryElementwiseOperatorTester()
3886 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3887 .input1_shape({input1_dim2, input1_dim1})
3888 .TestF32();
3889 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003890}
3891
Marat Dukhanab4af572019-12-03 11:11:18 -08003892TEST(MULTIPLY_ND_F32, 2d_x_1d) {
3893 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3894 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
3895 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3896 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3897 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3898 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3899 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3900 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3901 BinaryElementwiseOperatorTester()
3902 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3903 .input1_shape({input1_dim2, input1_dim1})
3904 .input2_shape({input2_dim1})
3905 .TestF32();
3906 }
3907 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003908}
3909
Marat Dukhanab4af572019-12-03 11:11:18 -08003910TEST(MULTIPLY_ND_F32, 2d_x_2d) {
3911 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3912 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
3913 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3914 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3915 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3916 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3917 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3918 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3919 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3920 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3921 BinaryElementwiseOperatorTester()
3922 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3923 .input1_shape({input1_dim2, input1_dim1})
3924 .input2_shape({input2_dim2, input2_dim1})
3925 .TestF32();
3926 }
3927 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08003928}
3929
Marat Dukhanab4af572019-12-03 11:11:18 -08003930TEST(MULTIPLY_ND_F32, 0d_x_3d) {
3931 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3932 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3933 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3934 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3935 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3936 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3937 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3938 BinaryElementwiseOperatorTester()
3939 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3940 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3941 .TestF32();
3942 }
3943}
3944
3945TEST(MULTIPLY_ND_F32, 1d_x_3d) {
3946 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
3947 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3948 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3949 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3950 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3951 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3952 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3953 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3954 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3955 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3956 BinaryElementwiseOperatorTester()
3957 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3958 .input1_shape({input1_dim1})
3959 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3960 .TestF32();
3961 }
3962 }
3963}
3964
3965TEST(MULTIPLY_ND_F32, 2d_x_3d) {
3966 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
3967 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
3968 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3969 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3970 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
3971 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
3972 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
3973 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3974 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3975 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
3976 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
3977 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
3978 BinaryElementwiseOperatorTester()
3979 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3980 .input1_shape({input1_dim2, input1_dim1})
3981 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
3982 .TestF32();
3983 }
3984 }
3985}
3986
3987TEST(MULTIPLY_ND_F32, 3d_x_0d) {
3988 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
3989 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
3990 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
3991 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
3992 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
3993 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
3994 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
3995 BinaryElementwiseOperatorTester()
3996 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
3997 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
3998 .TestF32();
3999 }
4000}
4001
4002TEST(MULTIPLY_ND_F32, 3d_x_1d) {
4003 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4004 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4005 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4006 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4007 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4008 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4009 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4010 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4011 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4012 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4013 BinaryElementwiseOperatorTester()
4014 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4015 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4016 .input2_shape({input2_dim1})
4017 .TestF32();
4018 }
4019 }
4020}
4021
4022TEST(MULTIPLY_ND_F32, 3d_x_2d) {
4023 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4024 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4025 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4026 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4027 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4028 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4029 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4030 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4031 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4032 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4033 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4034 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4035 BinaryElementwiseOperatorTester()
4036 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4037 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4038 .input2_shape({input2_dim2, input2_dim1})
4039 .TestF32();
4040 }
4041 }
4042}
4043
4044TEST(MULTIPLY_ND_F32, 3d_x_3d) {
4045 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4046 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4047 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4048 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4049 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4050 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4051 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4052 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4053 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4054 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4055 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4056 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4057 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4058 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4059 BinaryElementwiseOperatorTester()
4060 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4061 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4062 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4063 .TestF32();
4064 }
4065 }
4066}
4067
4068TEST(MULTIPLY_ND_F32, 0d_x_4d) {
4069 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4070 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4071 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4072 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4073 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4074 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4075 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4076 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4077 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4078 BinaryElementwiseOperatorTester()
4079 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4080 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4081 .TestF32();
4082 }
4083}
4084
4085TEST(MULTIPLY_ND_F32, 1d_x_4d) {
4086 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
4087 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4088 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4089 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4090 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4091 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4092 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4093 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4094 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4095 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4096 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4097 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4098 BinaryElementwiseOperatorTester()
4099 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4100 .input1_shape({input1_dim1})
4101 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4102 .TestF32();
4103 }
4104 }
4105}
4106
4107TEST(MULTIPLY_ND_F32, 2d_x_4d) {
4108 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
4109 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4110 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4111 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4112 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4113 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4114 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4115 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4116 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4117 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4118 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4119 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4120 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4121 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4122 BinaryElementwiseOperatorTester()
4123 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4124 .input1_shape({input1_dim2, input1_dim1})
4125 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4126 .TestF32();
4127 }
4128 }
4129}
4130
4131TEST(MULTIPLY_ND_F32, 3d_x_4d) {
4132 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4133 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4134 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4135 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4136 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4137 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4138 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4139 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4140 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4141 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4142 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4143 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4144 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4145 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4146 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4147 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4148 BinaryElementwiseOperatorTester()
4149 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4150 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4151 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4152 .TestF32();
4153 }
4154 }
4155}
4156
4157TEST(MULTIPLY_ND_F32, 4d_x_0d) {
4158 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4159 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4160 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4161 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4162 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4163 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4164 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4165 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4166 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4167 BinaryElementwiseOperatorTester()
4168 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4169 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4170 .TestF32();
4171 }
4172}
4173
4174TEST(MULTIPLY_ND_F32, 4d_x_1d) {
4175 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4176 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4177 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4178 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4179 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4180 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4181 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4182 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4183 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4184 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4185 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4186 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4187 BinaryElementwiseOperatorTester()
4188 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4189 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4190 .input2_shape({input2_dim1})
4191 .TestF32();
4192 }
4193 }
4194}
4195
4196TEST(MULTIPLY_ND_F32, 4d_x_2d) {
4197 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4198 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4199 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4200 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4201 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4202 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4203 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4204 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4205 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4206 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4207 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4208 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4209 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4210 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4211 BinaryElementwiseOperatorTester()
4212 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4213 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4214 .input2_shape({input2_dim2, input2_dim1})
4215 .TestF32();
4216 }
4217 }
4218}
4219
4220TEST(MULTIPLY_ND_F32, 4d_x_3d) {
4221 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4222 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4223 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4224 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4225 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4226 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4227 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4228 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4229 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4230 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4231 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4232 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4233 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4234 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4235 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4236 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4237 BinaryElementwiseOperatorTester()
4238 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4239 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4240 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4241 .TestF32();
4242 }
4243 }
4244}
4245
4246TEST(MULTIPLY_ND_F32, 4d_x_4d) {
4247 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4248 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4249 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4250 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4251 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4252 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4253 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4254 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4255 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4256 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4257 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4258 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4259 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4260 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4261 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4262 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4263 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4264 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4265 BinaryElementwiseOperatorTester()
4266 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4267 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4268 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4269 .TestF32();
4270 }
4271 }
Marat Dukhanca2733c2019-11-15 23:21:17 -08004272}
Marat Dukhanfc2b96e2019-12-03 12:04:04 -08004273
4274TEST(MULTIPLY_ND_F32, 0d_x_5d) {
4275 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4276 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4277 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4278 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4279 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4280 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4281 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4282 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4283 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4284 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4285 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4286 BinaryElementwiseOperatorTester()
4287 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4288 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4289 .TestF32();
4290 }
4291}
4292
4293TEST(MULTIPLY_ND_F32, 1d_x_5d) {
4294 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
4295 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4296 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4297 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4298 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4299 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4300 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4301 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4302 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4303 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4304 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4305 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4306 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4307 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4308 BinaryElementwiseOperatorTester()
4309 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4310 .input1_shape({input1_dim1})
4311 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4312 .TestF32();
4313 }
4314 }
4315}
4316
4317TEST(MULTIPLY_ND_F32, 2d_x_5d) {
4318 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
4319 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4320 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4321 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4322 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4323 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4324 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4325 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4326 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4327 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4328 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4329 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4330 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4331 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4332 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4333 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4334 BinaryElementwiseOperatorTester()
4335 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4336 .input1_shape({input1_dim2, input1_dim1})
4337 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4338 .TestF32();
4339 }
4340 }
4341}
4342
4343TEST(MULTIPLY_ND_F32, 3d_x_5d) {
4344 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4345 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4346 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4347 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4348 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4349 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4350 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4351 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4352 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4353 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4354 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4355 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4356 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4357 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4358 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4359 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4360 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4361 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4362 BinaryElementwiseOperatorTester()
4363 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4364 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4365 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4366 .TestF32();
4367 }
4368 }
4369}
4370
4371TEST(MULTIPLY_ND_F32, 4d_x_5d) {
4372 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4373 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4374 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4375 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4376 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4377 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4378 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4379 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4380 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4381 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4382 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4383 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4384 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4385 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4386 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4387 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4388 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4389 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4390 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4391 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4392 BinaryElementwiseOperatorTester()
4393 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4394 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4395 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4396 .TestF32();
4397 }
4398 }
4399}
4400
4401TEST(MULTIPLY_ND_F32, 5d_x_0d) {
4402 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4403 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4404 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4405 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4406 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4407 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4408 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4409 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4410 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4411 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4412 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4413 BinaryElementwiseOperatorTester()
4414 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4415 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4416 .TestF32();
4417 }
4418}
4419
4420TEST(MULTIPLY_ND_F32, 5d_x_1d) {
4421 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4422 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4423 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4424 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4425 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4426 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4427 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4428 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4429 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4430 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4431 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4432 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4433 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4434 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4435 BinaryElementwiseOperatorTester()
4436 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4437 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4438 .input2_shape({input2_dim1})
4439 .TestF32();
4440 }
4441 }
4442}
4443
4444TEST(MULTIPLY_ND_F32, 5d_x_2d) {
4445 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4446 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4447 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4448 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4449 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4450 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4451 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4452 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4453 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4454 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4455 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4456 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4457 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4458 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4459 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4460 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4461 BinaryElementwiseOperatorTester()
4462 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4463 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4464 .input2_shape({input2_dim2, input2_dim1})
4465 .TestF32();
4466 }
4467 }
4468}
4469
4470TEST(MULTIPLY_ND_F32, 5d_x_3d) {
4471 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4472 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4473 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4474 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4475 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4476 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4477 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4478 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4479 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4480 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4481 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4482 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4483 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4484 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4485 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4486 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4487 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4488 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4489 BinaryElementwiseOperatorTester()
4490 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4491 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4492 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4493 .TestF32();
4494 }
4495 }
4496}
4497
4498TEST(MULTIPLY_ND_F32, 5d_x_4d) {
4499 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4500 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4501 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4502 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4503 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4504 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4505 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4506 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4507 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4508 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4509 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4510 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4511 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4512 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4513 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4514 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4515 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4516 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4517 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4518 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4519 BinaryElementwiseOperatorTester()
4520 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4521 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4522 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4523 .TestF32();
4524 }
4525 }
4526}
4527
4528TEST(MULTIPLY_ND_F32, 5d_x_5d) {
4529 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4530 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4531 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4532 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4533 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4534 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4535 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4536 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4537 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4538 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4539 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4540 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4541 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4542 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4543 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4544 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4545 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4546 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4547 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4548 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4549 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4550 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4551 BinaryElementwiseOperatorTester()
4552 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4553 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4554 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4555 .iterations(1)
4556 .TestF32();
4557 }
4558 }
4559}
4560
4561TEST(MULTIPLY_ND_F32, 0d_x_6d) {
4562 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4563 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4564 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4565 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4566 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4567 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4568 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4569 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4570 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4571 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4572 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4573 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4574 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4575 BinaryElementwiseOperatorTester()
4576 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4577 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4578 .TestF32();
4579 }
4580}
4581
4582TEST(MULTIPLY_ND_F32, 1d_x_6d) {
4583 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
4584 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4585 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4586 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4587 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4588 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4589 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4590 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4591 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4592 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4593 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4594 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4595 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4596 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4597 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4598 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4599 BinaryElementwiseOperatorTester()
4600 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4601 .input1_shape({input1_dim1})
4602 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4603 .TestF32();
4604 }
4605 }
4606}
4607
4608TEST(MULTIPLY_ND_F32, 2d_x_6d) {
4609 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
4610 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4611 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4612 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4613 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4614 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4615 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4616 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4617 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4618 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4619 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4620 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4621 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4622 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4623 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4624 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4625 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4626 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4627 BinaryElementwiseOperatorTester()
4628 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4629 .input1_shape({input1_dim2, input1_dim1})
4630 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4631 .TestF32();
4632 }
4633 }
4634}
4635
4636TEST(MULTIPLY_ND_F32, 3d_x_6d) {
4637 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
4638 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4639 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4640 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4641 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4642 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4643 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4644 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4645 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4646 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4647 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4648 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4649 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4650 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4651 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4652 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4653 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4654 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4655 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4656 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4657 BinaryElementwiseOperatorTester()
4658 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4659 .input1_shape({input1_dim3, input1_dim2, input1_dim1})
4660 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4661 .TestF32();
4662 }
4663 }
4664}
4665
4666TEST(MULTIPLY_ND_F32, 4d_x_6d) {
4667 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
4668 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4669 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4670 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4671 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4672 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4673 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4674 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4675 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4676 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4677 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4678 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4679 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4680 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4681 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4682 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4683 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4684 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4685 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4686 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4687 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4688 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4689 BinaryElementwiseOperatorTester()
4690 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4691 .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4692 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4693 .TestF32();
4694 }
4695 }
4696}
4697
4698TEST(MULTIPLY_ND_F32, 5d_x_6d) {
4699 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
4700 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4701 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4702 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4703 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4704 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4705 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4706 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4707 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4708 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4709 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4710 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4711 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4712 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4713 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4714 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4715 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4716 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4717 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4718 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4719 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4720 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4721 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4722 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4723 BinaryElementwiseOperatorTester()
4724 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4725 .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4726 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4727 .iterations(1)
4728 .TestF32();
4729 }
4730 }
4731}
4732
4733TEST(MULTIPLY_ND_F32, 6d_x_0d) {
4734 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4735 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4736 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4737 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4738 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4739 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4740 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4741 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4742 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4743 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4744 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4745 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4746 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4747 BinaryElementwiseOperatorTester()
4748 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4749 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4750 .TestF32();
4751 }
4752}
4753
4754TEST(MULTIPLY_ND_F32, 6d_x_1d) {
4755 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4756 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
4757 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4758 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4759 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4760 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4761 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4762 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4763 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4764 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4765 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4766 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4767 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4768 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4769 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4770 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4771 BinaryElementwiseOperatorTester()
4772 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4773 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4774 .input2_shape({input2_dim1})
4775 .TestF32();
4776 }
4777 }
4778}
4779
4780TEST(MULTIPLY_ND_F32, 6d_x_2d) {
4781 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4782 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
4783 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4784 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4785 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4786 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4787 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4788 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4789 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4790 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4791 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4792 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4793 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4794 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4795 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4796 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4797 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4798 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4799 BinaryElementwiseOperatorTester()
4800 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4801 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4802 .input2_shape({input2_dim2, input2_dim1})
4803 .TestF32();
4804 }
4805 }
4806}
4807
4808TEST(MULTIPLY_ND_F32, 6d_x_3d) {
4809 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4810 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
4811 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4812 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4813 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4814 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4815 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4816 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4817 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4818 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4819 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4820 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4821 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4822 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4823 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4824 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4825 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4826 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4827 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4828 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4829 BinaryElementwiseOperatorTester()
4830 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4831 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4832 .input2_shape({input2_dim3, input2_dim2, input2_dim1})
4833 .TestF32();
4834 }
4835 }
4836}
4837
4838TEST(MULTIPLY_ND_F32, 6d_x_4d) {
4839 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4840 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
4841 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4842 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4843 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4844 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4845 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4846 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4847 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4848 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4849 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4850 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4851 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4852 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4853 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4854 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4855 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4856 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4857 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4858 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4859 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4860 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4861 BinaryElementwiseOperatorTester()
4862 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4863 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4864 .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4865 .TestF32();
4866 }
4867 }
4868}
4869
4870TEST(MULTIPLY_ND_F32, 6d_x_5d) {
4871 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4872 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
4873 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4874 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4875 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4876 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4877 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4878 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4879 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4880 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4881 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4882 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4883 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4884 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4885 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4886 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4887 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4888 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4889 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4890 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4891 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4892 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4893 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4894 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4895 BinaryElementwiseOperatorTester()
4896 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4897 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4898 .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4899 .iterations(1)
4900 .TestF32();
4901 }
4902 }
4903}
4904
4905TEST(MULTIPLY_ND_F32, 6d_x_6d) {
4906 for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
4907 for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
4908 const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
4909 const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
4910 const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
4911 const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
4912 const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
4913 const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
4914 const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
4915 const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
4916 const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
4917 const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
4918 const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
4919 const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
4920 const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
4921 const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
4922 const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
4923 const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
4924 const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
4925 const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
4926 const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
4927 const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
4928 const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
4929 const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
4930 const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
4931 const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
4932 BinaryElementwiseOperatorTester()
4933 .operation_type(BinaryElementwiseOperatorTester::OperationType::Multiply)
4934 .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
4935 .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
4936 .iterations(1)
4937 .TestF32();
4938 }
4939 }
4940}