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 c7426df2b851b..50c05eaf961d4 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -76,11 +76,13 @@ struct ggml_arm_arch_features_type { int has_neon; int has_dotprod; + 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, 0, -1}; +} ggml_arm_arch_features = {-1, -1, -1, -1, -1, -1, 0, -1}; #endif @@ -689,8 +691,10 @@ 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_sve2 = !!(hwcap2 & HWCAP2_SVE2); ggml_arm_arch_features.has_sme = !!(hwcap2 & HWCAP2_SME); #if defined(__ARM_FEATURE_SVE) @@ -709,6 +713,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; } @@ -719,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) @@ -729,6 +739,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 @@ -743,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 @@ -3377,14 +3405,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; @@ -3449,6 +3469,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; @@ -3457,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" }); }