功耗是邊緣人工智能 (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 所示。
|
活動模式:
在這種模式下,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]。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7649瀏覽量
152109 -
加速器
+關注
關注
2文章
807瀏覽量
38087 -
電池
+關注
關注
84文章
10675瀏覽量
131316
發布評論請先 登錄
相關推薦
評論