1?前言
Memory consistency model定義了使用Shared memory(共享內存)執(zhí)行多線程(Multithread)程序所允許的行為規(guī)范。RISC-V使用的內存模型是RVWMO(RISC-V Weak Memory Ordering),RVWMO內存模型是根據(jù)全局內存順序(global memory order)定義的,全局內存順序是所有harts產生的內存操作的總順序。通常,多線程程序有許多不同的可能執(zhí)行,每個執(zhí)行都有自己對應的全局內存順序。
全局內存順序是通過內存指令生成的基本load和store操作來定義的。內存操作的程序順序(program order)反映了生成每個load和store的指令在該處理器的動態(tài)指令流中邏輯布局的順序。例如:一個簡單的有序處理器執(zhí)行該處理器指令的順序。在分析任何一個內存模型時,要緊緊抓住全局內存順序和程序順序去分析。
當一個load的返回值確定時,我們就說它已經執(zhí)行了。當store在pipeline內執(zhí)行時,不是說它執(zhí)行了,只有當它的值被傳播到全局可見內存時才執(zhí)行。從這個意義上說,全局內存順序也代表了一致性協(xié)議和/或內存系統(tǒng)的其他部分的貢獻,將每個hart發(fā)出的(可能是重新排序的)內存訪問交錯到所有hart共同的單個總順序中。
RISC-V的RVWMO模型主要包含了preserved program order(PPO)、load value axiom、atomicity axiom和progress axiom。preserved program order由Overlapping-Address Orderings、Explicit Synchronization、Syntactic Dependencies和Pipeline Dependencies組成的。load value axiom、atomicity axiom和progress axiom三者共同組成了memory model axiom。
2?preservedprogram order
任何給定的程序執(zhí)行的全局內存順序都遵循每個hart的部分(但不是全部)程序順序。全局內存順序必須遵守的程序順序的子集稱為保留程序順序(preserved program order)。從概念上講,如果一個hart的某段程序時保留程序順序,那么這段程序必須被其它hart以相同的順序觀察到。另一方面,從其它hart角度來看,來自一個hart的未按保留的程序順序排序的事件可能看起來是重新排序的。
保留程序順序的完整定義如下(請注意,AMOs是同時load和store的):如果a在程序順序中先于b,內存操作a在保留程序順序中先于內存操作b(因此也在全局內存順序中),且a和b都訪問常規(guī)主存,不是I/O區(qū)域,并且以下任何一種情況(每個小節(jié))都有效:
2.1 Overlapping-Address Orderings
2.2 Explicit Synchronization
請看:RISC-V筆記——RVWMO基本體?和?RISC-V筆記——顯式同步
2.3 Syntactic Dependencies
2.4 Pipeline Dependencies
3?memory model axiom
memory model axiom(內存模型公理)是RVWMO的重要組成部分。它由以下三部分組成。
load value axiom
atomicity axiom
progress axiom
這三者的介紹在這篇文章:RISC-V筆記——內存模型公理
4?總結
內存一致性模型有弱和強之分。弱內存模型允許更多的硬件實現(xiàn)靈活性,并且比強模型提供更好的性能、每瓦性能、功率、可伸縮性和硬件驗證開銷,但代價是更復雜的編程模型。強模型提供了更簡單的編程模型,但代價是對可以在pipeline和內存系統(tǒng)中執(zhí)行的(非投機的)硬件優(yōu)化施加了更多的限制,并且反過來在功耗、面積開銷和驗證負擔方面施加了一些成本。
RVWMO是一種弱模型,它使架構師能夠構建簡單有效地實現(xiàn)、深入嵌入更大的系統(tǒng)并服從復雜的內存系統(tǒng)交互的實現(xiàn),或者任何其他可能性,并高效地支持編程語言內存模型。
為了方便從其他體系結構移植代碼,一些硬件實現(xiàn)可能會選擇實現(xiàn)Ztso擴展,該擴展在默認情況下提供更嚴格的RVTSO排序語義。為RVWMO編寫的代碼自動地和固有地與RVTSO兼容,但是假設RVTSO編寫的代碼不能保證在RVWMO實現(xiàn)上正確運行。事實上,大多數(shù)RVWMO實現(xiàn)將(也應該)拒絕只運行RVTSO的二進制文件。因此,每個實現(xiàn)都必須選擇是否優(yōu)先考慮與RVTSO代碼的兼容性(例如,為了便于從x86移植)。
在RVTSO下,為RVWMO編寫的代碼中的一些fence或memory排序可能變得多余。RVWMO對ZTSO實際造成的成本是取值這些fence指令的開銷,例如FENCE R,RW和FENCE RW,W,這些指令在該實現(xiàn)上變成NoP操作。但是,如果希望與非ZTSO實現(xiàn)兼容,則這些fences必須保留在代碼中。