• 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

CPU訪存單元 -- LSU模塊介紹

4小時(shí)前
144
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

1. LSU介紹

LSU(Load Store Unit)是一個(gè)專門的執(zhí)行單元,負(fù)責(zé)執(zhí)行所有的加載(load)和存儲(chǔ)(store)指令等,生成load和store操作的虛擬地址,并從內(nèi)存中加載數(shù)據(jù)或?qū)?shù)據(jù)從寄存器中存儲(chǔ)回內(nèi)存。LSU里一般包括L1 D-cache、D-TLB、AGU、load queue、store queue等模塊。

 

AGU(Address Generate Unit)用來(lái)計(jì)算地址,訪問內(nèi)存的指令(load/store等) 通常會(huì)在指令中攜帶內(nèi)存地址,AGU負(fù)責(zé)計(jì)算出指令中攜帶的地址,計(jì)算得到的地址是虛擬地址,還需要訪問D-TLB等獲取物理地址。

 

AGU完成了地址轉(zhuǎn)換的一小部分,真正的重頭戲是從虛擬地址轉(zhuǎn)為物理地址,以及從物理地址得到數(shù)據(jù)的過程。這個(gè)過程直接決定了處理器的性能,尤其是load/store指令也采用亂序執(zhí)行的處理器,需要復(fù)雜的硬件邏輯來(lái)檢測(cè)和處理各種違例情況,例如store/load違例或者load/load違例等。

2. 香山處理器的LSU

開源的香山處理器為例,其訪存單元的架構(gòu)如下圖:

香山處理器(南湖架構(gòu))核內(nèi)的訪存單元包含兩條load流水線,彼此分離的兩條sta流水線和兩條std流水線。load queue和store queue負(fù)責(zé)維護(hù)訪存指令的順序信息。 load queue會(huì)在 load 指令在一級(jí)緩存中缺失時(shí)負(fù)責(zé)監(jiān)聽后續(xù)的重填結(jié)果并執(zhí)行寫回操作。store queue負(fù)責(zé)在指令提交之前暫存store 的數(shù)據(jù),并為store向load的前遞提供數(shù)據(jù)。

 

在store指令提交之后, store queue 會(huì)將其中的數(shù)據(jù)搬運(yùn)到committed store buffer. committed store buffer 會(huì)以緩存行為單位對(duì) store 的寫請(qǐng)求進(jìn)行合并,在接近滿的時(shí)候?qū)⒑喜⒑蟮亩鄠€(gè) store 寫請(qǐng)求一并寫入到L1 D-cache。

 

一級(jí)數(shù)據(jù)緩存對(duì)核內(nèi)訪存組件暴露兩個(gè)位寬為64的讀端口和一個(gè)與一級(jí)數(shù)據(jù)緩存行寬度相同的寫端口, 以及一個(gè)數(shù)據(jù)重填端口。數(shù)據(jù)重填端口的寬度數(shù)據(jù)緩存和 L2 cache之間的總線寬度決定。

 

MMU負(fù)責(zé)將虛擬地址翻譯成物理地址,然后用這個(gè)物理地址去訪存。同時(shí)也會(huì)進(jìn)行權(quán)限檢查,比如是否可寫,可執(zhí)行。香山的MMU包含TLB、L2 TLB、Repeater、PMP & PMA等組件。

2.1 load pipeline

香山處理器(雁棲湖架構(gòu))包含兩條load流水線,每條load流水線分成3級(jí)流水:

 

Stage 0:

指令和操作數(shù)被從保留站讀出

加法器將操作數(shù)與立即數(shù)相加,計(jì)算虛擬地址

虛擬地址送入TLB進(jìn)行TLB查詢

虛擬地址送入數(shù)據(jù)緩存進(jìn)行Tag索引

Stage 1:

TLB 產(chǎn)生物理地址

完成快速異常檢查

虛擬地址進(jìn)行 Data 索引

物理地址送進(jìn)數(shù)據(jù)緩存進(jìn)行 Tag 比較

虛擬/物理地址送進(jìn)store queue/ committed store buffer開始進(jìn)行 store 到 load 的前遞操作

根據(jù)一級(jí)數(shù)據(jù)緩存返回的命中向量以及初步異常判斷的結(jié)果, 產(chǎn)生提前喚醒信號(hào)送給保留站

