孟凡奇
(東北電力大學(xué)信息工程學(xué)院,吉林吉林132012)
最差情況執(zhí)行時(shí)間(Worst-case Execution Time,WCET)是指程序P在處理器X上的執(zhí)行時(shí)間上限b。對(duì)于任何輸入,程序P在處理器X上的執(zhí)行時(shí)間都不超過b[1]。對(duì)于某些具有實(shí)時(shí)性要求的安全關(guān)鍵系統(tǒng)而言,其控制程序的執(zhí)行時(shí)間一旦超出預(yù)定的截止時(shí)間則可能造成災(zāi)難性的后果。例如汽車的防抱死制動(dòng)系統(tǒng),如果控制程序計(jì)算延遲較大,則緊急制動(dòng)時(shí)的距離就會(huì)增加,那意味著交通事故發(fā)生的可能性和嚴(yán)重性都會(huì)增加。因此,近年來很多領(lǐng)域的安全標(biāo)準(zhǔn)(例如 DO-178、ISO-26262、IEC-61508和CENELEC EN-50128)都要求提供系統(tǒng)中程序的最差情況執(zhí)行時(shí)間,以證明軟件沒有違背相關(guān)的安全目標(biāo)[2]。
由于程序的WCET受到其自身結(jié)構(gòu)、目標(biāo)處理器的屬性和狀態(tài)以及系統(tǒng)運(yùn)行環(huán)境的多重影響,因此獲得精確的WCET幾乎是不可能的,只能通過測(cè)量或者分析給出一個(gè)估計(jì)值[3]。目前,常用的WCET估計(jì)方法主要有動(dòng)態(tài)測(cè)量與靜態(tài)分析兩類方法。在此基礎(chǔ)上又演化出混合方法、基于模擬的方法以及基于機(jī)器學(xué)習(xí)的方法[4]等等。
動(dòng)態(tài)測(cè)量是通過實(shí)際運(yùn)行程序觀察其執(zhí)行時(shí)間的方法[5]。由于難以窮盡程序所有可能的執(zhí)行路徑,因此,測(cè)量的WCET往往小于(至多等于)程序?qū)嶋H的WCET[6]。這意味著,用此值判定程序一定能在截止時(shí)間內(nèi)完成是不可信的[7](本領(lǐng)域稱之為“不安全”)。所以動(dòng)態(tài)測(cè)量的方法通常用于非安全關(guān)鍵領(lǐng)域(如航模)。
靜態(tài)方法無需運(yùn)行待測(cè)程序,而是通過對(duì)程序控制流的分析計(jì)算WCET。由于有堅(jiān)實(shí)的理論基礎(chǔ),因此計(jì)算出的WCET比實(shí)際的大(是安全的)。也就是說,如果此WCET值能夠滿足截止時(shí)間要求,那么實(shí)際的WCET一定會(huì)在安全截止時(shí)間之內(nèi)。
靜態(tài)分析方法是安全關(guān)鍵領(lǐng)域中程序WCET估計(jì)的主流,其中最常用的是隱藏路徑枚舉技術(shù)(implicit path enumeration technique,IPET)。其核心思想是針對(duì)程序控制流圖中每個(gè)基本塊的執(zhí)行次數(shù)建立一系列線性約束,并通過整數(shù)規(guī)劃求解執(zhí)行時(shí)間最大值[8]。
盡管隱藏路徑枚舉技術(shù)能夠獲得大于實(shí)際WCET的估計(jì)值,但是傳統(tǒng)的局部約束法過于保守,尤其是對(duì)于含有非正交多重嵌套循環(huán)(或遞歸)語句的程序,會(huì)使WCET估計(jì)值過高。從軟件開發(fā)的角度看,過高的估計(jì)值會(huì)使程序的性能被嚴(yán)重低估,從而增添不必要的優(yōu)化工作,抬高開發(fā)成本,甚至延誤工期。從任務(wù)調(diào)度的角度看,過高的估計(jì)值會(huì)浪費(fèi)大量的系統(tǒng)資源,有時(shí)還會(huì)由于資源緊張而導(dǎo)致任務(wù)無法調(diào)度。本文余下部分首先用實(shí)驗(yàn)說明含非正交多重嵌套循環(huán)(或遞歸)語句的程序WCET被高估的現(xiàn)象及原因;然后提出針對(duì)這種高估的二次修正方法;最后用實(shí)驗(yàn)說明該方法的有效性。
眾所周知,程序的循環(huán)次數(shù)對(duì)執(zhí)行時(shí)間是有影響的,通常循環(huán)次數(shù)越多,程序執(zhí)行時(shí)間越長(zhǎng)。因此,目前所有的靜態(tài)方法在計(jì)算WCET之前都需要知道(自動(dòng)分析或人工標(biāo)注)循環(huán)邊界(循環(huán)次數(shù)的上下界),以便使 WCET 估計(jì)值更精確[9-10]。
定義1 循環(huán)邊界是指循環(huán)語句的循環(huán)體在程序正常運(yùn)行的情況下所有可能的執(zhí)行次數(shù)范圍。局部循環(huán)邊界是指循環(huán)語句執(zhí)行1次,其循環(huán)體可能的執(zhí)行次數(shù)范圍。全局循環(huán)邊界是指程序執(zhí)行1次,循環(huán)語句的循環(huán)體可能的全部執(zhí)行次數(shù)范圍。
需要說明的是,由于WCET計(jì)算的是最差情況,因此,通常僅需要提供循環(huán)上界。以下面的代碼為例,第1行for語句的“局部”和“全局”循環(huán)上界都是5。第2行for語句的局部循環(huán)上界是5,全局循環(huán)上界是25。
可以使用局部約束法或全局約束法為計(jì)算WCET的整數(shù)線性規(guī)劃提供所需的循環(huán)上界的表達(dá)式。局部約束法使用局部循環(huán)上界,WCET分析工具會(huì)將局部循環(huán)上界轉(zhuǎn)換成內(nèi)外層語句執(zhí)行次數(shù)的整數(shù)倍關(guān)系。以上面的代碼為例,如果第2行for語句的循環(huán)邊界使用局部約束法,則會(huì)生成類似“l(fā)ine2=5 line1”的表達(dá)式,其含義為第1行for語句每執(zhí)行1次,第2行for語句執(zhí)行5次。而全局約束法使用全局循環(huán)邊界,若第2個(gè)for語句使用全局約束,則會(huì)生成類似“l(fā)ine2=25”的表達(dá)式,即程序執(zhí)行1次,第2行for語句的循環(huán)體會(huì)執(zhí)行25次。
通常情況下,由于局部循環(huán)邊界易于獲取,所以局部約束法是較為常見的循環(huán)邊界標(biāo)注方法。然而,對(duì)于上下文敏感的循環(huán),尤其是非正交多重嵌套循環(huán),獲取內(nèi)循環(huán)語句的局部循環(huán)邊界并不容易。
定義2 若嵌套循環(huán)中內(nèi)層循環(huán)的執(zhí)行次數(shù)完全或部分地依賴于外層循環(huán)能夠直接修改的變量,則稱此嵌套循環(huán)為“非正交”嵌套循環(huán)。
以下面的程序?yàn)槔?行的while語句的局部循環(huán)執(zhí)行次數(shù)既與外層循環(huán)的控制變量i有關(guān)(第7行j取i的值),同時(shí)還與全局變量數(shù)組a的取值有關(guān)。因此,其局部循環(huán)邊界并非一目了然。出于對(duì)安全的考慮,此類非正交多重嵌套循環(huán)在標(biāo)注內(nèi)循環(huán)語句的循環(huán)邊界時(shí),往往采用局部循環(huán)上界,即所有可能情況下的局部最大循環(huán)次數(shù)。在此程序中,由于第6行while的循環(huán)上界是9,第8行while語句的局部循環(huán)上界也是9(當(dāng)i=10時(shí))。這樣一來,內(nèi)層while的全局執(zhí)行次數(shù)會(huì)被記為小于等于9×9=81次。而其實(shí)際的最大全局執(zhí)行次數(shù)為9+8+7+6+5+4+3+2+1=45次。于是,采用傳統(tǒng)局部約束法計(jì)算的WCET被嚴(yán)重高估了。
要獲得更為精確的WCET估計(jì)值,可以使用全局約束法標(biāo)注非正交多重嵌套循環(huán)的循環(huán)邊界。為了驗(yàn)證上述分析,我們做了實(shí)驗(yàn)(1)。我們從瑞典馬拉達(dá)倫大學(xué)的WCET基準(zhǔn)程序中選擇了“select.c”和“fac.c”作為實(shí)驗(yàn)對(duì)象。其中,“select.c”有 3 重嵌套,共4個(gè)非正交的循環(huán)。“fac.c”有一個(gè)非正交的循環(huán)嵌套遞歸。我們通過修改程序輸入的方法,為“select.c”生成8個(gè)變體,連同原程序一共9個(gè)實(shí)驗(yàn)對(duì)象。為“fac.c”生成3個(gè)變體,共4個(gè)實(shí)驗(yàn)對(duì)象。
圖1 采用不同約束獲得的WCET估計(jì)值與觀測(cè)值的對(duì)比(select程序集)
為了使硬件方面的不確定性降到最低,我們配置的目標(biāo)處理器沒有采用分支預(yù)測(cè)和指令Cache,沒有采用亂序執(zhí)行,指令取值隊(duì)列大小為4,重排序緩沖區(qū)為16。實(shí)驗(yàn)工具采用新加坡國(guó)立大學(xué)的Chronos。此時(shí)的WCET觀測(cè)值可認(rèn)為是實(shí)際的WCET。實(shí)驗(yàn)結(jié)果如圖1(select程序集)、表1(fac程序集)所示。
表1 采用不同約束獲得的WCET估計(jì)值與觀測(cè)值的對(duì)比(單位:Cycle)
圖1中全部9個(gè)程序,表1中全部4個(gè)程序,使用全局約束獲得的WCET估計(jì)值都比使用局部約束的低,但比觀測(cè)值要高。這說明,對(duì)于非正交多重循環(huán)嵌套,使用全局約束法獲得的WCET估計(jì)值比使用局部約束法更精確,同時(shí)也是安全的。
使用全局約束法可以修正傳統(tǒng)局部約束法在估計(jì)含非正交多重嵌套循環(huán)程序的WCET時(shí)的過高估計(jì)值,從而使其更精確。盡管如此,人們總是希望獲得更為精確的WCET估計(jì)值。因此,我們針對(duì)采用了亂序執(zhí)行、Cache和分支預(yù)測(cè)結(jié)構(gòu)的復(fù)雜處理器,待分析程序含有非正交多重嵌套循環(huán)或遞歸的情況,提出了WCET估計(jì)的二次修正方法。該方法的前提假設(shè)是:在對(duì)復(fù)雜處理器上運(yùn)行的某些程序的WCET進(jìn)行估計(jì)時(shí),不能僅使用全局約束法替代局部約束法在標(biāo)注循環(huán)邊界或遞歸深度時(shí)所起的作用。為了更好的說明本方法,我們做了以下一組實(shí)驗(yàn)。
實(shí)驗(yàn)(2)的實(shí)驗(yàn)?zāi)康氖窃诤?jiǎn)單處理器上,對(duì)比局部約束、全局約束對(duì)WCET估計(jì)值的影響。實(shí)驗(yàn)對(duì)象是:fac基準(zhǔn)程序,輸入值n=5。外層循環(huán)的循環(huán)上界為6;局部遞歸深度上界為6,全局遞歸深度上界為21。目標(biāo)處理器配置同實(shí)驗(yàn)(1)。試驗(yàn)結(jié)果如表2所示。
從表2中不難看出,當(dāng)僅使用局部約束時(shí),WCET隨著標(biāo)注的遞歸深度的增加而增加。而當(dāng)加入全局約束時(shí),局部遞歸深度d≤3不可行,因?yàn)槿诌f歸上界是21,此時(shí)d*6<21,整數(shù)線性規(guī)劃不可行(也沒意義)。而當(dāng)d≥4時(shí),WCET值不會(huì)隨著標(biāo)注的遞歸深度而增加。這表明,對(duì)于程序fac而言,在目標(biāo)處理器沒有采用亂序執(zhí)行、分支預(yù)測(cè)時(shí),若全局約束正確,局部約束除了會(huì)因?yàn)樵O(shè)置過小而沒有意義以外,不起任何作用。即,全局約束替代了局部約束在標(biāo)注循環(huán)邊界時(shí)的作用。
實(shí)驗(yàn)(3)的實(shí)驗(yàn)?zāi)康氖窃趶?fù)雜處理器上,對(duì)比局部約束、全局約束對(duì)WCET估計(jì)值的影響。實(shí)驗(yàn)對(duì)象與實(shí)驗(yàn)(2)相同。目標(biāo)處理器配置如表3所示。實(shí)驗(yàn)結(jié)果如表4所示。
表2 實(shí)驗(yàn)(2)WCET估計(jì)值、觀測(cè)值的對(duì)比(非亂序,fac(n=5))(單位:Cycle)
表3 實(shí)驗(yàn)(3)的目標(biāo)處理器配置
表4 實(shí)驗(yàn)(3)WCET估計(jì)值、觀測(cè)值對(duì)比(亂序,fac(n=5))(單位:Cycle)
與實(shí)驗(yàn)(2)相比,實(shí)驗(yàn)(3)的結(jié)果卻反映了另外一種情況,當(dāng)目標(biāo)處理器采用亂序執(zhí)行、分支預(yù)測(cè)時(shí),全局約束不能替代局部約束在標(biāo)注循環(huán)邊界時(shí)的作用。從表4中容易看出,即使正確約束了遞歸的全局執(zhí)行次數(shù)為21,WCET還是會(huì)隨著標(biāo)注的遞歸深度增加而增加,只不過估計(jì)值會(huì)比僅局部約束的小。類似的現(xiàn)象我們?cè)凇皊elect”程序的變體(輸入為10,30)中也發(fā)現(xiàn)過。這表明,我們之前的假設(shè)情況是存在的,即在估計(jì)某些在復(fù)雜處理器上運(yùn)行的程序的WCET時(shí),僅使用全局約束法是不夠的。
既然有些時(shí)候必須使用局部約束,這就帶來了一個(gè)新的問題:隱藏路徑枚舉法在計(jì)算WCET時(shí)要使用整數(shù)線性規(guī)劃。而整數(shù)線性規(guī)劃要求約束表達(dá)式中的值必須是整數(shù)[11-12]。同時(shí),局部約束法是用嵌套語句的局部循環(huán)上界表達(dá)內(nèi)外循環(huán)的執(zhí)行次數(shù)關(guān)系。但實(shí)際上這種關(guān)系未必都是整數(shù)倍,于是,即便結(jié)合全局約束與局部約束,WCET估計(jì)值必然還會(huì)存在一定的高估。我們用以下的實(shí)驗(yàn)(4)來說明這個(gè)問題。
實(shí)驗(yàn)(4)的實(shí)驗(yàn)?zāi)康氖菍?duì)比不同約束法獲得的WCET估計(jì)值。實(shí)驗(yàn)對(duì)象是基準(zhǔn)程序fac的4個(gè)變體。目標(biāo)處理器采用表3的配置。實(shí)驗(yàn)結(jié)果如表5所示。
表5 實(shí)驗(yàn)(4)不同約束方法獲得的WCET估計(jì)值(單位:Cycle)
以表5中的fac011為例,“局部約束”是僅采用局部約束法(即,僅使用局部最大遞歸深度“6”)獲得的WCET估計(jì)值?!叭旨s束”是在局部約束的基礎(chǔ)上,添加了全局約束(即,添加了全局遞歸執(zhí)行次數(shù)“21”)獲得的WCET估計(jì)值?!耙淮涡拚笔怯帽磺短渍Z句的全局執(zhí)行次數(shù)除以外層語句的全局次數(shù)所得的商再加1作局部約束,從而修正了原來使用局部執(zhí)行次數(shù)上限作約束所產(chǎn)生的高估值。(即,將原來的局部最大遞歸深度由“6”修正為“┌21/(5+1)┐ =4”),從而獲得更精確的WCET。“二次修正”是在一次修正的基礎(chǔ)上,進(jìn)一步將局部遞歸深度修正為21/(5+1)=3.5的近似值,從而使WCET又精確了一些。需要說明的是,二次修正不是直接修改遞歸深度,因?yàn)檎麛?shù)線性規(guī)劃不允許輸入非整數(shù)。
從表5中不難看出,隨著循環(huán)邊界越來越精確,所得的WCET越來越精確,這說明循環(huán)邊界對(duì)WCET的預(yù)測(cè)有很大影響。同時(shí),盡管全局約束能夠在一定程度上使WCET更精確,但由于前述某些情況的存在,使得全局約束不能完全替代局部約束的作用。而又由于嵌套語句的執(zhí)行次數(shù)關(guān)系未必是整數(shù)倍,所以使用全局約束獲得的WCET仍有繼續(xù)修正的空間。我們的二次修正方法正是針對(duì)這種情況提出來的,其基本流程如圖2所示。
圖2 基于IPET的WCET預(yù)測(cè)二次修正法的基本流程
我們以程序fac的兩個(gè)變體:fac02(n=10)(11,66)和fac011(n=5)(6,21)為例,進(jìn)一步說明二次修正方法的原理。這兩個(gè)程序外層是一個(gè)循環(huán),內(nèi)層嵌套的是遞歸。首先,fac02的外層循環(huán)上限是11,內(nèi)層遞歸的最大遞歸深度是11,內(nèi)層遞歸的全局執(zhí)行次數(shù)是66。然后,計(jì)算嵌套內(nèi)外層的執(zhí)行次數(shù)是否是整數(shù)倍關(guān)系。fac02的所有嵌套(實(shí)際上就1個(gè))的內(nèi)外層執(zhí)行次數(shù)(66/11=6)是整數(shù)倍,因此二次修正的隊(duì)列為空。此程序僅需將局部約束用“6”替代“11”做“一次修正”即可。
fac011的外層循環(huán)上限是6,內(nèi)層遞歸的最大遞歸深度是6,內(nèi)層遞歸的全局執(zhí)行次數(shù)是21。首先,fac011的嵌套非整數(shù)倍(21/6=3.5),進(jìn)入修正隊(duì)列。然后,用┌21/6┐=4和21分別設(shè)為內(nèi)層遞歸的局部和全局約束,計(jì)算WCETbgn。因?yàn)榇饲短椎膶哟蝞=2,所以使用┌21/6┐+1=5替代內(nèi)層嵌套的局部約束,并計(jì)算WCETadd。用WCET2=(WCETbgn-WCETadd)/(5*6-4*6)計(jì)算每1次遞歸的執(zhí)行時(shí)間。最終的WCET=WCETbgn-WCET2*(4*6-21)。其中(4*6-21)是局部遞歸深度設(shè)置為4時(shí),全局遞歸執(zhí)行次數(shù)比實(shí)際的21次多出的次數(shù)。
二次修正方法的效果需要從有效性及安全性兩個(gè)方面加以分析。首先,二次修正的目的是獲得更加精確的WCET估計(jì)值。如果這個(gè)方法確實(shí)能夠獲得比傳統(tǒng)方法(局部約束和全局約束)更加精確的WCET估計(jì)值,我們則認(rèn)為該方法是有效的。其次,二次修正后的結(jié)果必須是安全的,否則就失去了修正的意義。如果修正后的WCET仍然大于實(shí)際的WCET,我們則認(rèn)為該方法是安全的。
為了證明二次修正法的有效性,我們可以對(duì)比實(shí)驗(yàn)(4)的結(jié)果(表5所示)。從中不難看出,使用二次修正法獲得的WCET的確比使用局部約束及全局約束獲得的WCET更加精確,這說明該方法是有效的。為了驗(yàn)證二次修正方法的安全性,我們又做了實(shí)驗(yàn)(5)。實(shí)驗(yàn)對(duì)象是fac和select程序集。目標(biāo)處理器的配置與實(shí)驗(yàn)(1)相同,即不用亂序執(zhí)行等復(fù)雜硬件特性,從而使硬件方面的不確定性將至最低。此時(shí),觀測(cè)得到的WCET可認(rèn)為是實(shí)際的WCET。實(shí)驗(yàn)結(jié)果如表6所示。
表6 實(shí)驗(yàn)(5)二次修正法獲得的WCET估計(jì)值與觀測(cè)值的對(duì)比(單位:Cycle)
從表6中可以看到,二次修正獲得的WCET全部大于實(shí)際的WCET。這說明本文提出的二次修正方法是安全的,能夠用于評(píng)估程序的執(zhí)行時(shí)間是否能夠滿足截止時(shí)間要求。
某些含有非正交多重循環(huán)嵌套的程序,當(dāng)其在采用亂序執(zhí)行的復(fù)雜處理器上執(zhí)行時(shí),僅使用全局約束未必能替代局部約束在估計(jì)其WCET時(shí)所起的作用。其原因可能在于源碼與編譯后的目標(biāo)代碼很難一一對(duì)應(yīng)起來,因此在源碼中標(biāo)注的循環(huán)邊界并沒有被映射到所有相應(yīng)的目標(biāo)代碼上。這意味著僅使用全局約束獲得的WCET仍有繼續(xù)精確的空間。理論上可以在源碼上加注更多的全局約束以使WCET更精確,但更多的約束可能導(dǎo)致整數(shù)線性規(guī)劃不可解。
針對(duì)上述需要全局約束和局部約束同時(shí)起作用的情況,我們提出了二次修正方法。其中,第1次修正將用內(nèi)循環(huán)的局部循環(huán)上界表示的局部約束修正為內(nèi)循環(huán)全局循環(huán)上界除以其外循環(huán)全局循環(huán)上界所得的商再加1。在此基礎(chǔ)上,第2次修正是再將內(nèi)循環(huán)的局部約束修正為實(shí)際值。盡管二次修正方法中的第2次修正沒有第1次修正的效果明顯,但從對(duì)計(jì)算精度的不懈追求角度看,畢竟使得WCET估計(jì)值更精確了一些。
本文的貢獻(xiàn)在于發(fā)現(xiàn)了上述全局約束不能替代局部約束的問題,并且針對(duì)這一問題提出了二次修正方法,能夠獲得更為精確且安全的WCET估計(jì)值。該方法的不足之處在于需要多次進(jìn)行WCET的分析與計(jì)算,會(huì)比較耗時(shí)。未來的工作是進(jìn)一步研究程序源碼與目標(biāo)代碼之間的映射方法,提高映射精度,從而從根本上消除由于約束過多或過少造成的WCET不可求解或估計(jì)值過大的問題。
[1]Li X,Liang Y,Mitra T,et al.Chronos:A timing analyzer for embedded software[J].Science of Computer Programming,2007,69(1):56-67.
[2]Wilhelm R,Grund D.Computation takes time,but how much[J].Communications of the ACM,2014,57(2):94-103.
[3]呂鳴松.實(shí)時(shí)系統(tǒng)最壞情況執(zhí)行時(shí)間分析技術(shù)的研究[D].沈陽(yáng):東北大學(xué),2010.
[4]孔亮亮,江建慧,肖杰,等.ARM 程序執(zhí)行周期估計(jì)的基于模擬的非線性方法[J].計(jì)算機(jī)研究與發(fā)展,2012,49(2):392-401.
[5]Kosmidis L,Quinones E,Abella J,et al.Achieving timing composability with measurement-based probabilistic timing analysis[C]//In IEEE International Symposium on Object/component/service-oriented Real-time distributed computing(ISORC).2013:1-8.
[6]張保民,吳國(guó)偉,姚琳.程序最壞執(zhí)行時(shí)間極值統(tǒng)計(jì)方法[J].計(jì)算機(jī)工程與應(yīng)用,2010,46(26):67-71.
[7]Cazorla F J,Quinones E,Vardanega T,et al.Proartis:Probabilistically analyzable real-time systems[J].ACM Transactions on Embedded Computing Systems(TECS),2013,12(2s):94-119.
[8]Li Y T S,Malik S.Performance analysis of embedded software using implicit path enumeration[J].ACM SIGPLAN Notices,1995,30(11):88-98.
[9]Knoop J,Kovács L,Zwirchmayr J.An Evaluation of WCET Analysis using Symbolic Loop Bounds[J].Proc.of WCET,2011.
[10]Blazy S,Maroneze A,Pichardie D.Formal Verification of Loop Bound Estimation for WCET Analysis[M]//Verified Software:Theories,Tools,Experiments.Springer Berlin Heidelberg,2014:281-303.
[11]徐屹.基于優(yōu)化模型的廣義最小二乘法及其應(yīng)用[J].東北電力大學(xué)學(xué)報(bào),2013,33(6):11-14.
[12]曲朝陽(yáng),陳師,楊帆,等.基于雙層次分析的變電站數(shù)據(jù)分類方法[J].東北電力大學(xué)學(xué)報(bào),2014,34(2):61-65.