char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
d222767c7
char/aliceai-t5-moe
1// SPDX-FileCopyrightText: Copyright 2025-2026 Arm Limited and/or its affiliates <open-source-office@arm.com> 2// SPDX-License-Identifier: MIT 3// 4 5// KleidiAI micro-kernels 6#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p_qsi4c32p_interface.h" 7#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp_qsi8cxp_interface.h" 8#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod.h" 9#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod.h" 10#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod.h" 11#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm.h" 12#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot.h" 13#include "kai/ukernels/matmul/matmul_clamp_fp32_bf16p_bf16p/kai_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa.h" 14#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa.h" 15#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot.h" 16#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa.h" 17#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot.h" 18#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod.h" 19#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod.h" 20#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod.h" 21#include "kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm.h" 22#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm.h" 23#include "kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod.h" 24#include "kai/ukernels/matmul/matmul_clamp_f32_f16p_qsi4c32p/kai_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa.h" 25#include "kai/ukernels/matmul/matmul_clamp_f32_f32p_f32p/kai_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa.h" 26#include "kai/ukernels/matmul/matmul_clamp_f32_f32_f32p/kai_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla.h" 27#include "kai/ukernels/matmul/matmul_clamp_f32_f32p_f32p/kai_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa.h" 28 29#include "kai/ukernels/matmul/pack/kai_lhs_pack_bf16p2vlx2_f32_sme.h" 30#include "kai/ukernels/matmul/pack/kai_lhs_pack_f32p2vlx1_f32_sme.h" 31#include "kai/ukernels/matmul/pack/kai_lhs_quant_pack_qsi8d32p_f32.h" 32#include "kai/ukernels/matmul/pack/kai_lhs_quant_pack_qsi8d32p4x8sb_f32_neon.h" 33#include "kai/ukernels/matmul/pack/kai_lhs_quant_pack_qsi8d32p_f32_neon.h" 34#include "kai/ukernels/matmul/pack/kai_lhs_quant_pack_qai8dxp_f32.h" 35 36#include "kai/ukernels/matmul/pack/kai_rhs_pack_kxn_bf16p2vlx2b_f32_x32_sme.h" 37#include "kai/ukernels/matmul/pack/kai_rhs_pack_nxk_f32p2vlx1biasf32_f32_f32_sme.h" 38#include "kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0.h" 39#include "kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4c32ps1s0scalef16_qsu4c32s16s0_neon.h" 40#include "kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi8cxp_qsi8cx_neon.h" 41#include "kai/ukernels/matmul/pack/kai_lhs_pack_f16pmrx2_f32_neon.h" 42 43#include "kai/kai_common.h" 44 45#include "simd-mappings.h" 46 47#define GGML_COMMON_DECL_CPP 48#include "ggml-common.h" 49 50#include "kernels.h" 51 52#define NELEMS (x ) (sizeof(x) / sizeof(*x)) 53 54template < size_t (* Fn )(size_t ,size_t ,size_t )> 55static inline size_t kernel_offs_fn3 (size_t a ,size_t b ,size_t c ) { 56return Fn (a ,b ,c ); 57} 58 59template < size_t (* Fn )(size_t ,size_t )> 60static inline size_t kernel_offs_fn2 (size_t a ,size_t b ,size_t ) { 61return Fn (a ,b ); 62} 63 64template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,const void * ,const void * ,float * ,size_t ,size_t ,float ,float )> 65static inline void kernel_run_fn11 (size_t m ,size_t n ,size_t k ,size_t bl , 66const void * lhs ,const void * rhs ,void * dst , 67size_t dst_stride_row ,size_t dst_stride_col , 68float clamp_min ,float clamp_max ) { 69Fn (m ,n ,k ,bl ,lhs ,rhs ,static_cast < float *> (dst ),dst_stride_row ,dst_stride_col ,clamp_min ,clamp_max ); 70} 71 72template < void (* Fn )(size_t ,size_t ,size_t ,const void * ,const void * ,void * ,size_t ,size_t ,float ,float )> 73static inline void kernel_run_fn10 (size_t m ,size_t n ,size_t k ,size_t /*bl*/ , 74const void * lhs ,const void * rhs ,void * dst , 75size_t dst_stride_row ,size_t dst_stride_col , 76float clamp_min ,float clamp_max ) { 77Fn (m ,n ,k ,lhs ,rhs ,dst ,dst_stride_row ,dst_stride_col ,clamp_min ,clamp_max ); 78} 79 80template < void (* Fn )(size_t ,size_t ,size_t ,const void * ,size_t ,const void * ,void * ,size_t ,size_t ,float ,float )> 81static inline void kernel_run_lhs_stride_fn10 (size_t m , 82size_t n , 83size_t k , 84size_t lhs_stride , 85const void * lhs , 86const void * rhs , 87void * dst , 88size_t dst_stride_row , 89size_t dst_stride_col , 90float clamp_min , 91float clamp_max ) { 92Fn (m ,n ,k ,lhs ,lhs_stride ,rhs ,dst ,dst_stride_row ,dst_stride_col ,clamp_min ,clamp_max ); 93} 94 95template < void (* Fn )(size_t ,size_t ,size_t ,const void * ,const void * ,float * ,size_t ,size_t ,float ,float )> 96static inline void kernel_run_float_fn10 (size_t m ,size_t n ,size_t k ,size_t /*bl*/ , 97const void * lhs ,const void * rhs ,void * dst , 98size_t dst_stride_row ,size_t dst_stride_col , 99float clamp_min ,float clamp_max ) { 100Fn (m ,n ,k ,lhs ,rhs ,static_cast < float *> (dst ),dst_stride_row ,dst_stride_col ,clamp_min ,clamp_max ); 101} 102 103template < size_t (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t )> 104static inline size_t lhs_ps_fn6 (size_t m ,size_t k ,size_t bl ,size_t mr ,size_t kr ,size_t sr ) { 105return Fn (m ,k ,bl ,mr ,kr ,sr ); 106} 107 108template < size_t (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t )> 109static inline size_t lhs_ps_fn5 (size_t m ,size_t k ,size_t /*bl*/ ,size_t mr ,size_t kr ,size_t sr ) { 110return Fn (m ,k ,mr ,kr ,sr ); 111} 112 113template < size_t (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t )> 114static inline size_t lhs_offs_fn6 (size_t m_idx ,size_t k ,size_t bl ,size_t mr ,size_t kr ,size_t sr ) { 115return Fn (m_idx ,k ,bl ,mr ,kr ,sr ); 116} 117 118template < size_t (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t )> 119static inline size_t lhs_offs_fn5 (size_t m_idx ,size_t k ,size_t /*bl*/ ,size_t mr ,size_t kr ,size_t sr ) { 120return Fn (m_idx ,k ,mr ,kr ,sr ); 121} 122 123template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,const float * ,size_t ,void * )> 124static inline void lhs_pack_float_fn10 (size_t m ,size_t k ,size_t bl ,size_t mr ,size_t kr ,size_t sr , 125size_t m_idx_start ,const void * lhs ,size_t lhs_stride ,void * lhs_packed ) { 126Fn (m ,k ,bl ,mr ,kr ,sr ,m_idx_start ,static_cast < const float *> (lhs ),lhs_stride ,lhs_packed ); 127} 128 129template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,const void * ,size_t ,void * )> 130static inline void lhs_pack_void_fn10 (size_t m ,size_t k ,size_t bl ,size_t mr ,size_t kr ,size_t sr , 131size_t m_idx_start ,const void * lhs ,size_t lhs_stride ,void * lhs_packed ) { 132Fn (m ,k ,bl ,mr ,kr ,sr ,m_idx_start ,lhs ,lhs_stride ,lhs_packed ); 133} 134 135template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,const void * ,size_t ,void * )> 136static inline void lhs_pack_void_fn9 (size_t m ,size_t k ,size_t /*bl*/ ,size_t mr ,size_t kr ,size_t sr , 137size_t m_idx_start ,const void * lhs ,size_t lhs_stride ,void * lhs_packed ) { 138Fn (m ,k ,mr ,kr ,sr ,m_idx_start ,lhs ,lhs_stride ,lhs_packed ); 139} 140 141template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,const float * ,size_t ,void * )> 142static inline void lhs_pack_float_fn9_no_bl (size_t m ,size_t k ,size_t /*bl*/ ,size_t mr ,size_t kr ,size_t sr , 143size_t m_idx_start ,const void * lhs ,size_t lhs_stride ,void * lhs_packed ) { 144Fn (m ,k ,mr ,kr ,sr ,m_idx_start ,static_cast < const float *> (lhs ),lhs_stride ,lhs_packed ); 145} 146 147template < size_t (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t )> 148static inline size_t rhs_ps_fn5 (size_t n ,size_t k ,size_t nr ,size_t kr ,size_t bl ) { 149return Fn (n ,k ,nr ,kr ,bl ); 150} 151 152template < size_t (* Fn )(size_t ,size_t )> 153static inline size_t rhs_ps_fn2 (size_t n ,size_t k ,size_t /*nr*/ ,size_t /*kr*/ ,size_t /*bl*/ ) { 154return Fn (n ,k ); 155} 156 157template < size_t (* Fn )(size_t ,size_t ,size_t ,size_t )> 158static inline size_t rhs_stride_fn4 (size_t k ,size_t nr ,size_t kr ,size_t bl ) { 159return Fn (k ,nr ,kr ,bl ); 160} 161 162template < size_t (* Fn )(size_t )> 163static inline size_t rhs_stride_fn1 (size_t k ,size_t /*nr*/ ,size_t /*kr*/ ,size_t /*bl*/ ) { 164return Fn (k ); 165} 166 167template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,const uint8_t * ,const float * ,void * ,size_t ,const struct kai_rhs_pack_qs4cxs1s0_param * )> 168static inline void rhs_pack_fn12 (size_t num_groups ,size_t n ,size_t k ,size_t nr ,size_t kr ,size_t sr ,size_t bl , 169size_t /*rhs_stride*/ ,const void * rhs ,const void * bias ,const void * /*scale*/ , 170void * rhs_packed ,size_t extra_bytes ,const void * params ) { 171Fn (num_groups ,n ,k ,nr ,kr ,sr ,bl , 172static_cast < const uint8_t *> (rhs ), 173static_cast < const float *> (bias ), 174rhs_packed ,extra_bytes , 175static_cast < const kai_rhs_pack_qs4cxs1s0_param *> (params )); 176} 177 178template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,const int8_t * ,const float * ,const float * ,void * ,size_t ,const struct kai_rhs_pack_qsi8cx_params * )> 179static inline void rhs_pack_scale_fn12 (size_t num_groups ,size_t n ,size_t k ,size_t nr ,size_t kr ,size_t sr ,size_t /*bl*/ , 180size_t /*rhs_stride*/ ,const void * rhs ,const void * bias ,const void * scale , 181void * rhs_packed ,size_t extra_bytes ,const void * params ) { 182Fn (num_groups ,n ,k ,nr ,kr ,sr , 183static_cast < const int8_t *> (rhs ), 184static_cast < const float *> (bias ), 185static_cast < const float *> (scale ), 186rhs_packed ,extra_bytes , 187static_cast < const kai_rhs_pack_qsi8cx_params *> (params )); 188} 189 190template < void (* Fn )(size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,size_t ,const void * ,const void * ,const void * ,void * ,size_t ,const void * )> 191static inline void rhs_pack_fn13 (size_t num_groups ,size_t n ,size_t k ,size_t nr ,size_t kr ,size_t sr ,size_t /*bl*/ , 192size_t rhs_stride ,const void * rhs ,const void * bias ,const void * scale , 193void * rhs_packed ,size_t extra_bytes ,const void * params ) { 194Fn (num_groups ,n ,k ,nr ,kr ,sr ,rhs_stride ,rhs ,bias ,scale ,rhs_packed ,extra_bytes ,params ); 195} 196 197static const size_t INT4_PER_BYTE = 2 ; 198static const size_t INT4_BITS = 4 ; 199static const int Q4_0_ZERO_POINT = 8 ; 200const size_t INT4_PER_UINT16 = 4 ; 201 202static void dequantize_row_qsi4c32pscalef16 ( 203const void * packed_data , 204int32_t row_idx , 205int64_t nc , 206float * out , 207size_t nr_pack , 208size_t packed_row_stride , 209size_t kr , 210size_t bl , 211size_t num_bytes_multiplier 212) { 213size_t group_idx = row_idx /nr_pack ; 214size_t row_in_group = row_idx %nr_pack ; 215const uint8_t * packed_group = (const uint8_t * )packed_data + group_idx * packed_row_stride ; 216size_t num_blocks = nc /bl ; 217const uint8_t * block_ptr = packed_group ; 218 219for (size_t b = 0 ;b < num_blocks ;++ b ) { 220uint16_t scale_f16 = * ((const uint16_t * )(block_ptr + row_in_group * num_bytes_multiplier )); 221float scale = GGML_CPU_FP16_TO_FP32 (scale_f16 ); 222 223const uint8_t * segment_ptr = block_ptr + nr_pack * num_bytes_multiplier ; 224size_t num_segments = bl /kr ; 225size_t num_bytes_per_segment = kr /INT4_PER_BYTE ; 226 227for (size_t s = 0 ;s < num_segments ;++ s ) { 228const uint8_t * seg_base = segment_ptr + s * nr_pack * num_bytes_per_segment ; 229const uint8_t * qbytes = seg_base + row_in_group * num_bytes_per_segment ; 230for (size_t k = 0 ;k < num_bytes_per_segment ;++ k ) { 231uint8_t byte = qbytes [k ] ^0x88 ; 232int x0 = (byte & 0x0F )- Q4_0_ZERO_POINT ; 233int x1 = (byte >>INT4_BITS )- Q4_0_ZERO_POINT ; 234out [b * bl + s * num_bytes_per_segment + k ]= x0 * scale ; 235out [b * bl + s * num_bytes_per_segment + k + bl /2 ]= x1 * scale ; 236 } 237 } 238block_ptr += nr_pack * num_bytes_multiplier + num_segments * nr_pack * num_bytes_per_segment ; 239 } 240} 241 242static void dequantize_row_qsi4c32ps1s0scalef16 ( 243const void * packed_data , 244int32_t row_idx , 245int64_t k , 246float * out , 247size_t nr , 248size_t packed_row_stride , 249size_t kr , 250size_t bl , 251size_t num_bytes_multiplier 252) { 253const size_t num_blocks = k /bl ; 254const size_t bl4 = bl /INT4_PER_UINT16 ; 255 256size_t group_idx = row_idx /nr ; 257size_t row_in_group = row_idx %nr ; 258 259const uint8_t * packed_group = (const uint8_t * )packed_data + group_idx * packed_row_stride ; 260const uint16_t * qdata = (const uint16_t * )packed_group ; 261const uint16_t * scales = (const uint16_t * )(packed_group + packed_row_stride - (nr * num_blocks * num_bytes_multiplier )); 262 263for (size_t block_idx = 0 ;block_idx < num_blocks ;++ block_idx ) { 264uint16_t scale_f16 = scales [row_in_group + block_idx * nr ]; 265float scale = GGML_CPU_FP16_TO_FP32 (scale_f16 ); 266 267for (size_t bl4_idx = 0 ;bl4_idx < bl4 ;++ bl4_idx ) { 268uint16_t q = qdata [(block_idx * bl4 + bl4_idx )* nr + row_in_group ]; 269 270for (size_t qidx = 0 ;qidx < INT4_PER_UINT16 ;++ qidx ) { 271int v = ((q >> (qidx * 4 ))& 0xF )- Q4_0_ZERO_POINT ; 272out [block_idx * bl + bl4_idx * INT4_BITS + qidx ]= v * scale ; 273 } 274 } 275 } 276GGML_UNUSED (kr ); 277} 278 279static void dequantize_row_qsi8cxp ( 280const void * packed_data , 281int32_t row_idx , 282int64_t k , 283float * out , 284size_t nr , 285size_t packed_row_stride , 286size_t kr , 287size_t bl , 288size_t num_bytes_multiplier 289) { 290GGML_UNUSED (bl ); 291GGML_UNUSED (num_bytes_multiplier ); 292 293const size_t k_internal = ((size_t )k + QK8_0 - 1 ) /QK8_0 * QK8_0 ; 294const size_t group_idx = row_idx /nr ; 295const size_t row_in_group = row_idx %nr ; 296 297const uint8_t * group_ptr = static_cast < const uint8_t *> (packed_data )+ group_idx * packed_row_stride ; 298const int8_t * data_base = reinterpret_cast < const int8_t *> (group_ptr ); 299 300const size_t num_blocks = k_internal /kr ; 301 302for (size_t block = 0 ;block < num_blocks ;++ block ) { 303const int8_t * block_ptr = data_base + (block * nr + row_in_group )* kr ; 304for (size_t i = 0 ;i < kr ;++ i ) { 305const size_t k_idx = block * kr + i ; 306if (k_idx < (size_t )k ) { 307out [k_idx ]= static_cast < float > (block_ptr [i ]); 308 } 309 } 310 } 311 312const uint8_t * sums_ptr = group_ptr + nr * k_internal ; 313GGML_UNUSED (sums_ptr ); 314 315const float * scale_ptr = reinterpret_cast < const float *> (sums_ptr + nr * sizeof (int32_t )); 316const float scale = scale_ptr [row_in_group ]; 317 318if (scale == 0.0f ) { 319for (size_t i = 0 ;i < (size_t )k ;++ i ) { 320out [i ]= 0.0f ; 321 } 322return ; 323 } 324 325for (size_t i = 0 ;i < (size_t )k ;++ i ) { 326out [i ] *=scale ; 327 } 328} 329 330static ggml_kleidiai_kernels gemm_gemv_kernels []= { 331 { 332/* SME2 GEMM */ 333/* .kern_info = */ { 334/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 335/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 336/* .get_mr = */ kai_get_mr_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 337/* .get_nr = */ kai_get_nr_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 338/* .get_kr = */ kai_get_kr_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 339/* .get_sr = */ kai_get_sr_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 340/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 341/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa , 342/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa > , 343/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa > , 344/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_f16p1vlx2_qsi4c32p4vlx2_1vlx4vl_sme2_mopa > , 345 }, 346 347/* .gemm_lhs_info = */ { 348/* .get_offset = */ kai_get_lhs_offset_lhs_pack_f16pmrx2_f32_neon , 349/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_pack_f16pmrx2_f32_neon > , 350/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_pack_f16pmrx2_f32_neon > , 351/* .pack_func_ex = */ & lhs_pack_void_fn10 < kai_run_lhs_pack_f16pmrx2_f32_neon > , 352 }, 353/* SME2 GEMV */ 354/* .kern_info = */ { 355/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 356/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 357/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 358/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 359/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 360/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 361/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 362/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot , 363/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot > , 364/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot > , 365/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot > , 366 }, 367/* .gemv_lhs_info = */ { 368/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32_neon , 369/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32_neon > , 370/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32_neon > , 371/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32_neon > , 372 }, 373/* .rhs_info = */ { 374/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32ps1s0scalef16_qsu4c32s16s0_neon , 375/* .to_float = */ dequantize_row_qsi4c32ps1s0scalef16 , 376/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi4c32ps1s0scalef16_qsu4c32s16s0_neon > , 377/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32ps1s0scalef16_qsu4c32s16s0_neon > , 378/* .pack_func_ex = */ & rhs_pack_fn12 < kai_run_rhs_pack_nxk_qsi4c32ps1s0scalef16_qsu4c32s16s0_neon > , 379 }, 380/* .required_cpu = */ CPU_FEATURE_SME2 |CPU_FEATURE_FP16 , 381/* .lhs_type = */ GGML_TYPE_F32 , 382/* .rhs_type = */ GGML_TYPE_Q4_0 , 383/* .op_type = */ GGML_TYPE_F32 , 384 }, 385 { 386/* SME2 GEMM */ 387/* .kern_info = */ { 388/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 389/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 390/* .get_mr = */ kai_get_mr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 391/* .get_nr = */ kai_get_nr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 392/* .get_kr = */ kai_get_kr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 393/* .get_sr = */ kai_get_sr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 394/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 395/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 396/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa > , 397/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa > , 398/* .run_kernel_ex = */ & kernel_run_fn10 < kai_run_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa > , 399 }, 400/* .gemm_lhs_info = */ { 401/* .get_offset = */ kai_get_lhs_offset_lhs_pack_bf16p2vlx2_f32_sme , 402/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_pack_bf16p2vlx2_f32_sme > , 403/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_pack_bf16p2vlx2_f32_sme > , 404/* .pack_func_ex = */ & lhs_pack_void_fn9 < kai_run_lhs_pack_bf16p2vlx2_f32_sme > , 405 }, 406/* SME2 GEMV */ 407/* .kern_info = */ { 408/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 409/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 410/* .get_mr = */ kai_get_mr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 411/* .get_nr = */ kai_get_nr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 412/* .get_kr = */ kai_get_kr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 413/* .get_sr = */ kai_get_sr_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 414/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 415/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa , 416/* .get_lhs_offset_ex = */ nullptr , 417/* .get_rhs_packed_offset_ex = */ nullptr , 418/* .run_kernel_ex = */ nullptr , 419 }, 420/* .gemv_lhs_info = */ { 421/* .get_offset = */ kai_get_lhs_offset_lhs_pack_bf16p2vlx2_f32_sme , 422/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_pack_bf16p2vlx2_f32_sme > , 423/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_pack_bf16p2vlx2_f32_sme > , 424/* .pack_func_ex = */ & lhs_pack_void_fn9 < kai_run_lhs_pack_bf16p2vlx2_f32_sme > , 425 }, 426/* .rhs_info = */ { 427/* .packed_stride = */ nullptr , 428/* .to_float = */ nullptr , 429/* .packed_size_ex = */ & rhs_ps_fn2 < kai_get_rhs_packed_size_rhs_pack_kxn_bf16p2vlx2b_f32_x32_sme > , 430/* .packed_stride_ex = */ & rhs_stride_fn1 < kai_get_rhs_packed_stride_rhs_pack_kxn_bf16p2vlx2b_f32_x32_sme > , 431/* .pack_func_ex = */ & rhs_pack_fn13 < kai_run_rhs_pack_kxn_bf16p2vlx2b_f32_x32_sme > , 432 }, 433/* .required_cpu = */ CPU_FEATURE_SME2 , 434/* .lhs_type = */ GGML_TYPE_F32 , 435/* .rhs_type = */ GGML_TYPE_F16 , 436/* .op_type = */ GGML_TYPE_F32 , 437 }, 438#if defined(__APPLE__ ) 439 { 440/* DOTPROD GEMM */ 441/* .kern_info = */ { 442/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 443/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 444/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 445/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 446/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 447/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 448/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 449/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 450/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod > , 451/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod > , 452/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod > , 453 }, 454/* .gemm_lhs_info = */ { 455/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32 , 456/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32 > , 457/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32 > , 458/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32 > , 459 }, 460/* DOTPROD GEMV */ 461/* .kern_info = */ { 462/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 463/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 464/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 465/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 466/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 467/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 468/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 469/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 470/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod > , 471/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod > , 472/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod > , 473 }, 474/* .gemv_lhs_info = */ { 475/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32 , 476/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32 > , 477/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32 > , 478/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32 > , 479 }, 480/* .rhs_info = */ { 481/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 , 482/* .to_float = */ dequantize_row_qsi4c32pscalef16 , 483/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 484/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 485/* .pack_func_ex = */ & rhs_pack_fn12 < kai_run_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 486 }, 487/* .required_cpu = */ CPU_FEATURE_DOTPROD , 488/* .lhs_type = */ GGML_TYPE_F32 , 489/* .rhs_type = */ GGML_TYPE_Q4_0 , 490/* .op_type = */ GGML_TYPE_F32 , 491 }, 492 { 493/* i8mm GEMM */ 494/* .kern_info = */ { 495/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 496/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 497/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 498/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 499/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 500/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 501/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 502/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 503/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm > , 504/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm > , 505/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm > , 506 }, 507/* .gemm_lhs_info = */ { 508/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p4x8sb_f32_neon , 509/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 510/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 511/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 512 }, 513/* DOTPROD GEMV */ 514/* .kern_info = */ { 515/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 516/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 517/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 518/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 519/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 520/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 521/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 522/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 523/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod > , 524/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod > , 525/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod > , 526 }, 527/* .gemv_lhs_info = */ { 528/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32 , 529/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32 > , 530/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32 > , 531/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32 > , 532 }, 533/* .rhs_info = */ { 534/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 , 535/* .to_float = */ dequantize_row_qsi4c32pscalef16 , 536/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 537/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 538/* .pack_func_ex = */ & rhs_pack_fn12 < kai_run_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 539 }, 540/* .required_cpu = */ CPU_FEATURE_I8MM |CPU_FEATURE_DOTPROD , 541/* .lhs_type = */ GGML_TYPE_F32 , 542/* .rhs_type = */ GGML_TYPE_Q4_0 , 543/* .op_type = */ GGML_TYPE_F32 , 544 }, 545#else 546 { 547/* SVE i8mm GEMM */ 548/* .kern_info = */ { 549/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 550/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 551/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 552/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 553/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 554/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 555/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 556/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm , 557/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm > , 558/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm > , 559/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p8x8_16x8_sve_i8mm > , 560 }, 561/* .gemm_lhs_info = */ { 562/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p4x8sb_f32_neon , 563/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 564/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 565/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 566 }, 567/* SVE dotprod GEMV */ 568/* .kern_info = */ { 569/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 570/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 571/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 572/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 573/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 574/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 575/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 576/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod , 577/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod > , 578/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod > , 579/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p8x8_1x8_sve_dotprod > , 580 }, 581/* .gemv_lhs_info = */ { 582/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32 , 583/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32 > , 584/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32 > , 585/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32 > , 586 }, 587/* .rhs_info = */ { 588/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 , 589/* .to_float = */ dequantize_row_qsi4c32pscalef16 , 590/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 591/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 592/* .pack_func_ex = */ & rhs_pack_fn12 < kai_run_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 593 }, 594/* .required_cpu = */ CPU_FEATURE_SVE |CPU_FEATURE_I8MM |CPU_FEATURE_DOTPROD , 595/* .lhs_type = */ GGML_TYPE_F32 , 596/* .rhs_type = */ GGML_TYPE_Q4_0 , 597/* .op_type = */ GGML_TYPE_F32 , 598 }, 599 { 600/* i8mm GEMM */ 601/* .kern_info = */ { 602/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 603/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 604/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 605/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 606/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 607/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 608/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 609/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm , 610/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm > , 611/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm > , 612/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm > , 613 }, 614/* .gemm_lhs_info = */ { 615/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p4x8sb_f32_neon , 616/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 617/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 618/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p4x8sb_f32_neon > , 619 }, 620/* DOTPROD GEMV */ 621/* .kern_info = */ { 622/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 623/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 624/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 625/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 626/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 627/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 628/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 629/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod , 630/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod > , 631/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod > , 632/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod > , 633 }, 634/* .gemv_lhs_info = */ { 635/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32 , 636/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32 > , 637/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32 > , 638/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32 > , 639 }, 640/* .rhs_info = */ { 641/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 , 642/* .to_float = */ dequantize_row_qsi4c32pscalef16 , 643/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 644/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 645/* .pack_func_ex = */ & rhs_pack_fn12 < kai_run_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 646 }, 647/* .required_cpu = */ CPU_FEATURE_I8MM |CPU_FEATURE_DOTPROD , 648/* .lhs_type = */ GGML_TYPE_F32 , 649/* .rhs_type = */ GGML_TYPE_Q4_0 , 650/* .op_type = */ GGML_TYPE_F32 , 651 }, 652 { 653/* DOTPROD GEMM */ 654/* .kern_info = */ { 655/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 656/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 657/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 658/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 659/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 660/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 661/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 662/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod , 663/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod > , 664/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod > , 665/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod > , 666 }, 667/* .gemm_lhs_info = */ { 668/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32 , 669/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32 > , 670/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32 > , 671/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32 > , 672 }, 673/* DOTPROD GEMV */ 674/* .kern_info = */ { 675/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 676/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 677/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 678/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 679/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 680/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 681/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 682/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod , 683/* .get_lhs_offset_ex = */ & kernel_offs_fn3 < kai_get_lhs_packed_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod > , 684/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn3 < kai_get_rhs_packed_offset_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod > , 685/* .run_kernel_ex = */ & kernel_run_fn11 < kai_run_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod > , 686 }, 687/* .gemv_lhs_info = */ { 688/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qsi8d32p_f32 , 689/* .get_packed_offset_ex = */ & lhs_offs_fn6 < kai_get_lhs_packed_offset_lhs_quant_pack_qsi8d32p_f32 > , 690/* .packed_size_ex = */ & lhs_ps_fn6 < kai_get_lhs_packed_size_lhs_quant_pack_qsi8d32p_f32 > , 691/* .pack_func_ex = */ & lhs_pack_float_fn10 < kai_run_lhs_quant_pack_qsi8d32p_f32 > , 692 }, 693/* .rhs_info = */ { 694/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 , 695/* .to_float = */ dequantize_row_qsi4c32pscalef16 , 696/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 697/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 698/* .pack_func_ex = */ & rhs_pack_fn12 < kai_run_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0 > , 699 }, 700/* .required_cpu = */ CPU_FEATURE_DOTPROD , 701/* .lhs_type = */ GGML_TYPE_F32 , 702/* .rhs_type = */ GGML_TYPE_Q4_0 , 703/* .op_type = */ GGML_TYPE_F32 , 704 }, 705#endif 706 {/* Sentinel */ } 707}; 708 709static ggml_kleidiai_kernels gemm_gemv_kernels_q8 []= { 710 { 711/* SME2 GEMM */ 712 { 713/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 714/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 715/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 716/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 717/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 718/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 719/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 720/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa , 721/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa > , 722/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa > , 723/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa > , 724 }, 725/* .gemm_lhs_info = */ { 726/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 727/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 728/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 729/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 730 }, 731/* SME2 GEMV */ 732 { 733/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 734/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 735/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 736/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 737/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 738/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 739/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 740/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot , 741/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot > , 742/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot > , 743/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot > , 744 }, 745/* .gemv_lhs_info = */ { 746/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 747/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 748/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 749/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 750 }, 751/* .rhs_info = */ { 752/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon , 753/* .to_float = */ dequantize_row_qsi8cxp , 754/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 755/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 756/* .pack_func_ex = */ & rhs_pack_scale_fn12 < kai_run_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 757 }, 758/* .required_cpu = */ CPU_FEATURE_SME2 , 759/* .lhs_type = */ GGML_TYPE_F32 , 760/* .rhs_type = */ GGML_TYPE_Q8_0 , 761/* .op_type = */ GGML_TYPE_F32 , 762 }, 763 { 764/* SME GEMM (pure SME, no SME2 required) */ 765 { 766/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 767/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 768/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 769/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 770/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 771/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 772/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 773/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa , 774/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa > , 775/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa > , 776/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme_mopa > , 777 }, 778/* .gemm_lhs_info = */ { 779/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 780/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 781/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 782/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 783 }, 784/* SME GEMV (pure SME, no SME2 required) */ 785 { 786/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 787/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 788/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 789/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 790/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 791/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 792/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 793/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot , 794/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot > , 795/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot > , 796/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme_dot > , 797 }, 798/* .gemv_lhs_info = */ { 799/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 800/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 801/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 802/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 803 }, 804/* .rhs_info = */ { 805/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon , 806/* .to_float = */ dequantize_row_qsi8cxp , 807/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 808/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 809/* .pack_func_ex = */ & rhs_pack_scale_fn12 < kai_run_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 810 }, 811/* .required_cpu = */ CPU_FEATURE_SME , 812/* .lhs_type = */ GGML_TYPE_F32 , 813/* .rhs_type = */ GGML_TYPE_Q8_0 , 814/* .op_type = */ GGML_TYPE_F32 , 815 }, 816 { 817/* I8MM GEMM */ 818 { 819/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 820/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 821/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 822/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 823/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 824/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 825/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 826/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm , 827/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm > , 828/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm > , 829/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm > , 830 }, 831/* .gemm_lhs_info = */ { 832/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 833/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 834/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 835/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 836 }, 837/* I8MM GEMV (dotprod fallback) */ 838 { 839/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 840/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 841/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 842/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 843/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 844/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 845/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 846/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod , 847/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod > , 848/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod > , 849/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod > , 850 }, 851/* .gemv_lhs_info = */ { 852/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 853/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 854/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 855/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 856 }, 857/* .rhs_info = */ { 858/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon , 859/* .to_float = */ dequantize_row_qsi8cxp , 860/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 861/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 862/* .pack_func_ex = */ & rhs_pack_scale_fn12 < kai_run_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 863 }, 864/* .required_cpu = */ CPU_FEATURE_I8MM |CPU_FEATURE_DOTPROD , 865/* .lhs_type = */ GGML_TYPE_F32 , 866/* .rhs_type = */ GGML_TYPE_Q8_0 , 867/* .op_type = */ GGML_TYPE_F32 , 868 }, 869 { 870/* DOTPROD GEMM */ 871 { 872/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 873/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 874/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 875/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 876/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 877/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 878/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 879/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod , 880/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod > , 881/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod > , 882/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod > , 883 }, 884/* .gemm_lhs_info = */ { 885/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 886/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 887/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 888/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 889 }, 890/* DOTPROD GEMV */ 891 { 892/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 893/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 894/* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 895/* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 896/* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 897/* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 898/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 899/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod , 900/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod > , 901/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod > , 902/* .run_kernel_ex = */ & kernel_run_float_fn10 < kai_run_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod > , 903 }, 904/* .gemv_lhs_info = */ { 905/* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32 , 906/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_quant_pack_qai8dxp_f32 > , 907/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_quant_pack_qai8dxp_f32 > , 908/* .pack_func_ex = */ & lhs_pack_float_fn9_no_bl < kai_run_lhs_quant_pack_qai8dxp_f32 > , 909 }, 910/* .rhs_info = */ { 911/* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon , 912/* .to_float = */ dequantize_row_qsi8cxp , 913/* .packed_size_ex = */ & rhs_ps_fn5 < kai_get_rhs_packed_size_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 914/* .packed_stride_ex = */ & rhs_stride_fn4 < kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 915/* .pack_func_ex = */ & rhs_pack_scale_fn12 < kai_run_rhs_pack_nxk_qsi8cxp_qsi8cx_neon > , 916 }, 917/* .required_cpu = */ CPU_FEATURE_DOTPROD , 918/* .lhs_type = */ GGML_TYPE_F32 , 919/* .rhs_type = */ GGML_TYPE_Q8_0 , 920/* .op_type = */ GGML_TYPE_F32 , 921 }, 922 {/* Sentinel */ } 923}; 924 925static ggml_kleidiai_kernels ggml_kleidiai_kernels_f32 []= { 926 { 927/* SME2 GEMM */ 928 { 929/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 930/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 931/* .get_mr = */ kai_get_mr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 932/* .get_nr = */ kai_get_nr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 933/* .get_kr = */ kai_get_kr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 934/* .get_sr = */ kai_get_sr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 935/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 936/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa , 937/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa > , 938/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa > , 939/* .run_kernel_ex = */ & kernel_run_fn10 < kai_run_matmul_clamp_f32_f32p2vlx1_f32p2vlx1biasf32_sme2_mopa > , 940 }, 941/* .gemm_lhs_info = */ { 942/* .get_offset = */ kai_get_lhs_offset_lhs_pack_f32p2vlx1_f32_sme , 943/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_pack_f32p2vlx1_f32_sme > , 944/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_pack_f32p2vlx1_f32_sme > , 945/* .pack_func_ex = */ & lhs_pack_void_fn9 < kai_run_lhs_pack_f32p2vlx1_f32_sme > , 946 }, 947/* SME2 GEMV */ 948 { 949/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 950/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 951/* .get_mr = */ kai_get_m_step_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 952/* .get_nr = */ kai_get_nr_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 953/* .get_kr = */ kai_get_kr_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 954/* .get_sr = */ kai_get_sr_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 955/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 956/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla , 957/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_offset_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla > , 958/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla > , 959/* .run_kernel_ex = */ & kernel_run_lhs_stride_fn10 < kai_run_matmul_clamp_f32_f32_f32p2vlx1b_1x16vl_sme2_mla > , 960 }, 961/* .gemv_lhs_info = */ { 962/* .get_offset = */ nullptr , 963/* .get_packed_offset_ex = */ nullptr , 964/* .packed_size_ex = */ nullptr , 965/* .pack_func_ex = */ nullptr , 966 }, 967/* .rhs_info = */ { 968/* .packed_stride = */ nullptr , 969/* .to_float = */ nullptr , 970/* .packed_size_ex = */ & rhs_ps_fn2 < kai_get_rhs_packed_size_rhs_pack_nxk_f32p2vlx1biasf32_f32_f32_sme > , 971/* .packed_stride_ex = */ & rhs_stride_fn1 < kai_get_rhs_packed_stride_rhs_pack_nxk_f32p2vlx1biasf32_f32_f32_sme > , 972/* .pack_func_ex = */ & rhs_pack_fn13 < kai_run_rhs_pack_nxk_f32p2vlx1biasf32_f32_f32_sme > , 973 }, 974/* .required_cpu = */ CPU_FEATURE_SME2 , 975/* .lhs_type = */ GGML_TYPE_F32 , 976/* .rhs_type = */ GGML_TYPE_F32 , 977/* .op_type = */ GGML_TYPE_F32 , 978 }, 979 { 980/* SME GEMM */ 981 { 982/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 983/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 984/* .get_mr = */ kai_get_mr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 985/* .get_nr = */ kai_get_nr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 986/* .get_kr = */ kai_get_kr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 987/* .get_sr = */ kai_get_sr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 988/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 989/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 990/* .get_lhs_offset_ex = */ & kernel_offs_fn2 < kai_get_lhs_packed_offset_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa > , 991/* .get_rhs_packed_offset_ex = */ & kernel_offs_fn2 < kai_get_rhs_packed_offset_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa > , 992/* .run_kernel_ex = */ & kernel_run_fn10 < kai_run_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa > , 993 }, 994/* .gemm_lhs_info = */ { 995/* .get_offset = */ kai_get_lhs_offset_lhs_pack_f32p2vlx1_f32_sme , 996/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_pack_f32p2vlx1_f32_sme > , 997/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_pack_f32p2vlx1_f32_sme > , 998/* .pack_func_ex = */ & lhs_pack_void_fn9 < kai_run_lhs_pack_f32p2vlx1_f32_sme > , 999 }, 1000/* SME GEMV */ 1001 { 1002/* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1003/* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1004/* .get_mr = */ kai_get_mr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1005/* .get_nr = */ kai_get_nr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1006/* .get_kr = */ kai_get_kr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1007/* .get_sr = */ kai_get_sr_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1008/* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1009/* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_f32p2vlx1_f32p2vlx1b_2vlx2vl_sme_mopa , 1010/* .get_lhs_offset_ex = */ nullptr , 1011/* .get_rhs_packed_offset_ex = */ nullptr , 1012/* .run_kernel_ex = */ nullptr , 1013 }, 1014/* .gemv_lhs_info = */ { 1015/* .get_offset = */ kai_get_lhs_offset_lhs_pack_f32p2vlx1_f32_sme , 1016/* .get_packed_offset_ex = */ & lhs_offs_fn5 < kai_get_lhs_packed_offset_lhs_pack_f32p2vlx1_f32_sme > , 1017/* .packed_size_ex = */ & lhs_ps_fn5 < kai_get_lhs_packed_size_lhs_pack_f32p2vlx1_f32_sme > , 1018/* .pack_func_ex = */ & lhs_pack_void_fn9 < kai_run_lhs_pack_f32p2vlx1_f32_sme > , 1019 }, 1020/* .rhs_info = */ { 1021/* .packed_stride = */ nullptr , 1022/* .to_float = */ nullptr , 1023/* .packed_size_ex = */ & rhs_ps_fn2 < kai_get_rhs_packed_size_rhs_pack_nxk_f32p2vlx1biasf32_f32_f32_sme > , 1024/* .packed_stride_ex = */ & rhs_stride_fn1 < kai_get_rhs_packed_stride_rhs_pack_nxk_f32p2vlx1biasf32_f32_f32_sme > , 1025/* .pack_func_ex = */ & rhs_pack_fn13 < kai_run_rhs_pack_nxk_f32p2vlx1biasf32_f32_f32_sme > , 1026 }, 1027/* .required_cpu = */ CPU_FEATURE_SME , 1028/* .lhs_type = */ GGML_TYPE_F32 , 1029/* .rhs_type = */ GGML_TYPE_F32 , 1030/* .op_type = */ GGML_TYPE_F32 , 1031 }, 1032 {/* Sentinel */ } 1033}; 1034 1035ggml_kleidiai_kernels * ggml_kleidiai_select_kernels (cpu_feature cpu_features ,const ggml_tensor * tensor ) { 1036ggml_kleidiai_kernels * kernel = nullptr ; 1037 1038if (tensor -> op == GGML_OP_MUL_MAT && tensor -> src [0 ]!= nullptr && tensor -> src [1 ]!= nullptr ) { 1039auto try_table = [& ](auto & table ) { 1040for (size_t i = 0 ;i < NELEMS (table )- 1 ;++ i ) { 1041if ((cpu_features & table [i ].required_cpu )== table [i ].required_cpu && 1042table [i ].lhs_type == tensor -> src [1 ]-> type && 1043table [i ].rhs_type == tensor -> src [0 ]-> type && 1044table [i ].op_type == tensor -> type ) { 1045kernel = & table [i ]; 1046return true; 1047 } 1048 } 1049return false; 1050 }; 1051 1052if (tensor -> src [0 ]-> type == GGML_TYPE_Q8_0 ) { 1053try_table (gemm_gemv_kernels_q8 ); 1054 }else if (tensor -> src [0 ]-> type == GGML_TYPE_F32 ) { 1055try_table (ggml_kleidiai_kernels_f32 ); 1056 }else { 1057try_table (gemm_gemv_kernels ); 1058 } 1059 } 1060 1061return kernel ; 1062} 1063 1064ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q4_0 (cpu_feature features ) { 1065ggml_kleidiai_kernels * kernels = nullptr ; 1066 1067for (size_t i = 0 ;i < NELEMS (gemm_gemv_kernels )- 1 ;++ i ) { 1068if ((features & gemm_gemv_kernels [i ].required_cpu )== gemm_gemv_kernels [i ].required_cpu && 1069gemm_gemv_kernels [i ].rhs_type == GGML_TYPE_Q4_0 ) { 1070kernels = & gemm_gemv_kernels [i ]; 1071break ; 1072 } 1073 } 1074 1075return kernels ; 1076} 1077 1078ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q8_0 (cpu_feature features ) { 1079ggml_kleidiai_kernels * kernels = nullptr ; 1080 1081for (size_t i = 0 ;i < NELEMS (gemm_gemv_kernels_q8 )- 1 ;++ i ) { 1082if ((features & gemm_gemv_kernels_q8 [i ].required_cpu )== gemm_gemv_kernels_q8 [i ].required_cpu ) { 1083kernels = & gemm_gemv_kernels_q8 [i ]; 1084break ; 1085 } 1086 } 1087 1088return kernels ; 1089} 1090 1091ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_f32 (cpu_feature features ) { 1092ggml_kleidiai_kernels * kernels = nullptr ; 1093 1094for (size_t i = 0 ;i < NELEMS (ggml_kleidiai_kernels_f32 )- 1 ;++ i ) { 1095if ((features & ggml_kleidiai_kernels_f32 [i ].required_cpu )== ggml_kleidiai_kernels_f32 [i ].required_cpu ) { 1096kernels = & ggml_kleidiai_kernels_f32 [i ]; 1097break ; 1098 } 1099 } 1100return kernels ; 1101}