From c0e14f23244834e540d435a3e39fb5331767461d Mon Sep 17 00:00:00 2001 From: juju812 Date: Mon, 20 Jan 2025 20:41:42 +0800 Subject: [PATCH] CPURuntime: Bugfix: check i8mm support by AT_HWCAP2 According to arch/arm64/include/uapi/asm/hwcap.h, HWCAP2_I8MM should be checked via getauxval(AT_HWCAP2) --- source/backend/cpu/CPURuntime.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/backend/cpu/CPURuntime.cpp b/source/backend/cpu/CPURuntime.cpp index c2480a2c1..3fbbb2ad6 100644 --- a/source/backend/cpu/CPURuntime.cpp +++ b/source/backend/cpu/CPURuntime.cpp @@ -24,13 +24,15 @@ #include #include +// HWCAP flags #define CPUINFO_ARM_LINUX_FEATURE_FPHP UINT32_C(0x00000200) #define CPUINFO_ARM_LINUX_FEATURE_ASIMDHP UINT32_C(0x00000400) #define CPUINFO_ARM_LINUX_FEATURE_ASIMDDP UINT32_C(0x00100000) -// ref: https://cs.android.com/android/platform/superproject/+/master:bionic/libc/kernel/uapi/asm-arm64/asm/hwcap.h;drc=04da58f5b3bc40dbbafb4f8422aa2991479d9e1e;l=70 -#define CPUINFO_ARM_LINUX_FEATURE_I8MM UINT32_C(0x00002000) #define CPUINFO_ARM_LINUX_FEATURE_SVE UINT32_C(0x00400000) +// HWCAP2 flags #define CPUINFO_ARM_LINUX_FEATURE_SVE2 UINT32_C(0x00000002) +// ref: https://cs.android.com/android/platform/superproject/+/master:bionic/libc/kernel/uapi/asm-arm64/asm/hwcap.h;drc=04da58f5b3bc40dbbafb4f8422aa2991479d9e1e;l=70 +#define CPUINFO_ARM_LINUX_FEATURE_I8MM UINT32_C(0x00002000) #endif #include @@ -1288,6 +1290,7 @@ static void _getInfoApple(MNNCPUInfo* cpuinfo_isa) { static void _getInfoAux(MNNCPUInfo* cpuinfo_isa) { // Use AUX to get info for linux-aarch64 uint32_t isa_features = 0; + // HWCAP features isa_features = (uint32_t)getauxval(AT_HWCAP); if (isa_features & CPUINFO_ARM_LINUX_FEATURE_ASIMDDP) { cpuinfo_isa->dot = true; @@ -1296,10 +1299,11 @@ static void _getInfoAux(MNNCPUInfo* cpuinfo_isa) { if ((isa_features & fp16arith_mask) == fp16arith_mask) { cpuinfo_isa->fp16arith = true; } + // HWCAP2 features + isa_features = (uint32_t)getauxval(AT_HWCAP2); if (isa_features & CPUINFO_ARM_LINUX_FEATURE_I8MM) { cpuinfo_isa->i8mm = true; } - isa_features = (uint32_t)getauxval(AT_HWCAP2); if (isa_features & CPUINFO_ARM_LINUX_FEATURE_SVE2) { cpuinfo_isa->sve2 = true; }