日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单理解Tomasulo算法与重加载缓冲区

發布時間:2023/12/31 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单理解Tomasulo算法与重加载缓冲区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考書:《計算機體系結構量化研究方法》 作者:John L. Hennessy
流水線運行的一個主要限制是:它們使用循序指令發射與執行的方式。把指令執行的流水線簡單比喻為洗衣服:

采用循序發射與執行方式的限制,意思就是,衣服只能一件一件洗,洗完一件才能洗下一件。如果現在洗衣機壞掉了(硬件故障),或者衣服還沒臟(操作數不可用),這個流水線就停頓了,哪怕后面還有指令等待執行。但是我們希望操作數可用的時候就立即執行指令(有臟衣服就洗),這樣的流水線實際上是亂序執行的,意味著它將會亂序完成。這就是動態調度的主要思想。

一、Tomasulo算法

我們的目的是讓操作數可用的時候立即開始執行。于是我們增加了一個“管家”,如圖所示:

Tomasulo算法大概是這樣的:
這家主人說我要洗衣服,告訴了管家,這個步驟叫做指令發射。之前不同的是,這個指令由管家保存,并把相應的操作和衣服放在了新木桶中,這個木桶就是算法中的保留站。這個木桶很大,可以存放多條指令。不像之前,必須一條一條指令循序執行。不過有一點要注意,在Tomasulo算法中,指令仍然是循序發射的。主人1,主人2跟管家說我要洗衣服,這個過程是一個一個來的。
但是動態調度是如何實現的呢?
現在新木桶很大,現在里邊可以存放多條指令和衣服。但是現在管家發現了,雖然主人1說要洗一件衣服,但是衣服還沒來,或者是這件衣服還在洗衣機中洗。那么管家就會在木桶中給主人1留一個位置。因為衣服還沒來,沒辦法洗。這時候管家就會為主人2先洗衣服,同時監視晾衣架上主人1的衣服有沒有洗好。一旦發現晾衣架上主人1的衣服準備好了,那么就立即開始為主人1洗衣服。這就實現了:

  • 操作數可用時立即執行程序
  • 指令的循序發射以及亂序執行

Tomasulo算法的真實結構圖如下所示:

下面講一下算法的細節問題:
看以下下面這串代碼:

DIV.D F0,F2,F4 ;F0 = F2/F4 ADD.D F6,F0.F8 ;F6 = F0 + F8 S.D F6,0(R1) ;存儲 SUB.D F8,F10.F8 ;F8 = F10 - F8 MUL.D F6,F10,F8 ;F6 = F10 * F8

雖然代碼不大,但出現的數據冒險很多,共有5個:

把這個算法寫到保留站時,保留站應該如何處理呢?
寄存器重命名
保留站會把這個代碼改寫一丟丟,對寄存器進行重命名,使其不在沖突。改寫后的代碼如下:

DIV.D F0,F2,F4 ADD.D S,F0,F8 S.D S,0(R1) SUB.D T,F10,F14 MUL.D F6,F10,T

S,T為重命名的寄存器名稱,這樣就去除了所有的讀后寫WAR冒險和寫后寫WAW冒險。但是如果細心點會發現,改寫后的代碼中還存在寫后讀冒險。應該如何解決呢?因為剛才也介紹到,保留站只會在操作數可用的時候才會執行程序。如果正在寫源寄存器,那么保留站將會先執行其他執行,等待源寄存器寫好,再執行此條指令,這樣就解決了所有的寫后讀RAW冒險??偨Y來說:

  • 操作數可用時執行程序,解決了寫后讀RAW冒險
  • 寄存器重命名解決了寫后寫WAW,以及讀后寫WAR冒險

另外,在寫結果時,先將計算結果寫到CDB公共數據總線)中。然后CDB上進行廣播,看這個計算結果有沒有作為是其他指令源操作數的。如果保留站發現有,就會更新保留站源操作數的值。這樣就代替了流水線寄存器。

二、推測

什么是推測呢?舉個例子,現在這家主人說,我要洗衣服,我洗完這件還得洗,不過洗的衣服不確定,要么洗衣服A,要么洗衣服B,或者還有更多的選項。因為管家是提前處理指令的。所以現在他不知道要洗衣服A還是B。就沒辦發提前處理了。所以現在有兩種選擇:
1)等待,直到執行完分支指令,計算出分支地址之后,確定了要洗衣服A還是洗衣服B的時候再開始洗。這種就是無推測的執行方法,但是會產生不小的流水線停頓。
2)猜。洗衣服要么是A要么是B(如果只有兩分支的話),我猜要洗衣服A,就開始先洗了。這樣的提前處理,如果分支猜對了,就節省了很多的時鐘周期。但有個問題猜錯了話,咋辦?

猜錯了的話,首先,你得把衣服B還給人家吧。這種方式就是保持異常行為的一種。意思是:你現在程序執行錯誤,你必須要回到原來的狀態,以重新執行正確的程序。但是怎么正確的處理預測錯誤導致的異常呢?這里增加了一個概念叫:重排序緩沖區ROB)。它的主要思想是:

  • 允許指令亂序執行,但必須循序提交

我們Tomasulo算法中實現重排序緩沖區,其思想就變成了

  • 指令循序發射,亂序執行,循序提交

用洗衣服的方式來比喻的話,大概是這樣的(未展示發射邏輯):
現在又增加了一個管家2,管家2干啥呢?他負責整理并保存已經洗好的衣服,按照他發射的順序進行排序?,F在程序可能會出現,已經執行完畢,但是還沒有把結果寫回的情況。因為指令提交就必須循序完成,哪怕你已經執行完畢了,也得在重排序緩沖區中等待循序提交。
重加載緩沖區的實際邏輯如下:

現在對于推測錯誤就很好處理了,因為哪怕已經執行了分支之后的命令,由于之前的指令還沒有執行完畢,分支之后的指令就無法提交,所以很容易的就程序計數器改為正確的分支地址,而不影響其他指令結果。
實際上,預測錯誤的概率還是相對較低的,在Intel Core i7的分支預測器中錯誤預測率平均在5%以下。

總結

以上是生活随笔為你收集整理的简单理解Tomasulo算法与重加载缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。