這段MIPS程序的CPI如何計算?
01-27
這是一段延遲槽出問題的MIPS程序,總之把8和9互換一下就好了,但是放到五級流水後CPI如何計算呢?能不能詳細解答一下另外,為什麼5放到2和3之間就能實現CPI=1??
3立馬就要用到2的數據,而2的數據會在五級流水線if-id-exe-mem-wb的wb階段才會存入寄存器,而3在exe階段就要用這個數據。會有延遲。插一條不相干的指令5抵消延遲
手機打字,還不懂mips, 題主可不要坑我,憑印象說,希望不會誤導,假設問題描述的都是正確的,並且MIPS不是OOO。
1. 8和9順序的問題。跳轉指令下面一條指令總是會執行,所以這個順序不一樣意味著執行的指令也不同,結果不同是一定的。至於哪個結果對,看你的邏輯,恕我無力分辨。
2. 2和3之間是不是有冒險問題?因此導致流水線有氣泡?CPI全稱為Cycle Per Instruction,在通常的計算機組成原理中講解的求CPI方法為:
主頻 / 每秒指令數這個公式求的是此CPU的每條指令所需要的cycle,然而它包含一個隱藏條件:每個程序都是理想的,它的每條指令的出現都沒有違背CPU體系結構所陳述的各種設計特點(實際上是一種理想狀態的意思,想不出該如何表述,懇請有人能夠指點)。 此處要求的是具體程序的CPI,很顯然不能使用上面的公式,因為具體到程序時與人的水平相關。(一般來說這都是在程序優化時才需要考慮這個問題)MIPS大多數指令的執行時間是1cycle,但是載入以及跳轉指令會有延遲槽,也就是說他們的消耗都是2cycle(並不是說CPU執行這條指令,CPU執行它們仍然只需要一個cycle)。既然知道了這個前提,那麼久很容易分析出MIPS程序的CPI了。
假設程序的消耗為SC,指令數為IC,8和9的順序問題你也知道了,因此接下來我認為已經調整過了。 (1)add $5,$0,100,SC=1,IC=1,此時程序的CPI=SC/IC=1, (2)lw $1,10($fp),SC=2,IC=2,此時程序的CPI=1,(因為CPU執行它只需要一個Cycle,本條指令又不使用它的結果,那它額外消耗的cycle關我屁事?---事實上就是你的事,見下條指令分析)(3)subu $1,$1,150,SC=4,IC=3,此時CPI=1.333...,(lw得到的結果需要兩個cycle,從它開始執行才過了一個cycle,你就要使用它,所以CPU會直接延遲一個cycle才會開始執行本條指令。按道理來說,延遲的這個cycle是算到lw上的,但是為了容易理解,我將它算入第三條指令)
(4)sw $1,10($fp),SC=5,IC=4,CPI=1.25(不解釋) (5)lw $2,14($fp),SC=6,IC=5,CPI=1.2(參考(2)) (6)subu $5,$5,1,SC=7,IC=6,CPI=7/6(上條指令結果對本條指令的執行結果沒有任何影響,因此它的延遲不關本指令的事,因此SC只加1) (7)lw $3,16($fp),SC=8,IC=7,CPI=8/7(參考(5)) (8)bne $5,$0,$L5,SC=9,IC=8,CPI=9/8(為什麼此處SC只加了1呢?因為本條指令沒有使用上條指令的結果,因此不需要等待其結果返回) (9)addu $4,$2,$3,SC=10,IC=9,CPI=10/9,($2,$3的從開始執行到本條指令開始執行都過了至少2個cycle,因此不會對本指令產生任何的延遲執行作用) (10)lw $5,24($fp),SC=SC+1,IC=IC+1,CPI=SC/IC(如果SC==IC,那麼CPI就是1) 雖然上面對循環體只分析了以便,但是很明顯,只有第三條指令會被延遲一個cycle執行,這也是導致這段代碼的CPI不為1的原因。如果能夠消除它,那很明顯,不管循環多少次,CPI始終為1。 通過觀察代碼,很容易就能知道,不僅5放在2、3中間可以,6放在它門中間也是可以的。因為這兩種方式的調整都滿足,任何一條指令的執行都不依賴於前一條指令。其實通過上面的分析,你是否已經發現,為什麼提到優化時,別人會說變數的載入與訪問交叉進行性能會更好?
======================================================================寫好了,貼上來排版竟然消失了。(1)更新GPR[5]為100,因為MIPS架構中GPR[0]總是0。addu指令就是把後面兩個數加起來,放到第一個參數中,在此例中為GPR[5]。
(2)以GPR[fp]為base address, 10作為offset得到effectiv address: base addres + (offset&<&<2),以此地址作為VA去memory中讀取數據,放到GPR[1]中,參考MIPS II中對lw的描述。(3)GPR[1]的值減去150,然後放到GPR[1]中。(4)把剛才更新的GPR[1]放到memory中,其中:「剛才更新」指(3)的執行結果;memory指圖中指令(2)中提到的effective address,也就是(2)中讀取的memory地址。(5)以GPR[fp]作為base address, 14作為offset,GPR[2]作為目的寄存器,做(2)中類似的load word操作。(6)GPR[5]的值減去1,然後放到PR[5]中。(7)以GPR[fp]作為base address,16作為offset,GPR[3]作為目的寄存器,做(2)中類似的LW操作。(8)把GPR[2]和GPR[3]中的值加起來,結果放到GPR[4]中。
(9)如果GPR[5]不等於0就在執行完(10)中的指令(delay slot)後跳轉到「$L5」(即重新執行圖中第二條指令),如果PR[5]等於0,即在執行完(10)中的指令後執行(10)後面的指令(即結束循環)。(10)以GPR[fp]為base address,24為offset,GPR[5]作為目的寄存器,做(2)中類似的LW操作。注釋:上面解釋不包含可能遇到的address error,overflow,tlb,cache 等可能的exception。題主你好,我在學MIPS彙編,請問您圖片中代碼片段是書中的么,如果是,求告知書名;如果是其他電子資料,能不能發我一份?我的郵箱:custcoder@gmail.com
推薦閱讀:
※帶你了解機器學習(一): 機器學習中的「哲學」
※《三體》中人列計算機是否有可能性?
※操作系統的時間函數是怎麼實現的?
※為什麼給cpu進行液氮冷卻不會熱脹冷縮而損壞?
※[8] Python轉義字元和切片