Skip to content

Commit 904111a

Browse files
committed
ggml: Extend feature detection to include non aarch64 Arm arch
1 parent aab436c commit 904111a

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

ggml/src/ggml.c

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737
#include <unistd.h>
3838
#endif
3939

40-
#if defined(__aarch64__)
41-
struct ggml_aarch64_features_type {
40+
#if defined(__ARM_ARCH)
41+
struct ggml_arm_arch_features_type {
4242
int has_neon;
4343
int has_i8mm;
4444
int has_sve;
4545
int sve_cnt;
46-
} ggml_aarch64_features = {-1, -1, -1, 0};
46+
} ggml_arm_arch_features = {-1, -1, -1, 0};
4747
#endif
4848

4949
#if defined(__ARM_FEATURE_SVE) || defined(__ARM_FEATURE_MATMUL_INT8)
@@ -3649,60 +3649,61 @@ static inline int ggml_up(int n, int m) {
36493649

36503650
////////////////////////////////////////////////////////////////////////////////
36513651

3652-
#if defined(__aarch64__)
3652+
#if defined(__ARM_ARCH)
36533653

3654-
#if defined(__linux__)
3654+
#if defined(__linux__) && defined(__aarch64__)
36553655
#include <sys/auxv.h>
36563656
#elif defined(__APPLE__)
36573657
#include <sys/sysctl.h>
36583658
#endif
36593659

3660-
static void ggml_init_aarch64_features(void) {
3661-
#if defined(__linux__)
3660+
static void ggml_init_arm_arch_features(void) {
3661+
#if defined(__linux__) && defined(__aarch64__)
36623662
uint32_t hwcap = getauxval(AT_HWCAP);
36633663
uint32_t hwcap2 = getauxval(AT_HWCAP2);
36643664

3665-
ggml_aarch64_features.has_neon = !!(hwcap & HWCAP_ASIMD);
3666-
ggml_aarch64_features.has_i8mm = !!(hwcap2 & HWCAP2_I8MM);
3667-
ggml_aarch64_features.has_sve = !!(hwcap & HWCAP_SVE);
3665+
ggml_arm_arch_features.has_neon = !!(hwcap & HWCAP_ASIMD);
3666+
ggml_arm_arch_features.has_i8mm = !!(hwcap2 & HWCAP2_I8MM);
3667+
ggml_arm_arch_features.has_sve = !!(hwcap & HWCAP_SVE);
3668+
36683669
#if defined(__ARM_FEATURE_SVE)
3669-
ggml_aarch64_features.sve_cnt = PR_SVE_VL_LEN_MASK & prctl(PR_SVE_GET_VL);
3670+
ggml_arm_arch_features.sve_cnt = PR_SVE_VL_LEN_MASK & prctl(PR_SVE_GET_VL);
36703671
#endif
36713672
#elif defined(__APPLE__)
36723673
int oldp = 0;
36733674
size_t size = sizeof(oldp);
36743675
if (sysctlbyname("hw.optional.AdvSIMD", &oldp, &size, NULL, 0) != 0) {
36753676
oldp = 0;
36763677
}
3677-
ggml_aarch64_features.has_neon = oldp;
3678+
ggml_arm_arch_features.has_neon = oldp;
36783679

36793680
if (sysctlbyname("hw.optional.arm.FEAT_I8MM", &oldp, &size, NULL, 0) != 0) {
36803681
oldp = 0;
36813682
}
3682-
ggml_aarch64_features.has_i8mm = oldp;
3683+
ggml_arm_arch_features.has_i8mm = oldp;
36833684

3684-
ggml_aarch64_features.has_sve = 0;
3685-
ggml_aarch64_features.sve_cnt = 0;
3685+
ggml_arm_arch_features.has_sve = 0;
3686+
ggml_arm_arch_features.sve_cnt = 0;
36863687
#else
36873688
// Run-time CPU feature detection not implemented for this platform, fallback to compile time
36883689
#if defined(__ARM_NEON)
3689-
ggml_aarch64_features.has_neon = 1;
3690+
ggml_arm_arch_features.has_neon = 1;
36903691
#else
3691-
ggml_aarch64_features.has_neon = 0;
3692+
ggml_arm_arch_features.has_neon = 0;
36923693
#endif
36933694

36943695
#if defined(__ARM_FEATURE_MATMUL_INT8)
3695-
ggml_aarch64_features.has_i8mm = 1;
3696+
ggml_arm_arch_features.has_i8mm = 1;
36963697
#else
3697-
ggml_aarch64_features.has_i8mm = 0;
3698+
ggml_arm_arch_features.has_i8mm = 0;
36983699
#endif
36993700

37003701
#if defined(__ARM_FEATURE_SVE)
3701-
ggml_aarch64_features.has_sve = 1;
3702-
ggml_aarch64_features.sve_cnt = 16;
3702+
ggml_arm_arch_features.has_sve = 1;
3703+
ggml_arm_arch_features.sve_cnt = 16;
37033704
#else
3704-
ggml_aarch64_features.has_sve = 0;
3705-
ggml_aarch64_features.sve_cnt = 0;
3705+
ggml_arm_arch_features.has_sve = 0;
3706+
ggml_arm_arch_features.sve_cnt = 0;
37063707
#endif
37073708
#endif
37083709
}
@@ -3758,8 +3759,8 @@ struct ggml_context * ggml_init(struct ggml_init_params params) {
37583759
GGML_PRINT_DEBUG("%s: g_state initialized in %f ms\n", __func__, (t_end - t_start)/1000.0f);
37593760
}
37603761

3761-
#if defined(__aarch64__)
3762-
ggml_init_aarch64_features();
3762+
#if defined(__ARM_ARCH)
3763+
ggml_init_arm_arch_features();
37633764
#endif
37643765

37653766
is_first_call = false;
@@ -23328,16 +23329,16 @@ int ggml_cpu_has_fma(void) {
2332823329
}
2332923330

2333023331
int ggml_cpu_has_neon(void) {
23331-
#if defined(__aarch64__)
23332-
return ggml_aarch64_features.has_neon;
23332+
#if defined(__ARM_ARCH)
23333+
return ggml_arm_arch_features.has_neon;
2333323334
#else
2333423335
return 0;
2333523336
#endif
2333623337
}
2333723338

2333823339
int ggml_cpu_has_sve(void) {
23339-
#if defined(__aarch64__)
23340-
return ggml_aarch64_features.has_sve;
23340+
#if defined(__ARM_ARCH)
23341+
return ggml_arm_arch_features.has_sve;
2334123342
#else
2334223343
return 0;
2334323344
#endif
@@ -23484,16 +23485,16 @@ int ggml_cpu_has_vsx(void) {
2348423485
}
2348523486

2348623487
int ggml_cpu_has_matmul_int8(void) {
23487-
#if defined(__aarch64__)
23488-
return ggml_aarch64_features.has_i8mm;
23488+
#if defined(__ARM_ARCH)
23489+
return ggml_arm_arch_features.has_i8mm;
2348923490
#else
2349023491
return 0;
2349123492
#endif
2349223493
}
2349323494

2349423495
int ggml_cpu_get_sve_cnt(void) {
23495-
#if defined(__aarch64__)
23496-
return ggml_aarch64_features.sve_cnt;
23496+
#if defined(__ARM_ARCH)
23497+
return ggml_arm_arch_features.sve_cnt;
2349723498
#else
2349823499
return 0;
2349923500
#endif

0 commit comments

Comments
 (0)