国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

面向RISC-V內(nèi)核的標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制的設(shè)計(jì)*

2020-12-07 09:19:10丁,郭陽(yáng)
關(guān)鍵詞:數(shù)據(jù)流寄存器指令

鄧 丁,郭 陽(yáng)

(國(guó)防科技大學(xué) 計(jì)算機(jī)學(xué)院, 湖南 長(zhǎng)沙 410073)

據(jù)統(tǒng)計(jì), 1971—1986年的16年期間,國(guó)外發(fā)射的39顆同步衛(wèi)星總共出現(xiàn)故障1589次,其中1129次與空間輻射有關(guān)[1]??臻g輻射對(duì)電子器件的影響可分為總劑量(Total Ionizing Dose,TID)效應(yīng)和單粒子效應(yīng)(Single Event Effect,SEE)。具體而言,單粒子效應(yīng)又可細(xì)分為單粒子翻轉(zhuǎn)(Single Event Upset,SEU)、單粒子閂鎖(Single Event Latch,SEL)和單粒子燒毀(Single Event Burnout,SEB)三種子類。其中:后兩者均會(huì)導(dǎo)致載體器件發(fā)生不可逆轉(zhuǎn)的永久故障。而單粒子翻轉(zhuǎn)僅是由于晶體管在外界帶電粒子的轟擊下瞬時(shí)充放電,從而造成的邏輯狀態(tài)翻轉(zhuǎn)。一旦粒子轟擊結(jié)束,便可以自動(dòng)恢復(fù)正常功能。也即,單粒子翻轉(zhuǎn)所引發(fā)的是一種瞬時(shí)故障。事實(shí)上,瞬時(shí)故障在所有引起計(jì)算機(jī)系統(tǒng)失效的故障中所占比重接近90%[2],是永久故障的100倍以上[3]。文獻(xiàn)[4]指出,單粒子翻轉(zhuǎn)是輻射效應(yīng)的主要形式,在全部由宇宙輻射引發(fā)的故障中,55%是單粒子翻轉(zhuǎn)故障。

由計(jì)算機(jī)硬件故障所導(dǎo)致的錯(cuò)誤可分為控制流錯(cuò)誤和數(shù)據(jù)流錯(cuò)誤??刂屏麇e(cuò)誤主要發(fā)生在執(zhí)行轉(zhuǎn)移指令時(shí),而數(shù)據(jù)流錯(cuò)誤主要是由于存儲(chǔ)或傳輸中的數(shù)據(jù)因干擾耦合等因素發(fā)生錯(cuò)誤進(jìn)而引起的系統(tǒng)異常。

針對(duì)控制流錯(cuò)誤,2002年Standford大學(xué)CRC實(shí)驗(yàn)室提出了基于軟件簽名的控制流檢查(Control Flow Checking by Software Signature, CFCSS)算法,有效地將分支故障導(dǎo)致系統(tǒng)錯(cuò)誤的概率從33.7%降低為3.1%[5]。但是,CFCSS算法仍不能檢測(cè)到偽分支錯(cuò)誤、基本塊內(nèi)部控制流轉(zhuǎn)移錯(cuò)誤。文獻(xiàn)[6]通過(guò)添加硬件看門狗來(lái)檢查程序的控制流錯(cuò)誤。文獻(xiàn)[7]通過(guò)采用市場(chǎng)上常見的調(diào)試接口模塊能夠有效及時(shí)地檢測(cè)到控制流錯(cuò)誤。

針對(duì)數(shù)據(jù)流錯(cuò)誤,利用時(shí)間或空間上的冗余來(lái)驗(yàn)證數(shù)據(jù)的有效性是一種行之有效的方法。N版本程序法(N-Version Programming, NVP)為目標(biāo)功能設(shè)計(jì)了多種可能實(shí)現(xiàn)方式,從而保證至少有一種方式能夠正確地執(zhí)行[8]。數(shù)據(jù)重表達(dá)法(Data Re-expression Algorithm, DRA)采用多種不同的方式表達(dá)同樣的數(shù)據(jù),執(zhí)行相同的程序,從而能夠檢查并恢復(fù)數(shù)據(jù)流錯(cuò)誤。編譯器級(jí)容錯(cuò)技術(shù)通過(guò)復(fù)制程序指令,在一定檢查點(diǎn)插入比較指令來(lái)判斷程序執(zhí)行結(jié)果的正確與否,其典型的算法包括EDDI[9]、ED4I[10]、SWIFT[11]等。

文獻(xiàn)[12]將軟硬件方法結(jié)合在一起,僅用一個(gè)低端現(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array, FPGA)便極大提高了處理器的容錯(cuò)能力。文獻(xiàn)[13]從綜合階段入手優(yōu)化數(shù)據(jù)通路對(duì)瞬時(shí)故障的容錯(cuò)能力,將芯片的功耗降低了約48%。文獻(xiàn)[14]著重對(duì)專用于圖像處理和機(jī)器學(xué)習(xí)的分布式數(shù)據(jù)流處理系統(tǒng)進(jìn)行了容錯(cuò)設(shè)計(jì)。文獻(xiàn)[15]將數(shù)據(jù)流應(yīng)用映射到多個(gè)虛擬處理器上,從而減小了容錯(cuò)所需的總面積。

