http://software.intel.com/zh-cn/blogs/2011/12/26/400009546/?cid=sw:prccsdn2127
看到這個題目的時候,讀者可能會詫異:代碼也有節能與不節能之分?我們說,是的,本質上,程式所調度的是硬體資源,不合理的硬體調度,會使得裝置調度效率不高,從而產生更高的能耗。 實際上,隨著移動終端的流行,功耗比已然成為比較處理器的重要參數。在已經上市,可能大放光彩的超級本上(Ultrabook),功耗更成為重要的考慮因素。實際上英特爾已經大量考慮了硬體層面的功耗最佳化,微軟將在Windows8中增強功耗最佳化,第三方軟體也將不可避免的影響到功耗,而實際上ill behaving的軟體或服務甚至可能會使得所有硬體層和系統層所作的功耗最佳化功虧一簣。
當前來講,對於同質化的軟體,其差異性在於效能,功能,使用者體驗等,在不久的將來,功耗可能成為重要特性之一。想象一下,在超級本普及之後,一個軟體能支撐十個小時,而另外一個只能七個小時,那麼使用者尤其是沒有外接電源的情況下必然更傾向於前者。
閑話短續,那麼什麼樣的軟體是節能的軟體呢?通常可以從下面兩個工作狀態來看:
Idle workloads:
1. 處理器和平台能夠長時間處於idle狀態,避免軟體的高頻執行,比如統計等;
2. 應當儘可能的將任務聯合,協調和分批處理;避免頻繁的執行程式,最小化後台服務;
3. 軟體不能夠影響平台硬體組件進入到深一層的power state(往往是因為太多的中斷所造成)。
4. 當系統idle的時候,使硬碟降速(spin down)。避免周期性的硬碟訪問註冊。
Active workload:
1. 提高計算的有效性和CPU的使用效率,目的是讓系統進入到更長時間的idle狀態;
2. 減少處理器的C-state切換的次數,頻繁的C-state切換會導致能量的損耗;
3. 對於多核架構,最大化多核程式執行的並發性,這樣可以是package 層次的資源和platform層次的資源得到更有效管理;
4. 減少程式的執行頻率,對於有特定cpu使用率的任務來說,讓它運行更長的時間,更低的頻率,更節能。
5. 程式中如果提高了timer解析度對功耗有很大的影響,盡量使用大的timer的時間間隔,如果必須使用小的timer間隔,當任務完成之後,將其重設為大的值。
實際功耗分析中,package state, core state, c-state等都將是重要的考慮參數。從上面這些點中可以看到,所謂功耗最佳化,本質上無非是從平台的角度考慮效能最佳化。功耗的問題,不僅僅是CPU效能問題,而降低CPU的利用率則是第一步,這可以使用英特爾的Vtune工具。
(:/en-us/articles/intel-vtune-amplifier-xe/)
對於平台的功耗最佳化來說,還要考慮如何提高程式的並發性,如何減少外設(硬碟等)的電源的損耗,而這都是與軟體的運行特性相關的。我們將在未來的部落格中進一步分析如何才能寫更節能的程式。