色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RISCV該如何開啟和使用V擴展指令?

嵌入式IoT ? 來源:嵌入式IoT ? 作者:bigmagic ? 2021-06-18 16:28 ? 次閱讀

用哪吒D1開發板體驗riscv向量底層編程

1.前言

2.機器模式處理器狀態寄存器(MSTATUS)

3.編譯選項支持V擴展

4.RISCV向量計算的原理

5.通過實例分析RISCV V擴展的運作機制

6.RVV使用體驗

1.前言

RISCV V擴展即向量指令擴展(RVV),這部分作為研究AI加速計算領域有著非常關鍵的作用。既然的D1支持了rvv擴展(0.7.1,最新的版本已經0.10版本),那么就實際的從底層原理角度分析一下使用的流程。利用了多媒體加速指令集,可以讓計算變得更加的高效,同時并行計算的特性使得同時多次計算一組數字成為可能,類似于arm的NEON等等,那么RISCV又該如何去開啟和使用V擴展指令,讓計算變得更加高效呢?

下面會通過一個裸機代碼入手,結合實戰去展示riscv rvv的使用。

https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/src/2.vector_example

2.機器模式處理器狀態寄存器(MSTATUS)

機器模式狀態處理寄存器可以查看玄鐵C910的用戶手冊,開啟的V擴展的位是[23:24]位,如果不設置這兩位,那么使用V擴展指令的時候,會出現指令未定義的異常。

這里需要注意的是,RISCV的各家的VS標志并不是一定是這兩位,比如sifive會定義在

但是無論怎么說,都需要設置機器狀態控制器去開啟v擴展指令的支持。

/* Enable FPU and accelerator if present */

li t0, MSTATUS_FS | MSTATUS_XS | (0x01800000)

csrs mstatus, t0

在啟動代碼中,通過0x01800000設置mstatus開啟V擴展支持。

3.編譯選項支持V擴展

默認情況下,平頭哥提供的交叉編譯工具鏈已支持了V擴展的編譯。只需要在編譯選項中開啟即可。

從傳遞給riscv 的gcc的選項來看,帶有v擴展即可。

-march是指定了riscv的模塊化的指令集選項,可以通過選項指定目標RISC-V支持的模塊化的指令集的組合。比如下面幾種組合。

rv32i[m][a][f[d]][c]

rv32g[c]

rv64i[m][a][f[d]][c]

rv64g[c]

往往也會結合-mabi進行使用。-mabi決定了RISCV目標支持的ABI函數調用的規程。

4.RISCV向量計算的原理

在riscv的V擴展中,一共定義了32個寄存器,v0~v31,這32個寄存器,每個長度都是VLEN長度。在玄鐵C906定義長度為128位。

而在V擴展的操作中,需要擴展下面的寄存器組。

下面來具體分析一些每個寄存器的作用。

vstart

矢量起始位置寄存器指定了執行矢量指令時起始元素位置,每條矢量指令執行后 VSTART 會被清零。

該寄存器只有在處理器進入陷阱或者中斷狀態時,才會被硬件寫入。

所以的向量指令都會從vstart中給定的元素編號開始執行,支持完成后,自動變為0。

為什么會有這個寄存器,原因是在V擴展指令中,每個寄存器是可以分割與合并的,并不是單獨操作。

vxsat

這個是向量定點的飽和標志位,該位指示定點指令是否必須使輸出值飽和,以此適應目標格式。

vxrm

向量定點舍入模式寄存器,指定了定點指令采用的舍入模式。

vl

矢量長度寄存器指定了矢量指令更新目的寄存器的范圍,矢量指令更新目的寄存器中元素序號小于 VL 的元素,清零目的寄存器中元素序號大于等于 VL 的元素。特別的,當 VSTART》=VL 或 VL 為 0 時,目的寄存器的所有元素不 被更新。該寄存器是任意模式下的只讀寄存器,但是 vsetvli、vsetvl 以及 fault-only-first 指令能夠更新該寄存器的值。

