blob: e26464f9f7978c15ff243f7f33b641854a14b639 [file] [log] [blame]
SiCong Li7061eb22021-01-08 15:16:02 +00001/*
2 * Copyright (c) 2021 Arm Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "src/runtime/CL/mlgo/MLGOHeuristics.h"
25#include "src/runtime/CL/mlgo/Utils.h"
26#include "tests/framework/Asserts.h"
27#include "tests/framework/Macros.h"
28
29using namespace arm_compute::mlgo;
30
31namespace arm_compute
32{
33namespace test
34{
35namespace validation
36{
37TEST_SUITE(CL)
38TEST_SUITE(UNIT)
39TEST_SUITE(MLGOHeuristics)
40TEST_CASE(CorrectDotMLGOShouldLoadCorrectly, framework::DatasetMode::ALL)
41{
42 std::string mlgo_str = R"_(
SiCong Li70858d82021-02-05 09:19:51 +000043
SiCong Li7061eb22021-01-08 15:16:02 +000044 <header>
SiCong Li70858d82021-02-05 09:19:51 +000045
SiCong Li7061eb22021-01-08 15:16:02 +000046 gemm-version, [1,2,1]
47 ip-type,gpu
48 </header>
49 <heuristics-table>
50 0, g76 , 8, f32, best-performance, static, gemm-type, [m,n,k,n]
SiCong Li70858d82021-02-05 09:19:51 +000051
SiCong Li7061eb22021-01-08 15:16:02 +000052 1, g71 , 8, f16, best-performance, static, gemm-config-reshaped-only-rhs, [m,n,k,n]
53 2, g76 , 8, f16, best-performance, static, gemm-config-reshaped, [m,n,k,n]
54 </heuristics-table>
55 <heuristic, 0>
56 b , 0, var, m, ==, num, 10., 1, 2
57 l , 1, gemm-type, reshaped
58 b , 2, var, r_mn, >=, num, 2., 3, 6
SiCong Li70858d82021-02-05 09:19:51 +000059
SiCong Li7061eb22021-01-08 15:16:02 +000060 b , 3, var, n, >=, num, 200., 4, 5
SiCong Li70858d82021-02-05 09:19:51 +000061 l, 4, gemm-type, reshaped-only-rhs
SiCong Li7061eb22021-01-08 15:16:02 +000062 l , 5, gemm-type, reshaped
63 l , 6, gemm-type, reshaped-only-rhs
64 </heuristic>
65 <heuristic, 1>
66 b ,0,var, n, >, num, 100., 1, 4
67 b ,1,var, r_mnk, <=, num, 20., 2, 3
SiCong Li70858d82021-02-05 09:19:51 +000068
69
SiCong Li7061eb22021-01-08 15:16:02 +000070 l ,2,gemm-config-reshaped-only-rhs, [4, 4,4,2,1,0,1]
71 l ,3,gemm-config-reshaped-only-rhs,[ 2, 2,4,2,1,1, 1 ]
72 b ,4,var, n, >=, num, 199.12, 5, 6
73 l ,5,gemm-config-reshaped-only-rhs, [1, 4,3,4,0,0,0]
74 l ,6,gemm-config-reshaped-only-rhs, [5, 4,4,5,1,1,0]
75 </heuristic>
SiCong Li70858d82021-02-05 09:19:51 +000076
SiCong Li7061eb22021-01-08 15:16:02 +000077 <heuristic, 2>
78 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
SiCong Li70858d82021-02-05 09:19:51 +000079
SiCong Li7061eb22021-01-08 15:16:02 +000080 </heuristic>
SiCong Li70858d82021-02-05 09:19:51 +000081
SiCong Li7061eb22021-01-08 15:16:02 +000082 )_";
83 std::stringstream ss(mlgo_str);
84 MLGOHeuristics heuristics;
85 heuristics.reload_from_stream(ss);
86
87 ARM_COMPUTE_EXPECT(heuristics.query_gemm_type(Query{ "g76", DataType::F32, 10, 1024, 20, 1 }).second == GEMMType::RESHAPED, framework::LogLevel::ERRORS);
88 ARM_COMPUTE_EXPECT(heuristics.query_gemm_type(Query{ "g76", DataType::F32, 400, 201, 5, 1 }).second == GEMMType::RESHAPED_ONLY_RHS, framework::LogLevel::ERRORS);
89 ARM_COMPUTE_EXPECT(heuristics.query_gemm_type(Query{ "g76", DataType::F32, 400, 200, 199, 16 }).second == GEMMType::RESHAPED_ONLY_RHS, framework::LogLevel::ERRORS);
90 ARM_COMPUTE_EXPECT(heuristics.query_gemm_type(Query{ "g76", DataType::F32, 400, 199, 512, 4 }).second == GEMMType::RESHAPED, framework::LogLevel::ERRORS);
91
92 ARM_COMPUTE_EXPECT((heuristics.query_gemm_config_reshaped_only_rhs(Query{ "g71", DataType::F16, 100, 1024, 20, 32 }).second == GEMMConfigReshapedOnlyRHS{ 4, 4, 4, 2, true, false, true }),
93 framework::LogLevel::ERRORS);
94 ARM_COMPUTE_EXPECT((heuristics.query_gemm_config_reshaped_only_rhs(Query{ "g71", DataType::F16, 100, 1024, 20, 32 }).second == GEMMConfigReshapedOnlyRHS{ 4, 4, 4, 2, true, false, true }),
95 framework::LogLevel::ERRORS);
96 ARM_COMPUTE_EXPECT((heuristics.query_gemm_config_reshaped_only_rhs(Query{ "g71", DataType::F16, 128, 101, 20, 1 }).second == GEMMConfigReshapedOnlyRHS{ 2, 2, 4, 2, true, true, true }),
97 framework::LogLevel::ERRORS);
98 ARM_COMPUTE_EXPECT((heuristics.query_gemm_config_reshaped_only_rhs(Query{ "g71", DataType::F16, 400, 100, 512, 1 }).second == GEMMConfigReshapedOnlyRHS{ 5, 4, 4, 5, true, true, false }),
99 framework::LogLevel::ERRORS);
100 ARM_COMPUTE_EXPECT((heuristics.query_gemm_config_reshaped_only_rhs(Query{ "g71", DataType::F16, 400, 100, 512, 1 }).second == GEMMConfigReshapedOnlyRHS{ 5, 4, 4, 5, true, true, false }),
101 framework::LogLevel::ERRORS);
102
103 ARM_COMPUTE_EXPECT((heuristics.query_gemm_config_reshaped(Query{ "g76", DataType::F16, 100, 100, 20, 32 }).second == GEMMConfigReshaped{ 4, 2, 4, 2, 8, true, false, true, false }),
104 framework::LogLevel::ERRORS);
105 ARM_COMPUTE_EXPECT((heuristics.query_gemm_config_reshaped(Query{ "g76", DataType::F16, 128, 512, 1024, 1 }).second == GEMMConfigReshaped{ 4, 2, 4, 2, 8, true, false, true, false }),
106 framework::LogLevel::ERRORS);
107}
108
109TEST_CASE(InvalidDotmlgoSyntaxShouldReturnInvalidStatus, framework::DatasetMode::ALL)
110{
111 std::string mlgo_str = R"_(
112 <header>
113 gemm-version, [1,2,1]
114 ip-type,pu
115 </header>
116 <heuristics-table>
117 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
SiCong Li70858d82021-02-05 09:19:51 +0000118
SiCong Li7061eb22021-01-08 15:16:02 +0000119 </heurist
120 <heuristic, 0>
121 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
122 </heuristic>
123 )_";
124 std::stringstream ss(mlgo_str);
125 MLGOHeuristics heuristics;
126 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
127}
128
129TEST_SUITE(InvalidDotmlgoSemanticsShouldReturnInvalidStatus)
130// If the semantics errors are local to some trees instead of the entire heuristics, an alternative is to simply
131// ignore/remove those invalid trees. However the reason why we choose to throw, thus invalidating the entire
132// heuristics is that if there are some invalid trees, the quality of the dotmlgo is called into question even if
133// the rest of the trees are semantically valid, and they could severely degrade the performance of GEMM. Therefore
134// this "all or nothing" approach when it comes to dotmlgo correctness is safer and more defensive.
135
136// Also note that the semantic error of the tree only refers to those that obstruct its evaluation and thus query,
137// (e.g. invalid tree structure, unsupported features etc.) instead of those affecting the desired outcome
138// (usually in terms of final GEMM performance, e.g. the effectiveness of the decision tree)
139
140// In the future we might want to check the content of the exceptions as well. But right now it suffices to only
141// know that it throws exactly when it needs to.
142TEST_CASE(MismatchesBetweenHeuristicsTableEntriesAndHeuristicTrees, framework::DatasetMode::ALL)
143{
144 {
145 // Mismatching number of entries 1
146 std::string mlgo_str = R"_(
147 <header>
148 gemm-version, [1,2,1]
149 ip-type,gpu
150 </header>
151 <heuristics-table>
SiCong Li70858d82021-02-05 09:19:51 +0000152
SiCong Li7061eb22021-01-08 15:16:02 +0000153 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
SiCong Li70858d82021-02-05 09:19:51 +0000154
SiCong Li7061eb22021-01-08 15:16:02 +0000155 </heuristics-table>
156 )_";
157 std::stringstream ss(mlgo_str);
158 MLGOHeuristics heuristics;
159 // NOTE: This case might throw an internal error as the tree inserted by the heuristics-table cannot not be checked
160 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
161 }
162
163 {
164 // Mismatching number of entries 2
165 std::string mlgo_str = R"_(
166 <header>
167 gemm-version, [1,2,1]
168 ip-type,gpu
169 </header>
170 <heuristics-table>
171 </heuristics-table>
172 <heuristic, 1>
173 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
174 </heuristic>
175 )_";
176 std::stringstream ss(mlgo_str);
177 MLGOHeuristics heuristics;
178 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
179 }
180
181 {
182 // Mismatching info
183 std::string mlgo_str = R"_(
184 <header>
185 gemm-version, [1,2,1]
186 ip-type,gpu
187 </header>
188 <heuristics-table>
189 0, g76 , 8, f32, best-performance, static, gemm-type, [m,n,k,n]
190 </heuristics-table>
191 <heuristic, 0>
192 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
193 </heuristic>
194 )_";
195 std::stringstream ss(mlgo_str);
196 MLGOHeuristics heuristics;
197 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
198 }
199}
200
201TEST_CASE(RepeatedHeuristicsTableEntriesId, framework::DatasetMode::ALL)
202{
203 std::string mlgo_str = R"_(
204 <header>
205 gemm-version, [1,2,1]
206 ip-type,gpu
207 </header>
208 <heuristics-table>
209 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
210 0, g71 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
211 </heuristics-table>
212 <heuristic, 0>
213 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
214 </heuristic>
215 <heuristic, 1>
216 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
217 </heuristic>
218 )_";
219 std::stringstream ss(mlgo_str);
220 MLGOHeuristics heuristics;
221 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
222}
223
224TEST_CASE(RepeatedHeuristicsTableEntriesIndex, framework::DatasetMode::ALL)
225{
226 std::string mlgo_str = R"_(
227 <header>
228 gemm-version, [1,2,1]
229 ip-type,gpu
230 </header>
231 <heuristics-table>
232 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
233 1, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
234 </heuristics-table>
235 <heuristic, 0>
236 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
237 </heuristic>
238 <heuristic, 1>
239 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
240 </heuristic>
241 )_";
242 std::stringstream ss(mlgo_str);
243 MLGOHeuristics heuristics;
244 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
245}
246
247TEST_CASE(RepeatedHeuristicTreesId, framework::DatasetMode::ALL)
248{
249 std::string mlgo_str = R"_(
250 <header>
251 gemm-version, [1,2,1]
252 ip-type,gpu
253 </header>
254 <heuristics-table>
255 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
256 1, g71 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
257 </heuristics-table>
258 <heuristic, 0>
259 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
260 </heuristic>
261 <heuristic, 0>
262 l ,0,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
263 </heuristic>
264 )_";
265 std::stringstream ss(mlgo_str);
266 MLGOHeuristics heuristics;
267 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
268}
269TEST_CASE(EmptyTree, framework::DatasetMode::ALL)
270{
271 std::string mlgo_str = R"_(
272 <header>
273 gemm-version, [1,2,1]
274 ip-type,gpu
275 </header>
276 <heuristics-table>
277 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
278 </heuristics-table>
279 <heuristic, 0>
280 </heuristic>
281 )_";
282 std::stringstream ss(mlgo_str);
283 MLGOHeuristics heuristics;
284 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
285}
286
287TEST_CASE(InvalidTreeMissingRoot, framework::DatasetMode::ALL)
288{
289 std::string mlgo_str = R"_(
290 <header>
291 gemm-version, [1,2,1]
292 ip-type,gpu
293 </header>
294 <heuristics-table>
295 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
296 </heuristics-table>
297 <heuristic, 0>
298 b ,2, var, m, ==, num, 10., 3, 4
299 l ,3,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
300 l ,4,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
301 </heuristic>
302 )_";
303 std::stringstream ss(mlgo_str);
304 MLGOHeuristics heuristics;
305 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
306}
307TEST_CASE(InvalidTreeMissingNodes, framework::DatasetMode::ALL)
308{
309 std::string mlgo_str = R"_(
310 <header>
311 gemm-version, [1,2,1]
312 ip-type,gpu
313 </header>
314 <heuristics-table>
315 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
316 </heuristics-table>
317 <heuristic, 0>
318 b ,0, var, m, ==, num, 10., 1, 2
319 l ,1,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
320 </heuristic>
321 )_";
322 std::stringstream ss(mlgo_str);
323 MLGOHeuristics heuristics;
324 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
325}
326TEST_CASE(InvalidTreeRepeatedNodeIds, framework::DatasetMode::ALL)
327{
328 std::string mlgo_str = R"_(
329 <header>
330 gemm-version, [1,2,1]
331 ip-type,gpu
332 </header>
333 <heuristics-table>
334 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
335 </heuristics-table>
336 <heuristic, 0>
337 b ,0, var, m, ==, num, 10., 1, 2
338 l ,1,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
339 l ,1,gemm-config-reshaped,[1,2,4,2,8,1,0,1,0]
340 l ,2,gemm-config-reshaped,[2,2,4,2,8,1,0,1,0]
341 </heuristic>
342 )_";
343 std::stringstream ss(mlgo_str);
344 MLGOHeuristics heuristics;
345 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
346}
347TEST_CASE(InvalidTreeDisjointNodes, framework::DatasetMode::ALL)
348{
349 std::string mlgo_str = R"_(
350 <header>
351 gemm-version, [1,2,1]
352 ip-type,gpu
353 </header>
354 <heuristics-table>
355 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
356 </heuristics-table>
357 <heuristic, 0>
358 b ,0, var, m, ==, num, 10., 1, 2
359 l ,1,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
360 l ,2,gemm-config-reshaped,[2,2,4,2,8,1,0,1,0]
361
362 b ,4, var, n, ==, num, 10., 5, 6
363 l ,5,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
364 l ,6,gemm-config-reshaped,[2,2,4,2,8,1,0,1,0]
365
366 l ,7,gemm-config-reshaped,[2,2,4,2,8,1,0,1,0]
367 </heuristic>
368 )_";
369 std::stringstream ss(mlgo_str);
370 MLGOHeuristics heuristics;
371 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
372}
373TEST_CASE(InvalidTreeLoop, framework::DatasetMode::ALL)
374{
375 std::string mlgo_str = R"_(
376 <header>
377 gemm-version, [1,2,1]
378 ip-type,gpu
379 </header>
380 <heuristics-table>
381 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
382 </heuristics-table>
383 <heuristic, 0>
384 b ,0, var, m, ==, num, 10., 0, 1
385 l ,1,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
386 </heuristic>
387 )_";
388 std::stringstream ss(mlgo_str);
389 MLGOHeuristics heuristics;
390 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
391}
392TEST_CASE(InvalidTreeCycle, framework::DatasetMode::ALL)
393{
394 std::string mlgo_str = R"_(
395 <header>
396 gemm-version, [1,2,1]
397 ip-type,gpu
398 </header>
399 <heuristics-table>
400 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
401 </heuristics-table>
402 <heuristic, 0>
403 b ,0, var, m, ==, num, 10., 1, 5
404 b ,1, var, n, ==, num, 10., 2, 3
405 l ,2,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
406 b ,3, var, k, ==, num, 10., 0, 4
407 l ,4,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
408 l ,5,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
409 </heuristic>
410 )_";
411 std::stringstream ss(mlgo_str);
412 MLGOHeuristics heuristics;
413 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
414}
415TEST_CASE(InvalidTreeInvalidFeatures, framework::DatasetMode::ALL)
416{
417 std::string mlgo_str = R"_(
418 <header>
419 gemm-version, [1,2,1]
420 ip-type,gpu
421 </header>
422 <heuristics-table>
423 0, g76 , 8, f32, best-performance, static, gemm-config-reshaped, [m,n,k,n]
424 </heuristics-table>
425 <heuristic, 0>
426 b ,0, var, magic_feature, ==, num, 10., 1, 2
427 l ,1,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
428 l ,2,gemm-config-reshaped,[4,2,4,2,8,1,0,1,0]
429 </heuristic>
430 )_";
431 std::stringstream ss(mlgo_str);
432 MLGOHeuristics heuristics;
433 ARM_COMPUTE_EXPECT(!heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
434}
435TEST_SUITE_END() // InvalidDotmlgoSemanticsShouldReturnInvalidStatus
436
437TEST_CASE(InvalidUsageOfHeuristicsShouldReturnInvalidStatus, framework::DatasetMode::ALL)
438{
439 std::string mlgo_str = R"_(
440 <header>
441 gemm-version, [1,2,1]
442 ip-type,gpu
443 </header>
444 <heuristics-table>
445 0, g76 , 8, f32, best-performance, static, gemm-type, [m,n,k,n]
446 </heuristics-table>
447 <heuristic, 0>
448 b , 0, var, m, ==, num, 10., 1, 2
449 l , 1, gemm-type, reshaped
450 b , 2, var, r_mn, >=, num, 2., 3, 6
451 b , 3, var, n, >=, num, 200., 4, 5
452 l , 4, gemm-type, reshaped-only-rhs
453 l , 5, gemm-type, reshaped
454 l , 6, gemm-type, reshaped-only-rhs
455 </heuristic>
456 )_";
457 std::stringstream ss(mlgo_str);
458 MLGOHeuristics heuristics;
459 ARM_COMPUTE_EXPECT(heuristics.reload_from_stream(ss), framework::LogLevel::ERRORS);
460
461 // Querying unavailable heuristic type should return invalid Status
462 ARM_COMPUTE_EXPECT(!heuristics.query_gemm_config_reshaped(Query{ "g76", DataType::F32, 1024, 1024, 100, 3 }).first, framework::LogLevel::ERRORS);
463 // Querying unavailable ip target should return invalid Status
464 ARM_COMPUTE_EXPECT(!heuristics.query_gemm_type(Query{ "g77", DataType::F32, 1024, 1024, 100, 3 }).first, framework::LogLevel::ERRORS);
465 // Querying unavailable data type should return invalid Status
466 ARM_COMPUTE_EXPECT(!heuristics.query_gemm_config_reshaped_only_rhs(Query{ "g76", DataType::QASYMM8, 1024, 1024, 100, 3 }).first, framework::LogLevel::ERRORS);
467}
468TEST_SUITE_END() // MLGOHeuristics
469TEST_SUITE_END() // UNIT
470TEST_SUITE_END() // CL
471} // namespace validation
472} // namespace test
473} // namespace arm_compute