[Day 06] tinyML的重要推手Arm Cortex-M MCU

[Day 01]时就有提及,未来具有边缘智能(Edge AI)的智慧物联网(AIoT)装置一定少不了单晶片(MCU)。而从[Day 03]更可看出目前市售支援tinyML的开发板可能有九成以上都是使用Arm Cortex-M系列的MCU,所以接下来要来帮大家好好介绍为什麽它会如此受欢迎且占有这麽重要的地位。

首先要先了解一下什麽是MCU?这是一种发展了四十多年的技术,它将运算单元(CPU)、输出入单元(GPIO)、辅助控制单元(Timer, UART, I2C, SPI, ADC等)及记忆体(Flash, SRAM, EEPROM)整合在同一颗晶片上,相当於把一部电脑塞进一个晶片中,故早期亦将MCU称为「微电脑晶片」。近年来更有许多厂商把无线通讯部份(如WiFi, BlueTooth, Zeebee, 4G, 5G等)甚至人工智慧所需的神经运算加速单元(如NPU)加入其中。

MCU的优点是体积小、价格便宜(视功能配置,约US$ 0.5 ~ 20)、功耗极低(mW等级)可使用电池供电、功能强大,从4bit到32bit都有,容易开发,有非常完整的工具链(Tool Chain)及生态体系(Ecosystem),连中小学生在玩的Micro:bit, Arduino开发板都属於MCU的范围。但缺点是系统架构种类及供应商太多,没有统一的开发工具。

另外受限价格因素,通常工作时脉不高(MHz等级),程序及记忆体区域都很小(KByte等级,少数能到MByte),不利大量运算,通常也没有作业系统,仅有少数像Arm Mbed, RTOS能运行在较高阶的MCU上。所以开发出来的程序就很难像手机上的APP一样可以任意运行在不同硬体的手机上。

MCU依属性主要分类方式
Fig. 6-1 MCU依属性主要分类方式。(OmniXRI整理绘制, 2021/9/9)

而MCU依不同属性有不同的分类方式,如Fig. 6-1所示。以下就根据不同属性作一简单说明。

依「工作用途」可分为使用者可完全使用全部资源的「通用型MCU」,和有特定用途,仅需少量程序码或完全不需使用者程序的「专用型MCU」,当然也有两者混合的类型,端看面对的市场而定。

依「处理器结构」可分为冯纽曼结构(von Neumann architecture, 或译为冯.诺依曼)和哈佛结构(Harvard architecture),前者中央处理器和储存装置分开且程序和资料储存在同一个记忆体中,指令和资料不能同时存取,而後者的程序和资料则分开存放在不同的记忆体中,存取时各自有汇流排(Bus),可於同一周期中运行,处理速度较快。

依「指令集家族」又可分为复杂指令集(Complex Instruction Set Computer, CISC)和精简指令集(Reduced Instruction Set Computer, RISC),前者主要代表有Intel 8051系列,而後者常见代表则有Arm Cortex-M, RISC-V, Atmel AVR, Microchip PIC, TI MSP430等系列,後者有指令工作周期短及省电优势,因此目前在MCU领域RISC已逐渐取CISC。

依「指令宽度」可分为4/8/16/32 bit,部份厂商亦有依不同需求而采混合指令宽度,如Arm Cortex-M就有采用Thumb-1(16bit)和Thumb-2(32bit)的作法。

依「程序记忆体」可分为不带(外挂)程序记忆体,由半导体厂直接光罩(MASK)制作(俗称Read-Only Memory, ROM),使用者可一次烧录的(One Time Programmable ROM, OTPROM),可重覆烧录的紫外线抹除式可复写唯读记忆体(Erasable Programmable ROM, EPROM)或电子抹除式可复写唯读记忆体(Electrically-Erasable Programmable ROM, EEPROM)或NOR型快闪记忆体(Flash ROM)。而常用於记忆卡的NAND Flash虽然储存容量很大,但由於存放资料不连续,难以直接用来储存程序码,如一定要用(如导入作业系统),则通常需要搭配大量的随机记忆体(如SRAM, DRAM, DDR等)来使程序能连续存放於记忆体中。

接着就帮大家介绍一下tinyML最重要的推手「Arm Cortex-M MCU」家族。首先要认识一下安谋(Arm)这家公司,它是一家不生产实体积体电路(Integrated Circuit, IC)的公司,它只授权矽智财(Intellectual Property Core, IP)给其它公司整合成实体积体电路。1985年Arm推出第一颗RISC架构的CPU「Arm1」。2004年推出第一颗32bit RISC指令集的MCU IP 「Cortex-M3」,此後接连发展出Cortex-M (MCU)系列,包括M1, M0, M4, M0+, M7, M23, M33, M35P, M55等,有许多知名的厂商都有授权生产不同用途的MCU,如STM, NXP, TI等,国内亦有像新唐(NuvoTon)、盛群(Holtek)、松翰(Sonix)等厂商。