該寄存器的值是通過vsetvli/vsetvl指令自動設置的。

vtype

VTYPE 寄存器指定了矢量寄存器組的數據類型以及矢量寄存器的元素組成。

通過C910的數據手冊,可看出

向量長度寄存器VLENB

該寄存器用于表示矢量寄存器的數據位寬,以實際位寬除以 8 得到的字節數體現。C906 矢量寄存器為 128 位,因此 VLENB 值固定為 16。該寄存器位長是 64 位,用戶模式只讀。

5.通過實例分析RISCV V擴展的運作機制

下面一個rvv實際的函數

void test_v(void)

{

float a[]={1.0,2.0,3.0,4.0};

float b[]={1.0,2.0,3.0,4.0};

float c[]={0.0,0.0,0.0,0.0};

int len=4;

int i=0;

//inline assembly for RVV 0.7.1

//for(i=0; i《len; i++){c[i]=a[i]+b[i];}

asm volatile(

“mv t4, %[LEN]

“mv t1, %[PA]

“mv t2, %[PB]

“mv t3, %[PC]

“LOOP1:

“vsetvli t0, t4, e32,m1

sub t4, t4, t0

“slli t0, t0, 2

” //Multiply number done by 4 bytes

“vle.v v0, (t1)

add t1, t1, t0

“vle.v v1, (t2)

“add t2, t2, t0

“vfadd.vv v2, v0, v1

“vse.v v2, (t3)

“add t3, t3, t0

“bnez t4, LOOP1

:[LEN]“r”(len), [PA]“r”(a),[PB]“r”(b),[PC]“r”(c)

:“cc”,“memory”, “t0”, “t1”, “t2”, “t3”, “t4”,

“v0”, “v1”, “v2”

);

for(i=0; i《len; i++){

printf(“

”);

printf(“%f

”,c[i]);

printf(“

”);

}

}

這里采用的是內聯匯編,可以更加深入的分析RVV的運作機制和底層原理。

在riscv中,內聯匯編的寫法

asm volatile(“nop”);

這樣編譯器在編譯后會生成可以執行的匯編代碼。

該函數的功能

for(i=0; i《len; i++){c[i]=a[i]+b[i];}

通過上述分析,通過向量計算,可以一次性計算出上面四次循環加法。

vsetvli t0, t4, e32,m1

vsetvli表示設置每個向量的長度,t4的值表示的是len,也就是4。

e32表示每個元素為32位,m1表示使用1倍數量的向量寄存器。

該條指令相當于把一個向量寄存器(128位)分成四等分,這是一條設置指令,設置vl寄存器。返回值為t0,這里由于是剛好裝下4條32位的數字,所以返回值為4。

sub t4, t4, t0

通過查看數組是否計算完成,來進行循環計算,這里t4為0了。

slli t0, t0, 2

往左移動兩位,也就是將t0乘以4。這里計算的目的是如果存在很長的數組,可以偏移t0個字節從而指向數組的下個地址。

vle.v v0, (t1)

填充向量寄存器(t1)為a數組,一條指令將數據放到向量寄存器v0中。

add t1, t1, t0

將a數組的起始元素加上16字節(4個元素)的偏移。

vle.v v1, (t2)

填充b數組的數組到向量寄存器v1中。

add t2, t2, t0

將數組b的元素的起始地址偏移16字節,也就是4個元素。

vfadd.vv v2, v0, v1

執行向量加法,將向量的結果保存到向量寄存器v2中。

vse.v v2, (t3)

將向量寄存器中值寫回到c數組中。

add t3, t3, t0

將數組c的元素指針偏移4個元素。

bnez t4, LOOP1

直到計算的len長度為0,此時跳出循環計算。

由于此時計算只有4字節,所以一次循環就計算完成了,不用多次計算。

采用向量寄存器的計算,可以把四次循環計算用一次計算就完成。當然這種如果大量計算時,才能體現出更大的優勢。

