01、前言
RISC-V使用的內(nèi)存模型是RVWMO(RISC-V Weak Memory Ordering),它是Release Consistency的擴展,因此,RVWMO的基本體類似于RC模型。
02、RC模型
Release consistency(RC)的提出是基于一個觀察:將所有同步操作用FENCE圍在一起是多余的。隨著對同步操作的深入理解,同步操作acquire只需要后面放一個FENCE,同步操作release只需要前面放一個FNECE。因此RC提供了ACQUIRE和RELEASE操作,它們和FENCE類似,但是只在一個方向上對memory進行保序,而不是像FENCE那樣在兩個方向上都進行保序。更一般地說,RC只需要:
ACQUIRE -> Load, Store ??(Load, Store -> ACQUIRE方向不保序)
Load, Store -> RELEASE ???(RELEASE -> Load, Store 方向不保序)
ACQUIRE -> ACQUIRE
ACQUIRE -> RELEASE
RELEASE -> ACQUIRE
RELEASE -> RELEASE
如下圖,注:LDAR代表load具有acquire語義,STLR代表store具有release語義。
03、RVWMO基本體
在RISC-V中,與RC類似,load和store指令可以攜帶其它語義:load指令可以攜帶ACQUIRE語義,store指令可以攜帶RELEASE語義,以及RMW指令可以攜帶ACQUIRE、RELEASE或兩者都具有。有兩種ACQUIRE語義:ACQUIRE-RCpc和ACQUIRE-RCsc。同樣,也有兩種RELEASE語義:RELEASE-RCpc和RELEASE-RCsc?!癛Cpc語義”代表“Acquire-RCpc”或“Release-RCpc”。“RCsc語義”代表“Acquire-RCsc”或“Release-RCsc”。Load(store)可以攜帶任何一種ACQUIRE(RELEASE)語義,而RMW只能攜帶RCsc語義。這些語義有如下保序:
ACQUIRE -> Load,Store ??(ACQUIRE代表ACQUIRE-RCsc和ACQUIRE-RCpc)
Load,Store -> RELEASE (RELEASE 代表RELEASE-RCsc和RELEASE-RCpc)
RELEASE-RCsc -> ACQUIRE-RCsc? (注意RELEASE-RCpc -> ACQUIRE-RCpc不成立)
從上述保序公式可以看出:
帶有RELEASE-RCpc的older store指令的寫數(shù)據(jù)可以直接被forward給帶有ACQUIRE-RCpc的同地址younger load指令。
如果它們兩個是不同地址,那么在younger load指令會先于older store指令出現(xiàn)在global memory order上。
上述這兩點是RCsc不允許的,RCsc具有更強的保序行為。為什么RCsc和RCpc有這兩點區(qū)別,看它們的全稱就知道了。
“RCpc”代表release consistency with processor-consistent synchronization operations。
“RCsc”代表release consistency with sequentially consistent synchronization operations。
RCpc語義有processor-consistent特性。Processor consistency(PC)表示一個Core的store操作按順序達(dá)到其它Core,但不一定同時達(dá)到其它Core。TSO模型是PC的特殊情況,其中每個Core都可以立即看到自己的Store操作,但是當(dāng)任何其它Core看到Store操作時,所有其它Core都可以看到它,這個屬性稱為write atomicity。
RCsc語義有sequentially consistent特性。Sequential consistency (SC)模型中,memory order保留了每個core的program order。也就是SC模型為同一個線程的兩個指令間的所有四種load和store組合(Load -> Load, Load -> Store, Store -> Store, and Store -> Load)保留了順序。
因此RCpc和RCsc在行為上還是有些區(qū)別,RCsc語義可以讓RVWMO模型像SC(Sequential Consistency)模型行為一樣,RCpc語義可以讓RVWMO像TSO(Total Store Order)內(nèi)存模型行為一樣,這極大方便了其它CPU內(nèi)存模型的代碼移植到RISC-V CPU上運行。比如要遷移MIPS R10000的代碼到RISC-V CPU上,可以使用RCsc的load和store指令。要遷移Intel/AMD的代碼到RSIC-V CPU上,可以使用RCpc的load和store指令。
如下圖,注:LDAR代表load具有acquire-RCsc語義,STLR代表store具有release-RCsc語義。LDAPA代表load具有acquire-RCpc語義。