1、前言
RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要記錄下preserved program order(保留程序順序)中的Pipeline Dependencies(Pipeline依賴)。
2、Pipeline依賴
a操作在程序順序中先于b操作,a和b都訪問常規(guī)主存,不是I/O區(qū)域,如果存在以下任何一個條件,那么a操作和b操作在全局內(nèi)存順序中的順序也不會變。
b是load,在a和b程序順序之間存在一個store m,m的地址或數(shù)據(jù)依賴于a,b返回的值是m寫的值。
b是store,在a和b程序順序之間存在一些指令m,m的地址依賴于a。
這兩點幾乎在所有真實處理器pipeline上都存在的。
關(guān)于第一點:是想表明如果old的store的地址或數(shù)據(jù)還未知的話,load是不能從store轉(zhuǎn)發(fā)數(shù)據(jù)的。也就是必須等a確定執(zhí)行完之后,得到了m的地址或數(shù)據(jù)了,才會執(zhí)行b,所以a和b的全局順序肯定是保證的。如下圖所示。
(f)在(e)的數(shù)據(jù)確定之前是不能被執(zhí)行的,因為(f)必須返回(e)寫的值,并且在(d)有機會執(zhí)行之前,舊的值不能被(e)的回寫所破壞,因此,(f)將不會在(d)之前執(zhí)行,也就是它們倆的順序是固定的。
關(guān)于第二點:它與第一點規(guī)則有著類似的觀察:在可能訪問同一地址的所有older load被執(zhí)行之前,store不能在memory中確定執(zhí)行。因為store如果提前執(zhí)行的話,那么舊的值被覆蓋了,那么older的load就無法讀取到了。同樣的,除非知道前面的指令不會由于地址解析失敗而導(dǎo)致異常,都則通常不能執(zhí)行store操作,從這個意義上說,這個一點是之前語法依賴里的控制依賴的某種特殊情況。如下圖所示。
在(e)的地址被解析完之前,(f)不能執(zhí)行,因為結(jié)果可能是地址匹配,也就是a1等于0。因此,在(d)被執(zhí)行并確認(e)地址是否確實重疊之前,(f)不能被發(fā)到內(nèi)存去執(zhí)行的,也就是(d)和(f)的順序是固定的。