劉 陽,莊 毅
(南京航空航天大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院,軟件新技術(shù)與產(chǎn)業(yè)化協(xié)同創(chuàng)新中心,南京 211106)
隨著芯片制造工藝的進(jìn)步,元器件的集成度不斷提高,使得芯片的性能都得到了極大的提升.但同時,高度的集成化使得芯片對粒子輻射等環(huán)境因素的敏感度也提高了.當(dāng)芯片受到單粒子撞擊時,元器件存儲區(qū)域上的一位或者相鄰多位可能會發(fā)生翻轉(zhuǎn),從而導(dǎo)致軟錯誤的發(fā)生.軟錯誤主要指程序運(yùn)行時,由不正確的信號或者數(shù)據(jù)造成的故障[1,2].靜默數(shù)據(jù)損壞(Silent Data Corruption,SDC)[3]錯誤是最具有危害性的軟錯誤類型之一.SDC錯誤具有較高的隱蔽性,通常會導(dǎo)致難以察覺的程序輸出錯誤,在常規(guī)檢測方法下難以被檢測.而在有較高可靠性需求的航空航天領(lǐng)域,要降低程序?qū)臻g粒子輻射的敏感度,使得程序能夠檢測到SDC錯誤,故需要設(shè)計具有針對性的錯誤檢測方法來檢測SDC錯誤.
傳統(tǒng)的基于冗余的SDC錯誤檢測方案會導(dǎo)致較大的性能開銷,對于性能約束較為嚴(yán)格的嵌入式程序而言,一個高效費(fèi)比的SDC錯誤檢測方法是尤為重要的.
本文的主要貢獻(xiàn)如下:改進(jìn)了故障模型,將物理空間中的多位翻轉(zhuǎn)映射到單一指令中,使得故障注入模擬更加貼近真實輻射情況.提出了一種利用AdaBoost的SDC錯誤檢測方法SEDA(SDC Error Detection Method based on AdaBoost),通過故障注入獲取指令SDC相關(guān)特征,訓(xùn)練機(jī)器學(xué)習(xí)模型預(yù)測指令SDC脆弱性,最后通過粒度可配置的指令冗余操作加固源程序以達(dá)到檢測SDC錯誤的目的.與現(xiàn)有方法相比,本文所提出的利用AdaBoost的SDC錯誤檢測方法具有更低的時空開銷和更高的檢測率.
目前針對SDC錯誤的檢測方法主要包括:基于程序斷言的SDC檢錯方法、基于故障注入的SDC檢錯方法、基于靜態(tài)分析的SDC檢錯方法以及基于機(jī)器學(xué)習(xí)的SDC檢錯方法.
基于程序斷言的SDC檢錯方法通過將斷言插入到程序中來檢測到數(shù)據(jù)流錯誤,包括在數(shù)值間隔和數(shù)據(jù)值之間的關(guān)系下程序的數(shù)字特征.Siva[4],Hiller[5]等人通過分析程序的功能邏輯,人工提取了變量之間的函數(shù)關(guān)系等特征來執(zhí)行斷言以檢測程序中的錯誤.Racunas[6],Sahoo[7],Ma[8]等人采用自動提取的方法,通過在程序運(yùn)行時獲取變量的數(shù)值,根據(jù)數(shù)值的分布得出合法區(qū)間來執(zhí)行斷言以檢測程序中的錯誤.這些基于程序斷言的SDC檢錯方法的檢錯代價較低,但同時檢錯率也相對較低.
基于故障注入的SDC檢錯方法需要對指令依次進(jìn)行故障注入,收集SDC相關(guān)信息.這類方法具有較高的時間開銷,為了降低故障注入的時間開銷.Hari 等人通過控制流等價策略來減小故障空間的大小,根據(jù)程序控制流上下文環(huán)境來預(yù)測可能的故障結(jié)果,并將預(yù)測結(jié)果相同的故障篩去,從而降低故障注入的時間開銷[9].Xu 等人提出了一種偏向性故障注入框架CriticalFault,通過指令脆弱性分析明確錯誤高相關(guān)故障類型,從而降低故障注入的時間開銷[10].這些方法雖然一定程度上降低了故障注入的開銷,但如何平衡預(yù)測準(zhǔn)確度與故障空間大小仍是亟需解決的問題.
基于靜態(tài)分析的SDC檢錯方法專注于程序的特征,以分析程序的SDC脆弱性.Pattabiraman 等人提出了一個程序級框架SymPLFIED,該框架使用符號化執(zhí)行對變量的錯誤狀態(tài)進(jìn)行抽象處理,并通過模型檢驗技術(shù)抽象執(zhí)行程序,然后對錯誤傳播路徑及程序運(yùn)行結(jié)果進(jìn)行分析,從而對SDC 脆弱指令進(jìn)行識別[11].這類基于靜態(tài)分析的SDC檢錯方法雖然以較低的開銷實現(xiàn)了較高的精度,但由于存在狀態(tài)爆炸的問題,所以難以應(yīng)用到大規(guī)模的程序之中.
基于機(jī)器學(xué)習(xí)的SDC檢錯方法通過提取目標(biāo)程序的相關(guān)特征來訓(xùn)練機(jī)器學(xué)習(xí)模型[12],從而達(dá)到預(yù)測SDC脆弱性的目的.Lu等人提出了一種經(jīng)驗?zāi)P蚐DCTune,模型首先提取程序中指令的編譯時靜態(tài)特征,然后通過決策回歸樹和程序分析方法來預(yù)測程序中指令的SDC脆弱性[13].YANG等人提出了一種基于支持向量機(jī)的方法PVInsiden.該方法通過機(jī)器學(xué)習(xí)訓(xùn)練檢測器,能夠識別出SDC脆弱性高的指令[14].基于機(jī)器學(xué)習(xí)的方法通常可較為準(zhǔn)確地預(yù)測指令的脆弱性,但目前的基于機(jī)器學(xué)習(xí)的SDC預(yù)測方法只考慮了寄存器或存儲器中的單位翻轉(zhuǎn)[14],沒有考慮到多位翻轉(zhuǎn)對指令SDC脆弱性的影響.
綜上所述,基于程序斷言的SDC檢錯方法檢錯率較低,基于故障注入的SDC檢錯方法開銷過大,基于靜態(tài)分析的SDC檢錯方法難以應(yīng)用于大規(guī)模程序,基于機(jī)器學(xué)習(xí)的SDC檢錯方法目前則多局限于單位翻轉(zhuǎn).
為了解決上述問題,本文在故障模型中引入了多位翻轉(zhuǎn)模型,使得模擬故障更加貼近真實空間輻射環(huán)境.并在此基礎(chǔ)上提出了一種基于AdaBoost的SDC錯誤檢測方法,該方法采用AdaBoost模型預(yù)測指令SDC脆弱性,并選擇高脆弱指令進(jìn)行冗余加固處理,進(jìn)而達(dá)到SDC錯誤檢測的目的.
嵌入式計算機(jī)在極端工作環(huán)境中經(jīng)常暴露在高能粒子的照射下,這些高能粒子會引發(fā)單粒子翻轉(zhuǎn)(Single Event Upset,SEU),影響嵌入式計算機(jī)的正常運(yùn)行.單粒子翻轉(zhuǎn)是指高能粒子使元器件的邏輯狀態(tài)發(fā)生翻轉(zhuǎn)的現(xiàn)象[15].單粒子翻轉(zhuǎn)存在著單位翻轉(zhuǎn)和多位翻轉(zhuǎn)兩種情況,現(xiàn)有的SDC錯誤檢測方法中,故障模型多側(cè)重于單位翻轉(zhuǎn),對多位翻轉(zhuǎn)的研究較少.但隨著電子器件特征尺寸的持續(xù)減小,單粒子引發(fā)多位翻轉(zhuǎn)的概率有所增長,多位翻轉(zhuǎn)已成為SDC錯誤檢測中不可忽視的一項因素[16].Chatzidimitriou等人研究表明,在多位故障注入和單位故障注入之間,程序的脆弱性相差了3.2倍[17].本文提出的方法主要通過分析指令的SDC脆弱性,并對脆弱性高的指令進(jìn)行冗余來檢測程序的SDC錯誤,故將指令多位翻轉(zhuǎn)引入故障模型,本文設(shè)計的故障模型Fm可以表示為一個三元組:
Fm=(Utotal,Utype,P)
(1)
其中,Utotal為發(fā)生指令單粒子翻轉(zhuǎn)故障的總數(shù)量,Utype為指令單粒子翻轉(zhuǎn)類型,P為對應(yīng)指令單粒子翻轉(zhuǎn)類型發(fā)生的概率.
Zhang等人選用IDT7164型號的SRAM進(jìn)行了輻照實驗[18].實驗結(jié)果顯示:在所有的單粒子翻轉(zhuǎn)現(xiàn)象中.單位翻轉(zhuǎn)占據(jù)了總量的83.3%、兩位翻轉(zhuǎn)占總量的13.8%、三位翻轉(zhuǎn)占總量的2.5%.四位及四位以上因比重過小忽略不計.如圖 1所示給出了多位翻轉(zhuǎn)的各種形式及對應(yīng)的發(fā)生概率,P(n,m)是第m種形式的n位翻轉(zhuǎn)發(fā)生的概率.
在內(nèi)存中,指令對應(yīng)的機(jī)器碼在物理空間中是按行存儲的[19].將內(nèi)存上單粒子翻轉(zhuǎn)映射到其上存儲的指令中,即可得到指令的單粒子翻轉(zhuǎn)情況.內(nèi)存中的單位翻轉(zhuǎn)、縱向兩位翻轉(zhuǎn)、斜向兩位翻轉(zhuǎn)和縱向三位翻轉(zhuǎn)映射到單條指令中即為指令單位翻轉(zhuǎn);內(nèi)存中的橫向兩位翻轉(zhuǎn)映射到單條指令中即為指令兩位翻轉(zhuǎn),內(nèi)存中的橫向三位翻轉(zhuǎn)映射到單條指令中即為指令三位翻轉(zhuǎn),內(nèi)存中的L型翻轉(zhuǎn)映射到單條指令中為指令單位翻轉(zhuǎn)和指令兩位翻轉(zhuǎn),如圖 2所示.
圖2 指令單粒子翻轉(zhuǎn)映射圖Fig.2 Instruction single particle flip mapping
故障模型Fm中的,Utype表示為向量:
Utype={ISBU,IDBU,ITBU}
(2)
其中,ISBU,IDBU,ITBU分別為指令單位翻轉(zhuǎn),指令兩位翻轉(zhuǎn)和指令三位翻轉(zhuǎn),對應(yīng)概率P表示為向量:
P={PISBU,PIDBU,PITBU}
(3)
其中,PISBU為指令單位翻轉(zhuǎn)的概率,PIDBU為指令兩位翻轉(zhuǎn)的概率,PITBU為指令三位翻轉(zhuǎn)的概率.
PISBU計算公式如下:
(4)
PIDBU計算公式如下:
(5)
PITBU計算公式如下:
PITBU=P(3,1)
(6)
通過計算可得指令單位翻轉(zhuǎn)概率PISBU=92.315%,指令兩位翻轉(zhuǎn)概率PIDBU=7.665%,指令三位翻轉(zhuǎn)概率PITBU=0.02%.故故障模型如表1所示.
表1 故障模型表Table 1 Fault model
基于上述故障模型,本文提出了一種利用AdaBoost的SDC錯誤檢測方法.方法流程如圖 3所示.
圖3 利用AdaBoost的SDC錯誤檢測方法流程圖Fig.3 SDC error detection method flow based on AdaBoost
首先將源程序通過LLVM[20,21]編譯器生成IR中間代碼,通過故障注入生成數(shù)據(jù)集合以進(jìn)行指令SDC脆弱性特征分析與提取,根據(jù)提取的SDC脆弱性特征和故障注入生成的數(shù)據(jù)集合來構(gòu)建訓(xùn)練數(shù)據(jù)集.將所得數(shù)據(jù)集作為輸入訓(xùn)練指令SDC脆弱性預(yù)測模型.然后使用訓(xùn)練過的模型來對故障注入得到的測試數(shù)據(jù)集中的指令SDC脆弱性進(jìn)行預(yù)測,并根據(jù)預(yù)測值對指令進(jìn)行SDC脆弱性排序.最后根據(jù)冗余粒度選擇脆弱性高的部分指令對源程序進(jìn)行冗余加固.
影響指令SDC脆弱性的因素有很多,為了更加準(zhǔn)確的描述指令的SDC脆弱性,本節(jié)對指令的SDC脆弱性特征進(jìn)行了分析與提取.
1)指令類型
指令類型是影響SDC脆弱性的一個重要因素.本文從MiBench測試程序集中選取了6個常用測試程序中的28種指令類型進(jìn)行逐位故障注入實驗.按照不同指令類型的SDC概率進(jìn)行統(tǒng)計,以表示指令類型對SDC概率的影響.統(tǒng)計結(jié)果如圖 4所示.
圖4 不同指令類型SDC概率圖Fig.4 SDC probability of different instruction types
可以看出,不同類型指令的SDC脆弱性具有較大差異.lshr移位指令,fcmp,icmp比較指令,fadd運(yùn)算指令等指令具有較高的SDC脆弱性,而alloca,fptosi,mul,phi等指令具有較低的SDC脆弱性.故將指令類型作為一類指令SDC脆弱性特征,表示為Stype.
2)指令地址寬度
指令的地址寬度也是影響指令SDC的重要因素,指令的位數(shù)越多則發(fā)生單粒子翻轉(zhuǎn)的概率越大,指令的SDC脆弱性也就越高.故將指令地址寬度作為一項指令SDC脆弱性特征,表示為Swidth.
3)指令調(diào)用次數(shù)
指令的調(diào)用次數(shù)影響著指令的SDC脆弱性.當(dāng)指令處于分支,循環(huán)等結(jié)構(gòu)內(nèi)時,指令將會被多次調(diào)用執(zhí)行,執(zhí)行次數(shù)越多,對SDC脆弱性的貢獻(xiàn)也就也大.故將指令調(diào)用作為一項指令SDC脆弱性特征,表示為Scall.
4)地址相關(guān)指令
地址相關(guān)指令發(fā)生單粒子翻轉(zhuǎn)引發(fā)軟錯誤后將大概率跳轉(zhuǎn)到錯誤的地址,引起程序崩潰或掛起,不易發(fā)生SDC錯誤.該類指令的SDC脆弱性較低,故將地址相關(guān)指令作為一項指令SDC脆弱性特征,表示為Saddress.
5)數(shù)據(jù)操作
運(yùn)算指令和讀寫指令等相關(guān)指令往往對數(shù)據(jù)進(jìn)行訪問,當(dāng)其訪問的數(shù)據(jù)受到單粒子翻轉(zhuǎn)影響發(fā)生錯誤時,操作結(jié)果必將發(fā)生改變.根據(jù)數(shù)據(jù)變量的類型不同,其所占的數(shù)據(jù)位數(shù)也不同,故而對單粒子翻轉(zhuǎn)的敏感度也不同.除此之外,指令操作的數(shù)據(jù)數(shù)量越大,其SDC脆弱性也就越高,所以將指令操作數(shù)據(jù)數(shù)量作為一類指令SDC脆弱性特征,表示為Sdata.
6)單粒子翻轉(zhuǎn)位數(shù)
在第3節(jié)故障模型中已經(jīng)介紹過,在一條指令內(nèi),指令單粒子翻轉(zhuǎn)情況有單位翻轉(zhuǎn),雙位翻轉(zhuǎn)和三位翻轉(zhuǎn)3種類型,翻轉(zhuǎn)位數(shù)越多,程序運(yùn)行出錯的概率就越大,故而該指令的SDC脆弱性也就越大.因此,本文將單粒子翻轉(zhuǎn)位數(shù)作為一項指令SDC脆弱性特征,表示為Sdigit.
綜上所述,指令SDC脆弱性特征向量如式(7)所示:
S={Stype,Swidth,Scall,Saddress,Sdata,Sdigit}
(7)
AdaBoost是一種集成學(xué)習(xí)方法,能夠?qū)⒍鄠€弱學(xué)習(xí)器集成得到一個精度較高的強(qiáng)學(xué)習(xí)器[22,23].AdaBoost的主要優(yōu)勢如下:
1)本文提取的特征數(shù)據(jù)類型為整型和布爾類型,AdaBoost適用于上述兩類數(shù)據(jù)類型.
2)相較于其他機(jī)器學(xué)習(xí)算法,AdaBoost具有較高的收斂速率,并且不容易造成過擬合現(xiàn)象,這將為模型提供更高的預(yù)測準(zhǔn)確率.
3)AdaBoost在每次訓(xùn)練后調(diào)整樣本權(quán)重,用以訓(xùn)練下一個弱學(xué)習(xí)器,故而不需要進(jìn)行特征篩選,操作簡單,具備較強(qiáng)的泛化能力.
基于AdaBoost上述優(yōu)點(diǎn),本文選取AdaBoost回歸算法來訓(xùn)練指令SDC脆弱性預(yù)測模型,如圖 5所示.
圖5 AdaBoost回歸構(gòu)造圖Fig.5 AdaBoost regression structural
首先對訓(xùn)練數(shù)據(jù)集賦予初始權(quán)重進(jìn)行訓(xùn)練,得到弱學(xué)習(xí)器決策樹1.
本文將訓(xùn)練數(shù)據(jù)集Tset定義如下:
(8)
訓(xùn)練數(shù)據(jù)集在第k個決策樹的權(quán)重Wk為:
Wk=(wk1,wk2,…,wkm)
(9)
其中,wkm表示k個決策樹中第m組訓(xùn)練樣本所占的權(quán)重.
初始化訓(xùn)練數(shù)據(jù)集權(quán)重W1為:
(10)
使用具有權(quán)重Wk的訓(xùn)練數(shù)據(jù)集進(jìn)行訓(xùn)練,得到弱學(xué)習(xí)器決策樹SDCk(S).
然后基于決策樹1的學(xué)習(xí)誤差率e1來調(diào)整訓(xùn)練樣本的權(quán)重值,將之前決策樹1在訓(xùn)練樣本中學(xué)習(xí)誤差率高的點(diǎn)的權(quán)重提高,使得決策樹2對這些點(diǎn)給予更多的重視.
學(xué)習(xí)誤差率ek的計算方法如下所示:
(11)
(12)
(13)
其中,SDCk(si)為第k個決策樹針對第i組樣本的指令SDC脆弱性預(yù)測值,Ek為第k個決策樹在訓(xùn)練數(shù)據(jù)集上的最大誤差,eki為其中每個樣本的相對誤差.
第k個決策樹權(quán)重系數(shù)αk計算方法如下所示:
(14)
對于更新樣本權(quán)重W,第k+1個決策樹的樣本集權(quán)重系數(shù)為:
(15)
其中Zk為規(guī)范化因子:
(16)
最后以更新權(quán)重后的訓(xùn)練集為基礎(chǔ),對決策樹2進(jìn)行訓(xùn)練.重復(fù)執(zhí)行上述步驟,直到?jīng)Q策樹的數(shù)量達(dá)到預(yù)定數(shù)值N,最終取這N個決策樹中權(quán)值中位數(shù)的決策樹為強(qiáng)學(xué)習(xí)器,得到基于AdaBoost 的SDC脆弱性預(yù)測模型如下所示:
f(x)=SDCk*(S)
(17)
執(zhí)行完指令SDC脆弱性預(yù)測操作后,需要根據(jù)預(yù)測結(jié)果對目標(biāo)程序進(jìn)行冗余加固處理.步驟如下:
1)根據(jù)模型預(yù)測出的指令SDC脆弱性值,從高到低對目標(biāo)程序指令集合I進(jìn)行排序,建立指令SDC脆弱性序列表;
2)在指令SDC脆弱性序列表中按照冗余粒度o選取冗余指令集合IR,并進(jìn)行冗余操作;
3)遍歷冗余指令集IR中所有指令,若指令I(lǐng)R[i]依賴于指令I(lǐng)R[j],且j
4)比較指令比較原始指令與冗余指令的運(yùn)行結(jié)果,相同則判斷程序運(yùn)行正確,不同則判斷發(fā)生了SDC錯誤.
算法描述如算法1所示:
算法1.指令冗余加固
輸入:指令集I,指令集大小O,冗余粒度o
輸出:插樁后的指令集ID
sort_instructions(I,O)//根據(jù)SDC脆弱性對指令集排序
OR←?O*o」//冗余指令集大小
IR←choose_instructions(I,OR)//按照冗余粒度選擇冗余指令集
forj← 1toORdo
clone_instruction(IR[j-1])//復(fù)制指令并插在下一條指令前
ifjudge_used(IR[j-1])= 0do//判斷是否存在定義引用關(guān)系
ID← insert_check_instruction(IR[j-1])//插入檢測指令
end
else
IR[i]← find_last_used_ins(IR[j-1])//找到引用鏈最后一條指令
ID← insert_check_instruction(IR[i])//在基本塊末尾插入檢測指令
end
end
為了驗證本文提出的利用AdaBoost的SDC錯誤檢測方法的性能,本節(jié)設(shè)計了兩項性能評估實驗,分別為指令SDC脆弱性預(yù)測實驗和SDC錯誤檢測實驗.實驗環(huán)境如表 2所示.
表2 實驗環(huán)境表Table 2 Experimental environment
測試用例選取了MiBench測試程序組中的6個測試程序,包括Bitstring、Isqrt、FFT、Rad2deg、Dijkstra和Qsort.所選的測試程序首先使用LLVM編譯以獲得中間(IR)指令,然后執(zhí)行LLVM Pass以提取程序指令特征.
本文采用基于LLFI[24]二次開發(fā)的故障注入工具對目標(biāo)程序進(jìn)行故障注入.在故障注入過程中,根據(jù)第3節(jié)所述故障模型注入3種類型的指令位翻轉(zhuǎn)故障來模擬實際輻射情況中的單粒子翻轉(zhuǎn)故障.
預(yù)測指令的SDC脆弱性是SDC錯誤檢測的關(guān)鍵環(huán)節(jié).對于本文提出的SEDA模型,在模型參數(shù)設(shè)置時采用控制變量法對模型進(jìn)行訓(xùn)練學(xué)習(xí)以尋求參數(shù)最優(yōu)解,得到部分參數(shù)的MSE(Mean Square Error,均方誤差)變化曲線如圖 6所示.
圖6 部分參數(shù)的MSE變化曲線圖Fig.6 MSE curve of some parameters
可以看出在決策樹數(shù)量為20時模型的MSE取到最小值,學(xué)習(xí)率為0.008時對應(yīng)的MSE最小.同時AdaBoost算法對于回歸問題,常使用指數(shù)函數(shù)作為損失函數(shù),故SEDA模型參數(shù)如表 3所示.
表3 模型參數(shù)表Table 3 Model parameters
為了驗證本文提出的SEDA模型的有效性,本節(jié)設(shè)計了對照實驗,現(xiàn)選取其他常用機(jī)器學(xué)習(xí)模型算法作為對照組,對照模型算法包括支持向量回歸算法SVR,隨機(jī)森林算法RF和GBDT.通過本文二次開發(fā)的故障注入工具對6個測試程序各進(jìn)行10000次故障注入,通過LLVM Pass收集指令SDC脆弱性數(shù)據(jù)樣本作為模型輸入.最后計算模型的均方誤差和判定系數(shù)(R-squared,R2)來評估我們的模型的預(yù)測準(zhǔn)確度.實驗結(jié)果如表 4所示.
表4 預(yù)測實驗結(jié)果表Table 4 Prediction experiment result
從實驗結(jié)果可以看出,SVR和RF在大部分測試用例中所獲得的MSE值均不理想,這是因為其模型特性容易受到噪聲數(shù)據(jù)干擾,進(jìn)而影響模型預(yù)測精度.相比之下,本文提出的SEDA模型在所有測試用例中均獲得了較低的MSE值,雖然GBDT在大多數(shù)測試程序上的MSE值與SEDA相近,但在Qsort測試程序上取得了所有模型中的最高值,結(jié)合對應(yīng)的R2值分析可以得出,GBDT在Qsort測試程序上發(fā)生了過擬合.而本文提出的SEDA模型在所有測試用例中都有著較高的R2值,這是因為SEDA模型在每次訓(xùn)練后都會根據(jù)學(xué)習(xí)誤差率來調(diào)整訓(xùn)練集的權(quán)重并訓(xùn)練下一個弱學(xué)習(xí)器,從而能夠更好地對數(shù)據(jù)進(jìn)行擬合,提高模型預(yù)測準(zhǔn)確性.
綜上所述,在所選4種模型算法中,本文提出SEDA模型對數(shù)據(jù)的擬合效果最好,預(yù)測精度最高.
本節(jié)設(shè)計了對比實驗來驗證本文提出方法的SDC檢錯能力.對照實驗組包括Hotpath方法[25]和30%冗余粒度的DFRMF方法[26].實驗首先使用基于本文故障模型二次開發(fā)的故障注入工具對6個測試程序各自進(jìn)行2000次故障注入.根據(jù)前期實驗數(shù)據(jù)分析,本文選取30%的冗余粒度進(jìn)行實驗,在該粒度下模型能夠在保證較高檢測率的同時保證時空開銷在較低的水平.實驗從檢錯率,空間開銷和時間開銷3個方面對本文提出的方法進(jìn)行評估.
如表 5所示為3種方法的SDC錯誤檢測率,30%冗余粒度的SEDA,Hotpath和30%冗余粒度的DFRMR的平均檢測率分別為86.5%,83.1%和85.0%.Hotpath在3種方法中取得了最低的錯誤檢測率,究其原因是由于Hotpath方法采取的是對程序執(zhí)行高頻路徑上的指令進(jìn)行冗余的加固策略,忽略了高頻路徑外的SDC脆弱性指令,故而導(dǎo)致了該方法的檢錯率較低.而本文提出的SDC錯誤檢測方法則有著較高的檢錯率,這是因為本文方法主要冗余SDC脆弱性高的指令,同時還考慮到了多位翻轉(zhuǎn)對指令SDC脆弱性的影響,故而提高了錯誤的檢測率.
表5 檢測率對比表Table 5 Detection rate comparison table
如表 6所示為3種方法的時空開銷對比,30%冗余粒度的SEDA,Hotpath和30%冗余粒度的DFRMR的平均時間開銷分別為49.0%,52.8%和50.5%,平均空間開銷分別為17.9%,21.3%和18.6%.可以看出,本文提出的SDC錯誤檢測方法的時空開銷較其他兩種方法更低,這是因為本文方法通過分析冗余指令之間的定義引用關(guān)系,減少了比較指令的插樁數(shù)量.而且在諸如FfT和Dijkstra等循環(huán)結(jié)構(gòu)比重較大的程序中,本文方法的時空開銷雖略有上升,但尚在可以接受的范圍之內(nèi).
表6 時空開銷對比表Table 6 Time and space cost table
綜上所述,本文提出的利用AdaBoost的SDC錯誤檢測方法能夠在較低的時空開銷下獲得較高的SDC錯誤檢測率.
針對SDC錯誤難以檢測,且現(xiàn)有方法多側(cè)重于單位翻轉(zhuǎn)的問題,本文改進(jìn)了故障模型,將物理空間中的多位翻轉(zhuǎn)映射到單一指令中,使得故障注入模擬更加貼近真實輻射情況.然后提出了一種利用AdaBoost的SDC錯誤檢測方法SEDA,通過故障注入的方法獲得指令SDC相關(guān)特征和故障注入結(jié)果,訓(xùn)練機(jī)器學(xué)習(xí)模型預(yù)測指令SDC脆弱性,最后通過粒度可配置的指令冗余操作加固源程序以達(dá)到檢測SDC錯誤的目的.通過本文設(shè)計的對比實驗驗證,本文所提出的利用AdaBoost的SDC錯誤檢測方法與現(xiàn)有方法相比,具有更低的時空開銷和更高的檢測率.