【问题标题】:Runtime CPU type detection for Android on ARMARM 上 Android 的运行时 CPU 类型检测
【发布时间】:2013-02-22 13:28:10
【问题描述】:

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

【问题讨论】:

    标签: android android-ndk arm neon


    【解决方案1】:

    您可以使用this doc 查看对霓虹灯的支持。要获取核心计数,请阅读 this thread 并查看 this page

    【讨论】:

    • 底线是:是的,检查 /proc 中的 cpuinfo 标志是快速且可靠的。
    • Android 现在推荐使用cpufeatures library(强调现在)。你不应该解析/proccpuinfo
    【解决方案2】:

    您可以使用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();
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用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

      【讨论】:

        【解决方案4】:

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

        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 library 文档,您使用以下 CPU 核心数。不过我没用过。

        int  android_getCpuCount(void);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-10
          • 1970-01-01
          • 2012-01-14
          • 1970-01-01
          相关资源
          最近更新 更多