如何在ARM平臺上開發低功耗的軟件系統
對于個別計算單元,選擇一種關機方案是很容易的。對于可以預測需要與否的單元,在不需要時通過應用程序或操作系統就可以停止運行這些單元。對于不可預測需要與否的單元,可以通過按需通電啟動系統,也可以在空閑超過某段時間之后再自動斷電。子系統斷電的時標可以通過以下兩方面來得出:通電但處于空閑狀態時的功耗以及睡眠喚醒循環的能耗。從根本上講,這取決于應用場合。但是,動力循環代碼的簡單循環計數將是最明顯的起點。
測量數據表明,N e o n引擎相比C o r tex-A9等內核的運行功率要高大約10%。但是,對于傳統的信號處理算法,其性能提升了40% - 150%。在任務期間啟用NeON而在不需要時切斷Neon的好處很明顯。很常見的是,不但N e o n引擎可以在任務完成時切斷,而且整個處理器系統可以節省更多功耗。
通常一個比較難的選擇是啟用計算組件提前完成計算(且因此切斷時間更長)還是完成計算時及時降低處理器速度以減少功耗。圖6顯示了每次迭代的能耗數據,這是簡單的基準(Domeika, 2009)。采用不同的指令緩存和浮點協處理器組合,對于兩個時鐘速度,每個時鐘速度均要運行此基準四次。有兩個清晰的重點。首先,盡管指令緩存和浮點單元均減少了能耗,但是浮點單元比指令緩存的表現更優異。

圖6:系統組件電源利用
其次,對于所有配置而言,每次迭代的能耗從本質上講是相同的,與時鐘速度無關。因此,為了更快地完成任務而啟用所有功能并全速運行要比調慢時鐘速度更加高效。
多重處理
眾所周知,與調高單核的功率相比,采用多核可以獲得更高的性能和更好的能效。使用多核系統時,我們必須考慮在不需要時選擇中止一個或多個內核。A R M的研究表明,S M PLinux系統中單核循環的成本是50000個周期(大部分周期用于清除一級緩存),這意味著此操作將在幾百毫秒內完成,而不是更短的時間內完成,否則其能耗成本將超過其具有的優勢。
ARM是主動研究型架構,其包含兩個內核,一個高性能的內核用于全功能操作,一個較小的配套內核則以較低的性能完成低功率操作。需要較高的處理功率時,系統運行較大的內核。任務完成時,系統可以把所有信息傳遞給小內核并關閉大內核。需要逆向信息移動時,再切換回大內核。如果這兩個內核相連成為相關系統,則切換的能耗成本可降到最低。
關于操作系統
不巧的是,在操作系統上運行時,應用程序員無法這樣靈活處理。緩存配置、S PM使用與否、組件的電源周期等很大程度上都是操作系統架構和設備驅動程序來專門決定的。但是,應用程序員仍然有很多東西需要考慮。
研究已經表明,設計不良的進程間通信(I P C)會大大增加系統的能耗。一個簡單的技術稱為“矢量化”進程間通信,這種技術批量處理小的消息并把大量小的消息作為一個大的消息來發送,這樣通常可以減少上下文的切換開銷。另外,減少進程數量可明顯降低進程間通信的需求。需要頻繁通信的進程可以合并成一個進程。
在嵌入式Linux中運行的最近研究(Tan, 2003)表明,分析和合理設計進程間通信2 可以潛在改進能耗多達60%。
結論
盡管我已經強調了許多領域仍然屬于學術研究范圍,但我們現在還是可以做許多工作。結果相對比較簡單:減少外部內存存取,減少指令執行,并在不使用某些單元時關掉它們。
在做出這個結論的同時,我想起了2 0 0 9年中期在一次培訓課上與客戶的一次談話。這些客戶關心如何在包含了N e o n的C or tex-A8平臺上實現信號處理算法且想要知道個別指令的確切能耗。我解釋說,實際上很多這種信息是未知的,而且不管在什么情況下,很難使用當前的工具得出這些信息。回顧上文,我們已經認識到在捕獵大象的這個長期任務中,這些信息都是無關緊要的。實際上,客戶要捕獵的大象與房間中的其他大象相比,非常的小。不管是經過分析還是持續跟蹤數據,都可以得出更好的建議,那就是估算每次實現中涉及的數據存取次數和類型。這樣,再結合指令計數,可以做出更加明智的選擇。與內存存取布置不良相比,個別指令的功耗幾乎無關緊要。
我們這些軟件開發人員要繼續對學術和工具供應商施加壓力,讓他們在下一代工具中構建出這些功能。這不容易但將會實現。
最后,我必須提醒大家所有這些取決于您所用的系統、平臺、應用程序、操作系統、電池和用戶。就像俗話說的“優勢各有不同”。
評論