ARM上Android的运行时CPU类型检测
从正在运行的C应用程序中确定CPU类型的最简单方法是什么?我感兴趣的是确定当前CPU有多少个内核,以及它是否有一个霓虹灯单元。一个简单的解决方案是在/proc中检查cpuinfo标志,但我不确定这是否是一种快速可靠的方法。您可以使用检查霓虹灯支持。读取内核计数并查看。您可以使用它来获取大量有关CPU的信息。此信息也可以通过Java绑定访问,因此您可以在类中定义几个本机方法,例如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
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);