在MAX78000上开发功耗优化应用

描述

功耗是边缘人工智能 (AI) 应用的关键因素,其中整个系统由小型电池供电,预计无需充电或更换电池即可运行数月。MAX78000超低功耗AI微控制器专为物联网边缘的此类应用而设计。本文介绍了各种配置,使用户能够在MAX78000上开发功耗优化应用,并提供基准测试示例。功耗优化方法应用于两个案例研究应用:20个关键词的关键词发现(KWS20)和人脸识别(FaceID),报告的结果可作为用户应用的指南。

介绍

MAX78000为超低功耗微控制器,具有专用卷积神经网络(CNN)加速器。这种架构能够在能源受限的环境中开发非常节能的 AI 应用程序。MAX78000提供多种选择,便于开发低功耗应用(详见数据资料[1]),例如可根据目标应用选择不同的振荡器、时钟源和工作模式。以下部分概述了这些选项,包括MAX78000评估板的实际示例和实际测量结果。有关详细信息,请遵循本文档中的参考资料。

注:本应用笔记给出的测量结果基于MAX78000评估板上的示例代码。用户平台和特定应用程序的实际结果可能会有所不同。

MAX78000

MAX78000是新一代AI微控制器,用于以超低功耗执行神经网络,并位于物联网边缘。该产品将最节能的AI处理与Maxim Integrated成熟的超低功耗微控制器相结合。基于硬件的 CNN 加速器使电池供电的应用程序能够执行 AI 推理,同时仅消耗微焦耳的能量。MAX78000具有带FPU微控制器的Atarm Cortex-M4,通过超低功耗深度神经网络加速器实现高效的系统控制。还集成了一个RISC-V内核,可以执行应用和控制代码以及驱动CNN加速器。图1所示为MAX78000的顶层架构。

微控制器

图1.MAX78000的结构

MAX78000评估板(EV kit)提供了一个平台,利用MAX78000的功能构建新一代AI器件。评估板具有板载硬件,如数字麦克风、串行端口、摄像头模块支持和3.5英寸触摸彩色薄膜晶体管(TFT)显示屏[2]。它还包括用于监控和显示功率电平的电路。MAX34417 [3] 监测 VCOREA 和 VCOREB 电压以及

微控制器

图2.电源监视器。

MAX78000,并将累积功率报告给MAX32625,MAX2用作电源数据处理器,同时控制功率显示,如图<>所示。

电源监视器以两种模式运行;瞬时,显示平均功率、电源电流和电压,以及窗口能量累积,根据触发事件测量 CNN 功率或总系统功率。瞬时测量通常用于快速、粗略地估计功率电平。另一方面,窗口测量非常适合测量用户定义的开始实例和完整实例之间的累积能量。这些事件由MAX78000的两个GPIO(P0.2和P0.3)的切换触发,这两个GPIO也连接到LED1和LED2以及MAX32625功率数据处理器的端口。有关使用电源监视器的详细信息,请参阅 [4]。

MAX78000时钟和工作模式

MAX78000支持不同的时钟源和低功耗工作模式,可联合配置以实现优化的功耗和性能。本应用笔记简要介绍了每种模式,以指导读者根据所需应用设置模式。有关更详细的描述,请参阅 [5]。

时钟

MAX78000包括多个可配置时钟,供不同外设使用。用户可以根据需要配置时钟源,以选择性能和电源效率的组合。选定的系统振荡器(SYS_OSC)是大多数内部模块的时钟源。以下振荡器源可用,可以选择SYS_OSC:

内部初级振荡器 (IPO) – 100MHz:
IPO 是频率最快的振荡器,消耗的功率最大。当进入低功耗模式(LPM)时,该振荡器可以关断。

内部次级振荡器 (ISO) – 60MHz:
这是一款低功耗内部次级振荡器,是SYS_OSC的上电复位默认设置。

内部纳米环振荡器 (INRO) – 8kHz-30kHz:
INRO 是一种超低功耗内部振荡器,可以选择作为SYS_OSC并始终启用。频率可配置为 8kHz、16kHz 或 30kHz(默认)。

内部波特率振荡器 (IBRO) – 7.3728MHz:
这是一款功耗非常低的内部振荡器,可以选择作为SYS_OSC。该时钟可以选择用作UART的专用波特率时钟。

外部实时时钟振荡器 (ERTCO) – 32.768kHz:
ERTCO 是一款功耗极低的内部振荡器,可以选择作为SYS_OSC。ERTCO可以选择使用32.768kHz输入时钟或8kHz独立纳米环振荡器代替外部晶体。该振荡器是实时时钟 (RTC) 的默认时钟,一旦启用 RTC,就会自动启用。

