DSP設計中的流水線(xiàn)數據相關(guān)問(wèn)題及解決辦法
在航空微電子中心的某預研項目中,需要開(kāi)發(fā)設計某32位浮點(diǎn)通用數字信號處理器(DSP)。本系統控制通路部分的設計采用超級哈佛及五級流水線(xiàn)結構。本文分析了該流水線(xiàn)的設計過(guò)程,并對遇到的數據相關(guān)問(wèn)題提出了一種新的解決方法。
本文引用地址:http://dyxdggzs.com/article/257368.htm1 流水線(xiàn)結構
流水線(xiàn)處理器一般把一條指令的執行分成幾個(gè)步驟,或稱(chēng)為級(stages)。每一級在一個(gè)時(shí)鐘周期內完成,也就是說(shuō)在每個(gè)時(shí)鐘周期,處理器啟動(dòng)并執行一條指令。如果處理器的流水線(xiàn)有m級,則同時(shí)可重疊執行的指令總條數為m。由于每條指令處在不同的執行階段,因此,如果分級分得好,每一級都沒(méi)有時(shí)間上的浪費,這就是最理想的情況。流水線(xiàn)處理器在理想情況下與非流水線(xiàn)處理器的性能加速比為:
式中,I為一個(gè)程序被執行的總的指令條數,它在流水線(xiàn)處理器和非流水線(xiàn)處理器中是相等的。CPInp是每條指令總體平均所需的時(shí)鐘周期數。因為流水線(xiàn)處理器把一條指令的執行時(shí)間理想地分成了m級,故有m條指令在同時(shí)(重疊)執行。T是每個(gè)時(shí)鐘周期的時(shí)間長(cháng)度,本例可假設它在兩種處理器中也是相同的,那么,最后總的加速比為m(即等于流水線(xiàn)的級數)。并不是說(shuō)把流水線(xiàn)級數分得越多,處理器的性能就越好。流水線(xiàn)處理器性能提高的關(guān)鍵在于每個(gè)時(shí)鐘周期處理器都應當能啟動(dòng)一條指令的執行。
2 數據相關(guān)問(wèn)題
下面來(lái)討論數據相關(guān)(data dependence)問(wèn)題及解決方法,先來(lái)看看下面的程序例子:
在上述程序段中,I1指令把寄存器r2和r3的內容相加,并將結果存人寄存器r1,這樣,它下面的4條指令均與I1相關(guān),其使用I1的結果如圖1給出的數據相關(guān)關(guān)系圖。從圖中可見(jiàn),當每個(gè)周期結束時(shí),在時(shí)鐘上升沿應把數據打入寄存器。在數據沒(méi)被打入之前,任何從該寄存器讀出的數據都是過(guò)時(shí)的。圖1中的I2到I4的3條指令就屬于這種情況。它們從r1寄存器讀出的數據都是過(guò)時(shí)的,是不能使用的。I5則沒(méi)關(guān)系,當它讀r1寄存器時(shí),I1已將結果寫(xiě)入。
I1下面有3條指令不能從寄存器r1讀出正確的數據。為了減少數據相關(guān)指令的條數,設計時(shí)可以讓寫(xiě)寄存器堆的操作提前半個(gè)周期,即由時(shí)鐘的下降沿打入。實(shí)踐證明這樣做是可行的,因為假定一個(gè)時(shí)鐘周期是10 ns,寄存器堆的訪(fǎng)問(wèn)只需要5 ns。這樣,數據相關(guān)的指令條數就減至兩條,其操作示意圖如圖2所示。
3 數據相關(guān)問(wèn)題的解決
在流水線(xiàn)處理器中處理數據相關(guān)問(wèn)題有兩種方法:一種是暫停相關(guān)指令的執行,即暫停流水線(xiàn),直到能夠正確讀出寄存器操作數為止;另一種是采用專(zhuān)門(mén)的數據通路,直接把結果送到ALU的輸入端,也就是把內部數據前推。描述這兩種方法可參考圖2所示的方案,即把寫(xiě)寄存器堆提前半個(gè)周期,這時(shí),只需考慮兩條相關(guān)指令。下面以ALU指令為例對暫停流水線(xiàn)的執行方法加以分析。
3.1 暫停數據相關(guān)流水線(xiàn)
暫停數據相關(guān)流水線(xiàn)指令是當數據相關(guān)出現時(shí),暫時(shí)停止相關(guān)指令的執行,等劍相關(guān)數據能從寄存器讀出再恢復執行。這里涉及到兩個(gè)問(wèn)題,一個(gè)是如何檢測數據相關(guān),另一個(gè)是如何暫停流水線(xiàn)。下面對這兩個(gè)問(wèn)題分別加以描述。
首先考慮數據相關(guān)如何用硬件電路檢測出來(lái)。由于I1與目的寄存器rd、I2和I3的源操作數是寄存器rs1或rs2中的數據,且只有當它們的rs1或rs2與I1的目的寄存器號rd相等時(shí)才有可能發(fā)生數據相關(guān),因此,硬件電路中要有比較器。由于指令格式中的源寄存器號rs2與立即數部分重疊,而立即數是不會(huì )出現相關(guān)的,因此,指令操作碼必須要參與檢測,以區分是寄存器操作數還是立即數。另外,如I1指令的rd一定作為目的寄存器號使用,也就是當結果要被寫(xiě)入目的奇仔器時(shí),后面的指令才有可能與之相關(guān)。上述規則用表達式表述如下(它們是在ID級檢測數據相關(guān)的表達式):
由于一條指令中的兩個(gè)源操作數都可能與上一條指令的目的操作數相關(guān),因此,總的數據相關(guān)DEPEN由A DFPEN和B_DEPEN兩部分組成。A_DEPEN指的是源寄存器rs1數據相關(guān),B_DE-PEN指的是源寄存器rs2數據相關(guān)。另外,兩條指令I(lǐng)2和I3也都可能與I1相關(guān)。如果是在流水線(xiàn)ID級檢測數據相關(guān),那么,對于I2來(lái)講,I1處在EXE級;對于I3來(lái)講,I1處在MEM級,因此,A_DEFPEN包括EXE_A_DEPEN和MEM_B_DEPEN兩部分。EXE_A_DEPEN的意思是處在ID級的指令與處在EXE級的指令數據相關(guān)。同理,MEM_A_DEPEN的意思是處在ID級的指令與處在MEM級的指令數據相關(guān)。同樣,B_DEPEN也包括EXE_B_DEPEN和MEM_B_DEPEN兩部分。
EXE_A_DEPEN為真的條件是:I2的rs1與I1的rd相等(ID_rs1==EXE_rd),rs1字段是寄存器(ID_rs1IsReg),并且I1的rd確實(shí)是目的寄存器(EXE_WREG==1)。后一個(gè)條件是為排除store指令而加上的。EXE_B_DEPEN與EXE_A_DEPEN類(lèi)似,源寄存器號(ID_rs2IsReg)所包含的指令要比ID_rs1IsReg少得多。I3與I1的數據相關(guān)判斷與此類(lèi)似。
得出了數據相關(guān)條件后。下一步的任務(wù)是確定如何暫停流水線(xiàn)。這里要特別注意的一個(gè)問(wèn)題是不能停止所有指令的流水線(xiàn),而只能暫停相關(guān)指令及其后續的所有指令。假如I2與I1相關(guān),則只暫停I2及I2以下的指令,而不應把I1也暫停,否則,處理器將永遠暫停下去。暫停流水線(xiàn)要注意以下3個(gè)方面:
(1) 封鎖當前正譯碼的指令的寫(xiě)控制信號;
(2) 不能把從存儲器取來(lái)的下條指令打入IR;
(3) 不改變當前PC值。
實(shí)際操作時(shí)可使用如下的方法實(shí)現流水線(xiàn)的暫停:
這樣,當I2與I1相關(guān)時(shí),流水線(xiàn)將暫停兩個(gè)周期。I3與I1相關(guān)時(shí),流水線(xiàn)暫停一個(gè)周期。通常把被暫停掉的周期稱(chēng)作流水線(xiàn)“氣泡”。暫停流水線(xiàn)是解決流水線(xiàn)處理器數據相關(guān)問(wèn)題的一種有效方法。使用這種方法可保證處理器能夠從寄存器堆讀出正確的數據。但是,暫停流水線(xiàn)兩個(gè)或一個(gè)周期會(huì )造成處理器性能的損失。因此,如果沒(méi)有數據相關(guān),處理器完全可以多執行兩條或一條指令。在使用這種方法的處理器組成的計算機系統中,高級語(yǔ)言的編澤器和匯編器在產(chǎn)生最終目標機器碼時(shí),應盡量避免出現過(guò)多的數據相關(guān)指令序列。編譯器和匯編器最初可以在相關(guān)指令之間插入nop指令,然后進(jìn)行優(yōu)化,可以用一些有意義的不相關(guān)的指令替換掉nop,以減少“氣泡”的出現。
3.2 內部前推
流水線(xiàn)數據相關(guān)問(wèn)題的本質(zhì)在于一條指令執行時(shí)要用到上面指令的計算結果,但這個(gè)結果尚未被寫(xiě)入寄存器堆,因此,如果讓ALU使用從寄存器堆瀆出的數據的話(huà),流水線(xiàn)“氣泡”問(wèn)題也可以得到解決。試想,數據相關(guān)發(fā)生在A(yíng)LU計算周期,而所有的計算任務(wù)均由這一個(gè)ALU來(lái)按順序完成,也就是說(shuō),ALU計算時(shí)發(fā)現與上一條或兩條指令的結果數據相關(guān)的話(huà),這些結果實(shí)際上已由ALU計算出來(lái)了,只是還沒(méi)有寫(xiě)入寄存器堆,但其結果還在流水線(xiàn)寄存器R和C中,這就可以把它們直接拿過(guò)來(lái)用。為此,可在A(yíng)LU的兩個(gè)數據輸入端各加一個(gè)多路器,以使R和C中的數據能被直接送到ALU的輸入端,這樣就用內部前推技術(shù)提高了流水線(xiàn)的性能。
4 結束語(yǔ)
采用暫停數據相關(guān)流水線(xiàn)的方法可以解決數據相關(guān)問(wèn)題。目前,筆者已將該方法應用于某32位浮點(diǎn)通用數字信號處理器中,而且該處理器已經(jīng)沒(méi)計完成,并通過(guò)綜合仿真查驗波形證明:該DSP完全符合要求。
評論