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