最后的結果如下:

通過對數組的計算

float a[]={1.0,2.0,3.0,4.0};

float b[]={1.0,2.0,3.0,4.0};

float c[]={0.0,0.0,0.0,0.0};

最后c數組的結果

float c[]={2.0,4.0,6.0,8.0};

其理論數據和實際數據一樣。

6.RVV使用體驗

剛接觸到riscv 的 V擴展編程時,很多概念都理解的很模糊,感覺十分的困難,通過一段時間梳理之后,發現和以前mips上接觸的mxu或者arm的neno使用上大多數是一樣的,就需要去設置使用寄存器的長度,當然這些底層函數如果進行一層封裝后,再給用戶使用,那才是比較方便的,但是本文只是介紹底層實現的原理,并不多介紹使用的細節。

RVV還有一個特性就是寄存器的擴充,比如D1采用的玄鐵C906的核,支持的是32個128位的向量寄存器,也可以將兩個或多個向量寄存器拼成一個來使用。這樣寄存器的長度更加長,能夠同時做到并行計算也就更多。這取決于如何做向量的優化設計。

原文標題:用哪吒D1開發板體驗riscv向量底層編程

文章出處:【微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    120954
  • 開發板
    +關注

    關注

    25

    文章

    5121

    瀏覽量

    97992

原文標題:用哪吒D1開發板體驗riscv向量底層編程

