• 正文
    • 前言
    • 語(yǔ)法依賴
    • 語(yǔ)法依賴類別
    • 總結(jié)
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

RISC-V筆記——語(yǔ)法依賴

2024/10/15
1886
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

前言

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è)計(jì),同時(shí)支持可控制的編程模型。RSIC-V其實(shí)還支持Ztso擴(kuò)展,這是為了方便移植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(語(yǔ)法依賴)。

語(yǔ)法依賴

RVWMO內(nèi)存模型的定義部分取決于語(yǔ)法依賴。語(yǔ)法依賴關(guān)系是根據(jù)指令的源寄存器、指令的目的寄存器以及指令從源寄存器到目的寄存器攜帶依賴關(guān)系的方式來(lái)定義的。本文講述的寄存器指的是整個(gè)通用寄存器、CSR的某些部分或整個(gè)CSR。

那么什么是源寄存器和目的寄存器呢?可以找到如下定義:

源寄存器定:一般來(lái)說(shuō),如果滿足下列任何條件之一,寄存器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的另一個(gè)源寄存器別名;

目的寄存器定義:一般來(lái)說(shuō),如果滿足下列任何條件之一,寄存器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的另一個(gè)目的寄存器別名;

比如有以下load和store指令:

lw x1,0(x2)?? // x1充當(dāng)目的寄存器角色

sw x3,0(x4)? // x3充當(dāng)源寄存器角色

內(nèi)存指令通常還進(jìn)一步指定哪些源寄存器是地址源寄存器還是數(shù)據(jù)源寄存器。大多數(shù)非內(nèi)存訪問(wèn)指令都帶有從源寄存器到目的寄存器的依賴項(xiàng)。

那么什么是語(yǔ)法依賴呢?可以找到如下定義:

語(yǔ)法依賴定義:如果以下任何一個(gè)條件成立,那么指令j通過(guò)i的目的寄存器s和指令j的源寄存器r在語(yǔ)法上依賴于指令i。

s和r是同一個(gè),且在i和j之間排序的程序指令沒(méi)有r作為目的寄存器;

在指令i和指令j之間有指令m,使得以下所有條件都成立:

指令m的目的寄存器q和指令j的源寄存器r在語(yǔ)法上存在依賴;

指令m的源寄存器p和指令i的目的寄存器s在語(yǔ)法上存在依賴;

指令m的p和q存在依賴;

下面兩個(gè)例子分別對(duì)應(yīng)語(yǔ)法依賴的兩種場(chǎng)景:

例子1:

指令i:lw x1,0(x2)?? // x1充當(dāng)目的寄存器角色

指令j:sw x1,0(x4)? // x1充當(dāng)源寄存器角色

這里指令i和指令j通過(guò)x1寄存器形成語(yǔ)法依賴,稱作指令j依賴于指令i,因?yàn)橹噶頹是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通過(guò)x1形成語(yǔ)法依賴,指令j和指令m通過(guò)x3形成語(yǔ)法依賴,而且指令m的x1x3存在依賴,因此指令j和指令i存在語(yǔ)法依賴。

語(yǔ)法依賴類別

對(duì)于內(nèi)存訪問(wèn)操作中,Syntactic Dependencies(語(yǔ)法依賴)可以分為syntactic address dependency(地址依賴),syntactic data dependency(數(shù)據(jù)依賴)和syntactic control dependency(控制依賴)

為了說(shuō)明這個(gè)三個(gè)依賴的不同之處,假設(shè)有a和b兩個(gè)內(nèi)存操作,i和j分別是生成a和b的指令。

地址依賴:如果r是j的地址源操作數(shù),并且j通過(guò)源寄存器r對(duì)i有語(yǔ)法依賴,則b有語(yǔ)法地址依賴于a。

指令i (操作a):lw r,0(r1)

指令j (操作b):sw ?r2,0(r)

數(shù)據(jù)依賴:如果b是一個(gè)store操作,r是j的數(shù)據(jù)源寄存器,j通過(guò)源寄存器r對(duì)i有語(yǔ)法依賴,那么b對(duì)a有語(yǔ)法數(shù)據(jù)依賴。

指令i (操作a):lw r,0(r1)

指令j (操作b):sw ?r,0(r0)

控制依賴:如果在i和j之間有一條指令m,m是一條分支或間接跳轉(zhuǎn)指令,并且m在語(yǔ)法上依賴于i,則b在語(yǔ)法控制上依賴于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)存模型使用語(yǔ)法依賴關(guān)系而不是語(yǔ)義依賴關(guān)系。換句話說(shuō),這個(gè)定義取決于被不同指令訪問(wèn)的寄存器的身份,而不是這些寄存器的實(shí)際內(nèi)容。這意味著必須強(qiáng)制執(zhí)行地址、控制或數(shù)據(jù)依賴,即使有些情況可以被優(yōu)化掉。這種選擇確保RVWMO與使用這些錯(cuò)誤語(yǔ)法依賴關(guān)系作為輕量級(jí)排序機(jī)制的代碼保持兼容。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