所选SYS_OSC是系统振荡器分频器的输入,用于生成系统时钟 (SYS_CLK)。分频器可在 0 到 7 之间选择,得到 1、2、4、8、16、32、64 或 128 的除数。SYS_CLK驱动带有 FPU 内核的 Arm Cortex-M4,以及系统中的所有高级高性能总线 (AHB) 主站。通过两个分频器的固定分频后,它还可以生成高级外设总线(APB)时钟,为CNN加速器、RISC-V和外设供电。有关时钟源、配置和要设置的寄存器列表的更多详细信息,请参阅 [3] 的第 1.5 节。

表 1 中列出了用于设置时钟的 API。

 

应用程序接口 描述
int MXC_SYS_ClockSourceEnable (mxc_sys_system_clock_t clock) 启用时钟源而不选择它;以下来源可用:
MXC_SYS_CLOCK_IPO、MXC_SYS_CLOCK_IBRO、MXC_SYS_CLOCK_ISO、MXC_SYS_CLOCK_INRO、MXC_SYS_CLOCK_ERTCO MXC_SYS_CLOCK_EXTCLK
int MXC_SYS_Clock_Select (mxc_sys_system_clock_t clock) 选择要用于SYS_CLK的时钟源;有关列表,请参阅时钟部分
void SystemCoreClockUpdate(void) 根据所选时钟源更新系统核心时钟
无效MXC_SYS_ClockEnable(mxc_sys_periph_clock_t时钟) 支持外设时钟:
MXC_SYS_PERIPH_CLOCK_GPIO0 至 2
MXC_SYS_PERIPH_CLOCK_DMA
MXC_SYS_PERIPH_CLOCK_SPI0和 1
MXC_SYS_PERIPH_CLOCK_UART0 至 3
MXC_SYS_PERIPH_CLOCK_I2C0 至 2
MXC_SYS_PERIPH_CLOCK_TMR0 至 5
MXC_SYS_PERIPH_CLOCK_ADC
MXC_SYS_PERIPH_CLOCK_CNN
MXC_SYS_PERIPH_CLOCK_PT
MXC_SYS_PERIPH_CLOCK_TRNG
MXC_SYS_PERIPH_CLOCK_SMPHR
MXC_SYS_PERIPH_CLOCK_OWIRE

MXC_SYS_PERIPH_CLOCK_CRC MXC_SYS_PERIPH_CLOCK_AES
MXC_SYS_PERIPH_CLOCK_I2S
MXC_SYS_PERIPH_CLOCK_PCIF
MXC_SYS_PERIPH_CLOCK_WDT0
MXC_SYS_PERIPH_CLOCK_CPU1 // RISC-V 时钟
MXC_SYS_PERIPH_CLOCK_WDT1
MXC_SYS_PERIPH_CLOCK_LPCOMP1 至 3
无效MXC_SYS_ClockDisable(mxc_sys_periph_clock_t时钟) 禁用外设时钟;有关列表,请参阅时钟部分

 

操作模式

MAX78000包括多种工作模式,能够微调电源选项以优化性能和功耗。系统支持以下操作模式,如表 2 所示。

 

Operation Mode Arm RISC-V Oscillators System CNN Quadrants CNN RAM Peripherals
ACTIVE On On All available Available Active, Configurable Active, Configurable Available
SLEEP Retention On/ Retention All available Available Active, Configurable Active, Configurable Available
LPM Retention On/ Retention ISO, IBRO,
ERTCO, INRO
0,1: Retention
2,3: Available
Active, Configurable Active, Configurable Available
UPM Retention Retention IBRO,
ERTCO, INRO
Retention Optionally off Selectable retention Retention,
LPUART0, LPTMR0-1 LPWDT0, LPCOMP0-3,
GPIO, WUT, RTC available
STANDBY Retention Retention IBRO,
ERTCO, INRO
Retention Off Selectable retention Retention,
WUT, RTC, COMP0, GPIO available
BACKUP Off Off ERCO Configurable
retention
Off Selectable retention Off
WUT, RTC, COMP0, GPIO available
POWER
DOWN
Off Off Off Off Off Off Off,
Configurable P3.0/1
             

 

活动模式:

在这种模式下,Arm 和 RISC-V 内核都可以执行应用代码,并且所有数字和模拟外设均可按需提供。动态时钟禁用未使用的外设,提供高性能和低功耗的最佳组合。每个外设都可以在活动模式下单独使能或断电。CNN 和四个 CNNx16_n 处理器阵列中的每一个及其相关存储器都可以根据需要关闭电源或设置为活动状态。

睡眠模式:

当 Arm 或 RISC-V 执行代码时,可以使用此模式,在此期间,另一个进入睡眠状态以降低功耗。可以选择启用时钟以加快唤醒过程。CNN 可供使用,四个CNNx16_n象限中的每一个都可以单独配置为关断。除非明确禁用,否则所有外围设备均处于打开状态

 

To enter SLEEP Mode:
     SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;  // Needed just once

Either directly set sleep mode bit in MXC_GCR->pm register, or use WFI instruction:
•  MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
MXC_GCR->pm   |= MXC_S_GCR_PM_MODE_CM4;
•  Or use WFI:
o   Arm:  __WFI(); // Enter to sleep and wait for interrupt to wake up
o   RISC-V: asm volatile("wfi");

