chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

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

嵌入式IoT ? 來源:嵌入式IoT ? 作者:bigmagic ? 2021-06-18 16:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1.前言

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

3.編譯選項支持V擴展

4.RISCV向量計算的原理

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

6.RVV使用體驗

1.前言

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

下面會通過一個裸機代碼入手,結(jié)合實戰(zhàn)去展示riscv rvv的使用。

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

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

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

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

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

/* Enable FPU and accelerator if present */

li t0, MSTATUS_FS | MSTATUS_XS | (0x01800000)

csrs mstatus, t0

在啟動代碼中,通過0x01800000設(shè)置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]

往往也會結(jié)合-mabi進行使用。-mabi決定了RISCV目標支持的ABI函數(shù)調(diào)用的規(guī)程。

4.RISCV向量計算的原理

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

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

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

vstart

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

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

所以的向量指令都會從vstart中給定的元素編號開始執(zhí)行,支持完成后,自動變?yōu)?。

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

vxsat

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

vxrm

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

vl

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

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

vtype

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

通過C910的數(shù)據(jù)手冊,可看出

向量長度寄存器VLENB

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

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

下面一個rvv實際的函數(shù)

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(“

”);

}

}

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

在riscv中,內(nèi)聯(lián)匯編的寫法

asm volatile(“nop”);

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

該函數(shù)的功能

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

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

vsetvli t0, t4, e32,m1

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

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

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

sub t4, t4, t0

通過查看數(shù)組是否計算完成,來進行循環(huán)計算,這里t4為0了。

slli t0, t0, 2

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

vle.v v0, (t1)

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

add t1, t1, t0

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

vle.v v1, (t2)

填充b數(shù)組的數(shù)組到向量寄存器v1中。

add t2, t2, t0

將數(shù)組b的元素的起始地址偏移16字節(jié),也就是4個元素。

vfadd.vv v2, v0, v1

執(zhí)行向量加法,將向量的結(jié)果保存到向量寄存器v2中。

vse.v v2, (t3)

將向量寄存器中值寫回到c數(shù)組中。

add t3, t3, t0

將數(shù)組c的元素指針偏移4個元素。

bnez t4, LOOP1

直到計算的len長度為0,此時跳出循環(huán)計算。

由于此時計算只有4字節(jié),所以一次循環(huán)就計算完成了,不用多次計算。

采用向量寄存器的計算,可以把四次循環(huán)計算用一次計算就完成。當然這種如果大量計算時,才能體現(xiàn)出更大的優(yōu)勢。

最后的結(jié)果如下:

通過對數(shù)組的計算

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數(shù)組的結(jié)果

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

其理論數(shù)據(jù)和實際數(shù)據(jù)一樣。

6.RVV使用體驗

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

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

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

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