本文采用重復(fù)執(zhí)行被標(biāo)記指令的策略來(lái)檢測(cè)并糾正由單粒子翻轉(zhuǎn)效應(yīng)引起的數(shù)據(jù)流瞬時(shí)故障。本文的主要?jiǎng)?chuàng)新與貢獻(xiàn)包括:

1)實(shí)現(xiàn)了一種可靈活標(biāo)記復(fù)算指令的機(jī)制。該機(jī)制以較小的硬件開銷與性能降低為代價(jià),能夠檢測(cè)出指定指令在執(zhí)行期間是否發(fā)生數(shù)據(jù)流錯(cuò)誤。

2)對(duì)于標(biāo)記為復(fù)算的指令,實(shí)現(xiàn)了時(shí)間上的三模冗余糾錯(cuò)機(jī)制。若第一次復(fù)算結(jié)果與初始結(jié)果不相等,將自動(dòng)執(zhí)行第二次復(fù)算,并根據(jù)少數(shù)服從多數(shù)的原則,對(duì)數(shù)據(jù)流錯(cuò)誤進(jìn)行糾正。

1 標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制

1.1 總體結(jié)構(gòu)設(shè)計(jì)

單粒子翻轉(zhuǎn)故障是一種瞬時(shí)故障,其故障持續(xù)時(shí)間很短。因此通常假設(shè)單粒子翻轉(zhuǎn)故障發(fā)生的同時(shí),錯(cuò)誤也立即產(chǎn)生,即沒有故障延遲。又因單粒子翻轉(zhuǎn)故障觸發(fā)的時(shí)刻、位置都是隨機(jī)不可預(yù)測(cè)的,所以連續(xù)兩個(gè)不同時(shí)刻,在同一位置發(fā)生同一類型的瞬時(shí)故障的概率非常微小。鑒于此,本文提出在連續(xù)的指令周期里重復(fù)執(zhí)行被標(biāo)記的指令來(lái)檢測(cè)并糾正瞬時(shí)錯(cuò)誤結(jié)果的容錯(cuò)機(jī)制。

從宏觀上看,關(guān)于標(biāo)記指令復(fù)算機(jī)制的改進(jìn)主要集中在如圖1所示的深灰色方框中,關(guān)于標(biāo)記指令糾錯(cuò)機(jī)制的改進(jìn)主要集中在如圖1所示的淺灰色方框中。糾錯(cuò)的核心思想是:由編譯器對(duì)關(guān)鍵或易錯(cuò)指令進(jìn)行復(fù)算標(biāo)記的賦值,并將復(fù)算標(biāo)記一同存入指令存儲(chǔ)器中;復(fù)算標(biāo)記與其所對(duì)應(yīng)的指令一同流入處理器內(nèi)核,最終一同發(fā)射給運(yùn)算邏輯單元(Arithmetic Logical Unit, ALU);ALU部件根據(jù)所接收到的標(biāo)記,由復(fù)算糾錯(cuò)狀態(tài)機(jī)RCC_FSM生成反饋信號(hào)作用于itcm_ctrl和ifu兩個(gè)模塊,從而控制下一條指令是否流出。本文主要對(duì)以下兩種情況進(jìn)行糾錯(cuò):①涉及寫寄存器文件的指令,包括load指令,以寄存器文件為目標(biāo)地址的邏輯運(yùn)算指令、算術(shù)運(yùn)算指令等;②條件分支指令。對(duì)寄存器文件寫操作的糾錯(cuò)主要由寄存器文件備份模塊Reg_bak來(lái)完成;對(duì)條件分支指令的糾錯(cuò)主要由跳轉(zhuǎn)狀態(tài)位的備份模塊Bjp_bak來(lái)完成。Reg_bak模塊根據(jù)備份數(shù)據(jù)與復(fù)算數(shù)據(jù)的比較結(jié)果,控制寄存器文件的寫回模塊Wbck,進(jìn)而決定是否對(duì)寄存器文件進(jìn)行寫操作。Bjp_bak模塊根據(jù)備份跳轉(zhuǎn)位與復(fù)算跳轉(zhuǎn)位的比較結(jié)果,控制分支指令的跳轉(zhuǎn)模塊Isjp,進(jìn)而決定是否沖刷掉已經(jīng)推測(cè)預(yù)取到指令緩沖Ins_buf中的后續(xù)指令。

圖1 標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制結(jié)構(gòu)框圖Fig.1 Architecture of the recomputation and correction mechanism for tagged instruction

1.2 標(biāo)記指令復(fù)算機(jī)制的具體實(shí)現(xiàn)

在基于RISC-V指令集的開源內(nèi)核“蜂鳥e203”[16]上實(shí)現(xiàn)該標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制,后文將以“蜂鳥e203”內(nèi)核為例,詳細(xì)闡述該容錯(cuò)機(jī)制的具體實(shí)現(xiàn)過(guò)程。

