功耗是邊緣人工智能 (AI) 應(yīng)用的關(guān)鍵因素,其中整個系統(tǒng)由小型電池供電,預計無需充電或更換電池即可運行數(shù)月。MAX78000超低功耗AI微控制器專為物聯(lián)網(wǎng)邊緣的此類應(yīng)用而設(shè)計。本文介紹了各種配置,使用戶能夠在MAX78000上開發(fā)功耗優(yōu)化應(yīng)用,并提供基準測試示例。功耗優(yōu)化方法應(yīng)用于兩個案例研究應(yīng)用:20個關(guān)鍵詞的關(guān)鍵詞發(fā)現(xiàn)(KWS20)和人臉識別(FaceID),報告的結(jié)果可作為用戶應(yīng)用的指南。
介紹
MAX78000為超低功耗微控制器,具有專用卷積神經(jīng)網(wǎng)絡(luò)(CNN)加速器。這種架構(gòu)能夠在能源受限的環(huán)境中開發(fā)非常節(jié)能的 AI 應(yīng)用程序。MAX78000提供多種選擇,便于開發(fā)低功耗應(yīng)用(詳見數(shù)據(jù)資料[1]),例如可根據(jù)目標應(yīng)用選擇不同的振蕩器、時鐘源和工作模式。以下部分概述了這些選項,包括MAX78000評估板的實際示例和實際測量結(jié)果。有關(guān)詳細信息,請遵循本文檔中的參考資料。
注:本應(yīng)用筆記給出的測量結(jié)果基于MAX78000評估板上的示例代碼。用戶平臺和特定應(yīng)用程序的實際結(jié)果可能會有所不同。
MAX78000
MAX78000是新一代AI微控制器,用于以超低功耗執(zhí)行神經(jīng)網(wǎng)絡(luò),并位于物聯(lián)網(wǎng)邊緣。該產(chǎn)品將最節(jié)能的AI處理與Maxim Integrated成熟的超低功耗微控制器相結(jié)合。基于硬件的 CNN 加速器使電池供電的應(yīng)用程序能夠執(zhí)行 AI 推理,同時僅消耗微焦耳的能量。MAX78000具有帶FPU微控制器的Atarm Cortex-M4,通過超低功耗深度神經(jīng)網(wǎng)絡(luò)加速器實現(xiàn)高效的系統(tǒng)控制。還集成了一個RISC-V內(nèi)核,可以執(zhí)行應(yīng)用和控制代碼以及驅(qū)動CNN加速器。圖1所示為MAX78000的頂層架構(gòu)。
圖1.MAX78000的結(jié)構(gòu)
MAX78000評估板(EV kit)提供了一個平臺,利用MAX78000的功能構(gòu)建新一代AI器件。評估板具有板載硬件,如數(shù)字麥克風、串行端口、攝像頭模塊支持和3.5英寸觸摸彩色薄膜晶體管(TFT)顯示屏[2]。它還包括用于監(jiān)控和顯示功率電平的電路。MAX34417 [3] 監(jiān)測 VCOREA 和 VCOREB 電壓以及
圖2.電源監(jiān)視器。
MAX78000,并將累積功率報告給MAX32625,MAX2用作電源數(shù)據(jù)處理器,同時控制功率顯示,如圖<>所示。
電源監(jiān)視器以兩種模式運行;瞬時,顯示平均功率、電源電流和電壓,以及窗口能量累積,根據(jù)觸發(fā)事件測量 CNN 功率或總系統(tǒng)功率。瞬時測量通常用于快速、粗略地估計功率電平。另一方面,窗口測量非常適合測量用戶定義的開始實例和完整實例之間的累積能量。這些事件由MAX78000的兩個GPIO(P0.2和P0.3)的切換觸發(fā),這兩個GPIO也連接到LED1和LED2以及MAX32625功率數(shù)據(jù)處理器的端口。有關(guān)使用電源監(jiān)視器的詳細信息,請參閱 [4]。
MAX78000時鐘和工作模式
MAX78000支持不同的時鐘源和低功耗工作模式,可聯(lián)合配置以實現(xiàn)優(yōu)化的功耗和性能。本應(yīng)用筆記簡要介紹了每種模式,以指導讀者根據(jù)所需應(yīng)用設(shè)置模式。有關(guān)更詳細的描述,請參閱 [5]。
時鐘
MAX78000包括多個可配置時鐘,供不同外設(shè)使用。用戶可以根據(jù)需要配置時鐘源,以選擇性能和電源效率的組合。選定的系統(tǒng)振蕩器(SYS_OSC)是大多數(shù)內(nèi)部模塊的時鐘源。以下振蕩器源可用,可以選擇SYS_OSC:
內(nèi)部初級振蕩器 (IPO) – 100MHz:
IPO 是頻率最快的振蕩器,消耗的功率最大。當進入低功耗模式(LPM)時,該振蕩器可以關(guān)斷。
內(nèi)部次級振蕩器 (ISO) – 60MHz:
這是一款低功耗內(nèi)部次級振蕩器,是SYS_OSC的上電復位默認設(shè)置。
內(nèi)部納米環(huán)振蕩器 (INRO) – 8kHz-30kHz:
INRO 是一種超低功耗內(nèi)部振蕩器,可以選擇作為SYS_OSC并始終啟用。頻率可配置為 8kHz、16kHz 或 30kHz(默認)。
內(nèi)部波特率振蕩器 (IBRO) – 7.3728MHz:
這是一款功耗非常低的內(nèi)部振蕩器,可以選擇作為SYS_OSC。該時鐘可以選擇用作UART的專用波特率時鐘。
外部實時時鐘振蕩器 (ERTCO) – 32.768kHz:
ERTCO 是一款功耗極低的內(nèi)部振蕩器,可以選擇作為SYS_OSC。ERTCO可以選擇使用32.768kHz輸入時鐘或8kHz獨立納米環(huán)振蕩器代替外部晶體。該振蕩器是實時時鐘 (RTC) 的默認時鐘,一旦啟用 RTC,就會自動啟用。
所選SYS_OSC是系統(tǒng)振蕩器分頻器的輸入,用于生成系統(tǒng)時鐘 (SYS_CLK)。分頻器可在 0 到 7 之間選擇,得到 1、2、4、8、16、32、64 或 128 的除數(shù)。SYS_CLK驅(qū)動帶有 FPU 內(nèi)核的 Arm Cortex-M4,以及系統(tǒng)中的所有高級高性能總線 (AHB) 主站。通過兩個分頻器的固定分頻后,它還可以生成高級外設(shè)總線(APB)時鐘,為CNN加速器、RISC-V和外設(shè)供電。有關(guān)時鐘源、配置和要設(shè)置的寄存器列表的更多詳細信息,請參閱 [3] 的第 1.5 節(jié)。
表 1 中列出了用于設(shè)置時鐘的 API。
應(yīng)用程序接口 | 描述 |
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的時鐘源;有關(guān)列表,請參閱時鐘部分 |
void SystemCoreClockUpdate(void) | 根據(jù)所選時鐘源更新系統(tǒng)核心時鐘 |
無效MXC_SYS_ClockEnable(mxc_sys_periph_clock_t時鐘) |
支持外設(shè)時鐘: 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時鐘) | 禁用外設(shè)時鐘;有關(guān)列表,請參閱時鐘部分 |
操作模式
MAX78000包括多種工作模式,能夠微調(diào)電源選項以優(yōu)化性能和功耗。系統(tǒng)支持以下操作模式,如表 2 所示。
|
活動模式:
在這種模式下,Arm 和 RISC-V 內(nèi)核都可以執(zhí)行應(yīng)用代碼,并且所有數(shù)字和模擬外設(shè)均可按需提供。動態(tài)時鐘禁用未使用的外設(shè),提供高性能和低功耗的最佳組合。每個外設(shè)都可以在活動模式下單獨使能或斷電。CNN 和四個 CNNx16_n 處理器陣列中的每一個及其相關(guān)存儲器都可以根據(jù)需要關(guān)閉電源或設(shè)置為活動狀態(tài)。
睡眠模式:
當 Arm 或 RISC-V 執(zhí)行代碼時,可以使用此模式,在此期間,另一個進入睡眠狀態(tài)以降低功耗??梢赃x擇啟用時鐘以加快喚醒過程。CNN 可供使用,四個CNNx16_n象限中的每一個都可以單獨配置為關(guān)斷。除非明確禁用,否則所有外圍設(shè)備均處于打開狀態(tài)
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處于深度睡眠狀態(tài)時從啟用的外設(shè)收集和移動數(shù)據(jù),則可以使用此模式。如果未使用 RISC-V 并且處于睡眠模式,則 Arm 還可以處理數(shù)據(jù)并在外圍設(shè)備或 CNN 處于活動狀態(tài)并在中斷時喚醒時切換到 LPM。Arm、DMA 和 SPI0 處于狀態(tài)保留狀態(tài)。CNN 象限、內(nèi)存和其他外設(shè)處于活動狀態(tài)且可配置。請注意,CNN 只能喚醒 RISC-V,而不能喚醒 LPM 中的 Arm。在這種情況下,如果 CNN 處理時間已知,則喚醒計時器 (WUT) 可用于喚醒 Arm?;蛘撸珻NN中斷可以喚醒RISC-V,RISC-V反過來可以喚醒Arm,然后RISC-V可以重新進入睡眠狀態(tài)。
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斷電,應(yīng)使用IBRO,ERTCO,INRO或ISO。
注意:如果 Arm 內(nèi)核進入 LPM,RISC-V 可以根據(jù)需要繼續(xù)執(zhí)行并進入睡眠狀態(tài)。如果需要在兩個內(nèi)核之間管理 LPM 的入口,則可以使用多處理器通信來確保兩個內(nèi)核都處于已知狀態(tài)。有關(guān)詳細信息,請參閱 [3] 中的第 3.3.5 節(jié)。
微功耗模式:
此模式用于極低的功耗,同時使用最少的外設(shè)集來提供喚醒功能。在此模式下,將保留 Arm 和 RISC-V、系統(tǒng)和 CNN RAM 以及非 UPM 外設(shè)的狀態(tài)。CNN 象限可以關(guān)閉。IPO 和 ISO 振蕩器斷電,IBRO、ERTCO和INRO啟用。以下外設(shè)可用作喚醒源: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.
這種模式在低活動循環(huán)應(yīng)用中最有利于節(jié)省能源。
為了確保確定性地進入 UPM 模式,Arm 和 RISC-V 可能需要使用多處理器通信進行同步。有關(guān)更多信息,請參閱 [3] 中的第 3.4.5 節(jié)。
待機模式:
在此模式下,RTC 運行時保留系統(tǒng)狀態(tài);Arm、RISC-V、System RAM、GPIO 和外設(shè)也保留其狀態(tài)。CNN 象限關(guān)閉,CNN 內(nèi)存具有可選擇的保留。IPO 和 ISO 振蕩器斷電,ERTCO、INRO 和 IBRO 啟用。如果需要對應(yīng)用進行占空比,此模式可提供進一步的功耗降低。
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 可能需要使用多處理器通信進行同步。有關(guān)更多信息,請參閱 [3] 中的第 3.5.5 節(jié)。
備份模式:
此模式用于保留系統(tǒng)內(nèi)存。在此模式下,Arm、RISC-V、所有外設(shè)和除 ERTCO 之外的所有振蕩器都將關(guān)閉電源。系統(tǒng) RAM 0-3 可以獨立配置為使用 PWRSEQ_LPCN 寄存器保留狀態(tài)。
進入備份模式不需要 Arm 和 RISC-V 之間的同步,任何一個內(nèi)核都可以將 GCR_PM.mode 設(shè)置為 BACKUP,這會導致設(shè)備立即進入 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.
掉電模式:
此模式在產(chǎn)品級別的分發(fā)和存儲期間使用。ARM、RISC-V、存儲器、外設(shè)和振蕩器均斷電。在此模式下沒有數(shù)據(jù)保留,但閃存中的值會保留。在此模式下,V雷吉POR電壓監(jiān)視器正在運行。
如果已配置,可通過外部復位 (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 配置為在發(fā)生喚醒事件時喚醒。有關(guān)不同操作模式下的喚醒源列表,請參閱 [3] 中的第 4.5 節(jié)。
手臂喚醒配置:
應(yīng)啟用中斷。在 SLEEP 的情況下,Arm 內(nèi)核會喚醒 after__WFI() 以響應(yīng)任何中斷。
對于低功耗模式,需要啟用喚醒源:
在電源排序器寄存器 (PWRSEQ) 中:在低功耗外設(shè)喚醒中啟用外設(shè)和特定 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,然后進入睡眠狀態(tài),直到 CNN 推理完成。之后,CNN中斷喚醒RISC-V,然后喚醒ARM也。
有關(guān)此示例的完整代碼,請參閱 [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(); 設(shè)置 RISC-V 引導地址 MXC_FCR->urvbootaddr = (uint32_t) &__FlashStart_; 啟用森帕霍爾時鐘MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SMPHR);設(shè)置喚醒 ISR NVIC_SetVector(RISCV_IRQn, WakeISR ); 不要刪除此行: MXC_Delay(SEC(2));如果需要,讓調(diào)試器中斷 啟用 RISC-V 時鐘 MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_CPU1); 轉(zhuǎn)到 LPM,等待 RISC-V 喚醒 MXC_LP_ClearWakeStatus(); SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // SLEEPDEEP=1 __WFI(); // 轉(zhuǎn)到深度睡眠,讓 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(); // 設(shè)置 RISCV JTAG MXC_ICC_Enable(MXC_ICC1); // 啟用緩存 使能外設(shè), CNN 中斷, CNN 時鐘 // CNN 時鐘 : 50 MHz 分區(qū) 1 cnn_enable(MXC_S_GCR_PCLKDIV_CNNCLKSEL_PCLK, MXC_S_GCR_PCLKDIV_CNNCLKDIV_DIV1); cnn_init();使狀態(tài)機進入一致的狀態(tài) cnn_load_weights();加載內(nèi)核 cnn_load_bias(); cnn_configure();配置狀態(tài)機 load_input();加載數(shù)據(jù)輸入 cnn_start(); // 在 (cnn_time == 0) asm volatile(“WFI”) 時啟動 CNN 處理; 睡眠,等待 CNN 完成 // 現(xiàn)在信號 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; // 屏蔽內(nèi)存 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; } |
不同模式下的功耗
在開發(fā)應(yīng)用時,用戶可以將MAX78000切換到不同的工作模式,并相應(yīng)地安排任務(wù)以節(jié)省功耗。了解每種操作模式下的功耗以及啟動或喚醒所需的時間,有助于用戶選擇合適的模式并規(guī)劃任務(wù)的占空比。電源監(jiān)視器可在系統(tǒng)電源模式 [4] 下使用,以測量幾種情況下的功耗和喚醒或啟動時間。在此測試中,RISC-V和外圍設(shè)備關(guān)閉,Arm在不同的操作模式下進行測試。對于喚醒時間測試,RISC-V用作Arm的喚醒源。 圖3顯示了該實驗的結(jié)果。使用ISO振蕩器在60MHz下測量活動功率和睡眠功率。其他低功耗模式在休眠期間采用 ERTCO (32kHz)(API 默認值)。
還測試了不同時鐘頻率的啟動時間(定義為從上電到開始執(zhí)行主代碼的時間)和喚醒時間,如圖4所示。喚醒時間隨所選時鐘頻率進行縮放。啟動時間以上電默認時鐘(ISO 在 60MHz)測量。
圖3.不同運行模式下的功耗。
圖4.不同頻率的啟動和喚醒時間。
美國有線電視新聞網(wǎng)電源
人工智能應(yīng)用程序的核心是由CNN加速器執(zhí)行的推理。根據(jù)應(yīng)用程序的不同,推理可以連續(xù)地對傳入的數(shù)據(jù)進行,也可以按特定的時間間隔定期進行。CNN推理可以在輸入數(shù)據(jù)準備就緒后開始(例如KWS案例研究),也可以在FIFO模式下(例如FaceID示例)開始,一旦FIFO中存儲了足夠的數(shù)據(jù)來開始該過程,它就會開始。CNN 功耗分三個階段測量:
加載權(quán)重(內(nèi)核):在活動模式下將權(quán)重加載到 CNN 內(nèi)存中發(fā)生一次
加載輸入數(shù)據(jù):每次有新的推理時。在FIFO模式下,它可以與推理重疊
推理:對輸入數(shù)據(jù)進行操作并生成分類結(jié)果
功率監(jiān)視器使用 GPIO 信號觸發(fā)每個事件,并在 CNN 功率模式下測量每個相位的功率 [4]。為了進行測量,在Maxim SDK中選擇了兩個示例:KWS20和FaceID。每個示例都經(jīng)過訓練[7]、合成[8],并閃存到MAX78000評估板中??梢灾甘竞铣赡_本僅為 Arm(默認:RISC-V 關(guān)閉)或 RISC-V(帶有 --deepsleep --riscv --riscv-debug 標志)生成代碼,其中 Arm 初始化 RISC-V 并進入睡眠狀態(tài)。合成腳本還可以包括 GPIO 信號,以指示電源監(jiān)視器在 CNN 電源模式 (--energy) 下運行。能量、時間、非活動 (I) 和活動 (A) 功率測量值顯示在功率監(jiān)視器顯示屏上。KWS20和FaceID在不同操作模式和時鐘源(100MHz時的IPO和60MHz的ISO)下的測試結(jié)果如表4和表5所示。請注意,F(xiàn)IFO用于FaceID,因此推理時間也包括加載時間。根據(jù)結(jié)果,當CNN使用相同的時鐘時,僅使用ARM以及ARM和RISC-V的推理時間和能量是相似的。使用較慢的時鐘源加載權(quán)重和數(shù)據(jù)需要更長的時間,從而導致能量顯著增加。用戶應(yīng)考慮加載內(nèi)核和輸入所需的能量,以決定如何調(diào)度應(yīng)用程序。在活動周期較小時的情況下,重新加載重量可能會改善整體功耗。在睡眠模式或LPM中,推理時間和能量預計不會改善,因為它們僅在CNN的活動窗口內(nèi)測量。但是,它們會顯著影響應(yīng)用程序的總體功耗,如下文所示。
選擇ARM和RISC-V在空閑時間都處于睡眠狀態(tài)的案例,通過應(yīng)用不同的時鐘頻率和源來測試振蕩器頻率的影響。RISC-V驅(qū)動加載權(quán)重和輸入,以及管理CNN。通過降低時鐘頻率,推理時間和能量呈指數(shù)級增長。這表明以最高速度執(zhí)行加載和推理,然后進入更長的睡眠期往往會改善整體能耗。該實驗的結(jié)果如圖5和圖6所示。
KWS20: 操作 模式 |
時鐘頻率(兆赫) | 內(nèi)核加載 | 輸入加載 | 推理 | |||||||||||
Arm | RISC-V | CNN | E(毫焦耳) | T(毫秒) | I(毫瓦) | A(毫瓦) | E(毫焦耳) | T(毫秒) | I(毫瓦) | A(毫瓦) | E(毫焦耳) | T(毫秒) | A(毫瓦) | ||
Arm Only | 始終處于活動狀態(tài) | 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 | 始終處于活動狀態(tài) | 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: 操作 模式 |
時鐘頻率(兆赫) | 內(nèi)核加載 | 輸入加載 |
先進先出加載 + 推理 |
|||||||||||
Arm | RISC-V | CNN | E(毫焦耳) | T(毫秒) | I(毫瓦) | A(毫瓦) | E(毫焦耳) | T(毫秒) | I(毫瓦) | A(毫瓦) | E(毫焦耳) | T(毫秒) | A(毫瓦) | ||
Arm Only | 始終處于活動狀態(tài) | 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 | 始終處于活動狀態(tài) | 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的影響驅(qū)動CNN并在空閑時間休眠。
圖6.時鐘頻率對FaceID的影響;手臂處于睡眠狀態(tài);RISC-V驅(qū)動CNN并在空閑時間休眠。
在 CNN 內(nèi)存中保留權(quán)重
四個 CNN 掩碼 RAM(CNN 權(quán)重存儲)中的每一個都可以配置為在 UPM、備份或待機的情況下保留權(quán)重。另一方面,無論 CNN 掩碼 RAM 保留設(shè)置如何,CNN 配置寄存器在任何這些省電模式下(SLEEP 和 LPM 除外)都會丟失,并且需要重新加載。
對于某些低占空比應(yīng)用,用戶可以選擇關(guān)閉掩碼RAM,以進一步降低睡眠期間的功耗。在這種情況下,應(yīng)考慮用于反復重新加載砝碼的額外功率的影響。表 6 顯示了在 UPM 期間,當 FaceID 示例保留 CNN 權(quán)重時,功耗從 0.17mW 增加到 0.38mW。在這種情況下,CNN 配置重新加載只需幾分之一毫秒。但是,如果 CNN 掩碼 RAM 關(guān)閉,則權(quán)重和配置的總重新加載時間大于 12 毫秒。用戶可以研究這種權(quán)衡,以優(yōu)化其應(yīng)用程序的計劃和操作模式。以下示例演示如何打開/關(guān)閉體重保留以及如何在喚醒后重新初始化 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 喚醒后加載權(quán)重/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 |
應(yīng)用功率
開發(fā)應(yīng)用時,選擇每個內(nèi)核的工作模式、時鐘頻率和占空比非常重要。通常,在 Arm 上運行的應(yīng)用程序可以以更高的頻率(100MHz 而不是 50MHz APB 時鐘)執(zhí)行,并具有更優(yōu)化的代碼,這可能導致更低的總能耗。如果存在可以同時分配給 Arm 和 RISC-V 內(nèi)核的并行任務(wù),則為每個內(nèi)核使用正確的操作模式非常重要。在 SLEEP 和 LPM 中,內(nèi)核可以獨立運行或休眠。但是,在其他節(jié)能模式(如 UPM 或待機)中,兩個內(nèi)核同時斷電。在這種情況下,Arm 和 RISC-V 可能需要協(xié)調(diào),以便它們都使用多處理器通信進入低功耗模式,如 [8] 的第 2.5 節(jié)所述。
對于需要偶爾較短活動時間的應(yīng)用程序,可以選擇 UPM、待機、備份或關(guān)機模式。用戶可以評估在睡眠期間在CNN內(nèi)存中維持權(quán)重的能量成本,并與在每個活動窗口之前重新加載權(quán)重的能量進行比較。MAX78000評估板上的功率監(jiān)測電路可用于測量一段時間內(nèi)的整體系統(tǒng)功耗[4]。這有助于用戶根據(jù)需要在運行時分析應(yīng)用程序電源。
案例研究 1:在 Arm 和 CNN 上進行關(guān)鍵字發(fā)現(xiàn) (KWS20) 演示
本示例應(yīng)用演示了使用MAX20評估板[78000]識別一組9個關(guān)鍵字。應(yīng)用程序讀取 I2S麥克風以16kHz采樣,并監(jiān)視128個采樣窗口的閾值。一旦超過靜默閾值,應(yīng)用程序就會捕獲一秒鐘的樣本,對樣本運行 CNN 推理,并在 TFT 顯示屏上顯示分類結(jié)果。
在此基準測試示例中,不使用RISC-V,Arm內(nèi)核處理整個任務(wù)。測試了幾種操作模式。系統(tǒng)電源模式下的功率監(jiān)視器用于以十秒間隔測量總能量,無論是在完全靜音(即無推理或 TFT 更新)時,還是當關(guān)鍵字以每秒一個單詞的速度說出時(十個推理和 TFT 更新)。結(jié)果如表7所示。在活動模式下,Arm 內(nèi)核始終運行。無論靜默還是檢測,此模式下的功率約為20mW,因為推理能量只是總功耗的一小部分。通過在收集 I 的空閑時間內(nèi)使用 LPM2S采樣以及推理時間,通過在推理后關(guān)閉CNN時鐘(功耗大幅降低),功耗降至8.3mW(靜默期間為6.58mW)。
圖7.KWS20的占空比和平均功率示例在靜音或關(guān)鍵字檢測期間,TFT可以打開或關(guān)閉。
圖7分析并演示了表7中最后兩種功耗優(yōu)化工作模式的平均功耗和活動占空比。
案例研究 2-A:Arm 和 CNN 上的 FaceID 演示
該演示應(yīng)用演示了在MAX78000上使用面部識別識別對象。FaceID CNN模型從評估板相機拍攝的實時圖像中生成尺寸為512的嵌入。計算嵌入與已知主題嵌入的距離,如果大于閾值,則選擇最佳候選者。已知嵌入的數(shù)據(jù)庫是從主題的圖片創(chuàng)建的,并與固件集成。推理在每個圖像的 160x120 面框上執(zhí)行。為了增強識別性能,推理在幀上執(zhí)行三次,每次在圖片上稍微移動面部框時執(zhí)行。
在本案例研究中,RISC-V處于關(guān)閉狀態(tài),整個任務(wù)由Arm驅(qū)動并按順序執(zhí)行。Arm 在推理期間進入睡眠模式,并在幀之間進入 UPM 或待機模式約半秒。表 8 總結(jié)了 FaceID 主要功能的執(zhí)行時間和功能。表 9 顯示了每種操作模式下的時間和功耗。
處理一幀 | 平均能源 | ||||
---|---|---|---|---|---|
系統(tǒng)時鐘 | CNN Clock | Arm duty cycle | E(μJ ) | T(毫秒) | P(毫瓦) |
ARM-100兆赫 | 50兆赫 | 圖像捕獲 | 1189.8 | 171.2 | 6.95 |
CNN 內(nèi)核負載(用于備用或 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驅(qū)動從相機捕獲的圖像、CNN加載和推理,以及針對數(shù)據(jù)庫的嵌入距離計算。共享內(nèi)存和郵箱用于協(xié)調(diào) Arm 和 RISC-V 通信。
表 10 總結(jié)了此模式下 FaceID 主要功能期間的執(zhí)行時間和功耗。處理完幀后,Arm 和 RISC-V 會像前一種情況一樣進入待機模式大約半秒鐘。
Processing One Frame | 平均能源 | ||||
系統(tǒng)時鐘 | 美國有線電視新聞網(wǎng)時鐘 | RISC-Arm | E(μJ) | T(毫秒) | P(毫瓦) |
ARM-100MHz RISCV-60MHz | 50兆赫 | 圖像捕獲 | 1392.6 | 169 | 8.24 |
CNN 內(nèi)核加載 | 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.比較在實現(xiàn)FaceID時使用Arm,或同時使用Arm和RISC-V。
通過比較圖 10 中 FaceID 的兩種實現(xiàn),很明顯,使用 Arm 處理幀的總能量顯著降低,這主要是由于其速度更高,而不是 RISC-V(100MHz,vs 50MHz),導致活動狀態(tài)的持續(xù)時間更短。
總結(jié)
本應(yīng)用筆記概述了MAX78000支持的功耗優(yōu)化技術(shù),以及與關(guān)鍵字識別和FaceID應(yīng)用配合使用時的結(jié)果。以下摘要重點介紹了一些改善功耗的一般建議:
通常越快越好。通常,使用更高的時鐘速率可以加快執(zhí)行速度,并減少恒定靜態(tài)功耗的影響,從而改善整體功耗。
如果沒有太多并行任務(wù)要執(zhí)行,則首選單核。在RISC-V上運行任務(wù)由于其時鐘速率而較慢,并且與Arm相比,往往會導致能源使用量增加。
在沒有活動時利用 UPM、備份和備用。當 Arm 在某些外圍設(shè)備運行時可以休眠時,請考慮使用 LPM。
加載內(nèi)核(權(quán)重)一次并保留在內(nèi)存中,以避免在 UPM、備份和待機模式下重新加載能量。但是,如果活動占空比非常低,請考慮禁用砝碼保持或使用 POWERDOWN 模式并在每個周期中重新加載砝碼。
確保在 CNN 處理完成后關(guān)閉 CNN 時鐘,并在下一個活動期間再次訪問 CNN 之前將其打開。
當 CNN 正在運行并且 Arm 正在等待推理完成時,請使用 LPM。要喚醒,請使用RISC-V或喚醒定時器。CNN 中斷無法在 LPM 中直接喚醒 Arm。
使用快速FIFO或四快速FIFO(僅在RISC-V驅(qū)動CNN時才支持)顯著改善了輸入加載時間和推理能量(--fast-fifo,--fast-fifo-quad)[8]。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7552瀏覽量
151417 -
加速器
+關(guān)注
關(guān)注
2文章
799瀏覽量
37867 -
電池
+關(guān)注
關(guān)注
84文章
10576瀏覽量
129661
發(fā)布評論請先 登錄
相關(guān)推薦
評論