日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RISC-V向量指令扩展(二)

發布時間:2024/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RISC-V向量指令扩展(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前邊我們提到RISC-V向量擴展將32個向量寄存器和7個非特權的CSRs添加到一個及標量RISC-V指令集架構中,本節討論一下各個寄存器的功能以及各個組成字段的含義。各個寄存器的位寬為固定的VLEN。

·vstart

向量起始索引,RISC-V定義該寄存器為可讀可寫,規定了向量指令執行的第一個元素的索引;vstart寄存器還可以在指令執行過程中產生陷阱被寫入,記錄同步異常和外部異常中斷時正在執行的元素索引,方便跳出陷阱后繼續執行剩下的元素。所有向量指令保證目的寄存器vstart之前的元素不被更改,指令執行結束,vstart寄存器置零。
向量指令執行期間目標元素索引被劃分為三個不相交的子集:預啟動元素,主體元素,尾部元素。

·vxsat

向量定點飽和寄存器,可讀可寫,用于表示運算結果是否飽和,最低位有效vxsat[0]。
該寄存器除了有獨自的地址空間外,在vcsr寄存器中也有相應的字段,像這種類型的寄存器不止一個,具體原因后續講述。
該寄存器有效表示輸出結果飽和,需要進行截位以適應目的寄存器的格式,若發生有符號向上溢出時,取正值最大值;發生有符號向下溢出,取負數最小值給到目的寄存器。

·vxrm

向量定點舍入模式,浮點舍入模式由單獨的浮點舍入寄存器frm決定。低兩位有效,其余位恒為0,可讀可寫。同樣,與vxsat相同,該寄存器除了有獨自的地址空間外,在vcsr寄存器中也有相應的字段。
vxrm共有四種模式:
a)round-to-nearest-up(rnu):就近舍入,當為中間值時,向上舍入(四舍五入)。
b)round-to-nearest-even(rne):就近舍入,當為中間值時,向偶數舍入。
c)round-down(rdn):向下舍入,直接取移位后的值。
d)round-to-odd(rod):向奇數舍入。
設源操作數為vs1,有d位要被截位,則舍入后的值為(vs1>>d)+r,其中r為不同舍入模式下的差值。
vxrm[1:0]不同值對應的不同模式編碼如下:

其中,r取決的是舍入模式,vs1[d-1]為舍入字段最高位,vs1[d]為舍入后結果最高位。
①向上舍入模式中,當vs1[d-1]=0時,表示距離舍入方向更近些直接截掉舍入即可。
②就近舍入偏向偶數模式中,根據表達式vs1[d-1] & (vs1[d-2:0]≠0 | vs1[d])選擇偏移量r的值,例如,當vs1[d-1]=1,vs1[d-2:0]=0,且vs1[d]為0時,表達式為0,即r=0(截斷低d位后結果為偶數,所以偏移量為0)。又當vs1[d-1]=1,vs1[d-2:0]=0,且vs1[d]即舍入后最高位為1時,截斷低d位后結果為奇數,所以偏移量為1,截斷結果加r,向偶數舍入。另外,當vs1[d]=1,截斷結果為奇數,vs1[d-1]=0,vs1[d-2:0]≠0,此時r=0,因為舍入前操作數不為中間數,就近舍入。
③向下舍入模式直接截斷低d位,不額外增加偏移量。
④向奇數舍入模式中,根據表達式!vs1[d] & vs1[d-1:0]≠0選擇偏移量r的值,例如,vs1[d]=0,截斷結果為偶數,vs1[d-1:0]=0無需偏移,當vs1[d-1:0]≠0時,截斷加1向數舍入。

·vcsr

向量控制狀態寄存器,低三位有效,由vxrm[1:0]和vxsat[0]組成,具體分配為

**vcsr[2:1]=vxrm[1:0],vcsr[0]=vxsat[0]**

那么單獨的vxrm和vxsat地址和vcsr中的二者地址有什么區別呢?或者說這么設計的作用是什么?是否浪費了一定的地址空間?

前面也提到過,擁有這種設計的寄存器不止一個,riscv-v中規定fflags和frm寄存器也采用類似設計。
實際上,這種設計主要是關于讀寫寄存器的速度而設計的,當要讀取這兩種寄存器的值時,只需要讀取vcsr一個寄存器就好,不需要讀取兩個寄存器兩個地址操作了,寫入是相同的道理;又當要對其中某一個寄存器進行更改時,那么就不需要對另一個進行操作了,這時就只需要對單獨的寄存器地址進行操作就好了。
那么有人會有疑問,對vcsr的[2:1]或者[0]單獨進行操作不就好了,當然不是,對其中一個位段操作時,要先把另一個字段讀出來然后對需要更改的字段賦值時將不更改的字段賦原值,也就是說多了一個讀寄存器的操作。