To enter into this mode on Arm, MXC_LP_EnterSleepMode() API call can also be used.

 

低功耗模式:

如果RISC-V希望在Arm处于深度睡眠状态时从启用的外设收集和移动数据,则可以使用此模式。如果未使用 RISC-V 并且处于睡眠模式,则 Arm 还可以处理数据并在外围设备或 CNN 处于活动状态并在中断时唤醒时切换到 LPM。Arm、DMA 和 SPI0 处于状态保留状态。CNN 象限、内存和其他外设处于活动状态且可配置。请注意,CNN 只能唤醒 RISC-V,而不能唤醒 LPM 中的 Arm。在这种情况下,如果 CNN 处理时间已知,则唤醒计时器 (WUT) 可用于唤醒 Arm。或者,CNN中断可以唤醒RISC-V,RISC-V反过来可以唤醒Arm,然后RISC-V可以重新进入睡眠状态。

 

Before going to LPM:
Make sure the clock source is enabled during LPM in MXC_GCR->pm, for example:
 MXC_GCR->pm &= ~MXC_F_GCR_PM_ISO_PD;  // enable ISO during sleep

Power Sequencer Registers (PWRSEQ) are used to configure clock source and wake up source. The clock source for peripherals and RISC-V needs to be specified. By default, it uses ISO during LPM. If needed, set this field to 1 to use the PCLK (APB Clock = SYS_CLK/2)
PWRSEQ_LPCN ->lpcn |= MXC_F_PWRSEQ_LPCN_LPMCLKSEL;

The wakeup source of the low power peripheral (e.g GPIO, RISC-V) needs to be enabled. For example:
MXC_PWRSEQ->lppwen |= MXC_F_PWRSEQ_LPPWEN_CPU1;  // wake up on RISC-V interrupt

To enter LPM:
     SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;  // Needed just once
     /* Write 1 to clear */
    MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
    MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
    MXC_PWRSEQ->lppwst  = 0xFFFFFFFF; 
    MXC_MCR->ctrl |= MXC_F_MCR_CTRL_ERTCO_EN; // enable ERTCO 

Either directly set sleep mode bit in MXC_GCR->pm register, or use WFI instruction:
  • MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE; MXC_GCR->pm |= MXC_S_GCR_PM_MODE_LPM;
  • Or use WFI:
    • Arm:__WFI(); // Enter to deepsleep, wait for interrupt to wake up

 

在LPM中,IPO断电,应使用IBRO,ERTCO,INRO或ISO。

注意:如果 Arm 内核进入 LPM,RISC-V 可以根据需要继续执行并进入睡眠状态。如果需要在两个内核之间管理 LPM 的入口,则可以使用多处理器通信来确保两个内核都处于已知状态。有关详细信息,请参阅 [3] 中的第 3.3.5 节。

微功耗模式:

此模式用于极低的功耗,同时使用最少的外设集来提供唤醒功能。在此模式下,将保留 Arm 和 RISC-V、系统和 CNN RAM 以及非 UPM 外设的状态。CNN 象限可以关闭。IPO 和 ISO 振荡器断电,IBRO、ERTCO和INRO启用。以下外设可用作唤醒源:WUT、LPUART0、LPTMR0、LPTMR1、LPWDT0、LPCOMP0-LPCOMP3 和 GPIO

 

To enter UPM Mode:
      /* Write 1 to clear */
     MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
     MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
     MXC_PWRSEQ->lppwst  = 0xFFFFFFFF; 
     MXC_MCR->ctrl |= MXC_F_MCR_CTRL_ERTCO_EN; // enable ERTCO 

Set UPM mode bit in MXC_GCR->pm register:
      MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
MXC_GCR->pm |= MXC_S_GCR_PM_MODE_UPM;

To enter into this mode on Arm, MXC_LP_EnterDeepSleepMode() API call can also be used.

 

这种模式在低活动循环应用中最有利于节省能源。

为了确保确定性地进入 UPM 模式,Arm 和 RISC-V 可能需要使用多处理器通信进行同步。有关更多信息,请参阅 [3] 中的第 3.4.5 节。

待机模式:

在此模式下,RTC 运行时保留系统状态;Arm、RISC-V、System RAM、GPIO 和外设也保留其状态。CNN 象限关闭,CNN 内存具有可选择的保留。IPO 和 ISO 振荡器断电,ERTCO、INRO 和 IBRO 启用。如果需要对应用进行占空比,此模式可提供进一步的功耗降低。

 

To enter STANDBY Mode:
     /* Write 1 to clear */
    MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
    MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
    MXC_PWRSEQ->lppwst = 0xFFFFFFFF; 
    MXC_MCR->ctrl |= MXC_F_MCR_CTRL_ERTCO_EN; // enable ERTCO 