如果在這一級(jí)就出現(xiàn)了會(huì)導(dǎo)致指令從保留站重發(fā)的事件, 通知保留站這條指令需要重發(fā)

Stage 2:

完成異常檢查

根據(jù)一級(jí)數(shù)據(jù)緩存及前遞返回的結(jié)果選擇數(shù)據(jù)

根據(jù) load 指令的要求, 對(duì)返回的結(jié)果做裁剪操作

更新 load queue 中對(duì)應(yīng)項(xiàng)的狀態(tài)

結(jié)果 (整數(shù)) 寫回到公共數(shù)據(jù)總線

結(jié)果 (浮點(diǎn)) 送到浮點(diǎn)模塊

Stage 3:

根據(jù) dcache 的反饋結(jié)果, 更新 load queue 中對(duì)應(yīng)項(xiàng)的狀態(tài)

根據(jù) dcache 的反饋結(jié)果, 反饋到保留站, 通知保留站這條指令是否需要重發(fā)

Load Miss

一條 miss 的 load 指令會(huì)執(zhí)行以下操作來(lái)取得其所需的數(shù)據(jù), 這一節(jié)將逐個(gè)介紹這些機(jī)制:

禁用當(dāng)前指令的提前喚醒

更新 load queue 的狀態(tài)

分配 dcache MSHR (MissQueue entry)

偵聽 dcache refill

寫回 miss 的 load 指令

在load stage 1, 根據(jù) dcache tag 比較結(jié)果, load 流水線可以得知當(dāng)前指令是否 miss. 在發(fā)生 miss 時(shí), 這條指令的提前喚醒有效位會(huì)被設(shè)置成false, 以禁用當(dāng)前指令的提前喚醒。

 

在 load stage 2, 如果發(fā)現(xiàn) miss, load 流水線不會(huì)寫回結(jié)果到寄存器堆, 不占用 load 指令寫回端口. 同時(shí)更新 load queue 的狀態(tài), 這條發(fā)生 miss 的 load 指令此后會(huì)在在 load queue 中等待 dcache refill. 與此同時(shí), dcache 會(huì)嘗試為這條 miss 的 load 指令分配 dcache MSHR (MissQueue entry). 由于分配邏輯復(fù)雜, 分配的結(jié)果要在下一拍才能反饋到 load queue。

 

在 load stage 3,?根據(jù) dcache MSHR 分配的結(jié)果再次更新 load queue 的狀態(tài). 如果 dcache MSHR 分配失敗, 則請(qǐng)求保留站重發(fā)這條指令。

 

若這條指令成功被分配 dcache MSHR,后續(xù)其將在 load queue 中偵聽 dcache refill 的結(jié)果。

 

Replay From RS

load流水線是非阻塞的, 即無(wú)論出現(xiàn)任何異常情況, 都不會(huì)影響流水線中有效指令的流動(dòng). 而在除 load miss 之外的異常情況發(fā)生導(dǎo)致 load 無(wú)法正常執(zhí)行完時(shí), load 流水線會(huì)利用從保留站重發(fā)(Replay From RS)機(jī)制來(lái)重新執(zhí)行這條指令. 下面逐個(gè)介紹會(huì)觸發(fā)從保留站重發(fā)機(jī)制的事件:

 

TLB miss

TLB miss事件會(huì)通過使用feedbackSlow 端口請(qǐng)求從保留站重發(fā). TLB miss 的指令在重發(fā)時(shí)存在重發(fā)延遲, 在指令在保留站中等待到延遲結(jié)束后才被重發(fā). 重發(fā)延遲的存在是因?yàn)?TLB 重填需要時(shí)間, 在 TLB 重填完成之前重發(fā)指令還會(huì)產(chǎn)生 TLB miss, 是沒有意義的。

 

預(yù)取指令的處理

目前, 軟件預(yù)取指令使用與 load 指令類似的處理流程, 軟件預(yù)取指令會(huì)與正常的 load 指令一樣進(jìn)入 load 流水線, 在發(fā)現(xiàn) miss 時(shí)向 dcache 的 MissQueue 發(fā)出請(qǐng)求, 觸發(fā)對(duì)下層 cache 的訪問. 特殊地, 軟件預(yù)取指令執(zhí)行期間會(huì)屏蔽所有例外, 且不會(huì)重發(fā)。

 