·vl

向量長度寄存器,只讀,規定了一條向量指令需要操作的元素個數,為無符號數。該寄存器只被vsetvli、vsetvl指令和fault-only-first向量加載(load)指令變量更改。
當vl=0或者vstart≥vl時,目的寄存器的所有元素都不被更改,也可以說指令不執行。
vl的寬度由最小元素寬度(SEW)和最大向量長度決定,其中SEW規定了指令執行元素的寬度,最小為8,最大向量長度為組成的最長的向量寄存器組,由VLMUL決定,最大為8。所以最多元素個數為

**VLMAX = VLMUL * (VLEN/SEW)**

當VLMUL和SEW取極值時,VLMAX = VLEN,也就是說vl的最大值由VLEN決定。

·vtype

向量類型寄存器,只讀,只能通過vsetvl{i}指令更新以維護vtype寄存器的狀態。該寄存器決定了每個向量寄存器中元素的組織形式,并決定向量寄存器的分組方式、單個向量寄存器的元素組成、指示如何處理屏蔽元素(被mask)和向量結果中超過當前向量長度的元素。
vtype寄存器分為五大域:如下表:

①vill

當vsetvl指令想要向vtype字段寫入不支持的值時,vill字段置1。并將vtype其他字段全部清零,非法置位時,后續依賴于vtype執行的指令全部產生非法指令異常。

②vma、vta

vma(vector mask agnostic)、vta(vector tail agnostic)字段分別用于在向量指令執行期間決定尾部元素和目標非活躍元素的行為。
決定的元素行為主要分為兩種:undisturbed(不受干擾)agnostic(不可預知)。具體分配如下

其中,當一個元素被標記為undisturbed時,向量寄存器組的相應目標元素將保留原值不變。當一個元素被標記為agnostic時,目標操作數元素既可以保留原值也可以全部置1。
那么為什么需要添加agnostic策略呢?
在有些處理器中,會采用寄存器重命名的技術,比如超標量流水線處理器,在undisturbed策略下,必須從舊的物理目標向量寄存器中讀取元素值,才能復制到新的物理目標寄存器中;也可以說,在新的物理寄存器進行重命名時,需要根據重命名映射表,查到原有的映射關系,然后把其中的元素值讀出來,寫到重命名后的對應元素。這對于不需要這些非活躍元素和尾部元素值的之后的運算既降低了性能也增加了功耗。因此undisturbed策略就顯得很不可觀,此時按照agnostic策略進行運算比較好。

③VSEW

VSEW(vector selected elements width),選擇元素寬度,用于動態選擇元素的位寬。因此向量寄存器的元素個數就為VLEN/VSEW。
元素寬度的確定方式并不是等于VSEW的值,而是

**SEW=(8*2VSEW)**

因此元素寬度SEW的取值范圍理論上來講為8-2048,但在RISC-V規范中,將VSEW[2]=1的所有值保留。所以

**SEW=8、16、32、64**

例如,當SEW=8,VLEN=128時,向量寄存器共有128/8=16個元素。

④VLMUL

前邊也提到過,引入向量操作的目的就是為了提高效率,該字段用于將多個向量寄存器組合在一起組成向量寄存器組。以便在單個指令可以在多個向量寄存器上操作。
與VSEW相同,向量寄存器分組數lmul的值為

**lmul=2vlmul**

需要注意的是,vlmul是一個有符號數,也就是說,lmul的值除了可以是整數外,還可以是分數小數,減少單個向量寄存器中使用的位數。小數分組主要用于混合寬度指令操作。因此lmul的取值是1/8,1/4,1/2,1,2,4,8。
與VSEW定義結合,單個向量指令能夠執行的最大元素數量為

**VLMAX = LMUL * (VLEN/SEW)**

另外,掩碼寄存器只有一個寄存器,通常為v0,所以與VLMUL設置無關。

⑤vlenb

vlenb為只讀,恒為VLEN/8,表示以字節為單位的向量寄存器長度,當有些指令需要以字節為單位使用向量寄存器時,用于減少額外的計算過程。

更多內容歡迎關注我的公眾號-“司曄”


總結

以上是生活随笔為你收集整理的RISC-V向量指令扩展(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。