Set STANDBY mode bit in MXC_GCR->pm register:
    MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
    MXC_GCR->pm |= MXC_S_GCR_PM_MODE_STANDBY;

To enter into this mode on Arm, MXC_LP_EnterStandbyMode() API call can also be used.
 

为了确保确定性地进入待机模式,Arm 和 RISC-V 可能需要使用多处理器通信进行同步。有关更多信息,请参阅 [3] 中的第 3.5.5 节。

备份模式:

此模式用于保留系统内存。在此模式下,Arm、RISC-V、所有外设和除 ERTCO 之外的所有振荡器都将关闭电源。系统 RAM 0-3 可以独立配置为使用 PWRSEQ_LPCN 寄存器保留状态。

进入备份模式不需要 Arm 和 RISC-V 之间的同步,任何一个内核都可以将 GCR_PM.mode 设置为 BACKUP,这会导致设备立即进入 BACKUP。

 

To enter BACKUP Mode:
     /* Write 1 to clear */
    MXC_PWRSEQ->lpwkst0 = 0xFFFFFFFF;
    MXC_PWRSEQ->lpwkst1 = 0xFFFFFFFF;
    MXC_PWRSEQ->lppwst  = 0xFFFFFFFF; 

 Set BACKUP mode bit in MXC_GCR->pm register:
    MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
    MXC_GCR->pm |= MXC_S_GCR_PM_MODE_BACKUP

To enter into this mode on Arm, MXC_LP_EnterBackupMode() API call can also be used.
 

掉电模式:

此模式在产品级别的分发和存储期间使用。ARM、RISC-V、存储器、外设和振荡器均断电。在此模式下没有数据保留,但闪存中的值会保留。在此模式下,V雷吉POR电压监视器正在运行。

如果已配置,可通过外部复位 (RSTN) 或 P3.0 或 P3.1 上的唤醒事件退出 PDM。

To enter PDM Mode:
 MXC_GCR->pm &= ~MXC_F_GCR_PM_MODE;
 MXC_GCR->pm |= MXC_S_GCR_PM_MODE_POWERDOWN

To enter into this mode on Arm, MXC_LP_ShutDownMode() API call can also be used.

唤醒配置

需要将 Arm 和 RISC-V 配置为在发生唤醒事件时唤醒。有关不同操作模式下的唤醒源列表,请参阅 [3] 中的第 4.5 节。

手臂唤醒配置:

应启用中断。在 SLEEP 的情况下,Arm 内核会唤醒 after__WFI() 以响应任何中断。

对于低功耗模式,需要启用唤醒源:

在电源排序器寄存器 (PWRSEQ) 中:在低功耗外设唤醒中启用外设和特定 GPIO 源 启用寄存器(PWRSEQ_LPWKEN0 至 3,PWRSEQ_LPPWEN)

在全局控制寄存器 (GCR) 中:在电源管理寄存器 (GCR_PM) 中启用 GPIO 唤醒使能和 RTC 报警唤醒启用

Example of Arm wakeup configuration: 
Wakeup from LPM on GPIO:
 MXC_GCR->pm  |= MXC_F_GCR_PM_GPIO_WE;  // enable wakeup from GPIOs
 MXC_PWRSEQ->lpwken2 |= (1 << 7);   // Pb2: GPIO2.7 is selected for wakeup

Wakeup from LPM on RISC-V interrupt:
 MXC_PWRSEQ->lppwen |= MXC_F_PWRSEQ_LPPWEN_CPU1; // wakeup on RISC-V interrupt

RISC-V 唤醒配置:

要将RISC-V配置为在中断时唤醒,需要启用IRQ和EVENT。

Example of RISC-V wakeup configuration: 
 __enable_irq();
 NVIC_EnableIRQ(CNN_IRQn);
 NVIC_EnableEVENT(CNN_IRQn);

表 3 显示了 Arm 和 RISC-V 代码的示例。Arm 进入 LPM(深度睡眠),RISC-V 初始化并启动 CNN,然后进入睡眠状态,直到 CNN 推理完成。之后,CNN中断唤醒RISC-V,然后唤醒ARM也。

有关此示例的完整代码,请参阅 [6]。

 

