傅翠嬌,錢(qián)德沛,2,欒鐘治
(1.北京航空航天大學(xué)計(jì)算機(jī)學(xué)院,100191,北京;2.中山大學(xué)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院,510275,廣州)
隨著通信網(wǎng)絡(luò)、個(gè)人計(jì)算機(jī)以及數(shù)據(jù)中心規(guī)模的快速增長(zhǎng),它們消耗的能量也越來(lái)越多,2012年個(gè)人和商業(yè)計(jì)算機(jī)的能耗已超過(guò)470 TW·h[1]。在計(jì)算機(jī)硬件方面已經(jīng)采取了一些節(jié)能技術(shù),主要有根據(jù)系統(tǒng)中的負(fù)載來(lái)調(diào)節(jié)操作狀態(tài)的動(dòng)態(tài)電源管理技術(shù)[2]和根據(jù)計(jì)算能力的不同需要來(lái)動(dòng)態(tài)調(diào)節(jié)電壓和頻率的技術(shù)[3]。然而,在軟件方面,軟件開(kāi)發(fā)者一般不確定一段代碼的具體能耗和如何減少能耗。雖然借助于某些測(cè)量工具可以直接讀出軟件的能耗,但是它不能解釋能耗變化的原因以及定位程序能耗較高的代碼段。本文提出了一種基于機(jī)器學(xué)習(xí)算法的能耗模型,軟件開(kāi)發(fā)者可以通過(guò)該模型來(lái)評(píng)估代碼的能耗,而不需要用測(cè)量的能耗數(shù)據(jù)訓(xùn)練自己的模型。該能耗模型是基于性能事件工具測(cè)量的性能數(shù)據(jù)建立的,這些性能事件本身可以反映出程序運(yùn)行時(shí)的行為,所以可以解釋能耗變化的原因。實(shí)驗(yàn)數(shù)據(jù)表明,以測(cè)量的能耗為基準(zhǔn),該模型的平均能耗預(yù)測(cè)誤差小于9%。程序員可以利用該模型對(duì)自己所編寫(xiě)的程序的能耗進(jìn)行預(yù)測(cè),而不需要專(zhuān)門(mén)對(duì)程序再進(jìn)行能耗測(cè)量和訓(xùn)練;也可以利用該模型準(zhǔn)確地估計(jì)一些重復(fù)使用率高的代碼能耗,以便為優(yōu)化這些代碼提供依據(jù)。
現(xiàn)有的關(guān)于軟件能耗的研究工作主要包括:CPU級(jí)、功能部件級(jí)、進(jìn)程級(jí)、分布式系統(tǒng)的應(yīng)用程序以及基于系統(tǒng)調(diào)用的能耗模型等。
CPU的能耗是計(jì)算機(jī)系統(tǒng)能耗中的重要部分。CPU級(jí)能耗模型的研究主要集中在周期級(jí)和指令級(jí)兩個(gè)抽象的級(jí)別。周期級(jí)體系結(jié)構(gòu)模擬器是在每一個(gè)執(zhí)行周期通過(guò)激活微體系結(jié)構(gòu)級(jí)單元或者塊來(lái)估測(cè)模擬處理器的能耗[4],David等對(duì)處理器各部分分別進(jìn)行模擬然后計(jì)算出最后的能耗值[5]。指令級(jí)的能耗模型是用來(lái)估計(jì)程序中所有指令執(zhí)行的總能耗,Seo等提出了基于Java編程語(yǔ)言的能耗模型[6]。
在通過(guò)收集和使用實(shí)時(shí)部件能耗信息建立功能部件級(jí)能耗模型方面,Chen等提出了計(jì)算機(jī)系統(tǒng)主要功能部件的能耗模型[7];Shye等發(fā)現(xiàn)整個(gè)計(jì)算機(jī)能耗的主要部分是屏幕和CPU功耗[8];Gurumurthi等發(fā)現(xiàn)最耗能的部件是硬盤(pán)[9];Zhang等研究了部件利用率的能耗模型[10]。
進(jìn)程級(jí)能耗模型是一種更加細(xì)粒度的方法,它根據(jù)實(shí)時(shí)的能耗信息作出節(jié)省能耗的關(guān)鍵決策。Chen等把進(jìn)程的能耗定義為進(jìn)程對(duì)所有功能部件使用的能耗之和[7]。
Feng等在文獻(xiàn)[11]中提出了分布式系統(tǒng)應(yīng)用程序的能耗測(cè)量和分析框架;Seo等則提出了基于Java編程語(yǔ)言的分布式系統(tǒng)能耗模型[6]。
Pathak等提出了基于系統(tǒng)調(diào)用的有限狀態(tài)機(jī)能耗模型[12],有限狀態(tài)機(jī)的每個(gè)狀態(tài)代表一個(gè)特定部件的功率使用模式。Aggarwal等提出了基于系統(tǒng)調(diào)用計(jì)數(shù)的模型[13],該模型不適用于新的應(yīng)用軟件,它只能預(yù)測(cè)能耗的變化,并不能給出具體的能耗情況。
本文采用機(jī)器學(xué)習(xí)算法建立能耗模型,該模型以軟件的性能事件為特征。在建立軟件能耗模型的過(guò)程中,首先采集用作訓(xùn)練樣本的性能和能耗數(shù)據(jù),然后根據(jù)相應(yīng)的算法進(jìn)行特征選擇,通過(guò)有監(jiān)督的機(jī)器學(xué)習(xí)算法建立與性能相關(guān)的能耗模型,再根據(jù)模型預(yù)測(cè)測(cè)試程序的能耗,最后根據(jù)預(yù)測(cè)的能耗結(jié)果,通過(guò)修改程序代碼來(lái)達(dá)到優(yōu)化程序能效的目的。
本文以性能事件作為模型的特征是因?yàn)樾阅苁录c程序的行為和特征有關(guān)。Perf工具[14]是Linux下的性能分析工具。它支持多種性能事件,主要包含7個(gè)硬件事件、8個(gè)軟件事件和26個(gè)硬件高速緩存事件。軟件事件實(shí)際上是與硬件無(wú)關(guān)的內(nèi)核計(jì)數(shù)器。硬件事件和高速緩存事件依賴(lài)于CPU架構(gòu)[4]。我們應(yīng)用Perf工具采集了41個(gè)性能事件,這些性能事件是cycles、instructions等。
為了建立一個(gè)健壯的能耗模型揭示能耗與性能的關(guān)系,需要收集大量的訓(xùn)練數(shù)據(jù)(即軟件性能數(shù)據(jù)與軟件能耗數(shù)據(jù))。為了方便數(shù)據(jù)的采集,本研究團(tuán)隊(duì)專(zhuān)門(mén)研制了Marcher服務(wù)器,該服務(wù)器提供了能耗采集的基本功能。我們?cè)贛archer服務(wù)器上運(yùn)行大量的樣本軟件,采集軟件運(yùn)行的性能和能耗相關(guān)的數(shù)據(jù)。軟件的性能數(shù)據(jù)是利用Perf工具采集的程序運(yùn)行過(guò)程中的數(shù)據(jù)。能耗數(shù)據(jù)是在Marcher服務(wù)器讀取的運(yùn)行程序的功耗數(shù)據(jù)。用作訓(xùn)練的程序主要是C、C++、Python以及Java程序,這些程序中有100多個(gè)程序是本研究團(tuán)隊(duì)自己編寫(xiě)的程序,有300多個(gè)程序來(lái)自編程任務(wù)網(wǎng)站[15],此外還包括OMP2012[16]、SPEC2006[17]、FFT和Nbody等程序[18]。用做測(cè)試的程序是Bhomp[18]和NPB3.0[19]。為了使測(cè)試集中于計(jì)算等基本的操作,去掉了程序中所有與輸入輸出相關(guān)的代碼部分。
為了獲取實(shí)驗(yàn)所需的訓(xùn)練樣本數(shù)據(jù),專(zhuān)門(mén)設(shè)計(jì)了腳本程序。在服務(wù)器上運(yùn)行這些腳本程序,自動(dòng)實(shí)時(shí)記錄能耗數(shù)據(jù)。從可測(cè)功率的高性能計(jì)算機(jī)(Marcher服務(wù)器)上實(shí)時(shí)讀取程序運(yùn)行時(shí)的功率數(shù)據(jù)并求其平均值,為了避免由于其他因素造成的干擾,每個(gè)程序運(yùn)行3次,取3次功率數(shù)據(jù)的平均值。本文還設(shè)計(jì)了一些腳本用于記錄從性能工具獲取的性能事件數(shù)據(jù),分別記錄了多個(gè)點(diǎn)的性能數(shù)據(jù)。對(duì)于性能數(shù)據(jù)沒(méi)有采取平均值而是采用了中位數(shù)。采用中位數(shù)是因?yàn)樗皇軜O端數(shù)據(jù)的影響,可以避免數(shù)據(jù)相差較大。
為了減少特征集中的特征數(shù),需要進(jìn)行特征選擇。選擇出的特征可以更好地解釋模型并提高模型預(yù)測(cè)的準(zhǔn)確性。
由于不同性能事件數(shù)據(jù)的取值是不同的,有的數(shù)值差距較大,所以將性能數(shù)據(jù)標(biāo)準(zhǔn)化到0~1的范圍內(nèi)。標(biāo)準(zhǔn)化的數(shù)據(jù)使機(jī)器學(xué)習(xí)算法運(yùn)行的更快更準(zhǔn)確[12]。
本文選用了Perman相關(guān)性分析、主成分分析法以及隨機(jī)森林算法進(jìn)行特征選擇。根據(jù)機(jī)器學(xué)習(xí)算法和相關(guān)性分析算法選擇了排名前22的特征,它們分別是:cycles、instructions、cache-references、cache-misses、bus-cycles、branches、branch-misses、ref-cycles、stalled-cycles-backend、stalled-cycles-frontend、L1-dcache-loads、L1-dcache-load-misses、dTLB-loads、LLC-loads、LLC-load-misses、LLC-stores、cpu-clock、cs、migrations、L1-dcache-prefetch-misses、branch-load-misses和branch-loads。其中隨機(jī)森林算法在選擇這22個(gè)特征時(shí),預(yù)測(cè)的得分為96.06,這些特征主要與系統(tǒng)時(shí)鐘、訪問(wèn)高速緩存以及執(zhí)行指令的順序有關(guān)。
不同類(lèi)型的軟件可選擇出不同的特征。首先選擇采集自程序Nbody的數(shù)據(jù)來(lái)訓(xùn)練模型,只選擇LLC-stores和migrations特征時(shí),預(yù)測(cè)的得分可達(dá)86.1,模型的系數(shù)是[16.861,71.254],常數(shù)是72.814。當(dāng)選擇bus-cycles、branch-misses、ref-cycles、LLC-stores、LLC-prefetches和migrations這6個(gè)特征時(shí),預(yù)測(cè)得分高達(dá)94.77,模型的系數(shù)是[-5.554,3.005,-5.545,17.113,6.026,72.042],常數(shù)是72.490。Nbody程序是典型的并行程序。對(duì)于并行程序,在開(kāi)始運(yùn)行時(shí)需要把任務(wù)分派到各個(gè)處理器上,Migrations參數(shù)反映了程序的并行執(zhí)行程度。對(duì)于計(jì)算密集型的程序來(lái)說(shuō),由于存在較多的寫(xiě)回操作,因此LLC-stores反映了最后一級(jí)高速緩存寫(xiě)回的次數(shù)。
本文分別采用了線性回歸、隨機(jī)森林、嶺回歸和套索回歸4種不同的機(jī)器學(xué)習(xí)算法建立預(yù)測(cè)能耗的模型,之所以選擇這些算法是因?yàn)樗鼈兪褂煤?jiǎn)單、預(yù)測(cè)準(zhǔn)確。
(1)
本文將預(yù)測(cè)誤差率定義為測(cè)量的功耗與預(yù)測(cè)的功耗差的絕對(duì)值除以測(cè)量的功耗
ε=|y-p|/y
(2)
式中:ε為軟件預(yù)測(cè)誤差率;y為測(cè)量的功耗;p為預(yù)測(cè)的功耗。
根據(jù)樹(shù)型隨機(jī)分類(lèi)算法選擇性能特征cache_miss對(duì)測(cè)試的程序進(jìn)行分類(lèi)。運(yùn)行Weka軟件的分類(lèi)功能,根據(jù)實(shí)驗(yàn)數(shù)據(jù)得到cache_miss的閾值。在實(shí)驗(yàn)中,根據(jù)程序性能的cache_miss數(shù)值將軟件分為兩類(lèi),一類(lèi)是cache_miss數(shù)值大于或等于2×107的軟件,這類(lèi)軟件具有計(jì)算密集型和訪存密集型的特征;一類(lèi)是cache_miss數(shù)值小于2×107的軟件。對(duì)于每個(gè)內(nèi)存訪問(wèn)請(qǐng)求,處理器查找主緩存以檢索數(shù)據(jù),若找不到數(shù)據(jù),則將其視為高速緩存缺失。cache_miss是軟件的一個(gè)重要性能指標(biāo),非常適合對(duì)軟件進(jìn)行分類(lèi),然后根據(jù)類(lèi)別分別建立能耗模型。
本節(jié)首先介紹了實(shí)驗(yàn)所用服務(wù)器的配置和測(cè)試程序,然后驗(yàn)證了實(shí)驗(yàn)的預(yù)測(cè)準(zhǔn)確率,并以預(yù)測(cè)準(zhǔn)確率較高的嶺回歸算法建立了能耗模型,最后根據(jù)模型分析了能耗產(chǎn)生的原因。
在美國(guó)國(guó)家科學(xué)基金會(huì)資助的可測(cè)功率的高性能計(jì)算機(jī)(代號(hào)Marcher)上進(jìn)行實(shí)驗(yàn)。每一個(gè)服務(wù)器包含兩個(gè)英特爾Xeon E5-2600處理器,每個(gè)處理器有16個(gè)內(nèi)核、一個(gè)32 GB的DRAM、一個(gè)K20 GPU和一個(gè)英特爾Xeon Phi協(xié)處理器,以及硬盤(pán)和SSD的混合存儲(chǔ)。在服務(wù)器上已開(kāi)發(fā)了一個(gè)易于使用的API,它可以從多個(gè)來(lái)源來(lái)讀取功率數(shù)值,包括英特爾RAPL接口[21]、NVIDIA管理庫(kù)(NVML)接口[22]、英特爾micaccess API[23]和電力數(shù)據(jù)采集卡(PODAC)。通過(guò)這個(gè)API,可以很容易地在運(yùn)行時(shí)收集所有主要部件(例如CPU、內(nèi)存、硬盤(pán)、GPU和Xeon Phi)的細(xì)粒度的功率數(shù)據(jù)。由于測(cè)試樣本程序不使用GPU和Xeon Phi,而磁盤(pán)的功率在大多數(shù)時(shí)候是相同的,所以在實(shí)驗(yàn)中只計(jì)算CPU功率數(shù)據(jù)。關(guān)于服務(wù)器系統(tǒng)更多的細(xì)節(jié)可參見(jiàn)文獻(xiàn)[24]。
在測(cè)試實(shí)驗(yàn)中使用的基準(zhǔn)測(cè)試程序主要包括NPB3.0和Bhomp,共有27個(gè)獨(dú)立的程序運(yùn)行形式。其中,程序BT的S類(lèi)型的可執(zhí)行程序的形式是“BT.S”,Bhomp中的程序是不同的輸入數(shù)據(jù)集下的Bhomp程序的獨(dú)立運(yùn)行結(jié)果。例如Nhome(5)是指Nhome(200 000,10,5),其中200 000、10、5 是程序運(yùn)行時(shí)的輸入?yún)?shù),其他程序類(lèi)似。這些程序主要是CPU計(jì)算密集型和內(nèi)存訪問(wèn)密集型程序。
預(yù)測(cè)的誤差率越小說(shuō)明預(yù)測(cè)準(zhǔn)確率越高。表1給出了不同機(jī)器學(xué)習(xí)算法下能耗測(cè)量數(shù)據(jù)和預(yù)測(cè)數(shù)據(jù)之間的差異。由實(shí)驗(yàn)結(jié)果得到,這些程序能耗預(yù)測(cè)的平均預(yù)測(cè)誤差率為6.80%。嶺回歸算法的平均預(yù)測(cè)誤差率最小為5.70%。隨機(jī)森林算法、套索回歸和線性回歸算法的平均預(yù)測(cè)誤差率分別為6.5%、8.18%和6.81%??梢钥闯?所得到的預(yù)測(cè)數(shù)據(jù)基本上是準(zhǔn)確的。由于嶺回歸算法的誤差最小,所以在建立能耗模型時(shí)選取嶺回歸算法。
本文首先建立了軟件平均能耗模型,然后在此基礎(chǔ)上建立了實(shí)時(shí)能耗模型,并對(duì)二者的預(yù)測(cè)誤差率進(jìn)行了比較。
3.4.1 平均能耗模型 通過(guò)對(duì)4種機(jī)器學(xué)習(xí)算法的實(shí)驗(yàn)比較,選擇嶺回歸算法作為模型所用的算法,建立了預(yù)測(cè)平均功耗的模型p=cx+b,其中c為模型的系數(shù)向量,c=[c1,c2,…,cn];b為常數(shù)。程序能耗的公式是E=pt,p為CPU的功耗,t為程序的運(yùn)行時(shí)間。代入p得到能耗公式
E=(cx+b)t
(3)
當(dāng)性能參數(shù)cache_miss值大于等于2×107時(shí),能耗模型E1=(c1x+b1)t。當(dāng)cache_miss值小于2×107時(shí),能耗模型E2=(c2x+b2)t。根據(jù)嶺回歸機(jī)器學(xué)習(xí)算法可以得到模型的系數(shù),其中
b1=109.74
b2=63.2
c1=[-3.97,-2.64,-8.13,-3.41,3.76,-6.7,-0.97,3.77,-11.14,2.46,-8.7,0.74,-8.7,-9.64,3.12,-11.66,3.85,9.64,3.76,3.54,-0.94,-6.31]
表1 不同機(jī)器學(xué)習(xí)算法軟件能耗的預(yù)測(cè)誤差率
c2=[2.45,-1.93,-1.64,1.51,2.44,-3.73,-0.78,2.44,0.1,8.2,1.3,-3.04,1.3,-2.81,1.55,1.69,2.45,2.34,21.51,-0.4,-0.8,-3.71]
3.4.2 實(shí)時(shí)能耗模型 建立上述能耗模型時(shí),選取性能數(shù)據(jù)中位數(shù)作為訓(xùn)練數(shù)據(jù),雖然中位數(shù)可以規(guī)避數(shù)值差異較大帶來(lái)的問(wèn)題,但是它不能實(shí)時(shí)地反映系統(tǒng)的實(shí)際運(yùn)行功率,所以需要建立實(shí)時(shí)的能耗模型。根據(jù)實(shí)時(shí)的性能信息實(shí)時(shí)預(yù)測(cè)出能耗的值。當(dāng)cache_miss的值大于等于2×107時(shí)程序的j時(shí)刻(在0.02 s的一段時(shí)間內(nèi))的實(shí)時(shí)功耗模型為p1=c1x+b1;當(dāng)cache_miss的值小于2×107時(shí)程序的功耗模型為p2=c2x+b2,對(duì)應(yīng)j時(shí)刻的實(shí)時(shí)能耗模型分別為E1j和E2j,即
E1j=(c1xj+b1)t/N,E2j=(c2xj+b2)t/N
(4)
Perf工具的采樣頻率為N,程序運(yùn)行的時(shí)間為T(mén),那么在時(shí)間T內(nèi),Perf工具共采樣了TN次。兩類(lèi)程序的平均能耗分別為E1和E2,即
(5)
表2給出了以Bhomp基準(zhǔn)測(cè)試程序?yàn)闇y(cè)試程序的預(yù)測(cè)誤差率結(jié)果,從表2可以看出,實(shí)時(shí)能耗模型預(yù)測(cè)誤差率平均值僅為0.79%,比平均能耗模型預(yù)測(cè)誤差率降低了17%。
表2 不同應(yīng)用程序的平均能耗模型和實(shí)時(shí)能耗模型預(yù)測(cè)誤差率比較
從3.4.1節(jié)的能耗模型可以看出,和功耗相關(guān)的主要性能特征可以分為以下幾類(lèi)。
(1)與CPU的執(zhí)行周期有關(guān)的參數(shù)為cycles、bus_cycles、ref-cycles以及cpu-clock,這些都是和時(shí)間相關(guān)的參數(shù)。這些參數(shù)的值越大,程序的執(zhí)行時(shí)間越長(zhǎng),CPU的能耗也越高。
(2)與分支預(yù)測(cè)相關(guān)的參數(shù)為branches、branch-misses、branch-loads和branch-load-misses。如果分支預(yù)測(cè)正確,指令的執(zhí)行沿最短時(shí)間的路線前進(jìn),程序的執(zhí)行時(shí)間較短。但是如果這些數(shù)值變大,說(shuō)明程序在分支預(yù)測(cè)上花費(fèi)了更多的時(shí)間,會(huì)延長(zhǎng)整個(gè)程序的執(zhí)行時(shí)間。
(3)與高速緩存訪問(wèn)相關(guān)的參數(shù)為cache-references、cache-misses、L1-dcache-loads、L1-dcache-load-misses、dTLB-loads、LLC-loads、LLC-load-misses、LLC-stores、L1-dcache-prefetch-misses。其中cache-references是高速緩存的訪問(wèn)次數(shù),cache-misses是高速緩存訪問(wèn)不命中的次數(shù)。一般假定所有的存儲(chǔ)器停頓都是由高速緩存缺失引起的,把命中時(shí)鐘周期數(shù)包含在CPU執(zhí)行時(shí)鐘周期數(shù)中。最后一級(jí)高速緩存的讀寫(xiě)、TLB的讀取、L1數(shù)據(jù)高速緩存的讀取、讀取失敗的次數(shù)以及預(yù)測(cè)失敗的次數(shù)都對(duì)高速緩存的缺失率起重要作用。CPU頻率越高,CPU滿(mǎn)載時(shí)的功率也越高,每次缺失會(huì)需要較多的時(shí)鐘周期數(shù),從而導(dǎo)致存儲(chǔ)器停頓時(shí)間延長(zhǎng)、性能降低、能耗增加。
(4)與程序的切換有關(guān)的參數(shù)為cs、migrations。cs是上下文切換的次數(shù),migrations是線程從一個(gè)CPU的核轉(zhuǎn)移到另一個(gè)核上執(zhí)行的次數(shù)。在計(jì)算量較大的情況下,CPU會(huì)把一些計(jì)算任務(wù)轉(zhuǎn)移到空閑的核上去執(zhí)行。
(5)與程序執(zhí)行指令條數(shù)相關(guān)的參數(shù)為instructions。指令數(shù)是獨(dú)立于硬件的,一般用來(lái)評(píng)價(jià)性能,在時(shí)鐘周期不變的情況下,執(zhí)行的指令越多,程序的執(zhí)行時(shí)間越長(zhǎng)。
通過(guò)性能參數(shù)對(duì)CPU的功耗建模,可以揭示功耗產(chǎn)生的原因。當(dāng)通過(guò)調(diào)節(jié)CPU的功率來(lái)降低能耗時(shí),從模型上可以看出調(diào)節(jié)功耗影響了程序的性能,進(jìn)而延長(zhǎng)了程序的執(zhí)行時(shí)間,從而增加了程序能耗,所以不能為了降低能耗而盲目地降低或者增加CPU的功率。
能效優(yōu)化可以通過(guò)對(duì)采用不同方法編寫(xiě)的相同功能的程序?qū)Ρ葘?shí)驗(yàn)來(lái)說(shuō)明。實(shí)驗(yàn)中實(shí)際測(cè)量與預(yù)測(cè)的CPU功耗基本一致。實(shí)驗(yàn)中所有程序都運(yùn)行了3次,實(shí)驗(yàn)數(shù)據(jù)取平均值。在第1組遞歸和非遞歸程序?qū)Ρ葘?shí)驗(yàn)中,遞歸程序運(yùn)行了6.798 s,CPU的功耗實(shí)際測(cè)量值為378.994 W,預(yù)測(cè)值為382.549 W;非遞歸程序運(yùn)行了0.201 s,CPU的功耗實(shí)際測(cè)量值為8.085 W,預(yù)測(cè)值為7.444 W,可以看出遞歸程序的能耗較大,原因在于遞歸程序因?yàn)橐Wo(hù)現(xiàn)場(chǎng)占用了太多的資源,因此在編寫(xiě)程序時(shí)不建議采用遞歸方法。本實(shí)驗(yàn)的第2組數(shù)據(jù)是重載和未采用重載操作的程序。采用重載操作的程序運(yùn)行了58.419 s,CPU的功耗測(cè)量值為77.826 W,預(yù)測(cè)值為78.257 W;而未采用重載操作的程序運(yùn)行了28.817 s,CPU的功耗測(cè)量值為80.522 W,預(yù)測(cè)值為79.280 W,可以看出采用重載操作的程序運(yùn)行時(shí)間較長(zhǎng),因?yàn)閹в卸鄠€(gè)重載操作符的表達(dá)式可能會(huì)導(dǎo)致臨時(shí)對(duì)象創(chuàng)建中間結(jié)果。通過(guò)兩組程序的能耗對(duì)比,為程序員編寫(xiě)高能效的程序提供了依據(jù)。
本文提出了一種利用機(jī)器學(xué)習(xí)算法預(yù)測(cè)軟件能耗的方法,并建立了以軟件性能事件為特征的能耗模型。在實(shí)驗(yàn)中使用了4種機(jī)器學(xué)習(xí)算法,通過(guò)預(yù)測(cè)誤差對(duì)比實(shí)驗(yàn)選取了最適合的嶺回歸機(jī)器學(xué)習(xí)算法。實(shí)驗(yàn)結(jié)果表明,以測(cè)量能耗為基準(zhǔn)的能耗預(yù)測(cè)誤差率低于9%,并且根據(jù)模型更容易分析能耗產(chǎn)生的原因?;谀P偷哪芎念A(yù)測(cè)方法避免了采用程序代碼插樁方式測(cè)量能耗會(huì)影響程序性能的缺點(diǎn)。本文還提出了一種基于性能特征的軟件分類(lèi)方法,即根據(jù)cache_miss的閾值將軟件分類(lèi)并分別建模。本模型對(duì)計(jì)算密集型和內(nèi)存訪問(wèn)密集型程序的能耗有更精確的預(yù)測(cè)。下一步我們將基于神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)等算法,結(jié)合更大規(guī)模的程序數(shù)據(jù)訓(xùn)練樣本,建立更為準(zhǔn)確的能耗模型。