由於Cortex-M系列MCU规格跨度很大,对於不同的tinyML应用,我们需要对一些规格有一些基本认识,方便後续理解如何选用、效能分析及应用场合。在[Day 03]时,我们已提及工作时脉、程序码和随机记忆体的重要性。在[Day 05]也得知如果要使用深度学习卷积神经网路时会产非常巨量的运算需求。因此如果想要加速运算就需要考下列几项因素。

  • 工作时脉:每个指令需要的执行时间有所不同,大多为单指令周期,所以时脉越高,则计算速度越快。以市售MCU来看可从二、三十MHz到五百多MHz。
  • 处理器结构:Cortex-M0, M0+, M1, M23为冯纽曼架构,其余M3, M4, M7, M33, M35P, M55皆为哈佛架构。采用哈佛架构可同时处理指令和资料存取,速度较快。
  • Arm 指令集:可向下相容,高阶运行低阶指令集时不用修改程序。
    • ARMv6-M : 支援Cortex-M0, M0+, M1,32 bit乘法(32 bit输出,32~33指令周期)、大部份指令为16 bit(Thumb-1)指令,少量32 bit(Thumb-2)指令。
    • ARMv7-M : 支援Cortex-M3, 16/32 bit(Thumb-1/2),完整32 bit乘法(64 bit输出,1指令周期)、硬体除法(2~12周期)、乘加(MAC)及部份饱和运算指令。
    • ARMv7E-M : 支援Cortex-M4, M7,扩展DSP(8/16 bit SIMD)指令,1指令周期的乘法及乘加(MAC)、单精度浮点运算(M4, FPv4-SP)、双精度浮点(M4F, M7, FPv5)。
    • ARMv8-M Baseline : 支援Cortex-M23,属於M0+的扩展,加上17或32指令周期的硬体除法,1或32周期的硬体乘法。
    • ARMv8-M Mainline : 支援Cortex-M33, M35P,於M4和M23的交集,11指令周期的硬体除法,可选的FPv5浮点运算。
    • ARMv8.1-M : 支援Cortex-M55,支援单/双精度、DSP扩展、饱和运算及最新的向量扩充指令(M-Profile Vector Extension, MVE),并可支援半精度浮点数(FP16)和8 bit整数(INT8)加速运算。

更完整的Arm Cortex-M系列介绍,可参考Arm官方连结

Arm Cortex-M系列指令集一览表
Fig. 6-2 Arm Cortex-M系列指令集一览表。(资料来源:如文末参考资料二)

不管tinyML运行的是传统机器学习(ML)、深度神经网路(DNN)或卷积神经网路(CNN),大量的矩阵(MAC, 乘加)计算都是免不了的,所以如果单指令就能完成一次乘加动作,就比起要分成一次乘法(多周期)和一次加法快上至少两倍。若再加上单指令多资料流(Single Instruction Multiple Data, SIMD)指令,那就能让一个32 bit的指令再分拆成2个 16bit或4个8bit整数指令运算,如此就能让运算速度再提升2到4倍。如果不懂这些加速的程序如何撰写或优化,则还可利用Arm提供的CMSIS(Common Microcontroller Software Interface Standard)函式库来协助,这部份就留待後续章节再补充说明。

综合上述硬体规格来看,似乎Cortex-M4刚好是一个一个分界点,它支援单周期乘加、浮点运算及SIMD指令集,相当於一个指令周期可发挥2~8倍甚至更高功效,同时配置有较大的程序码和随机记忆体区,不仅可以容纳较大的神经网路模型和参数,亦可选择性的布署Arm Mbed作业系统,这对於後续tinyML的小型Edge AI应用程序开发有很大的帮助。至於M3以下的MCU就留给像智慧感测器等更小的应用了。

参考连结


<<:  铁人赛 Day21 -- Bootstrap 初体验

>>:  Day 06 - Lenses (Basic)

知名云服务供应商 Liquid Web 收购 WordPress 群众募资外挂 GiveWP

说起群众募资,有时是开始新产品、新服务或各种古怪的新奇事物。但也有典型的例如线上课程、解决某一件社...

Day19 将电脑接上数据机和网路线

到目前为止,我试玩过 CC: Tweaked Disk Drive、Speaker、Printer、...

什麽是MVC框架? 如何用UML建模?

MVC模式的架构元件被设计用来处理开发中的应用程序的不同方面。MVC设计模式的作用是将表现层与业务逻...

OpenSSL

OpenSSL 是一个开源命令行工具,通常用於生成私钥、创建 CSR、安装 SSL/TLS 证书以及...