From 360b1471cf4854f85ead22da3b108db0c7d61eee Mon Sep 17 00:00:00 2001 From: Christian Kastner Date: Fri, 6 Jun 2025 12:53:46 +0200 Subject: [PATCH 1/3] ARM: add missing flags to fallback feature detection --- ggml/src/ggml-cpu/ggml-cpu.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index c7426df2b851b..63a7ccac6ca84 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -729,6 +729,18 @@ static void ggml_init_arm_arch_features(void) { ggml_arm_arch_features.has_neon = 0; #endif +#if defined(__ARM_FEATURE_DOTPROD) + ggml_arm_arch_features.has_dotprod = 1; +#else + ggml_arm_arch_features.has_dotprod = 0; +#endif + +#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) + ggml_arm_arch_features.has_fp16_va = 1; +#else + ggml_arm_arch_features.has_fp16_va = 0; +#endif + #if defined(__ARM_FEATURE_MATMUL_INT8) ggml_arm_arch_features.has_i8mm = 1; #else From 9cc914cd7f09f9dd91831f32ae8c31d45937d72c Mon Sep 17 00:00:00 2001 From: Christian Kastner Date: Fri, 6 Jun 2025 12:58:01 +0200 Subject: [PATCH 2/3] ARM: Dynamically query FP16_VECTOR_ARITHMETIC support --- ggml/src/ggml-cpu/ggml-cpu.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index 63a7ccac6ca84..58f9e27cbf3b9 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -76,11 +76,12 @@ struct ggml_arm_arch_features_type { int has_neon; int has_dotprod; + int has_fp16_va; int has_i8mm; int has_sve; int sve_cnt; int has_sme; -} ggml_arm_arch_features = {-1, -1, -1, -1, 0, -1}; +} ggml_arm_arch_features = {-1, -1, -1, -1, -1, 0, -1}; #endif @@ -689,6 +690,7 @@ static void ggml_init_arm_arch_features(void) { ggml_arm_arch_features.has_neon = !!(hwcap & HWCAP_ASIMD); ggml_arm_arch_features.has_dotprod = !!(hwcap & HWCAP_ASIMDDP); + ggml_arm_arch_features.has_fp16_va = !!(hwcap & HWCAP_FPHP); ggml_arm_arch_features.has_i8mm = !!(hwcap2 & HWCAP2_I8MM); ggml_arm_arch_features.has_sve = !!(hwcap & HWCAP_SVE); ggml_arm_arch_features.has_sme = !!(hwcap2 & HWCAP2_SME); @@ -709,6 +711,11 @@ static void ggml_init_arm_arch_features(void) { } ggml_arm_arch_features.has_dotprod = oldp; + if (sysctlbyname("hw.optional.arm.FEAT_FP16", &oldp, &size, NULL, 0) != 0) { + oldp = 0; + } + ggml_arm_arch_features.has_fp16_va = oldp; + if (sysctlbyname("hw.optional.arm.FEAT_I8MM", &oldp, &size, NULL, 0) != 0) { oldp = 0; } @@ -3389,14 +3396,6 @@ int ggml_cpu_has_f16c(void) { #endif } -int ggml_cpu_has_fp16_va(void) { -#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) - return 1; -#else - return 0; -#endif -} - int ggml_cpu_has_wasm_simd(void) { #if defined(__wasm_simd128__) return 1; @@ -3461,6 +3460,14 @@ int ggml_cpu_has_dotprod(void) { #endif } +int ggml_cpu_has_fp16_va(void) { +#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) + return ggml_arm_arch_features.has_fp16_va; +#else + return 0; +#endif +} + int ggml_cpu_has_sve(void) { #if defined(__ARM_ARCH) && defined(__ARM_FEATURE_SVE) return ggml_arm_arch_features.has_sve; From 46694771e08fdc04d78271a066361d49857bf4ec Mon Sep 17 00:00:00 2001 From: Christian Kastner Date: Fri, 6 Jun 2025 13:01:43 +0200 Subject: [PATCH 3/3] ARM: Add support for SVE2 feature detection --- ggml/include/ggml-cpu.h | 1 + ggml/src/ggml-cpu/ggml-cpu.c | 23 ++++++++++++++++++++--- ggml/src/ggml-cpu/ggml-cpu.cpp | 3 +++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ggml/include/ggml-cpu.h b/ggml/include/ggml-cpu.h index de77a875ec533..2261f3bffb6e1 100644 --- a/ggml/include/ggml-cpu.h +++ b/ggml/include/ggml-cpu.h @@ -95,6 +95,7 @@ extern "C" { GGML_BACKEND_API int ggml_cpu_has_dotprod (void); GGML_BACKEND_API int ggml_cpu_has_matmul_int8(void); GGML_BACKEND_API int ggml_cpu_has_sve (void); + GGML_BACKEND_API int ggml_cpu_has_sve2 (void); GGML_BACKEND_API int ggml_cpu_get_sve_cnt (void); // sve vector length in bytes GGML_BACKEND_API int ggml_cpu_has_sme (void); // other diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index 58f9e27cbf3b9..50c05eaf961d4 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -79,9 +79,10 @@ struct ggml_arm_arch_features_type { int has_fp16_va; int has_i8mm; int has_sve; + int has_sve2; int sve_cnt; int has_sme; -} ggml_arm_arch_features = {-1, -1, -1, -1, -1, 0, -1}; +} ggml_arm_arch_features = {-1, -1, -1, -1, -1, -1, 0, -1}; #endif @@ -693,6 +694,7 @@ static void ggml_init_arm_arch_features(void) { ggml_arm_arch_features.has_fp16_va = !!(hwcap & HWCAP_FPHP); ggml_arm_arch_features.has_i8mm = !!(hwcap2 & HWCAP2_I8MM); ggml_arm_arch_features.has_sve = !!(hwcap & HWCAP_SVE); + ggml_arm_arch_features.has_sve2 = !!(hwcap2 & HWCAP2_SVE2); ggml_arm_arch_features.has_sme = !!(hwcap2 & HWCAP2_SME); #if defined(__ARM_FEATURE_SVE) @@ -726,8 +728,9 @@ static void ggml_init_arm_arch_features(void) { } ggml_arm_arch_features.has_sme = oldp; - ggml_arm_arch_features.has_sve = 0; - ggml_arm_arch_features.sve_cnt = 0; + ggml_arm_arch_features.has_sve = 0; + ggml_arm_arch_features.has_sve2 = 0; + ggml_arm_arch_features.sve_cnt = 0; #else // Run-time CPU feature detection not implemented for this platform, fallback to compile time #if defined(__ARM_NEON) @@ -762,6 +765,12 @@ static void ggml_init_arm_arch_features(void) { ggml_arm_arch_features.sve_cnt = 0; #endif +#if defined(__ARM_FEATURE_SVE2) + ggml_arm_arch_features.has_sve2 = 1; +#else + ggml_arm_arch_features.has_sve2 = 0; +#endif + #if defined(__ARM_FEATURE_SME) || defined(__ARM_FEATURE_SME2) ggml_arm_arch_features.has_sme = 1; #else @@ -3476,6 +3485,14 @@ int ggml_cpu_has_sve(void) { #endif } +int ggml_cpu_has_sve2(void) { +#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_SVE2) + return ggml_arm_arch_features.has_sve2; +#else + return 0; +#endif +} + int ggml_cpu_has_matmul_int8(void) { #if defined(__ARM_ARCH) && defined(__ARM_FEATURE_MATMUL_INT8) return ggml_arm_arch_features.has_i8mm; diff --git a/ggml/src/ggml-cpu/ggml-cpu.cpp b/ggml/src/ggml-cpu/ggml-cpu.cpp index e013e8b416222..fd8239246861d 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.cpp +++ b/ggml/src/ggml-cpu/ggml-cpu.cpp @@ -559,6 +559,9 @@ static ggml_backend_feature * ggml_backend_cpu_get_features(ggml_backend_reg_t r if (ggml_cpu_has_sve()) { features.push_back({ "SVE", "1" }); } + if (ggml_cpu_has_sve2()) { + features.push_back({ "SVE2", "1" }); + } if (ggml_cpu_has_dotprod()) { features.push_back({ "DOTPROD", "1" }); }