CPU特性
=====

CPU特性是CPU提供的一些硬件扩展。开发者可以通过调用指令，设置特殊寄存器来使用这些CPU特性，例如ARMv7a架构上的VFP-v32d32、NEON、IDIV、AES等CPU特性。很多CPU特性是可选的，不同厂商的CPU通常有不同的特性。

在HarmonyOS原生库开发中，如何使用CPU特性？如何在代码中处理CPU特性相关的代码？本章节将提供一些方法，以便帮助开发者开发出既能保持兼容性，又能利用CPU特性能力的应用。

HarmonyOS系统当前没有提供获取CPU特性的接口，开发者可以导入现有开源社区的库函数，具体可以参考如下的例子；也可直接读取/proc/cpuinfo，或者调用libc getauxval(AT\_HWCAP)接口来获取设备的CPU特性。

#### 使用建议

1.  在HarmonyOS系统C++工程中引入开源库，下载[cpu\_features库](https://github.com/google/cpu_features)，解压到工程的cpp目录下，解压后的文件名改为cpu\_features。如下以DevEco Studio C++模板示例应用举例：
    
    *   解压后目录结构如下
        
        MyApplication
          |-- entry
           |-- src
                |-- main
                     |-- cpp
                         |--cpu\_features
                         |--CMakeLists.txt
                         |--hello.cpp
        
    *   在CMakeLists.txt添加导入目录
        
        add\_subdirectory(cpu\_features) # 添加子目录到工程
        target\_link\_libraries(entry PUBLIC cpu\_features) # 添加需要链接依赖的库文件
        
2.  在代码中加入判断CPU特性支持能力语句，如下以支持ARM与AARCH64两种架构举例：
    
    // ...
    // 包含CPU架构目标检测头文件
    #include "cpu\_features\_macros.h"
    // 在ARM架构上，这个宏在上面头文件中根据目标自动定义
    #if defined (CPU\_FEATURES\_ARCH\_ARM)
    #include "cpuinfo\_arm.h" // 包含ARM架构的cpuinfo头文件
    #elif defined (CPU\_FEATURES\_ARCH\_AARCH64)
    #include "cpuinfo\_aarch64.h" // 包含ARM64架构的cpuinfo头文件
    #endif
    // C++代码, 需要添加\`using namespace cpu\_features;\`
    // 根据不同架构，获取相应的CPU特性信息；
    #if defined (CPU\_FEATURES\_ARCH\_ARM)
    static const ArmFeatures features = GetArmInfo().features;
    #elif defined (CPU\_FEATURES\_ARCH\_AARCH64)
    static const Aarch64Features features = GetAarch64Info().features;
    #endif
    void Compute(void) {
      // 根据features的字段进行支持CPU features的特性判断
      if (features.aes) {
        // ...
      } else {
        // ...
      }
    }
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/10/v3/HjBj_XRZSgetT_2yRJmHzw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073816Z&HW-CC-Expire=86400&HW-CC-Sign=1906DA8EE571DA7CC32D102C1C2D685D7D8A4F9CA0B2FE3C0AAA5C17B02B2C2D)
    
    cpu\_features库实际上是通过/proc/cpuinfo，与getauxval接口从内核中读取对应的CPU特性信息，有可能由于应用沙盒的原因导致无法读取对应的信息，注意错误处理。