加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 前言
    • 語法依賴
    • 語法依賴類別
    • 總結(jié)
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

RISC-V筆記——語法依賴

10/15 08:53
1269
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

前言

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的x1x3存在依賴,因此指令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)系作為輕量級排序機制的代碼保持兼容。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

分享Arm architecture, AMBA, 芯片驗證, 腳本, EDA, Linux等知識。

微信公眾號