ARM上Android的运行时CPU类型检测

ARM上Android的运行时CPU类型检测,android,android-ndk,arm,neon,Android,Android Ndk,Arm,Neon,从正在运行的C应用程序中确定CPU类型的最简单方法是什么?我感兴趣的是确定当前CPU有多少个内核,以及它是否有一个霓虹灯单元。一个简单的解决方案是在/proc中检查cpuinfo标志,但我不确定这是否是一种快速可靠的方法。您可以使用检查霓虹灯支持。读取内核计数并查看。您可以使用它来获取大量有关CPU的信息。此信息也可以通过Java绑定访问,因此您可以在类中定义几个本机方法,例如processGeneric()和processNeon(),并仅在CPU支持的情况下调用NEON方法: import

从正在运行的C应用程序中确定CPU类型的最简单方法是什么?我感兴趣的是确定当前CPU有多少个内核,以及它是否有一个霓虹灯单元。一个简单的解决方案是在/proc中检查cpuinfo标志,但我不确定这是否是一种快速可靠的方法。

您可以使用检查霓虹灯支持。读取内核计数并查看。

您可以使用它来获取大量有关CPU的信息。此信息也可以通过Java绑定访问,因此您可以在类中定义几个本机方法,例如
processGeneric()
processNeon()
,并仅在CPU支持的情况下调用NEON方法:

import info.yeppp.Library;
import info.yeppp.ArmCpuSimdFeature;
import info.yeppp.CpuMicroarchitecture;

if (Library.isSupported(ArmCpuSimdFeature.NEON)) {
    if (Library.getMicroarchitecture().equals(CpuMicroarchitecture.Krait)) {
        /* Special NEON implementation for recent Qualcomm processors */
        nativeClass.processKrait();
    } else {
        /* Generic NEON implementation */
        nativeClass.processNeon();
    }
} else {
    /* Generic implementation without NEON */
    nativeClass.processGeneric();
}

您可以使用
Build.SUPPORTED_ABIS
检查CPU Abi版本(例如,arm64-v8a、armeabi-v7a等)

此外,还支持使用
/proc/cpuinfo
文件进行检查

阿比 示例代码

@SuppressWarnings("deprecation")
public static List<String> getSupportedABIs() {
    if (Build.VERSION.SDK_INT >= 21) {
        return Arrays.asList(Build.SUPPORTED_ABIS);
    } else {
        return Arrays.asList(Build.CPU_ABI, Build.CPU_ABI2);
    }
}
霓虹的 下面是“cat/proc/cpuinfo”的示例输出

shell@mako:/ $ cat /proc/cpuinfo
Processor   : ARMv7 Processor rev 2 (v7l)
processor   : 0
BogoMIPS    : 13.53

processor   : 1
BogoMIPS    : 13.53

processor   : 2
BogoMIPS    : 13.53

processor   : 3
BogoMIPS    : 13.53

Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x51
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0x06f
CPU revision    : 2

Hardware    : QCT APQ8064 MAKO
Revision    : 000b
Serial      : 0000000000000000
注意
功能
行。它包含CPU支持的所有功能。注意:将列出
neon
功能

因此,检查当前设备是否支持
neon
,最简单的方法是创建一个
InputStreamReader(“/proc/cpuinfo”)
,然后读取
功能

顺便提一下 上述方法试图避免使用本机库。
如果您想了解有关cpu的更多详细信息,请尝试官方NDK库。还有一个.

因为您有NDK标记,所以这里有一个C上下文答案。当使用现代NDK时,我相信你应该使用Android的

cpu features.h
cpu features.c
$ANDROID\u NDK\u ROOT/sources/ANDROID/cpufeatures
复制到项目源代码树中。将其作为源代码的一部分进行编译

然后


。。。从正在运行的C应用程序中确定CPU类型

要测试CPU是否为ARMv7,请执行以下操作。Android文档声明首先使用
Android\u getcpuffamily()
测试该系列


。。。当前CPU有多少个内核,是否有霓虹灯单元

要测试霓虹灯,请使用以下代码。在ARMv8/Aarch64上,NEON被称为ASIMD

bool HasNEON()
{
#if defined(__ANDROID__) && defined(__aarch64__)
    if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
        ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
            return true;
#elif defined(__ANDROID__) && defined(__arm__)
    if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
        ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
            return true;
#endif
     return false;
}
根据文档,您使用以下内容进行CPU核心计数。不过我从来没用过

int  android_getCpuCount(void);

底线是:是的,在/proc中检查cpuinfo标志是快速可靠的。Android现在建议使用(现在强调)。您不应该解析
/proc
cpuinfo
bool HasNEON()
{
#if defined(__ANDROID__) && defined(__aarch64__)
    if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
        ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
            return true;
#elif defined(__ANDROID__) && defined(__arm__)
    if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
        ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
            return true;
#endif
     return false;
}
int  android_getCpuCount(void);