3

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

4

4 回答 4

3

您可以使用此文档检查对霓虹灯的支持。要获取核心计数,请阅读此线程并查看此页面

于 2013-02-22T13:52:56.307 回答
1

你可以用耶普!库以获取有关 CPU 的大量信息。此信息也可通过 Java 绑定访问,因此您可以在类中定义多个本地方法,例如processGeneric()and 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();
}
于 2013-02-23T09:01:35.080 回答
0

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

此外,使用该/proc/cpuinfo文件检查是否支持霓虹灯。

ABI

示例代码

@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行。

顺便提一句

上面描述的那些方法试图避免使用本机库。如果您想了解有关 cpu 的更多详细信息,请尝试使用官方 NDK 库cpufeatures。还有一个ndk-sample

于 2016-10-09T02:58:04.913 回答
-1

由于您有 NDK 标记,因此这是一个 C 上下文答案。在使用现代 NDK 时,我相信您应该使用 Android 的cpu-features 库

复制cpu-features.hcpu-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 库文档,您使用以下 CPU 核心数。不过,我从未使用过它。

int  android_getCpuCount(void);
于 2018-07-08T05:31:24.633 回答