在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

RISCV該如何開(kāi)啟和使用V擴(kuò)展指令?

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

掃碼添加小助手

加入工程師交流群

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

1.前言

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

3.編譯選項(xiàng)支持V擴(kuò)展

4.RISCV向量計(jì)算的原理

5.通過(guò)實(shí)例分析RISCV V擴(kuò)展的運(yùn)作機(jī)制

6.RVV使用體驗(yàn)

1.前言

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

下面會(huì)通過(guò)一個(gè)裸機(jī)代碼入手,結(jié)合實(shí)戰(zhàn)去展示riscv rvv的使用。

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

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

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

這里需要注意的是,RISCV的各家的VS標(biāo)志并不是一定是這兩位,比如sifive會(huì)定義在

但是無(wú)論怎么說(shuō),都需要設(shè)置機(jī)器狀態(tài)控制器去開(kāi)啟v擴(kuò)展指令的支持。

/* Enable FPU and accelerator if present */

li t0, MSTATUS_FS | MSTATUS_XS | (0x01800000)

csrs mstatus, t0

在啟動(dòng)代碼中,通過(guò)0x01800000設(shè)置mstatus開(kāi)啟V擴(kuò)展支持。

3.編譯選項(xiàng)支持V擴(kuò)展

默認(rèn)情況下,平頭哥提供的交叉編譯工具鏈已支持了V擴(kuò)展的編譯。只需要在編譯選項(xiàng)中開(kāi)啟即可。

從傳遞給riscv 的gcc的選項(xiàng)來(lái)看,帶有v擴(kuò)展即可。

-march是指定了riscv的模塊化的指令集選項(xiàng),可以通過(guò)選項(xiàng)指定目標(biāo)RISC-V支持的模塊化的指令集的組合。比如下面幾種組合。

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

rv32g[c]

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

rv64g[c]

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

4.RISCV向量計(jì)算的原理

在riscv的V擴(kuò)展中,一共定義了32個(gè)寄存器,v0~v31,這32個(gè)寄存器,每個(gè)長(zhǎng)度都是VLEN長(zhǎng)度。在玄鐵C906定義長(zhǎng)度為128位。

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

下面來(lái)具體分析一些每個(gè)寄存器的作用。

vstart

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

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

所以的向量指令都會(huì)從vstart中給定的元素編號(hào)開(kāi)始執(zhí)行,支持完成后,自動(dòng)變?yōu)?。

為什么會(huì)有這個(gè)寄存器,原因是在V擴(kuò)展指令中,每個(gè)寄存器是可以分割與合并的,并不是單獨(dú)操作。

vxsat

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

vxrm

向量定點(diǎn)舍入模式寄存器,指定了定點(diǎn)指令采用的舍入模式。

vl

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

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

vtype

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

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

向量長(zhǎng)度寄存器VLENB

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

5.通過(guò)實(shí)例分析RISCV V擴(kuò)展的運(yùn)作機(jī)制

下面一個(gè)rvv實(shí)際的函數(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的運(yùn)作機(jī)制和底層原理。

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

asm volatile(“nop”);

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

該函數(shù)的功能

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

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

vsetvli t0, t4, e32,m1

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

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

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

sub t4, t4, t0

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

slli t0, t0, 2

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

vle.v v0, (t1)

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

add t1, t1, t0

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

vle.v v1, (t2)

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

add t2, t2, t0

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

vfadd.vv v2, v0, v1

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

vse.v v2, (t3)

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

add t3, t3, t0

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

bnez t4, LOOP1

直到計(jì)算的len長(zhǎng)度為0,此時(shí)跳出循環(huán)計(jì)算。

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

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

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

通過(guò)對(duì)數(shù)組的計(jì)算

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í)際數(shù)據(jù)一樣。

6.RVV使用體驗(yàn)

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

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

原文標(biāo)題:用哪吒D1開(kāi)發(fā)板體驗(yàn)riscv向量底層編程

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

責(zé)任編輯:haq

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

    關(guān)注

    31

    文章

    5433

    瀏覽量

    124225
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5654

    瀏覽量

    104182