責任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5587

    瀏覽量

    128992
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    6112

    瀏覽量

    112937

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    易靈思FPGA RISC-V自定義指令的使用方法

    RISC-V(Reduced Instruction Set Computing-V)是一個開源指令集架構(gòu)(ISA),它的設(shè)計目標是提供一個簡潔、可擴展且高效的
    的頭像 發(fā)表于 11-24 11:36 ?3408次閱讀
    易靈思FPGA RISC-<b class='flag-5'>V</b>自定義<b class='flag-5'>指令</b>的使用方法

    【CIE全國RISC-V創(chuàng)新應(yīng)用大賽】+MUSE Pi Pro RiscV UEFI固件開發(fā)

    啟動的支持。 RiscV是一種開源的指令集架構(gòu)(ISA),與UEFI的結(jié)合為新興硬件平臺提供了高效的系統(tǒng)啟動和管理方案。 1. 環(huán)境設(shè)置說明 在構(gòu)建RiscV固件之前,首先需要配置開發(fā)環(huán)境。以下是設(shè)置
    發(fā)表于 11-13 00:20

    riscv底層原理分析gd32vf103的中斷行為

    的處理,通過csrrw ra, CSR_JALMNXTI, ra指令進行分析。 不難發(fā)現(xiàn),這個是個芯來自定義擴展指令,CSR_JALMNXTI寄存器通過gdb解析可以看到如下的數(shù)據(jù)
    發(fā)表于 10-31 08:04

    全志D1開發(fā)板(哪吒 RISCV64)開箱評測

    。 2.支持RVV 這個也較為關(guān)鍵,在RISCV中對于多媒體加速指令上,采用的是V擴展,也就是RISCV
    發(fā)表于 10-31 07:50

    riscv實現(xiàn)自定義指令并用qemu運行

    1.說明 riscv支持指令集自定義擴展,這大大增加了riscv的可玩性,同時對于一些實際應(yīng)用中,自己通過一條指令來實現(xiàn)特定的功能,效率非
    發(fā)表于 10-31 07:37

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

    使用的流程。利用了多媒體加速指令集,可以讓計算變得更加的高效,同時并行計算的特性使得同時多次計算一組數(shù)字成為可能,類似于arm的NEON等等,那么RISCV又該如何去開啟和使用V
    發(fā)表于 10-29 06:21

    在Linux環(huán)境中使用riscv-torture的方法

    步驟: 1、安裝riscv-gnu-toolchain 要使用riscv-torture,您需要先安裝riscv-gnu-toolchain,工具鏈提供了RISC-
    發(fā)表于 10-24 06:32

    risc-v P擴展(一) P指令集簡介

    解碼、醫(yī)學(xué)成像、計算機視覺、嵌入式控制、機器人技術(shù)、人機界面等。 P指令擴展提高了RISC-V CPU IP產(chǎn)品的DSP算法處理能力。隨著RISC-V P
    發(fā)表于 10-23 07:40

    RISCV-K指令擴展分享

    RISC-V K擴展指的是RISC-V用于提升密碼學(xué)算法的速度、減小應(yīng)用程序大小的一個擴展指令集。主要包含了:AES加密算法的加速
    發(fā)表于 10-23 06:12

    RVB 位操作指令擴展(一)

    中進行應(yīng)用,B擴展分為了幾個更細小的子集,zba、zbb、zbc、zbs。 目前,B擴展標準已凍結(jié),可參考官方文檔riscv-bitmanip 二、B擴展中包含的
    發(fā)表于 10-22 08:11

    基于E203 NICE協(xié)處理器擴展指令

    擴展到某些特定領(lǐng)域可以非常明顯地提高能效比。NICE協(xié)處理器(Nuclei Instruction Co-unitExtension,蜂鳥內(nèi)核指令協(xié)處理器擴展機制)是一個獨立于蜂鳥E203內(nèi)核的一塊運算
    發(fā)表于 10-21 14:35

    RISC-V V擴展指令代碼

    1.指令V擴展的主要內(nèi)容: 矢量指令:針對數(shù)據(jù)并行性,增加了一系列新的矢量指令,可以同時對多個數(shù)據(jù)進行操作,提高了計算效率。浮點
    發(fā)表于 10-21 13:11

    RISC-V B擴展介紹及實現(xiàn)

    B擴展簡介 RISCV B擴展指的是RISCV用于位運算加速的一個擴展指令集,目的是使用一條
    發(fā)表于 10-21 13:01

    e203進行F指令擴展的具體實現(xiàn)

    的簡單譯碼單元來進行(minidec)。 譯碼單元 譯碼階段的主要工作是對所有指令的信息進行譯碼,將其譯成對應(yīng)的指令操作傳給派遣單元,針對F指令擴展對應(yīng)的
    發(fā)表于 10-21 11:51

    浮點指令擴展中16位指令的處理

    指令取代對應(yīng)的寬指令由它們決定。 為了能在一系列的程序上得到良好的代碼壓縮效果, RISC-V 架構(gòu)師精心挑選了 RVC擴展中的指令。同時,
    發(fā)表于 10-20 11:02