1、前言
RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要記錄下preserved program order(保留程序順序)中的Overlapping-Address Orderings(重疊地址排序)。
2、重疊地址排序
a操作在程序順序中先于b操作,a和b都訪問常規(guī)主存,不包含I/O區(qū)域,如果存在以下任何一個條件,那么a操作和b操作在全局內存順序中的順序也不會變。
b是store,且a和b訪問重疊的內存地址。
a和b是load,x是a和b同時讀取的字節(jié),且在a和b程序順序之間沒有store操作訪問x,a和b放回x的值由不同的內存操作寫入。
a是由AMO或SC指令生成的,b是一個load,b返回由a寫入的值。
關于第一點,load或store操作永遠不能與后面訪問重疊內存位置的store操作進行重排序。從微體系架構的角度來看,一般來說,如果投機是無效的,則很難或不可能撤回投機重排序的store操作,因此模型直接不允許這種行為。不過另一方面,store可以forward數(shù)據(jù)給后面的load操作,這種情況通常發(fā)生在store的數(shù)據(jù)暫時存放在store buffer里,之后load命中store buffer,就直接load數(shù)據(jù)走了。
關于第二點,其實就是要求同一個hart中,younger的load返回的值不能比同地址older load返回的值更老。這通常被稱為“CoRR”(Coherence for Read-Read pairs),或者SC模型(sequential consistency)的要求一部分, RVWMO需要強制執(zhí)行CoRR排序。如下代碼所示,不管程序如何執(zhí)行,(f)返回的值肯定比(d)的新。
關于第三點,其實就是AMO或成功的SC必須要全局可見后,才能將值返回給后續(xù)的load操作。
這三個原則也適用于內存訪問之間只有部分重疊的情況,而且基地址也不一定相同的。例如,當使用不同大小的操作訪問同一個地址區(qū)間時,就可以發(fā)生這種情況。當使用非對齊的內存訪問時,重疊地址的規(guī)則可以獨立地應用于每個地址的內存訪問。