原文標(biāo)題:用哪吒D1開(kāi)發(fā)板體驗(yàn)riscv向量底層編程

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    RISC-V核低功耗MCU指令集架構(gòu)(ISA)特點(diǎn)

    自由使用、修改底層指令集,降低芯片設(shè)計(jì)成本并加速定制化開(kāi)發(fā)?。 靈活擴(kuò)展?:支持基礎(chǔ)指令集(如RV32I/RV64I)與可選擴(kuò)展模塊(如浮點(diǎn)運(yùn)算、向量加速)的組合,開(kāi)發(fā)者可根據(jù)低功耗需
    的頭像 發(fā)表于 04-23 10:01 ?440次閱讀

    開(kāi)啟hyper v開(kāi)啟hyper v的詳細(xì)操作步驟

    就為大家介紹開(kāi)啟hyperv的詳細(xì)操作步驟。 ? ?Hyper-V是微軟提供的虛擬化技術(shù),允許用戶(hù)在單一物理硬件上運(yùn)行多個(gè)操作系統(tǒng)。以下是開(kāi)啟Hyper-V的詳細(xì)步驟,適用于Windo
    的頭像 發(fā)表于 01-23 10:01 ?3014次閱讀
    <b class='flag-5'>開(kāi)啟</b>hyper <b class='flag-5'>v</b>,<b class='flag-5'>開(kāi)啟</b>hyper <b class='flag-5'>v</b>的詳細(xì)操作步驟

    RISC-V基礎(chǔ)指令詳解

    RISC-V中定義了六種指令類(lèi)型,其中包括 R型指令 : 用于寄存器與寄存器之間算數(shù)運(yùn)算的指令 I型指令 : 用于寄存器和立即數(shù)算術(shù)運(yùn)算和讀
    發(fā)表于 12-29 18:47

    RISC-V指令集概述

    RISC-V就是RISC的第五代指令集架構(gòu)。而RISC-V目標(biāo)就是“成為一種完全開(kāi)放的指令集架構(gòu),可被任何學(xué)術(shù)機(jī)構(gòu)或商業(yè)組織自由使用”。 RISC-
    發(fā)表于 11-30 23:30

    【「RISC-V體系結(jié)構(gòu)編程與實(shí)踐」閱讀體驗(yàn)】-- SBI及NEMU環(huán)境

    。 我覺(jué)得這也是本書(shū)的一個(gè)亮點(diǎn),從最底層最簡(jiǎn)單的裸機(jī)開(kāi)始,一步步對(duì)其擴(kuò)展和完善,而不是直接從OpenSBI開(kāi)始,這樣更容易理解底層的一些細(xì)節(jié)。 NEMU環(huán)境介紹及搭建 RISCV-V的實(shí)驗(yàn)環(huán)境搭建
    發(fā)表于 11-26 09:37

    RISCV 操作常見(jiàn)問(wèn)題集 - v5

    /riscv-xpack-toolchain_8.3.0-2.3_windows/bin/../lib/gcc/riscv-none-embed/8.3.0/../../../../riscv-none-embed/bin/ld
    的頭像 發(fā)表于 11-01 11:06 ?1064次閱讀

    RISCV 操作常見(jiàn)問(wèn)題集 - v4

    。 原文標(biāo)題:RISCV 操作常見(jiàn)問(wèn)題集 - v
    的頭像 發(fā)表于 11-01 11:06 ?976次閱讀

    RISC-V指令集位寬的幾點(diǎn)學(xué)習(xí)心得

    的應(yīng)用中,則可以選擇64位或更高位寬的指令集。 此外,RISC-V還支持指令集的擴(kuò)展和自定義。用戶(hù)可以根據(jù)需要添加新的指令或修改現(xiàn)有
    發(fā)表于 10-31 22:05

    RISC-V之li指令講解

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

    riscv架構(gòu)和arm的區(qū)別是什么

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

    RISC-V指令集的特點(diǎn)總結(jié)

    實(shí)現(xiàn)的復(fù)雜性,提高處理器的執(zhí)行效率和易于優(yōu)化。 模塊化 定義:RISC-V 指令集支持模塊化擴(kuò)展,允許開(kāi)發(fā)者根據(jù)具體應(yīng)用需求添加或定制特定的指令模塊。 優(yōu)勢(shì):模塊化設(shè)計(jì)使得 RISC-
    發(fā)表于 08-30 22:05

    RISCV的主流指令集有哪些?

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

    RISC-V指令集仿真介紹

    程序所呈現(xiàn)的結(jié)果不一致,則認(rèn)為處理器設(shè)計(jì)存在問(wèn)題,需要修正。對(duì)于RISCV處理器設(shè)計(jì)來(lái)講,最常見(jiàn)的仿真工具是Spike。本文將著重介紹如何安裝Spike仿真工具。 安裝Spike工具鏈 以下涉及到
    發(fā)表于 07-31 23:03

    RISC-V基礎(chǔ)整數(shù)指令

    ; x且x ≥ y表示y ≤ x。 由于RISC-V指令長(zhǎng)度必須是兩個(gè)字節(jié)的倍數(shù),分支指令的尋址方式是12位的立即數(shù)乘以2,符號(hào)擴(kuò)展它,然后將得到值加到PC上作為分支的跳轉(zhuǎn)地址。PC相
    發(fā)表于 07-27 22:25

    為什么要有RISC-V

    袖珍化、低能耗的特點(diǎn),而這對(duì)于嵌入式應(yīng)用可能至關(guān)重要。RISC-V編譯器得知當(dāng)前硬件包含哪些擴(kuò)展后,便可以生成當(dāng)前硬件條件下的最佳代碼。慣例是把代表擴(kuò)展的字母附加到指令集名稱(chēng)之后作為指
    發(fā)表于 07-27 15:05
    主站蜘蛛池模板: 欧美成人午夜片一一在线观看 | 色3344| 亚洲精品亚洲人成人网 | 日日操夜夜操天天操 | 久久思re热9一区二区三区 | 国产精品亚洲一区二区三区在线播放 | 性欧美xxxx | 黄色aaa大片| 8050网午夜一级毛片免费不卡 | 天天摸日日舔 | 7799国产精品久久久久99 | 欧美 亚洲 国产 丝袜 在线 | 免费爱爱网址 | 欧美黄色大片免费 | 日韩免费视频一区 | 国产免费午夜 | 四虎传媒 | 天堂在线网 | 国产精品久久福利网站 | 人人添 | 午夜嘿嘿 | yellow中文字幕久久网 | 亚洲成人免费在线观看 | 狠狠干一区 | 欧美色视频日本 | 国产精品午夜自在在线精品 | 1024成人| 老师你好大好白好紧好硬 | 午夜免费视频观看在线播放 | 五月天激激婷婷大综合丁香 | 亚洲综合色婷婷久久 | 啪啪国产视频 | 亚洲精品久久久久午夜福 | 免费观看四虎精品国产永久 | 四虎成人免费影院网址 | 色色色色色色色色色色色色 | 欧色美| 国产综合在线视频 | 未满十八18周岁禁止免费国产 | 色婷婷五| 天天干天天拍天天操 |