Arm RISC-V
mnist-riscv
int main(void)
{
MXC_ICC_Enable(MXC_ICC0); // 启用缓存
// 切换到 100 MHz 时钟
MXC_SYS_Clock_Select(MXC_SYS_CLOCK_IPO);
SystemCoreClockUpdate();
设置 RISC-V 引导地址
MXC_FCR->urvbootaddr = (uint32_t) &__FlashStart_;
启用森帕霍尔时钟MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SMPHR);设置唤醒 ISR NVIC_SetVector(RISCV_IRQn, WakeISR
); 不要删除此行:
MXC_Delay(SEC(2));如果需要,让调试器中断 启用 RISC-V 时钟
MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CPU1);
转到 LPM,等待 RISC-V 唤醒
MXC_LP_ClearWakeStatus();
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // SLEEPDEEP=1
__WFI(); // 转到深度睡眠,让 RISC-V 运行
返回 0;
} void WakeISR(void)
{
MXC_SEMA->irq0 = MXC_F_SEMA_IRQ0_EN & ~MXC_F_SEMA_IRQ0_CM4_IRQ;
}
int main(void)
{
Debug_Init(); // 设置 RISCV JTAG
MXC_ICC_Enable(MXC_ICC1); // 启用缓存 使能外设, CNN 中断, CNN 时钟 // CNN 时钟
: 50 MHz 分区 1
cnn_enable(MXC_S_GCR_PCLKDIV_CNNCLKSEL_PCLK, MXC_S_GCR_PCLKDIV_CNNCLKDIV_DIV1); cnn_init();使状态机进入一致的状态
cnn_load_weights();加载内核
cnn_load_bias();
cnn_configure();配置状态机
load_input();加载数据输入

cnn_start(); // 在 (cnn_time == 0)
asm volatile(“WFI”) 时启动 CNN 处理; 睡眠,等待 CNN 完成 // 现在信号 Arm 唤醒
MXC_SEMA->irq0 = MXC_F_SEMA_IRQ0_EN |MXC_F_SEMA_IRQ0_CM4_IRQ;
} int cnn_enable(uint32_t clock_source, uint32_t clock_divider)
{ // 重置所有域,恢复 CNN 的电源 MXC_BBFC->reg3 = 0xf; // 重置 MXC_BBFC->reg1 = 0xf; // 屏蔽内存
MXC_BBFC->reg0 = 0xf; // Power
MXC_BBFC->reg2 = 0x0; // iso

MXC_BBFC->reg3 = 0x0; /
/ 重置
MXC_GCR->pclkdiv = (MXC_GCR->pclkdiv & ~(MXC_F_GCR_PCLKDIV_CNNCLKDIV |MXC_F_GCR_PCLKDIV_CNNCLKSEL))
|clock_divider |clock_source;
启用 CNN 时钟MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CNN);
在 CNN
上启用中断和唤醒完成 __enable_irq();
NVIC_EnableIRQ(CNN_IRQn);
NVIC_EnableEVENT(CNN_IRQn);
返回CNN_OK;
}

 

不同模式下的功耗

在开发应用时,用户可以将MAX78000切换到不同的工作模式,并相应地安排任务以节省功耗。了解每种操作模式下的功耗以及启动或唤醒所需的时间,有助于用户选择合适的模式并规划任务的占空比。电源监视器可在系统电源模式 [4] 下使用,以测量几种情况下的功耗和唤醒或启动时间。在此测试中,RISC-V和外围设备关闭,Arm在不同的操作模式下进行测试。对于唤醒时间测试,RISC-V用作Arm的唤醒源。 图3显示了该实验的结果。使用ISO振荡器在60MHz下测量活动功率和睡眠功率。其他低功耗模式在休眠期间采用 ERTCO (32kHz)(API 默认值)。

还测试了不同时钟频率的启动时间(定义为从上电到开始执行主代码的时间)和唤醒时间,如图4所示。唤醒时间随所选时钟频率进行缩放。启动时间以上电默认时钟(ISO 在 60MHz)测量。

微控制器

图3.不同运行模式下的功耗。

微控制器

图4.不同频率的启动和唤醒时间。

美国有线电视新闻网电源

人工智能应用程序的核心是由CNN加速器执行的推理。根据应用程序的不同,推理可以连续地对传入的数据进行,也可以按特定的时间间隔定期进行。CNN推理可以在输入数据准备就绪后开始(例如KWS案例研究),也可以在FIFO模式下(例如FaceID示例)开始,一旦FIFO中存储了足够的数据来开始该过程,它就会开始。CNN 功耗分三个阶段测量:

加载权重(内核):在活动模式下将权重加载到 CNN 内存中发生一次

加载输入数据:每次有新的推理时。在FIFO模式下,它可以与推理重叠

推理:对输入数据进行操作并生成分类结果

功率监视器使用 GPIO 信号触发每个事件,并在 CNN 功率模式下测量每个相位的功率 [4]。为了进行测量,在Maxim SDK中选择了两个示例:KWS20和FaceID。每个示例都经过训练[7]、合成[8],并闪存到MAX78000评估板中。可以指示合成脚本仅为 Arm(默认:RISC-V 关闭)或 RISC-V(带有 --deepsleep --riscv --riscv-debug 标志)生成代码,其中 Arm 初始化 RISC-V 并进入睡眠状态。合成脚本还可以包括 GPIO 信号,以指示电源监视器在 CNN 电源模式 (--energy) 下运行。能量、时间、非活动 (I) 和活动 (A) 功率测量值显示在功率监视器显示屏上。KWS20和FaceID在不同操作模式和时钟源(100MHz时的IPO和60MHz的ISO)下的测试结果如表4和表5所示。请注意,FIFO用于FaceID,因此推理时间也包括加载时间。根据结果,当CNN使用相同的时钟时,仅使用ARM以及ARM和RISC-V的推理时间和能量是相似的。使用较慢的时钟源加载权重和数据需要更长的时间,从而导致能量显着增加。用户应考虑加载内核和输入所需的能量,以决定如何调度应用程序。在活动周期较小时的情况下,重新加载重量可能会改善整体功耗。在睡眠模式或LPM中,推理时间和能量预计不会改善,因为它们仅在CNN的活动窗口内测量。但是,它们会显著影响应用程序的总体功耗,如下文所示。

