流水線的相關(guān)問題
引言
在CPU流水線中會出現(xiàn)一些相關(guān)的情況,導致流水線不能很好地表現(xiàn)出理論性能
流水線相關(guān)分類
結(jié)構(gòu)相關(guān)
指的是在指令執(zhí)行過程中,由于硬件資源滿足不了指令執(zhí)行的要求,發(fā)生硬件資源沖突而產(chǎn)生的相關(guān)
例子:指令和數(shù)據(jù)使用同一個存儲器,如果取指的同時需要對存儲器中的數(shù)據(jù)進行訪問,產(chǎn)生存儲器訪問沖突
控制相關(guān)
指的是流水線中的分支指令或者其他需要改寫PC的指令造成的相關(guān)
數(shù)據(jù)相關(guān)
指的是在流水線中執(zhí)行的幾條指令中,一條指令依賴于前面指令的執(zhí)行結(jié)果
tips:下面的指令j都是在指令i后面執(zhí)行,且二者對同一個寄存器或存儲器單元操作
RAW
即指令j在指令i寫入寄存器之前嘗試讀出該寄存器的內(nèi)容,指令j得不到正確的數(shù)據(jù)
WAR
即指令j在指令i讀取寄存器之前就去更改寄存器的內(nèi)容,指令i得不到正確的數(shù)據(jù)
WAW
即指令j在指令i之前寫寄存器,指令'i'的值會覆蓋指令j的值,寄存器保存的數(shù)據(jù)不是最新的
解決辦法
數(shù)據(jù)相關(guān)
WAW
合理分配寫入的時機,最好確保只有一個階段進行寫入操作 --- 目前我只知道這個辦法
WAR
和WAW類似,控制讀寫的階段,將二者分開,比如:每次都是在譯碼階段讀寄存器,在回寫階段寫寄存器
RAW
-
插入暫停周期
當檢測到該數(shù)據(jù)相關(guān)插入nop周期 --- 一定程度上會影響流水線的效率 -
編譯器調(diào)度
軟件調(diào)整指令執(zhí)行的順序 -
數(shù)據(jù)前推
將計算結(jié)果從其產(chǎn)生處直接送到其他指令需要處或所有需要的功能單元處,避免了流水線的暫停
控制相關(guān)
使用延遲槽技術(shù),即轉(zhuǎn)移指令后面的一條指令為延遲指令,延遲指令一定會執(zhí)行,但是結(jié)果不一定會被保存

選自雷思磊的《自己動手寫CPU》
同時,將分支跳轉(zhuǎn)提前到譯碼階段,即在譯碼階段就完成對跳轉(zhuǎn)指令的執(zhí)行,因為跳轉(zhuǎn)指令只需要改變PC的值

浙公網(wǎng)安備 33010602011771號