在正在运行的C应用程序中确定CPU类型的最简单方法是什么?我有兴趣确定当前CPU有多少核心以及它是否有NEON单元。一个简单的解决方案可能是检查/ proc中的cpuinfo标志,但我不确定它是否是一种快速可靠的方法。
答案 0 :(得分:3)
您可以使用this doc检查霓虹灯支持。要将核心数量设为this thread,请查看this page。
答案 1 :(得分:1)
您可以使用Yeppp! library获取有关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();
}
答案 2 :(得分:0)
您可以使用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);
}
}
示例输出是:
| device | arch | Abi list
| Moto Nexus 6 | arm 32bit | [armeabi-v7a, armeabi]
| Huawei Mate 8 | arm 64bit | [arm64-v8a, armeabi-v7a, armeabi]
| OPPO R7s | arm 64 bit | [arm64-v8a, armeabi-v7a, armeabi]
| Moto X Style | arm 64 bit | [arm64-v8a, armeabi-v7a, armeabi]
以下是'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
注意Features
行。它包含CPU支持的所有功能。注意:列出了neon
功能。
因此,检查当前设备是否支持neon
非常简单,只需创建InputStreamReader("/proc/cpuinfo")
,然后阅读Features
行。
上述方法试图避免使用本机lib。 如果您想了解有关cpu的更多详细信息,请试用官方NDK库cpufeatures。还有ndk-sample。
答案 3 :(得分:-1)
由于您具有NDK标签,因此这里是C上下文答案。我相信使用现代NDK时,您应该使用Android的cpu-features library。
将cpu-features.h
中的cpu-features.c
和$ANDROID_NDK_ROOT/sources/android/cpufeatures
复制到项目源代码树。将其编译为源代码的一部分。
然后...
...从正在运行的C应用程序中确定CPU类型?
要测试CPU是否为ARMv7,请执行以下操作。 Android文档规定首先使用android_getCpuFamily()
测试该系列。
bool IsARMv7()
{
#if defined(__ANDROID__) && (defined(__aarch64__) || defined(__arm__))
if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0))
return true;
#endif
return false;
}
...当前CPU拥有多少个内核以及是否具有NEON单元
要测试NEON,请使用以下代码。 NEON在ARMv8 / Aarch64上称为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-features library文档,您将以下内容用于CPU内核计数。不过,我从未使用过它。
int android_getCpuCount(void);