“蜂鳥e203”內(nèi)核是一款超低功耗2級(jí)流水線處理器核,支持RISC-V指令集以及RV32I/E/A/M/C/F/D等指令子集的配置組合。其結(jié)構(gòu)框架如圖2所示。私有的指令緊耦合存儲(chǔ) (Instruction Tightly Coupled Memory, ITCM)與數(shù)據(jù)緊耦合存儲(chǔ)(Data Tightly Coupled Memory, DTCM)(未畫出)可在分離存儲(chǔ)指令與數(shù)據(jù)的同時(shí)提高性能。其中ITCM SRAM雖然主要用于存儲(chǔ)指令,但也可以用于存放數(shù)據(jù)并用load和store指令進(jìn)行訪問。其電路實(shí)例化模塊是圖2中的u_e203_srams,位寬為64位,大小為64 KB。雖然RISC-V指令集里指令的最大寬度是32位,但為減小讀取功耗與延時(shí),“蜂鳥e203”中的 itcm_ctrl模塊依然適時(shí)地從ITCM中讀出一整行的64位數(shù)據(jù)。為解決指令位寬不匹配的問題,“蜂鳥e203”里設(shè)計(jì)了ift2icb模塊。該模塊的主要功能是把讀出的64位指令分解成32位并暫存。由于“蜂鳥e203”是單發(fā)射、順序執(zhí)行、順序提交的體系結(jié)構(gòu),而乘法、除法等多周期指令必然導(dǎo)致流水線的停滯,因此,itcm_ctrl的另一個(gè)功能是根據(jù)當(dāng)前處理器所處的狀態(tài),決定輸出指令來(lái)源于上一條正在執(zhí)行的指令還是接受緩沖區(qū)(Ins_buf)中新的指令。由于RISC-V指令集是變長(zhǎng)指令集(同時(shí)支持32位指令和16位指令),所以取指令部件ifetch需要對(duì)指令進(jìn)行預(yù)譯碼,判斷當(dāng)前32位指令數(shù)據(jù)是一條完整的32位指令還是兩條16位指令,抑或是上一條32位指令的低16位與下一條32位指令的高16位等。ifetch部件最終為執(zhí)行部件u_e203_exu提供一個(gè)32位“指令束”ifu_o_ir。當(dāng)待發(fā)射指令是32位指令時(shí),ifu_o_ir的高16位來(lái)源于一個(gè)16位ifu_hi_ir觸發(fā)器中的新值,低16位來(lái)源于一個(gè)16位ifu_lo_ir觸發(fā)器中的新值。而當(dāng)待發(fā)射指令是16位指令時(shí),此時(shí)ifu_o_ir的真實(shí)有效指令只有低16位,其高16位數(shù)據(jù)此時(shí)是無(wú)關(guān)值。因此,ifu_o_ir的低16位來(lái)源于ifu_lo_ir觸發(fā)器的新值,而其高16位用ifu_hi_ir觸發(fā)器的舊值進(jìn)行填充。上述整個(gè)階段是“蜂鳥e203”流水線的第一級(jí),可歸納為“取指”,驅(qū)動(dòng)數(shù)據(jù)主要是“指令流”。指令流在第一級(jí)流水線中經(jīng)歷了“64位→32位→16位→32位”的變化?!胺澍Be203”流水線的第二級(jí)可歸納為“執(zhí)行”,主要負(fù)責(zé)指令的譯碼、執(zhí)行、寫回、提交等功能,驅(qū)動(dòng)數(shù)據(jù)主要是“數(shù)據(jù)流”。在本文所實(shí)現(xiàn)的容錯(cuò)機(jī)制中,標(biāo)記指令復(fù)算部分的改進(jìn)主要在流水線第一級(jí)進(jìn)行,而糾錯(cuò)部分的改進(jìn)主要在流水線第二級(jí)進(jìn)行。

圖2中的陰影矩形與陰影連線分別表示了指令復(fù)算標(biāo)記所存儲(chǔ)的位置與傳輸?shù)穆窂?。本文為?6位指令數(shù)據(jù)添加了1位初始標(biāo)記init_tg。因此,“蜂鳥e203”第一級(jí)流水線里的指令流帶寬被相應(yīng)調(diào)整成了“68位→34 位→17位→34位”。在所有指令需要暫存的地方,也都對(duì)其存儲(chǔ)部件進(jìn)行了位寬擴(kuò)展。比如:u_e203_srams從64位擴(kuò)展為68位,Ins_buf從32位擴(kuò)展成了34位,ifu_hi_ir/ifu_lo_ir從16位擴(kuò)展成了17位。每1位復(fù)算標(biāo)記與其所對(duì)應(yīng)的16位指令數(shù)據(jù)同時(shí)進(jìn)入每一個(gè)模塊,經(jīng)歷相同的路徑,緩沖相同的時(shí)間,最后同時(shí)由ifetch模塊輸出給譯碼模塊Decode。

在ifetch部件最終輸出的32位“指令束”ifu_o_ir中包含2位指令復(fù)算標(biāo)記rc_tg(tg_hi,tg_lo)。最終指令的復(fù)算情況與此二位復(fù)算標(biāo)記的取值存在如表1所示的關(guān)系。

圖2 “蜂鳥e203”內(nèi)核指令流示意Fig.2 Instruction flow path for “Humming bird e203”

表1 rc_tg取值與指令復(fù)算的關(guān)系

