犀牛鸟 2026 研究笔记 estelledc.github.io

MACE 深度解读

“深入骨髓的硬件适配——为 Hexagon DSP 和 GPU 纹理缓存量身定制的推理引擎”


一句话定位

MACE 是小米开源的移动端 AI 计算引擎,核心差异化在于 Hexagon DSP 整图下推、OpenCL image2d 纹理缓存精细优化和 CPU/GPU 功耗管理。覆盖 Android/iOS/Linux/Windows,聚焦移动端异构计算的深度优化。

设计哲学上最精彩的地方

MACE 最精彩的设计是 OpenCL image2d 纹理缓存的精细映射。移动 GPU 的纹理缓存针对 2D 局部性访问做了硬件优化,但一个 4D tensor 可以用很多种方式映射到 2D image——不同的映射方式对不同的算子性能差异巨大。

MACE 定义了 8 种 BufferContentTypeCONV2D_FILTERIN_OUT_CHANNELARGUMENTIN_OUT_HEIGHTIN_OUT_WIDTHWINOGRAD_FILTERDW_CONV2D_FILTERWEIGHT_HEIGHT。每种 Op 选择最优的映射方式来利用 GPU 纹理缓存的 2D 局部性。

这像是在仓库里存货:传统做法(buffer 模式)是把所有货物排成一长排,找东西要从头走到尾。MACE 的做法是根据取货模式选择最优的货架布局——经常一起取的货物放在同一个货架的相邻格子里。卷积权重、输入特征图、Winograd 变换后的数据各有各的最优”货架布局”。在六个框架中,MACE 对 GPU 纹理缓存的利用粒度是最细的

第二个精彩设计是 Hexagon DSP 整图下推。与其他框架的”逐 Op 执行”不同,MACE 对 Hexagon DSP 采用完全不同的执行模型——整个网络定义和权重一次性发送到 DSP,通过 FastRPC 通信,ION 共享内存实现 CPU <-> DSP 零拷贝。DSP 端接管全部计算,不存在 CPU-DSP 之间的反复数据交换。这相当于把整本菜谱交给 DSP 厨师,让他一口气做完所有菜,而不是每道菜都跑回来问你下一步做什么。

Delegator 模式——运行时内核选择

MACE 的 Operation 层面是常规的 Run() 接口,创新在于 Delegator 中间层。Delegator 用 5 维 key 查找具体内核:{delegator_name, data_type, runtime, impl_type, tag}。其中 tag 允许运行时根据参数动态选择最优实现:1x1 filter 用 K1x1,3x3 stride-1 大通道用 K3x3Winograd,3x3 stride-1 小通道用 K3x3S1,以此类推。

Delegator 在首次 Run() 时惰性创建并缓存。这比 TNN 的 LayerAccFactory 更通用——不仅卷积,BiasAdd/Activation 等也通过 Delegator 分发。但 OpenCL 路径不走 Delegator,因为 image2d 和 buffer 两种 GPU 内存类型需要完全不同的 CL kernel 代码,直接持有对应的 kernel 指针。

功耗管理——移动端独有的关切

MACE 在六个框架中对功耗管理最认真:CPU 大小核绑定(AFFINITY_BIG_ONLY / AFFINITY_LITTLE_ONLY / AFFINITY_POWER_SAVE)、GPU GPUPerfHint / GPUPriorityHint 控制 Adreno GPU 的频率和优先级、DSP SetPower() 直接控制电压/频率角点。还支持自动拆解长时间的 OpenCL 计算任务以保证 UI 渲染的抢占调度。

这些能力在实际产品中至关重要——手机上跑 AI 不是跑得越快越好,而是在性能、功耗和用户体验之间找平衡。其他框架基本把功耗管理交给了操作系统。

局限性与场景边界

MACE 项目维护活跃度近年下降,社区(~5K star)相对较小。不支持 x86 CPU 后端,桌面端部署受限。没有端侧训练和 LLM 推理能力。动态 Shape 支持受限。Hexagon DSP 深度优化的价值与高通芯片强绑定——在非高通平台上 MACE 的差异化优势大打折扣。代码中 image2d 的 8 种映射方式增加了大量格式转换代码,维护复杂度不低。

本地代码结构

mace/
  mace/
    core/
      tensor.h/cc              # Tensor 数据容器(Buffer + Runtime)
      runtime/
        runtime.h              # Runtime 设备抽象基类
        cpu/                   # CPU Runtime
        opencl/                # OpenCL Runtime
        hexagon/               # Hexagon DSP Runtime
      flow/
        base_flow.h/cc         # Flow 子网络生命周期管理
        flow_registry.h        # Flow 注册表
      net/
        base_net.h/cc          # BaseNet Op 拓扑序执行
      memory/
        memory_manager.h       # 内存池(4 种租用方式)
    ops/
      conv_2d.h/cc             # Conv2d Operation
      delegator/               # Delegator 中间层
        conv_2d.h              # Conv2d Delegator 定义
    port/
      arm/                     # ARM NEON 实现
    runtimes/
      opencl/
        core/                  # OpenCL 基础设施
        ops/                   # OpenCL kernel(image + buffer)
      hexagon/
        hexagon_control_wrapper.h  # DSP 整图下推
  tools/
    converter/                 # 模型转换工具

本地关键文件

文件 用途
mace/core/tensor.h Tensor 定义,Buffer + Runtime 指针多态管理
mace/core/flow/base_flow.h Flow 概念,管理子网络完整生命周期
mace/core/runtime/runtime.h Runtime 设备抽象,MapBuffer/UnMapBuffer
mace/ops/delegator/conv_2d.h Delegator 5 维 key 分发机制
mace/runtimes/opencl/ops/ OpenCL image2d/buffer 双路 kernel 实现
mace/runtimes/hexagon/hexagon_control_wrapper.h Hexagon DSP 整图下推接口
mace/core/memory/memory_manager.h 内存池,4 种租用方式(PRIVATE/SHARE/SCRATCH/SLICE)