Load 的提前喚醒

南湖的保留站支持提前喚醒機(jī)制來(lái)盡快調(diào)度后續(xù)的指令. 但是, 南湖架構(gòu)暫時(shí)不支持推測(cè)喚醒機(jī)制. 被提前喚醒的指令必須要能正常地執(zhí)行, 否則就需要沖刷整個(gè)流水線. 如果一條 load 指令正常執(zhí)行但沒有發(fā)出提前喚醒信號(hào), 則會(huì)導(dǎo)致依賴這條 load 的后續(xù)指令晚一個(gè)周期才能被發(fā)射, 造成少許的性能損失.

 

load 流水線會(huì)在 load stage 1 向保留站給出快速喚醒信號(hào). 由于 MemBlock 和 IntBlock 之間的線延遲, 這一信號(hào)處于關(guān)鍵路徑上. 在提前喚醒信號(hào)的產(chǎn)生, load 流水線會(huì)進(jìn)行指令能否正常執(zhí)行的粗略判斷. 一旦指令有不能正常執(zhí)行的跡象, 就不進(jìn)行提前喚醒.

 

在極端情況下, load 指令會(huì)錯(cuò)誤的發(fā)出提前喚醒, 此時(shí)需要沖刷整個(gè)流水線. load 指令錯(cuò)誤的發(fā)出提前喚醒的條件為:load 指令在 load stage 1 之后發(fā)生異常 (來(lái)源于數(shù)據(jù)錯(cuò)誤/總線錯(cuò)誤).

 

Forward Failure

這一小節(jié)介紹南湖架構(gòu)在虛地址前遞失敗時(shí)的處理. 當(dāng) store queue 或者 store buffer 反饋虛地址前遞失敗時(shí), load 流水線會(huì)在 stage 2 將這條指令附加上?replayInst?(需要從取指重發(fā)) 的標(biāo)簽. 在這條指令到達(dá) ROB 隊(duì)尾時(shí)觸發(fā)重定向. 由于虛地址前遞失敗是很罕見的現(xiàn)象, 這樣的重定向不會(huì)對(duì)性能產(chǎn)生過大影響.

2.2 store pipeline

香山處理器(南湖架構(gòu))采用了store 地址與數(shù)據(jù)分離的執(zhí)行方式。store的地址與數(shù)據(jù)在就緒時(shí)可以分別從保留站中被發(fā)出,進(jìn)入后續(xù)的處理流程。同一條 store 指令對(duì)應(yīng)的數(shù)據(jù)/地址兩個(gè)操作靠相同的 robIdx / sqIdx 聯(lián)系在一起。

 

香山處理器包含兩條store addr (sta) 流水線,每條store addr流水線分成4級(jí)。前兩個(gè)流水級(jí)負(fù)責(zé)將 store的控制信息和地址傳遞給 store queue,后兩個(gè)流水級(jí)負(fù)責(zé)等待訪存依賴檢查完成.

 

香山處理器(南湖架構(gòu))包含兩條?store data (std) 流水線,在保留站提供 store data 后, store data 流水線會(huì)立刻將 data 寫入 store queue 的對(duì)應(yīng)項(xiàng)中。

 

Sta Pipeline:

Stage 0

計(jì)算虛擬地址

虛擬地址送入D-TLB

Stage 1

D-TLB產(chǎn)生物理地址

完成快速異常檢查

開始進(jìn)行訪存依賴檢查

物理地址送入store queue

Stage 2

訪存依賴檢查

完成異常檢查和PMA查詢, 更新store queue

Stage 3

完成訪存依賴檢查

通知 ROB 可以提交指令

Std Pipeline:

 

Stage 0

保留站給出 store data

將 store data 寫入 store queue

TLB miss 的處理

 

和load 流水線一樣, store addr 流水線也可能經(jīng)歷TLB miss. 兩者的處理方式基本一致, 參見?load TLB miss 的處理. store addr 僅使用一個(gè) rsFeedback 端口向保留站反饋 store addr 計(jì)算操作是否需要從保留站重發(fā)。

相關(guān)推薦