文章出處:【微信號:Embeded_IoT,微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RISC-V指令集概述

    RISC-V就是RISC的第五代指令集架構。而RISC-V目標就是“成為一種完全開放的指令集架構,可被任何學術機構或商業組織自由使用”。 RISC-
    發表于 11-30 23:30

    【「RISC-V體系結構編程與實踐」閱讀體驗】-- SBI及NEMU環境

    。 我覺得這也是本書的一個亮點,從最底層最簡單的裸機開始,一步步對其擴展和完善,而不是直接從OpenSBI開始,這樣更容易理解底層的一些細節。 NEMU環境介紹及搭建 RISCV-V的實驗環境搭建
    發表于 11-26 09:37

    RISCV 操作常見問題集 - v4

    。 原文標題:RISCV 操作常見問題集 - v
    的頭像 發表于 11-01 11:06 ?366次閱讀

    RISC-V之li指令講解

    我們知道在RISC-V中有這樣一條偽指令: li a0, immediately 可以將任意的32位數據或者地址加載到指定的寄存器中,在 RV32I中,它擴展到 lui 和/或 addi。 li
    發表于 10-28 14:55

    riscv架構和arm的區別是什么

    都可以自由地使用、修改和分發RISC-V的設計,而不需要支付許可費用。 2. 模塊化: RISC-V的設計非常模塊化,它提供了基本的指令集(RV32I/RV64I)以及可選的擴展,如浮
    的頭像 發表于 09-07 09:37 ?2016次閱讀

    RISC-V指令集的特點總結

    實現的復雜性,提高處理器的執行效率和易于優化。 模塊化 定義:RISC-V 指令集支持模塊化擴展,允許開發者根據具體應用需求添加或定制特定的指令模塊。 優勢:模塊化設計使得 RISC-
    發表于 08-30 22:05

    RISCV的主流指令集有哪些?

    如題,就像X86中指令集有MMX,SSE,SSE2等,就像ARM指令集有ARM和Thumb等,但是總是感覺RISCV特別亂,可能是廠商比較多的緣故吧,我知道的有WCH的青稞RISC-V
    發表于 08-29 13:49

    RISC-V基礎整數指令

    ; x且x ≥ y表示y ≤ x。 由于RISC-V指令長度必須是兩個字節的倍數,分支指令的尋址方式是12位的立即數乘以2,符號擴展它,然后將得到值加到PC上作為分支的跳轉地址。PC相
    發表于 07-27 22:25

    BLUFI命令開啟后,不能再重復使用哪些AT指令呢?

    當使用 AT+BLUFI=1 命令時,如果剛發送完 AT+RESTORE 或 AT+RST 命令,則開啟 BLUFI 成功,若期間發送了一些藍牙廣播開啟等命令后,則會失敗。請問 BLUFI 命令開啟后,不能再重復使用哪些 AT
    發表于 06-27 06:50

    RISC-V 指令概況

    bgeu blt bltu 由于RISC-V指令長度必須是兩個字節的倍數,分支指令的尋址方式是12位的立即數乘以2,符號擴展,然后加到PC上作為分支的跳轉地址。
    發表于 06-11 05:05

    一起學《riscv-spec-v2.1》

    或者多個可選指令擴展進行增強,但是基本整數指令集不能被重新定義。我們將RISC-V指令擴展
    發表于 05-30 20:45

    RISCV soft JTAG調試_v1.2

    因為目前軟件的限制,RISCV的邏輯不能同時共用JTAG,所以如果想要同時去調試邏輯和RISCV的話,可以通過RISCV的soft Jtag來實現。soft Jtag就是通過GPIO來實現的軟件
    的頭像 發表于 04-23 08:38 ?1146次閱讀

    RISCV soft JTAG調試_v1.1

    因為目前軟件的限制,RISCV的邏輯不能同時共用JTAG,所以如果想要同時去調試邏輯和RISCV的話,可以通過RISCV的soft Jtag來實現。soft Jtag就是通過GPIO來實現的軟件
    的頭像 發表于 02-23 16:16 ?726次閱讀
    <b class='flag-5'>RISCV</b> soft JTAG調試_<b class='flag-5'>v</b>1.1

    【RISC-V開放架構設計之道|閱讀體驗】匯編語言和擴展指令

    【RISC-V開放架構設計之道|閱讀體驗】匯編語言和擴展指令集 匯編語言 將C語言翻譯成可執行的機器語言的重要步驟包括編譯過程,匯編過程,鏈接過程。 函數調用約定過程分為六個階段: 1)將參數存放
    發表于 02-03 13:29

    【RISC-V開放架構設計之道|閱讀體驗】RISC-V基礎整數指令

    分支的B型,用于長立即數的U型和用于無條件跳轉的J型。 下面是本章的思維導圖: RV32I是RISC-V的基礎指令集,后續會繼續拓展RISC-V的其它指令
    發表于 01-31 21:10
    主站蜘蛛池模板: 亚洲 日本 中文字幕 制服 | 天美传媒在线观看免费完整版 | 久久国内精品视频 | 欧美性爱 成人 | 国产人妻人伦精品836700 | 折磨比基尼美女挠肚子 | 欧美性情一线免费http | 久久亚洲精品AV无码四区 | 久久青草热热在线精品 | 极品少妇粉嫩小泬啪啪AV | 亚洲高清视频网站 | 99精品欧美一区二区三区美图 | 英国video性精品高清最新 | 欧美午夜福利主线路 | 伊人不卡久久大香线蕉综合影院 | 兽皇VIDEO另类HD | 久草免费视频在线观看 | 中文字幕爆乳JULIA女教师 | 中文字幕精品在线观看 | 小莹的性荡生活45章 | 肉动漫无码无删减在线观看 | 另类专区hy777 | 国内精品自线在拍2020不卡 | 精品久久久99大香线蕉 | 日韩精品无码免费专区 | 99爱免费视频 | 青青精品视频国产 | 国产精品点击进入在线影院高清 | 久久热精品18国产 | 无码乱人伦一区二区亚洲一 | 全球真实小U女视频合集 | 国产成人免费观看在线视频 | 亚洲国产成人精品不卡青青草原 | 亚瑟天堂久久一区二区影院 | 欧美精品一区二区在线电影 | 粗暴玩烂货调教 | 精品人妻伦一二三区久久AAA片 | 久草草在线视视频 | YY6080A旧里番在线观看 | 国产免费变态视频网址网站 | 久久久99精品成人片中文 |