本文的指令初始標(biāo)記init_tg是由編譯器根據(jù)目標(biāo)指令在應(yīng)用程序中的關(guān)鍵性與易錯(cuò)性來(lái)賦值的。指令關(guān)鍵性越強(qiáng),易錯(cuò)性越高,則相應(yīng)的init_tg就置為1,反之則置為0。所以對(duì)于32位指令不復(fù)算的情況,可以由編譯器在編譯時(shí)指定其兩段16位的指令數(shù)據(jù)所對(duì)應(yīng)的init_tg=00。由表1可以觀察得到,無(wú)論是32位指令還是16位指令,需要進(jìn)行復(fù)算時(shí),其tg_lo=1;不需進(jìn)行復(fù)算時(shí),其tg_lo=0。所以只需根據(jù)tg_lo的值即可判定所有指令是否應(yīng)該進(jìn)行復(fù)算。當(dāng)tg_lo=0時(shí),按照常規(guī)步驟進(jìn)行指令的譯碼、執(zhí)行、寫回等操作后將發(fā)射下一條新的指令。當(dāng)tg_lo=1時(shí),當(dāng)前指令提交之后,復(fù)算糾錯(cuò)狀態(tài)機(jī)RCC_FSM將停止從ITCM中讀取新的指令,并保持ifu_o_ir所輸出的當(dāng)前指令不變,重新再執(zhí)行一次。實(shí)施該種機(jī)制的硬件只需兩個(gè)時(shí)鐘門控單元,如圖2所示的陰影橢圓CKG。

這種實(shí)現(xiàn)方式有以下三個(gè)優(yōu)點(diǎn):①相比于在編譯器級(jí)插入復(fù)算指令的做法,該方法只引入了1位的復(fù)算標(biāo)記,極大節(jié)省了程序存儲(chǔ)空間;②相比于從ITCM中重新讀取一次復(fù)算指令的做法,避免了對(duì)程序計(jì)數(shù)器使用大量復(fù)雜的控制邏輯,同時(shí)也節(jié)省了將復(fù)算指令從ITCM讀到ift2icb再到經(jīng)ifetch整合并輸出給執(zhí)行部件所消耗的功耗與延時(shí);③相比于引入一個(gè)額外的指令緩沖區(qū)來(lái)存儲(chǔ)已發(fā)射并需要復(fù)算的指令的做法,本文節(jié)省了一個(gè)至少32位寬的指令緩沖區(qū)面積。

1.3 標(biāo)記指令糾錯(cuò)機(jī)制的具體實(shí)現(xiàn)

如圖1所示,標(biāo)記指令的糾錯(cuò)機(jī)制主要由復(fù)算糾錯(cuò)狀態(tài)機(jī)RCC_FSM和備份冗余模塊(Reg_bak與Bjp_bak)構(gòu)成。

復(fù)算糾錯(cuò)狀態(tài)機(jī)RCC_FSM的主要功能是:根據(jù)指令的標(biāo)記情況、提交情況決定是否執(zhí)行復(fù)算;根據(jù)原指令結(jié)果與第一次復(fù)算結(jié)果的比較情況,決定是否進(jìn)行第二次復(fù)算。其狀態(tài)轉(zhuǎn)移如圖3所示。

圖3 RCC_FSM的狀態(tài)轉(zhuǎn)移Fig.3 State transition diagram of RCC_FSM

有3個(gè)信號(hào)決定RCC_FSM的狀態(tài)轉(zhuǎn)移:

1)Tag信號(hào):Tag=1時(shí),表示被標(biāo)記指令需要進(jìn)行復(fù)算;Tag=0時(shí)則不進(jìn)行復(fù)算。

2)cmt_valid信號(hào):cmt_valid=1時(shí)表示原指令已經(jīng)執(zhí)行完畢,下一周期將取下一條指令。

3)final_assure信號(hào):final_assure=0時(shí),表示復(fù)算結(jié)果與備份結(jié)果不相等。

默認(rèn)情況下,RCC_FSM處于None狀態(tài),即不進(jìn)行復(fù)算狀態(tài)。在此種狀態(tài)下,只有當(dāng)Tag=1(也即tg_lo=1)且cmt_valid=1時(shí),才會(huì)跳轉(zhuǎn)到Repeat狀態(tài)。其他情況下,都將保持None狀態(tài)不變。

當(dāng)正在進(jìn)行復(fù)算或者已經(jīng)進(jìn)行過(guò)一次復(fù)算時(shí),RCC_FSM則處于Repeat狀態(tài)。在此狀態(tài)下,只有兩種類型的輸入能夠使RCC_FSM繼續(xù)保持在Repeat狀態(tài):

1)Tag=1且final_assure=0。此種情況的含義是:第一次復(fù)算已經(jīng)完成并已與原始指令的結(jié)果進(jìn)行了比較,發(fā)現(xiàn)連續(xù)兩次執(zhí)行的同一條指令結(jié)果不相同,因此需要對(duì)該指令進(jìn)行第二次復(fù)算,通過(guò)三模冗余的方式進(jìn)行糾錯(cuò)處理。

2)Tag=1且cmt_valid=0。此種情況常發(fā)生在被復(fù)算的指令是多周期指令時(shí)。

其他輸入模式下,狀態(tài)機(jī)都將跳回到None狀態(tài)。

Reg_bak與Bjp_bak模塊其實(shí)都是備份冗余模塊rddt的實(shí)例化,只是各自備份的數(shù)據(jù)位寬不同而已。rddt模塊主要由兩個(gè)數(shù)據(jù)緩存單元、兩個(gè)比較器、一個(gè)計(jì)數(shù)器、一個(gè)3路選擇器,一個(gè)或門構(gòu)成。因?yàn)镽eg_bak需要備份將要寫進(jìn)寄存器文件的32位數(shù)據(jù),所以其數(shù)據(jù)位寬是32位;而Bjp_bak只需要備份指示條件分支指令是否跳轉(zhuǎn)的1個(gè)狀態(tài)位,所以其數(shù)據(jù)寬度是1位。

