// SPDX-FileCopyrightText: Copyright 2025 Arm Limited and/or its affiliates // SPDX-License-Identifier: MIT // #pragma once #include #include #include "ggml.h" enum cpu_feature { CPU_FEATURE_NONE = 0, CPU_FEATURE_DOTPROD = 1, CPU_FEATURE_I8MM = 2, CPU_FEATURE_SVE = 4, CPU_FEATURE_SME = 8 }; inline cpu_feature& operator|=(cpu_feature& lhs, cpu_feature rhs) { lhs = static_cast(lhs | rhs); return lhs; } inline cpu_feature operator|(cpu_feature lhs, cpu_feature rhs) { return static_cast(static_cast(lhs) | static_cast(rhs)); } struct kernel_info { size_t (*get_m_step)(void); size_t (*get_n_step)(void); size_t (*get_mr)(void); size_t (*get_nr)(void); size_t (*get_kr)(void); size_t (*get_sr)(void); std::variant< std::function, std::function > get_lhs_offset; std::variant< std::function, std::function > get_rhs_packed_offset; size_t (*get_dst_offset)(size_t m_idx, size_t n_idx, size_t stride); size_t (*get_dst_size)(size_t m, size_t n); std::variant< std::function, std::function > run_kernel; }; struct lhs_packing_info { size_t (*get_offset)(size_t m_idx, size_t lhs_stride); std::variant< std::function, std::function > get_packed_offset; std::variant< std::function, std::function > packed_size; std::variant< std::function, std::function > pack_func; }; struct rhs_packing_info { std::variant< std::function, std::function > packed_size; size_t (*packed_stride)(size_t k, size_t nr, size_t kr, size_t bl); std::variant< std::function, std::function > pack_func; void (*to_float)(const void *packed_data, int32_t row_idx, int64_t nc, float *out, size_t nr_pack, size_t packed_row_stride, size_t kr, size_t bl, size_t num_bytes_multiplier); }; struct ggml_kleidiai_kernels { kernel_info gemm; kernel_info gemv; lhs_packing_info lhs_info; rhs_packing_info rhs_info; cpu_feature required_cpu; ggml_type lhs_type; ggml_type rhs_type; ggml_type op_type; }; ggml_kleidiai_kernels * ggml_kleidiai_select_kernels(cpu_feature cpu_features, const ggml_tensor * tensor); ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q4_0(cpu_feature features);