前言
Memory consistency model定義了使用Shared memory(共享內(nèi)存)執(zhí)行多線程(Multithread)程序所允許的行為規(guī)范。
RISC-V使用的內(nèi)存模型是RVWMO(RISC-V Weak Memory Ordering),該模型旨在為架構(gòu)師提供更高的靈活性,以構(gòu)建高性能可拓展的設(shè)計,同時支持可控制的編程模型。RSIC-V其實還支持Ztso擴展,這是為了方便移植x86或SPARC體系結(jié)構(gòu)的代碼,這兩種體系結(jié)構(gòu)默認(rèn)情況下都使用TSO內(nèi)存模型。至于什么是memory model、有哪些種類memory model以及它們有什么區(qū)別,可以看看這篇文章《一文讀懂Memory consistency model (內(nèi)存模型)》。
RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要講下preserved program order(保留程序順序)中的Syntactic Dependencies(語法依賴)。
語法依賴
RVWMO內(nèi)存模型的定義部分取決于語法依賴。語法依賴關(guān)系是根據(jù)指令的源寄存器、指令的目的寄存器以及指令從源寄存器到目的寄存器攜帶依賴關(guān)系的方式來定義的。本文講述的寄存器指的是整個通用寄存器、CSR的某些部分或整個CSR。
那么什么是源寄存器和目的寄存器呢?可以找到如下定義:
源寄存器定義:一般來說,如果滿足下列任何條件之一,寄存器R(除X0)就是指令A(yù)的源寄存器:
在指令A(yù)的操作碼中,rs1、rs2或rs3被設(shè)置為R;
A是CSR指令,在A的操作碼中,csr被設(shè)置為R。如果A是CSRRW或CSRRWI,需要rd不是x0;
R是CSR,且是指令A(yù)的隱式源寄存器;
R是CSR,它是A的另一個源寄存器別名;
目的寄存器定義:一般來說,如果滿足下列任何條件之一,寄存器R(除x0)就是指令A(yù)的目的寄存器:
在指令A(yù)的操作碼中,rd被設(shè)置為R;
A是CSR指令,在A的操作碼中,CSR被設(shè)置為R。如果A為CSRRS或CSRRC,需要rs1不是x0.如果A為CSRRSI或CSRRCI,需要umm[4:0]不是0;
R是CSR,且是指令A(yù)的隱式目的寄存器;
R是CSR,它是A的另一個目的寄存器別名;
比如有以下load和store指令:
lw x1,0(x2)?? // x1充當(dāng)目的寄存器角色
sw x3,0(x4)? // x3充當(dāng)源寄存器角色
內(nèi)存指令通常還進一步指定哪些源寄存器是地址源寄存器還是數(shù)據(jù)源寄存器。大多數(shù)非內(nèi)存訪問指令都帶有從源寄存器到目的寄存器的依賴項。
那么什么是語法依賴呢?可以找到如下定義:
語法依賴定義:如果以下任何一個條件成立,那么指令j通過i的目的寄存器s和指令j的源寄存器r在語法上依賴于指令i。
s和r是同一個,且在i和j之間排序的程序指令沒有r作為目的寄存器;
在指令i和指令j之間有指令m,使得以下所有條件都成立:
指令m的目的寄存器q和指令j的源寄存器r在語法上存在依賴;
指令m的源寄存器p和指令i的目的寄存器s在語法上存在依賴;
指令m的p和q存在依賴;
下面兩個例子分別對應(yīng)語法依賴的兩種場景:
例子1:
指令i:lw x1,0(x2)?? // x1充當(dāng)目的寄存器角色
指令j:sw x1,0(x4)? // x1充當(dāng)源寄存器角色
這里指令i和指令j通過x1寄存器形成語法依賴,稱作指令j依賴于指令i,因為指令j是younger,指令i是older的。
例子2:
指令i:lw x1,0(x2)?? // x1充當(dāng)目的寄存器角色
指令m:add x3,x1,x2 ??// x1充當(dāng)源寄存器角色,x3充當(dāng)目的寄存器角色
指令j:sw x3,0(x4)? // x3充當(dāng)源寄存器角色
這里指令m和指令i通過x1形成語法依賴,指令j和指令m通過x3形成語法依賴,而且指令m的x1和x3存在依賴,因此指令j和指令i存在語法依賴。
語法依賴類別
對于內(nèi)存訪問操作中,Syntactic Dependencies(語法依賴)可以分為syntactic address dependency(地址依賴),syntactic data dependency(數(shù)據(jù)依賴)和syntactic control dependency(控制依賴)。
為了說明這個三個依賴的不同之處,假設(shè)有a和b兩個內(nèi)存操作,i和j分別是生成a和b的指令。
地址依賴:如果r是j的地址源操作數(shù),并且j通過源寄存器r對i有語法依賴,則b有語法地址依賴于a。
指令i (操作a):lw r,0(r1)
指令j (操作b):sw ?r2,0(r)
數(shù)據(jù)依賴:如果b是一個store操作,r是j的數(shù)據(jù)源寄存器,j通過源寄存器r對i有語法依賴,那么b對a有語法數(shù)據(jù)依賴。
指令i (操作a):lw r,0(r1)
指令j (操作b):sw ?r,0(r0)
控制依賴:如果在i和j之間有一條指令m,m是一條分支或間接跳轉(zhuǎn)指令,并且m在語法上依賴于i,則b在語法控制上依賴于a。
指令i (操作a):lw r,0(r0)
指令m:bne r,r1,next
指令j (操作b):sw ?r3,0(r4)
總結(jié)
與其他現(xiàn)代內(nèi)存模型一樣,RVWMO內(nèi)存模型使用語法依賴關(guān)系而不是語義依賴關(guān)系。換句話說,這個定義取決于被不同指令訪問的寄存器的身份,而不是這些寄存器的實際內(nèi)容。這意味著必須強制執(zhí)行地址、控制或數(shù)據(jù)依賴,即使有些情況可以被優(yōu)化掉。這種選擇確保RVWMO與使用這些錯誤語法依賴關(guān)系作為輕量級排序機制的代碼保持兼容。