选择ARM和RISC-V在空闲时间都处于睡眠状态的案例,通过应用不同的时钟频率和源来测试振荡器频率的影响。RISC-V驱动加载权重和输入,以及管理CNN。通过降低时钟频率,推理时间和能量呈指数级增长。这表明以最高速度执行加载和推理,然后进入更长的睡眠期往往会改善整体能耗。该实验的结果如图5和图6所示。

 

KWS20:
操作
模式
时钟频率(兆赫) 内核加载 输入加载 推理
Arm RISC-V CNN E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) A(毫瓦)
Arm Only 始终处于活动状态 100 不适用 50 0.146 11.6 7.2 19.8 0.013 1.1 7.2 19.27 0.14 2 37.45
SLEEP 100 不适用 50 0.148 11.6 7.02 19.8 0.013 1.1 7.02 19.33 0.136 2 35.82
LPM 60 不适用 30 0.154 19.3 5.33 13.29 0.014 1.8 5.33 13.06 0.139 4.1 18.32
Arm 和 RISC-V 始终处于活动状态 100 50 50 0.42854 34.72 5.47 17.81 0.04001 3.31 10.45 22.52 0.1401 1.99 21.86
Only Arm SLEEP 100 50 50 0.04036 3.31 5.5 17.71 0.14077 2.01 21.89
Both SLEEP 100 50 50 0.03829 3.15 5.47 17.63 0.14055 2.19 21.41
Both SLEEP 60 30 30 0.487 50.3 3.48 13.16 0.0481 5.53 3.63 12.31 0.14595 3.38 13.06
LPM 60 30 30 0.0456 4.7 3.48 12.92 0.1424 3.5 13.67
面容ID:
操作
模式
时钟频率(兆赫) 内核加载 输入加载 先进先出加载
+ 推理
Arm RISC-V CNN E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) I(毫瓦) A(毫瓦) E(毫焦耳) T(毫秒) A(毫瓦)
Arm Only 始终处于活动状态 100 不适用 50 0.158 12.2 7.03 20.01 0.132 12.1 7.03 17.91 0.435 14 38.19
SLEEP 100 不适用 50 0.156 12.2 7.22 20.01 0.13 12.1 7.22 17.93 0.43 14 38
LPM 60 不适用 30 0.188 20.3 4.6 13.5 0.162 20 4.6 12.61 0.472 24 24.1
Arm 和 RISCV 始终处于活动状态 100 50 50 0.26 36 3.52 10.64 0.30203 24.82 14.54 26.72 0.57958 24.37 38.39
Only Arm SLEEP 100 50 50 0.29813 24.32 5.46 17.47 0.57823 24.87 29.3
Both SLEEP 100 50 50 0.29899 24.82 5.48 17.53 0.57921 24.37 29.18
Both SLEEP 60 30 30 0.53 52 3.45 13.48 0.36954 41.47 3.57 12.49 0.65009 40.72 19.52
LPM 60 30 30 0.328 36.5 3.45 12.45 0.608 36.1 20.36
LPM, Fast FIFO 60 30 30 不适用 不适用 不适用 不适用 0.524 25.2 24.29
LPM 60 60 60 不适用 不适用 不适用 不适用 0.254 18.2 6.02 19.19 0.533 18 35.58
Both SLEEP 60 60 60 不适用 不适用 不适用 不适用 不适用 不适用 不适用 不适用 0.471 12.6 43.57

 

微控制器

图5.时钟频率对KWS20、Arm in SLEEP和RISC-V的影响驱动CNN并在空闲时间休眠。

微控制器

图6.时钟频率对FaceID的影响;手臂处于睡眠状态;RISC-V驱动CNN并在空闲时间休眠。

在 CNN 内存中保留权重

四个 CNN 掩码 RAM(CNN 权重存储)中的每一个都可以配置为在 UPM、备份或待机的情况下保留权重。另一方面,无论 CNN 掩码 RAM 保留设置如何,CNN 配置寄存器在任何这些省电模式下(SLEEP 和 LPM 除外)都会丢失,并且需要重新加载。