備份冗余模塊運(yùn)行過(guò)程的時(shí)序情況如圖4所示。若目標(biāo)指令不是復(fù)算指令(即圖4所示的單周期指令I(lǐng)nst1),寫使能信號(hào)Wen=0、比較使能信號(hào)CP_en=0,備份冗余模塊并不對(duì)備份數(shù)據(jù)信號(hào)Din進(jìn)行暫存和比較。計(jì)數(shù)使能信號(hào)Cnt_en一直等于0,因此提交確認(rèn)信號(hào)cmt_assure一直為1。只要該指令執(zhí)行完畢,便可立即提交。

圖4 rddt模塊時(shí)序圖Fig.4 Timing diagram of rddt

若目標(biāo)指令是復(fù)算指令(即圖4所示的單周期指令I(lǐng)nst2),則:①在原指令執(zhí)行期間,內(nèi)部計(jì)數(shù)值Cnt=0,CP_en=0,因此cmt_assure=1。Wen=1,所以Din將原始指令執(zhí)行的結(jié)果存入第一級(jí)緩沖中。②在第一次復(fù)算期間,CP_en由0變?yōu)?, Cnt此時(shí)由0變?yōu)?,因此cmt_assure=CP1。若CP1=1,說(shuō)明復(fù)算結(jié)果與備份數(shù)據(jù)相等,從而可以順利提交該指令;若CP1=0,說(shuō)明復(fù)算結(jié)果與備份數(shù)據(jù)不相等,需要繼續(xù)執(zhí)行第二次復(fù)算。此時(shí)Wen=1,原始執(zhí)行結(jié)果被傳到第二級(jí)緩存,第一次復(fù)算結(jié)果被存進(jìn)第一級(jí)緩存。③在第二次復(fù)算期間,Cnt由1變?yōu)?。第二次復(fù)算的結(jié)果將分別與原始結(jié)果和第一次復(fù)算結(jié)果進(jìn)行比較,并把CP1|CP2賦給cmt_assure。

2 理論分析

本文提出的標(biāo)記指令復(fù)算糾錯(cuò)機(jī)制主要是針對(duì)由宇宙輻射所導(dǎo)致的數(shù)據(jù)流瞬時(shí)錯(cuò)誤。因此,對(duì)于某一個(gè)特定的指令,在不同的時(shí)刻發(fā)生單粒子翻轉(zhuǎn)效應(yīng)的概率相等。對(duì)于某條執(zhí)行周期為n的指令,假設(shè)其每個(gè)周期中數(shù)據(jù)流出錯(cuò)的概率為p。

在不復(fù)算的情況下,該指令執(zhí)行正確的概率:

Pr=(1-p)n

(1)

在不復(fù)算的情況下,該指令執(zhí)行錯(cuò)誤的概率:

Pf=1-Pr=1-(1-p)n

(2)

在復(fù)算的情況下,兩次均執(zhí)行正確的概率:

Prr=(1-p)2n

(3)

在復(fù)算的情況下,一次執(zhí)行錯(cuò)誤、一次執(zhí)行正確的概率:

Pfr+Prf=2[1-(1-p)n](1-p)n

(4)

在復(fù)算的情況下,兩次均執(zhí)行錯(cuò)誤的概率:

Pff=[1-(1-p)n]2

(5)

在不利用中斷程序輔助錯(cuò)誤處理的情況下,采取本文提出的標(biāo)記指令復(fù)算糾錯(cuò)機(jī)制,其最終能得到正確結(jié)果的概率為:

Pnew=Prfr+Pfrr+Prr

=2[1-(1-p)n](1-p)2n+(1-p)2n

(6)

在不復(fù)算也不利用中斷程序處理錯(cuò)誤的情況下,其最終能得到正確結(jié)果的概率:

Pold=Pr=(1-p)n

(7)

所以指令i正確執(zhí)行的概率增加了:

ΔP=Pnew-Pold=2[1-(1-p)n](1-p)2n+

(1-p)2n-(1-p)n

=-2t3+3t2-t=f1(t)

(8)

其中,t=(1-p)n。

若與中斷機(jī)制相結(jié)合,則當(dāng)三次計(jì)算結(jié)果均不一樣時(shí),可以通過(guò)中斷程序報(bào)錯(cuò),讓操作系統(tǒng)進(jìn)行相應(yīng)的錯(cuò)誤處理。此種情況的概率為:

Pint=2(1-p)n[1-(1-p)n]-

2(1-p)2n[1-(1-p)n]-

2(1-p)n[1-(1-p)n]·qn

(9)

