要處理CPU亂序調(diào)度中的內(nèi)存數(shù)據(jù)依賴,通常涉及兩個(gè)步驟:
1.計(jì)算內(nèi)存訪問的有效地址
2.檢查所有未處理完的load/store的地址,并確保沖突的load/store不能亂序執(zhí)行
A Load / Store Processing Model
load/store處理模型,如下圖所示。

load和store指令首先發(fā)給reservation station ,然后發(fā)送到load單元或store 單元。
在store單元中,store 指令首先經(jīng)過有效的地址計(jì)算和地址轉(zhuǎn)換,然后駐留在“Finished ”store 緩沖區(qū)中。 “completed ”store 緩沖區(qū)中的store 指令最終會(huì)提交到內(nèi)存中。
同樣,load指令首先通過地址生成和翻譯,并最終讀取數(shù)據(jù)cache 以從內(nèi)存中獲取數(shù)據(jù)。
我們可以做出的一個(gè)假設(shè)是,store 指令需要按程序順序完成,因此WAW數(shù)據(jù)依賴性是默認(rèn)強(qiáng)制執(zhí)行的。從本質(zhì)上講,處理數(shù)據(jù)依賴項(xiàng)可以簡(jiǎn)化為處理load/store 依賴項(xiàng)(RAW和WAR)。
Handling Data Dependencies with In-order Load / Store Dispatch
最直接的解決方案是按程序順序向公共reservation station 發(fā)出load/store 指令,并從reservation station 按FIFO順序發(fā)送。只有當(dāng)store 緩沖區(qū)為空時(shí),才能發(fā)送load。然而,load指令的延遲很長(zhǎng),不可預(yù)測(cè)。盡早執(zhí)行l(wèi)oad至關(guān)重要。
改進(jìn)的方案是支持不同地址的load bypass ,如果store 緩沖區(qū)中有地址匹配,則stall load指令。因此,不同地址的load可以繼續(xù)進(jìn)行。

為了進(jìn)一步加快load。如果存在地址匹配,但store buffer數(shù)據(jù)不可用,則load stall;如果存在地址匹配和store 數(shù)據(jù)可用,則將數(shù)據(jù)直接forward 到load。由于load直接從store buffer接收數(shù)據(jù),因此可以盡早執(zhí)行l(wèi)oad指令,并避免數(shù)據(jù)cache 訪問。

Handling Data Dependencies with Out-of-order Load / Store Dispatch
如果我們亂序調(diào)度load/store,可以在store之前發(fā)放load。由于無法檢查地址匹配,因此存在潛在的RAW依賴關(guān)系。

與store指令類似,如果從reservation station 發(fā)送的store在“finished ”load buffer中發(fā)現(xiàn)匹配的load,則應(yīng)刷新所有指令。
這種放松也引入了可能的WAR數(shù)據(jù)依賴性。load地址可能與后續(xù)store的地址匹配,因此會(huì)觸發(fā)不正確的數(shù)據(jù)forward 。一個(gè)簡(jiǎn)單的解決方案是stall 匹配地址的“finished ” store的load,僅具有匹配地址的“completed ”store上數(shù)據(jù)forward 給load。
-
cpu
+關(guān)注
關(guān)注
68文章
11332瀏覽量
225984 -
內(nèi)存
+關(guān)注
關(guān)注
9文章
3238瀏覽量
76526 -
數(shù)據(jù)依賴
+關(guān)注
關(guān)注
0文章
2瀏覽量
5748
原文標(biāo)題:CPU面試題Q7:如何處理內(nèi)存中的數(shù)據(jù)依賴?
文章出處:【微信號(hào):數(shù)字芯片實(shí)驗(yàn)室,微信公眾號(hào):數(shù)字芯片實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Cjson協(xié)議申請(qǐng)不到內(nèi)存如何處理?
如何處理好FPGA設(shè)計(jì)中跨時(shí)鐘域間的數(shù)據(jù)
labview寫入access數(shù)據(jù)庫亂序問題
如何處理存儲(chǔ)在非易失性設(shè)備中的內(nèi)存數(shù)據(jù)集損壞
如何處理才能使CPU的效率更高呢?
stm32如何處理數(shù)組中數(shù)據(jù)
編譯器優(yōu)化的靜態(tài)調(diào)度介紹
什么是CPU分枝/亂序執(zhí)行?
如何處理cpu風(fēng)扇轉(zhuǎn)速過快
小型Hadoop集群的數(shù)據(jù)分層調(diào)度處理算法分析
基于GPU/CPU的流程序多粒度劃分與調(diào)度
Redis服務(wù)器的內(nèi)存耗盡后,Redis會(huì)如何處理呢?
證明CPU指令是亂序執(zhí)行的
當(dāng)我們?cè)谡務(wù)?b class='flag-5'>cpu指令亂序的時(shí)候,究竟在談?wù)撌裁矗?/a>

如何處理CPU亂序調(diào)度中的內(nèi)存數(shù)據(jù)依賴
評(píng)論