对于某些低占空比应用,用户可以选择关闭掩码RAM,以进一步降低睡眠期间的功耗。在这种情况下,应考虑用于反复重新加载砝码的额外功率的影响。表 6 显示了在 UPM 期间,当 FaceID 示例保留 CNN 权重时,功耗从 0.17mW 增加到 0.38mW。在这种情况下,CNN 配置重新加载只需几分之一毫秒。但是,如果 CNN 掩码 RAM 关闭,则权重和配置的总重新加载时间大于 12 毫秒。用户可以研究这种权衡,以优化其应用程序的计划和操作模式。以下示例演示如何打开/关闭体重保留以及如何在唤醒后重新初始化 CNN。

 


Example: Turn on weight retention 
 MXC_BBFC->reg3 = 0xf; // Reset on
 MXC_BBFC->reg1 = 0x0; // turn off CNN RAM0-3 power
 MXC_BBFC->reg3 = 0x0; // Reset off
Example: Loading weights and configuring CNN with CNN Mask RAMs retention

 // wake up from UPM, BACKUP, or STANDBY – CNN memory was retained
 cnn_init(); // Bring state machine into consistent state
 cnn_load_bias();
 cnn_configure(); // Configure state machine
 …
 // proceed to loading data  
Example: Turn off weight retention prior to sleep (must turn back on after waking up)
 MXC_BBFC->reg3 = 0xf; // Reset on
 MXC_BBFC->reg1 = 0x0; // turn off CNN RAM0-3 power
 MXC_BBFC->reg3 = 0x0; // Reset off
  
 /* get ready to go to sleep */
 MXC_LP_EnterDeepSleepMode(); // Arm enters LPM, waits for wakup

 /* restore power to CNN RAM0-3 after wakeup, or prior to next cnn_load() */
 MXC_BBFC->reg3 = 0xf; // Reset
 MXC_BBFC->reg1 = 0xf; // turn on CNN RAM0-3 power
 MXC_BBFC->reg3 = 0x0; // Reset
Example: Loading weights and configuring CNN without CNN Mask RAMs retention

 // Power up or wake up from UPM, BACKUP or STANDBY, CNN memory not retained
 cnn_init(); // Bring state machine into consistent state
 cnn_load_weights(); // Load kernels
 cnn_load_bias();
 cnn_configure(); // Configure state machine
 …
 // proceed to loading data  

  UPM 从 UPM 唤醒后加载权重/CNN 配置
CNN Weight Retention P(毫瓦) E(μJ) T(毫秒) P(毫瓦)
Off 172 242.38 12.16 19.93
On 0.387 1.956 0.1089 17.95

应用功率

开发应用时,选择每个内核的工作模式、时钟频率和占空比非常重要。通常,在 Arm 上运行的应用程序可以以更高的频率(100MHz 而不是 50MHz APB 时钟)执行,并具有更优化的代码,这可能导致更低的总能耗。如果存在可以同时分配给 Arm 和 RISC-V 内核的并行任务,则为每个内核使用正确的操作模式非常重要。在 SLEEP 和 LPM 中,内核可以独立运行或休眠。但是,在其他节能模式(如 UPM 或待机)中,两个内核同时断电。在这种情况下,Arm 和 RISC-V 可能需要协调,以便它们都使用多处理器通信进入低功耗模式,如 [8] 的第 2.5 节所述。

对于需要偶尔较短活动时间的应用程序,可以选择 UPM、待机、备份或关机模式。用户可以评估在睡眠期间在CNN内存中维持权重的能量成本,并与在每个活动窗口之前重新加载权重的能量进行比较。MAX78000评估板上的功率监测电路可用于测量一段时间内的整体系统功耗[4]。这有助于用户根据需要在运行时分析应用程序电源。

案例研究 1:在 Arm 和 CNN 上进行关键字发现 (KWS20) 演示

本示例应用演示了使用MAX20评估板[78000]识别一组9个关键字。应用程序读取 I2S麦克风以16kHz采样,并监视128个采样窗口的阈值。一旦超过静默阈值,应用程序就会捕获一秒钟的样本,对样本运行 CNN 推理,并在 TFT 显示屏上显示分类结果。

在此基准测试示例中,不使用RISC-V,Arm内核处理整个任务。测试了几种操作模式。系统电源模式下的功率监视器用于以十秒间隔测量总能量,无论是在完全静音(即无推理或 TFT 更新)时,还是当关键字以每秒一个单词的速度说出时(十个推理和 TFT 更新)。结果如表7所示。在活动模式下,Arm 内核始终运行。无论静默还是检测,此模式下的功率约为20mW,因为推理能量只是总功耗的一小部分。通过在收集 I 的空闲时间内使用 LPM2S采样以及推理时间,通过在推理后关闭CNN时钟(功耗大幅降低),功耗降至8.3mW(静默期间为6.58mW)。

 

 

微控制器

图7.KWS20的占空比和平均功率示例在静音或关键字检测期间,TFT可以打开或关闭。

图7分析并演示了表7中最后两种功耗优化工作模式的平均功耗和活动占空比。

案例研究 2-A:Arm 和 CNN 上的 FaceID 演示