其中:2(1-p)n[1-(1-p)n]表示的是標(biāo)記指令被執(zhí)行3次的概率;2(1-p)2n[1-(1-p)n]表示的是3次執(zhí)行中2次正確、1次錯(cuò)誤的概率;2(1-p)n[1-(1-p)n]·qn表示的是3次執(zhí)行中2次錯(cuò)誤、1次正確,且錯(cuò)誤結(jié)果相同的概率。q表示出現(xiàn)錯(cuò)誤且錯(cuò)誤結(jié)果與之前的錯(cuò)誤結(jié)果相同的概率,其數(shù)值遠(yuǎn)遠(yuǎn)小于p。比如,對(duì)某個(gè)深度為32、位寬為32的寄存器文件而言,若寄存器R0某個(gè)數(shù)據(jù)位發(fā)生單粒子瞬時(shí)故障的概率為p,則對(duì)于指定位(如最高位)發(fā)生單粒子瞬時(shí)故障的概率q=p/32。

因此,可以忽略2(1-p)n[1-(1-p)n]·qn項(xiàng),則Pint≈2(1-p)n[1-(1-p)n][1-(1-p)n]。

同理,設(shè)t=(1-p)n∈(0,1),則:

Pint≈f2(t)=2(t3-2t2+t)

(10)

所以Pint+ΔP≈f(t)=-t2+t。

f(t)max=f(1/2)=0.25,即:若與中斷錯(cuò)誤處理程序配合使用,標(biāo)記指令復(fù)算糾錯(cuò)機(jī)制可把單個(gè)指令的檢錯(cuò)能力最多提高25%。

對(duì)于一個(gè)包含s條指令的程序,假設(shè)沒有復(fù)算糾錯(cuò)機(jī)制,每一條指令執(zhí)行正確的概率是ti=(1-pi)ni,其中pi是第i條指令發(fā)生錯(cuò)誤的概率,ni是執(zhí)行第i條指令所需的時(shí)鐘周期。則整個(gè)程序最終能正確執(zhí)行結(jié)束的概率是:

(11)

若采用指令復(fù)算糾錯(cuò)機(jī)制,則整個(gè)程序最終能夠正確執(zhí)行結(jié)束的概率是:

(12)

所以對(duì)于整個(gè)系統(tǒng)而言,最終目標(biāo)程序的容錯(cuò)能力提高了:

(13)

以本文所做的實(shí)驗(yàn)為例,假設(shè)整個(gè)程序中共s= 160條指令,所有指令都是涉及寄存器文件操作的單周期指令,任一時(shí)刻寄存器文件中的某個(gè)寄存器發(fā)生故障的概率pi=1/32,則對(duì)于每一條指令,其能正確執(zhí)行的概率ti=(1-1/32)1=31/32,代入式(8)可得Δti=ΔPi=2.83%。

在沒有復(fù)算糾錯(cuò)機(jī)制時(shí),整個(gè)程序最終得以正確執(zhí)行的概率Pori=(31/32)160=0.62%。

若采用復(fù)算糾錯(cuò)機(jī)制(不考慮中斷輔助),程序正確執(zhí)行的概率為:

Prcc=(31/32+2.83%)160=62.33%

(14)

所以對(duì)于整個(gè)程序而言,本文提出的復(fù)算糾錯(cuò)機(jī)制將系統(tǒng)可靠性提高了:

ΔPtotal=Prcc-Pori=61.71%

(15)

3 實(shí)驗(yàn)結(jié)果

本文用6個(gè)來(lái)自riscv-test項(xiàng)目中的基準(zhǔn)測(cè)試集對(duì)復(fù)算糾錯(cuò)機(jī)制進(jìn)行測(cè)試。riscv-test是由RISC-V架構(gòu)開發(fā)者在Github平臺(tái)上維護(hù)的公共項(xiàng)目,其中包含一些測(cè)試處理器是否符合RISC-V指令集架構(gòu)定義的測(cè)試程序,它們均由匯編語(yǔ)言編寫。本文的重點(diǎn)是從硬件上建立指令復(fù)算和糾錯(cuò)機(jī)制,而非在軟件上優(yōu)化編譯器使之能根據(jù)指令的重要性和易錯(cuò)性自動(dòng)添加復(fù)算標(biāo)記。所以在整個(gè)實(shí)驗(yàn)過(guò)程中,復(fù)算標(biāo)記是在ITCM初始化文件中手動(dòng)添加的。

本文對(duì)邏輯運(yùn)算測(cè)試集or、and、xor和算數(shù)運(yùn)算測(cè)試集add、mul、div分別進(jìn)行了100次容錯(cuò)實(shí)驗(yàn)。因?yàn)樵谏鲜?個(gè)測(cè)試集中也包含有分支跳轉(zhuǎn)指令,因此通過(guò)對(duì)其中的分支跳轉(zhuǎn)指令添加復(fù)算標(biāo)記,也可以順便完成對(duì)Bjp_bak糾錯(cuò)模塊的測(cè)試。其中故障注入是通過(guò)在測(cè)試文件tb_top.v中利用force和release語(yǔ)句,在指定時(shí)刻對(duì)隨機(jī)信號(hào)產(chǎn)生隨機(jī)干擾完成的。為降低故障注入的復(fù)雜度并便于調(diào)試,本文在每個(gè)時(shí)鐘周期上升沿之后,只針對(duì)32個(gè)通用寄存器文件進(jìn)行隨機(jī)故障注入,每次故障持續(xù)的時(shí)間都最長(zhǎng)不超過(guò)一個(gè)時(shí)鐘周期。雖然只針對(duì)寄存器進(jìn)行了故障注入,但是該方法可以模擬整個(gè)寄存器文件讀、寫以及運(yùn)算執(zhí)行過(guò)程中所覆蓋的硬件的全部故障,即達(dá)到了本文想要檢測(cè)并糾正數(shù)據(jù)流瞬時(shí)故障的初衷。因此,對(duì)于每個(gè)時(shí)鐘周期,每個(gè)寄存器文件出錯(cuò)的概率p=1/32。每個(gè)“蜂鳥e203”寄存器文件的數(shù)據(jù)位寬是32位,因此對(duì)于指定寄存器的指定位發(fā)生錯(cuò)誤的概率q=p/32。

