blob: 1d7b9c5b7352c3f610efd5596447da7ce89ac8d6 [file] [log] [blame]
Michalis Spyrou71ac9032019-11-14 14:31:44 +00001/*
Francesco.Petrogalli@arm.com193cad32022-03-07 13:39:21 +00002 * Copyright (c) 2019-2020, 2022 Arm Limited.
Michalis Spyrou71ac9032019-11-14 14:31:44 +00003 *
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#ifdef __aarch64__
25
26#include "arm_gemm.hpp"
27
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000028#include "kernels/a64_gemm_s16_8x12.hpp"
29#include "kernels/a64_gemm_s8_4x4.hpp"
30#include "kernels/a64_gemm_s8_8x12.hpp"
31#include "kernels/a64_hybrid_s8qa_dot_4x16.hpp"
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010032#include "kernels/a64_hybrid_s8qa_mmla_4x16.hpp"
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000033#include "kernels/a64_hybrid_s8qs_dot_6x16.hpp"
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010034#include "kernels/a64_hybrid_s8qs_mmla_6x16.hpp"
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000035#include "kernels/a64_hybrid_s8s32_dot_6x16.hpp"
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010036#include "kernels/a64_hybrid_s8s32_mmla_6x16.hpp"
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000037#include "kernels/a64_interleaved_s8s32_mmla_8x12.hpp"
38#include "kernels/a64_smallK_hybrid_s8s32_dot_6x4.hpp"
39#include "kernels/a64_smallK_hybrid_s8s32_dot_8x4.hpp"
Michalis Spyrou71ac9032019-11-14 14:31:44 +000040
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000041#include "kernels/sve_hybrid_s8qa_dot_4x4VL.hpp"
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010042#include "kernels/sve_hybrid_s8qa_mmla_4x4VL.hpp"
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000043#include "kernels/sve_hybrid_s8qs_dot_6x4VL.hpp"
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010044#include "kernels/sve_hybrid_s8qs_mmla_6x4VL.hpp"
45#include "kernels/sve_hybrid_s8s32_dot_6x4VL.hpp"
46#include "kernels/sve_hybrid_s8s32_mmla_6x4VL.hpp"
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000047#include "kernels/sve_interleaved_s8s32_dot_8x3VL.hpp"
48#include "kernels/sve_interleaved_s8s32_mmla_8x3VL.hpp"
49#include "kernels/sve_smallK_hybrid_s8s32_dot_8x1VL.hpp"
50
51#include "gemm_hybrid_indirect.hpp"
Michalis Spyrou71ac9032019-11-14 14:31:44 +000052#include "gemm_hybrid_quantized.hpp"
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000053#include "gemm_hybrid_quantized_inline.hpp"
54#include "gemm_interleaved.hpp"
Michalis Spyrou71ac9032019-11-14 14:31:44 +000055#include "quantize_wrapper.hpp"
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000056#include "utils.hpp"
Michalis Spyrou71ac9032019-11-14 14:31:44 +000057
58namespace arm_gemm {
59
60static const GemmImplementation<int8_t, int8_t, Requantize32> gemm_qint8_methods[] =
61{
Michalis Spyrou20fca522021-06-07 14:23:57 +010062#ifdef ARM_COMPUTE_ENABLE_SVE
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010063GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
64 GemmMethod::GEMM_HYBRID,
65 "sve_hybrid_s8qa_mmla_4x4VL",
66 [](const GemmArgs &args, const Requantize32 &qp) { return quant_hybrid_asymmetric(qp) && args._ci->has_sve2() && args._ci->has_svei8mm(); },
67 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_sve_hybrid_s8qa_mmla_4x4VL, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
68 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_sve_hybrid_s8qa_mmla_4x4VL, int8_t, int8_t, Requantize32>(args, qp); }
69),
70GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
71 GemmMethod::GEMM_HYBRID,
72 "sve_hybrid_s8qs_mmla_6x4VL",
73 [](const GemmArgs &args, const Requantize32 &qp) { return quant_hybrid_symmetric(qp) && args._ci->has_sve2() && args._ci->has_svei8mm(); },
74 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_sve_hybrid_s8qs_mmla_6x4VL, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
75 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_sve_hybrid_s8qs_mmla_6x4VL, int8_t, int8_t, Requantize32>(args, qp); }
76),
77GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000078 GemmMethod::GEMM_INTERLEAVED,
79 "sve_interleaved_s8s32_mmla_8x3VL",
Michalis Spyrou20fca522021-06-07 14:23:57 +010080 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_svei8mm() && (args._Ksize>8); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010081 [](const GemmArgs &args, const Requantize32 &) { return GemmInterleavedQuantized<cls_sve_interleaved_s8s32_mmla_8x3VL, int8_t, int8_t>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000082 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmInterleavedQuantized<cls_sve_interleaved_s8s32_mmla_8x3VL, int8_t, int8_t>(args, qp); }
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010083),
84GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
85 GemmMethod::GEMM_INTERLEAVED,
86 "sve_hybrid_s8s32_mmla_6x4VL",
87 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_svei8mm(); },
88 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_sve_hybrid_s8s32_mmla_6x4VL, int8_t, int8_t, Requantize32, true>::estimate_cycles<int8_t>(args); },
89 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_sve_hybrid_s8s32_mmla_6x4VL, int8_t, int8_t, Requantize32, true>(args, qp); }
90),
Michalis Spyrou71ac9032019-11-14 14:31:44 +000091{
92 GemmMethod::GEMM_HYBRID_QUANTIZED,
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000093 "sve_smallK_hybrid_s8s32_dot_8x1VL",
Pablo Marquez Telloa50f1932021-03-08 17:27:05 +000094 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_sve() && args._Ksize<=64 && !args._indirect_input; },
Gunes Bayire42a87f2021-09-13 13:24:38 +010095 [](const GemmArgs &args, const Requantize32 &) { return !(args._ci->has_svei8mm() || args._ci->has_i8mm()); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000096 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridQuantized<cls_sve_smallK_hybrid_s8s32_dot_8x1VL, int8_t, int8_t>(args, qp); }
97},
Georgios Pinitas4ee8b152021-07-16 16:16:43 +010098GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +000099 GemmMethod::GEMM_HYBRID,
100 "sve_hybrid_s8qs_dot_6x4VL",
Michalis Spyrou20fca522021-06-07 14:23:57 +0100101 [](const GemmArgs &args, const Requantize32 &qp) { return args._ci->has_sve2() && quant_hybrid_symmetric(qp); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100102 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_sve_hybrid_s8qs_dot_6x4VL, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000103 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_sve_hybrid_s8qs_dot_6x4VL, int8_t, int8_t, Requantize32>(args, qp); }
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100104),
105GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000106 GemmMethod::GEMM_HYBRID,
107 "sve_hybrid_s8qa_dot_4x4VL",
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100108 [](const GemmArgs &args, const Requantize32 &qp) { return args._ci->has_sve2() && quant_hybrid_asymmetric(qp); },
109 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_sve_hybrid_s8qa_dot_4x4VL, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000110 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_sve_hybrid_s8qa_dot_4x4VL, int8_t, int8_t, Requantize32>(args, qp); }
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100111),
112GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000113 GemmMethod::GEMM_HYBRID,
114 "sve_hybrid_s8s32_dot_6x4VL",
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100115 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_sve(); },
116 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_sve_hybrid_s8s32_dot_6x4VL, int8_t, int8_t, Requantize32, true>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000117 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_sve_hybrid_s8s32_dot_6x4VL, int8_t, int8_t, Requantize32, true>(args, qp); }
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100118),
119GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000120 GemmMethod::GEMM_INTERLEAVED,
121 "sve_interleaved_s8s32_dot_8x3VL",
Pablo Marquez Telloa50f1932021-03-08 17:27:05 +0000122 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_sve() && (args._Ksize>4); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100123 [](const GemmArgs &args, const Requantize32 &) { return GemmInterleavedQuantized<cls_sve_interleaved_s8s32_dot_8x3VL, int8_t, int8_t>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000124 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmInterleavedQuantized<cls_sve_interleaved_s8s32_dot_8x3VL, int8_t, int8_t>(args, qp); }
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100125),
126#endif // ARM_COMPUTE_ENABLE_SVE
127GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
128 GemmMethod::GEMM_HYBRID,
129 "a64_hybrid_s8qa_mmla_4x16",
130 [](const GemmArgs &args, const Requantize32 &qp) { return args._ci->has_i8mm() && quant_hybrid_asymmetric(qp); },
131 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_a64_hybrid_s8qa_mmla_4x16, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
132 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_a64_hybrid_s8qa_mmla_4x16, int8_t, int8_t, Requantize32>(args, qp); }
133),
134GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
135 GemmMethod::GEMM_HYBRID,
136 "a64_hybrid_s8qs_mmla_6x16",
137 [](const GemmArgs &args, const Requantize32 &qp) { return args._ci->has_i8mm() && quant_hybrid_symmetric(qp); },
138 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_a64_hybrid_s8qs_mmla_6x16, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
139 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_a64_hybrid_s8qs_mmla_6x16, int8_t, int8_t, Requantize32>(args, qp); }
140),
141GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000142 GemmMethod::GEMM_INTERLEAVED,
143 "a64_interleaved_s8s32_mmla_8x12",
Michalis Spyrou20fca522021-06-07 14:23:57 +0100144 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_i8mm() && (args._Ksize>8); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100145 [](const GemmArgs &args, const Requantize32 &) { return GemmInterleavedQuantized<cls_a64_interleaved_s8s32_mmla_8x12, int8_t, int8_t>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000146 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmInterleavedQuantized<cls_a64_interleaved_s8s32_mmla_8x12, int8_t, int8_t>(args, qp); }
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100147),
148GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
149 GemmMethod::GEMM_INTERLEAVED,
150 "a64_hybrid_s8s32_mmla_6x16",
151 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_i8mm(); },
152 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_a64_hybrid_s8s32_mmla_6x16, int8_t, int8_t, Requantize32, true>::estimate_cycles<int8_t>(args); },
153 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_a64_hybrid_s8s32_mmla_6x16, int8_t, int8_t, Requantize32, true>(args, qp); }
154),
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000155{
156 GemmMethod::GEMM_HYBRID_QUANTIZED,
157 "a64_smallK_hybrid_s8s32_dot_8x4",
158 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_dotprod() && (args._Nsize % 4 == 0) && (args._Ksize<=32) && !args._indirect_input; },
Gunes Bayire42a87f2021-09-13 13:24:38 +0100159 [](const GemmArgs &args, const Requantize32 &) { return !(args._ci->has_svei8mm() || args._ci->has_i8mm()); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000160 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridQuantized<cls_a64_smallK_hybrid_s8s32_dot_8x4, int8_t, int8_t>(args, qp); }
Michalis Spyrou71ac9032019-11-14 14:31:44 +0000161},
162{
163 GemmMethod::GEMM_HYBRID_QUANTIZED,
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000164 "a64_smallK_hybrid_s8s32_dot_6x4",
165 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_dotprod() && (args._Nsize % 4 == 0) && (args._Ksize>32) && (args._Ksize<=64) && !args._indirect_input; },
Gunes Bayire42a87f2021-09-13 13:24:38 +0100166 [](const GemmArgs &args, const Requantize32 &) { return !(args._ci->has_svei8mm() || args._ci->has_i8mm()); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000167 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridQuantized<cls_a64_smallK_hybrid_s8s32_dot_6x4, int8_t, int8_t>(args, qp); }
Michalis Spyrou71ac9032019-11-14 14:31:44 +0000168},
169{
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000170 GemmMethod::GEMM_INTERLEAVED,
171 "a64_gemm_s16_8x12",
Aleksandr Nikolaeva084b462020-06-25 12:25:52 +0100172 nullptr,
Georgios Pinitascd22cbf2020-12-02 16:06:01 +0000173 [](const GemmArgs &args, const Requantize32 &) { return args._ci->get_cpu_model() == CPUModel::A53 && ((args._Msize > 28) || ((args._Msize % 8) > 4)); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000174 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmInterleavedQuantized<cls_a64_gemm_s16_8x12, int8_t, int8_t>(args, qp); }
175},
Georgios Pinitas33e03072021-01-14 13:43:40 +0000176GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000177 GemmMethod::GEMM_HYBRID,
178 "a64_hybrid_s8qs_dot_6x16",
179 [](const GemmArgs &args, const Requantize32 &qp) { return args._ci->has_dotprod() && quant_hybrid_symmetric(qp); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100180 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_a64_hybrid_s8qs_dot_6x16, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000181 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_a64_hybrid_s8qs_dot_6x16, int8_t, int8_t, Requantize32>(args, qp); }
Georgios Pinitas33e03072021-01-14 13:43:40 +0000182),
183GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000184 GemmMethod::GEMM_HYBRID,
185 "a64_hybrid_s8qa_dot_4x16",
186 [](const GemmArgs &args, const Requantize32 &qp) { return args._ci->has_dotprod() && quant_hybrid_asymmetric(qp); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100187 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_a64_hybrid_s8qa_dot_4x16, int8_t, int8_t, Requantize32>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000188 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_a64_hybrid_s8qa_dot_4x16, int8_t, int8_t, Requantize32>(args, qp); }
Georgios Pinitas33e03072021-01-14 13:43:40 +0000189),
190GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000191 GemmMethod::GEMM_HYBRID,
192 "a64_hybrid_s8s32_dot_6x16",
193 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_dotprod(); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100194 [](const GemmArgs &args, const Requantize32 &) { return GemmHybridIndirect<cls_a64_hybrid_s8s32_dot_6x16, int8_t, int8_t, Requantize32, true>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000195 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmHybridIndirect<cls_a64_hybrid_s8s32_dot_6x16, int8_t, int8_t, Requantize32, true>(args, qp); }
Georgios Pinitas33e03072021-01-14 13:43:40 +0000196),
197GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000198 GemmMethod::GEMM_INTERLEAVED,
199 "a64_gemm_s8_8x12",
200 [](const GemmArgs &args, const Requantize32 &) { return args._ci->has_dotprod(); },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100201 [](const GemmArgs &args, const Requantize32 &) { return GemmInterleavedQuantized<cls_a64_gemm_s8_8x12, int8_t, int8_t>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000202 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmInterleavedQuantized<cls_a64_gemm_s8_8x12, int8_t, int8_t>(args, qp); }
Georgios Pinitas33e03072021-01-14 13:43:40 +0000203),
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100204GemmImplementation<int8_t, int8_t, Requantize32>::with_estimate(
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000205 GemmMethod::GEMM_INTERLEAVED,
206 "a64_gemm_s8_4x4",
207 nullptr,
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100208 [](const GemmArgs &args, const Requantize32 &) { return GemmInterleavedQuantized<cls_a64_gemm_s8_4x4, int8_t, int8_t>::estimate_cycles<int8_t>(args); },
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000209 [](const GemmArgs &args, const Requantize32 &qp) { return new GemmInterleavedQuantized<cls_a64_gemm_s8_4x4, int8_t, int8_t>(args, qp); }
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100210),
Michalis Spyrou71ac9032019-11-14 14:31:44 +0000211{
212 GemmMethod::QUANTIZE_WRAPPER,
213 "quantized_wrapper",
Georgios Pinitasc0b6f762020-11-02 01:37:17 +0000214 [](const GemmArgs &args, const Requantize32 &) { return !args._indirect_input; },
Georgios Pinitas4ee8b152021-07-16 16:16:43 +0100215 [](const GemmArgs &, const Requantize32 &) { return false; },
Michalis Spyrou71ac9032019-11-14 14:31:44 +0000216 [](const GemmArgs &args, const Requantize32 &qp) { return new QuantizeWrapper<int8_t, int8_t, int32_t>(args, qp); }
217},
218{
219 GemmMethod::DEFAULT,
220 "",
221 nullptr,
222 nullptr,
223 nullptr
224}
225};
226
227template<>
228const GemmImplementation<int8_t, int8_t, Requantize32> *gemm_implementation_list<int8_t, int8_t, Requantize32>() {
229 return gemm_qint8_methods;
230}
231
232template UniqueGemmCommon<int8_t, int8_t> gemm<int8_t, int8_t, Requantize32>(const GemmArgs &args, const Requantize32 &os);
Francesco Petrogalli553f6952022-06-30 10:22:01 +0000233template bool has_opt_gemm<int8_t, int8_t, Requantize32>(WeightFormat &weight_format, const GemmArgs &args, const Requantize32 &os);
Michalis Spyrou71ac9032019-11-14 14:31:44 +0000234template std::vector<KernelDescription> get_compatible_kernels<int8_t, int8_t, Requantize32>(const GemmArgs &args, const Requantize32 &os);
235
236} // namespace arm_gemm
237
238#endif // __aarch64__