该演示应用演示了在MAX78000上使用面部识别识别对象。FaceID CNN模型从评估板相机拍摄的实时图像中生成尺寸为512的嵌入。计算嵌入与已知主题嵌入的距离,如果大于阈值,则选择最佳候选者。已知嵌入的数据库是从主题的图片创建的,并与固件集成。推理在每个图像的 160x120 面框上执行。为了增强识别性能,推理在帧上执行三次,每次在图片上稍微移动面部框时执行。

在本案例研究中,RISC-V处于关闭状态,整个任务由Arm驱动并按顺序执行。Arm 在推理期间进入睡眠模式,并在帧之间进入 UPM 或待机模式约半秒。表 8 总结了 FaceID 主要功能的执行时间和功能。表 9 显示了每种操作模式下的时间和功耗。

 

处理一帧 平均能源
系统时钟 CNN Clock Arm duty cycle E(μJ ) T(毫秒) P(毫瓦)
ARM-100兆赫 50兆赫 图像捕获 1189.8 171.2 6.95
CNN 内核负载(用于备用或 UPM) 935.3 37.5 24.94
3 x CNN 运行 1164.7 42 27.73
3 x CNN 卸载 1.6 0.15 10.7
3x 距离计算 470.4 48 9.8
在 TFT 上显示图像 620.5 49.4 12.56
4382.2 348.25  
模式 Active UPM Sleep Total
时间(毫秒) 227 498 160 885
功率(毫瓦) 18.14 0.3 6.92  
能量(微焦) 4118 150 1112 5380
模式 积极 待机
时间(毫秒) 227 497 160 884
功率(毫瓦) 18.14 0.03 6.92  
能量(微焦) 4118 15 1112 5245

 

微控制器

  图 8:在 Arm 上运行的 FaceID 示例的占空比和平均功率。

  案例研究2-B:Arm,RISC-V和CNN上的FaceID演示

  在这种情况下,Arm处理TFT控制和显示(只能通过MAX78000评估板上的Arm访问),RISC-V驱动从相机捕获的图像、CNN加载和推理,以及针对数据库的嵌入距离计算。共享内存和邮箱用于协调 Arm 和 RISC-V 通信。

  表 10 总结了此模式下 FaceID 主要功能期间的执行时间和功耗。处理完帧后,Arm 和 RISC-V 会像前一种情况一样进入待机模式大约半秒钟。

Processing One Frame 平均能源
系统时钟 美国有线电视新闻网时钟 RISC-Arm E(μJ) T(毫秒) P(毫瓦)
ARM-100MHz RISCV-60MHz 50兆赫 图像捕获 1392.6 169 8.24
CNN 内核加载 818.3 35.5 23.05
3 x CNN 运行 7910.1 327 24.19
3 x CNN 卸载 9.5 0.9 10.5
3x 距离计算 699.6 66 10.6
在TFT上显示图像(在手臂上与RISC-V处理并行显示图像)   60 12.48
10830 658.9  
模式 Active Standby Sleep Total
时间(毫秒) 448 500 169 1117
功率(毫瓦) 18.14 0.05 7.89  
能量(微焦) 8126.72 25 1333.41 9485.13

 

微控制器

图9.在 Arm 和 RISC-V 上运行的 FaceID 示例的占空比和平均功率。

微控制器

图 10.比较在实现FaceID时使用Arm,或同时使用Arm和RISC-V。

通过比较图 10 中 FaceID 的两种实现,很明显,使用 Arm 处理帧的总能量显着降低,这主要是由于其速度更高,而不是 RISC-V(100MHz,vs 50MHz),导致活动状态的持续时间更短。

总结

本应用笔记概述了MAX78000支持的功耗优化技术,以及与关键字识别和FaceID应用配合使用时的结果。以下摘要重点介绍了一些改善功耗的一般建议:

通常越快越好。通常,使用更高的时钟速率可以加快执行速度,并减少恒定静态功耗的影响,从而改善整体功耗。

如果没有太多并行任务要执行,则首选单核。在RISC-V上运行任务由于其时钟速率而较慢,并且与Arm相比,往往会导致能源使用量增加。

在没有活动时利用 UPM、备份和备用。当 Arm 在某些外围设备运行时可以休眠时,请考虑使用 LPM。

加载内核(权重)一次并保留在内存中,以避免在 UPM、备份和待机模式下重新加载能量。但是,如果活动占空比非常低,请考虑禁用砝码保持或使用 POWERDOWN 模式并在每个周期中重新加载砝码。

确保在 CNN 处理完成后关闭 CNN 时钟,并在下一个活动期间再次访问 CNN 之前将其打开。

当 CNN 正在运行并且 Arm 正在等待推理完成时,请使用 LPM。要唤醒,请使用RISC-V或唤醒定时器。CNN 中断无法在 LPM 中直接唤醒 Arm。

使用快速FIFO或四快速FIFO(仅在RISC-V驱动CNN时才支持)显着改善了输入加载时间和推理能量(--fast-fifo,--fast-fifo-quad)[8]。

审核编辑:郭婷


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分