圖5展示了在100次隨機(jī)故障注入的實(shí)驗(yàn)中,引入標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制前后各測(cè)試集錯(cuò)誤執(zhí)行的次數(shù)。其中,空白條BF表示未引入復(fù)算糾錯(cuò)機(jī)制前,測(cè)試程序能夠順利完成但得到的是錯(cuò)誤結(jié)果的次數(shù);灰色填充條BD表示未引入復(fù)算糾錯(cuò)機(jī)制前,測(cè)試程序由于數(shù)據(jù)流錯(cuò)誤,導(dǎo)致其中某些分支跳轉(zhuǎn)指令跳錯(cuò)方向,從而陷入死循環(huán)無(wú)法正常退出的次數(shù),即偽分支錯(cuò)誤;綠色填充條AF表示引入復(fù)算糾錯(cuò)機(jī)制后,測(cè)試程序能夠順利完成但得到的是錯(cuò)誤結(jié)果的次數(shù);紅色填充條AD表示引入復(fù)算糾錯(cuò)機(jī)制后,測(cè)試程序由于數(shù)據(jù)流錯(cuò)誤,其中某些分支跳轉(zhuǎn)指令跳錯(cuò)方向,從而陷入死循環(huán)無(wú)法正常退出的次數(shù)。

從or、and、xor的實(shí)驗(yàn)數(shù)據(jù)中可以看出,未改進(jìn)之前,邏輯運(yùn)算內(nèi)在的容錯(cuò)能力十分微弱,在100次隨機(jī)故障注入的實(shí)驗(yàn)中,沒有一次能夠正確運(yùn)行完畢。對(duì)于算數(shù)運(yùn)算測(cè)試集add、mul、div,在未引入復(fù)算糾錯(cuò)機(jī)制之前,出錯(cuò)概率也為100%。當(dāng)引入復(fù)算糾錯(cuò)機(jī)制和中斷處理機(jī)制之后,從圖5可以看出錯(cuò)誤執(zhí)行概率大大減小。其中,執(zhí)行完畢但得到錯(cuò)誤結(jié)果的概率(彩色條長(zhǎng)度相對(duì)于灰白條長(zhǎng)度)平均減小了約89.82%,說(shuō)明標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制能夠有效地檢查并校正數(shù)據(jù)流錯(cuò)誤。另外,偽分支錯(cuò)誤的概率(紅色填充條長(zhǎng)度相對(duì)于灰色填充條長(zhǎng)度)平均減小了40%。

圖6展示了在100次故障注入實(shí)驗(yàn)中,在引入本文所提出的標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制之后,程序最終得以正確執(zhí)行的次數(shù)。從中可以看出,在本文所提出的標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制和中斷處理程序的配合下,6個(gè)測(cè)試集平均有86.67%的概率能夠正確完成程序的指定任務(wù)。對(duì)于單周期指令or、and、xor測(cè)試集而言,實(shí)驗(yàn)數(shù)據(jù)表明在只有復(fù)算糾錯(cuò)機(jī)制的情況下,其正確執(zhí)行的概率平均為[(65+77+61)/300]×100%=67.67%,與第2節(jié)理論分析中得出的62.33%相吻合。

對(duì)于mul、div等多周期指令,隨著指令周期數(shù)n的增大,單條指令受到隨機(jī)故障影響的概率也越大。因此單條mul、div指令正確執(zhí)行的概率將變小,從而導(dǎo)致通過(guò)兩次復(fù)算進(jìn)行糾錯(cuò)的成功率也將大大降低。盡管如此,本文提出的復(fù)算與糾錯(cuò)機(jī)制可以根據(jù)原始計(jì)算與兩次復(fù)算結(jié)果的不同,檢查出數(shù)據(jù)流錯(cuò)誤并報(bào)中斷程序進(jìn)行系統(tǒng)級(jí)糾錯(cuò),從而成功保證程序得以正常執(zhí)行。從圖6的實(shí)驗(yàn)數(shù)據(jù)可以發(fā)現(xiàn),對(duì)于mul測(cè)試集和div測(cè)試集,其通過(guò)兩次復(fù)算成功糾錯(cuò)的次數(shù)分別只有27次和1次,但分別有62次和99次通過(guò)報(bào)中斷處理程序得以糾正錯(cuò)誤,保證程序的正確執(zhí)行。

圖5 程序執(zhí)行錯(cuò)誤的次數(shù)Fig.5 The number of program failures

圖6 程序正常執(zhí)行完畢的次數(shù)Fig.6 The number of program successes

4 結(jié)論

本文提出了一種標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制。通過(guò)編譯器對(duì)每16位指令數(shù)據(jù)插入1位復(fù)算標(biāo)記,并引入一個(gè)復(fù)算糾錯(cuò)狀態(tài)機(jī)RCC_FSM來(lái)監(jiān)控指令流中的標(biāo)記,可以對(duì)標(biāo)記為復(fù)算的指令進(jìn)行復(fù)算。通過(guò)引入Reg_bak和Bjp_bak兩個(gè)備份糾錯(cuò)模塊,若寫入寄存器文件的數(shù)據(jù)或者分支跳轉(zhuǎn)的方向在第一次復(fù)算時(shí)的結(jié)果與原始運(yùn)算結(jié)果不同,可自動(dòng)進(jìn)行第二次復(fù)算。根據(jù)少數(shù)服從多數(shù)的原則,可自動(dòng)糾正錯(cuò)誤從而得到正確結(jié)果。若三次運(yùn)算結(jié)果均各不相同,則可自動(dòng)觸發(fā)中斷機(jī)制,交由系統(tǒng)級(jí)容錯(cuò)軟件進(jìn)行處理。

所提出的標(biāo)記指令復(fù)算與糾錯(cuò)機(jī)制的優(yōu)點(diǎn)有:

1)對(duì)軟件程序所需的內(nèi)存開銷較小。因?yàn)闆]有直接插入完整的冗余指令,而只是插入了是否復(fù)算的標(biāo)記位。

2)對(duì)芯片的硬件開銷較小。采用時(shí)鐘門控的做法,避免了在原有的硬件基礎(chǔ)上增加復(fù)雜的控制邏輯。整個(gè)內(nèi)核只需引入一個(gè)復(fù)算糾錯(cuò)狀態(tài)機(jī)RCC_FSM??筛鶕?jù)具體的需要,針對(duì)易錯(cuò)部件靈活地插入備份糾錯(cuò)模塊。

3)對(duì)程序執(zhí)行時(shí)間的開銷較小。在程序復(fù)算的過(guò)程中免去了重新取指的過(guò)程,可以直接重新發(fā)射。而且僅在第一次復(fù)算結(jié)果與原始結(jié)果不同時(shí),才進(jìn)行第二次復(fù)算。

然而,本文的工作也仍存在不足:

1)雖然用額外添加標(biāo)記位的方式來(lái)表達(dá)指令復(fù)算的需求可以節(jié)省存儲(chǔ)空間,但同時(shí)也要求軟件工程師能分析出易出錯(cuò)的指令,抑或是將容錯(cuò)能力納入編譯器中,使編譯器能夠?qū)σ族e(cuò)指令進(jìn)行自動(dòng)標(biāo)記。下一步研究將對(duì)RISC-V編譯器進(jìn)行優(yōu)化和改進(jìn),使之能自動(dòng)分析出指令的易錯(cuò)性和重要性。

2)雖然二次復(fù)算可以避免傳統(tǒng)硬件三模冗余結(jié)構(gòu)帶來(lái)的面積與功耗開銷,但是對(duì)于出錯(cuò)率高、執(zhí)行周期長(zhǎng)的指令而言,可能會(huì)降低整體程序的性能,因此,本文提出的結(jié)構(gòu)可能更適合于出錯(cuò)率相對(duì)較低的環(huán)境。

3)最終實(shí)驗(yàn)時(shí),只選取了功能單一的測(cè)試向量并且最終的故障注入實(shí)驗(yàn)只針對(duì)寄存器文件中的32個(gè)通用寄存器進(jìn)行了等概率的隨機(jī)故障注入,其主要原因是缺乏具有標(biāo)記容錯(cuò)能力的編譯器與真實(shí)的輻射實(shí)驗(yàn)環(huán)境。事實(shí)上,不同指令所調(diào)用的部件、執(zhí)行周期長(zhǎng)短都各不相同,因此其真實(shí)的出錯(cuò)概率并不一樣。后續(xù)將研究建立更精確的故障注入模型,利用改進(jìn)后的編譯器產(chǎn)生更多貼近真實(shí)情況的程序,從而更好地模擬復(fù)算糾錯(cuò)機(jī)制對(duì)系統(tǒng)容錯(cuò)能力的提升。

猜你喜歡
數(shù)據(jù)流寄存器指令
聽我指令:大催眠術(shù)
汽車維修數(shù)據(jù)流基礎(chǔ)(下)
Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
ARINC661顯控指令快速驗(yàn)證方法
LED照明產(chǎn)品歐盟ErP指令要求解讀
一種提高TCP與UDP數(shù)據(jù)流公平性的擁塞控制機(jī)制
分簇結(jié)構(gòu)向量寄存器分配策略研究*
基于數(shù)據(jù)流聚類的多目標(biāo)跟蹤算法
北醫(yī)三院 數(shù)據(jù)流疏通就診量
坐標(biāo)系旋轉(zhuǎn)指令數(shù)控編程應(yīng)用
星子县| 琼海市| 咸丰县| 色达县| 班玛县| 望江县| 莱阳市| 乐东| 驻马店市| 灵石县| 手机| 湖南省| 嘉义县| 平武县| 伊通| 耿马| 芦山县| 汉阴县| 成安县| 合作市| 疏附县| 嘉峪关市| 墨玉县| 佛坪县| 红桥区| 万山特区| 孝感市| 沭阳县| 福海县| 古交市| 呼图壁县| 开远市| 文成县| 锦屏县| 印江| 当涂县| 福建省| 安丘市| 金山区| 长子县| 北辰区|