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

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

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

3天內不再提示

如何在在RISCV中使用DSP指令

嵌入式IoT ? 來源:嵌入式IoT ? 作者:bigmagic ? 2021-09-22 14:28 ? 次閱讀

1.概述

DSP有相關的專業芯片,能夠專門實現計算功能,相比于通用處理器,DSP芯片專門用于計算,可以在一個周期內執行多條計算。隨著單片機對計算功能的需求越來越多,如果用傳統的通用處理器去執行大數據的計算,將會消耗許多的機器周期,導致系統的實時性變低。于是,一些通用芯片上也開始集成DSP擴展,比如常見的ARM Cortex-R和ARM Cortex-M內核。

有了這些DSP擴展支持,其功能更加強大,使用上,許多的辦法都可以進行。比如常用的CMSIS-DSP。就是arm提供的DSP的編程庫。

https://arm-software.github.io/CMSIS_5/DSP/html/deprecated.html

使用上可以只需要將lib庫和頭文件包含到項目中即可。這樣就可以使用CMSIS里面的函數功能,比如求正余弦函數。

arm_cos_f32(radians);

如果用標準的數學庫中的cos函數,同樣也能夠達到目的,標準庫函數則需要消耗更多的機器周期,而使用了DSP庫,則更加方便高效的進行計算。

上述是ARM對DSP支持的使用,RISCV也支持DSP擴展,在RISCV的架構手冊上,就對DSP擴展有著一些描述。

https://github.com/riscv/riscv-p-spec

目前的支持riscv dsp的riscv core已經有了,但是實際的硬件芯片,市面上還沒有見到。目前riscv 的 p擴展還是處于沒有穩定的階段,通過文檔的閱讀,也能夠大致的描述最終的模型。

首先其特點如下:

RISCV DSP擴展是采用的通用寄存器進行數據的存儲,這意味著SIMD的寄存器的單位是以通用寄存器的寬度作為標準,如果是RV32,寄存器的長度是32,如果是RV64,則寄存器的長度為64。

相比于RISCV 的RVV,DSP擴展其寄存器的長度有限,但是對于并不復雜的計算來說,已經足夠,特別是簡單的音頻,圖形編解碼,電機控制等等,都是非常好用的。

下面來描述一下具體如何在RISCV上進行DSP的編程。

2.RISCV P擴展編程實踐(內聯匯編

riscv-p-spec規定了P擴展的一些常用的函數功能。

ADD16 (SIMD 16-bit Addition)

Type: SIMD

Format:

31 2524 2019 1514 1211 76 0

ADD16 0100000Rs2Rs1000RdOP-P 1110111

Syntax:

ADD16 Rd, Rs1, Rs2

Purpose: Perform 16-bit integer element additions in parallel.

Description: This instruction adds the 16-bit integer elements in Rs1 with the 16-bit integer elements in Rs2, and then writes the 16-bit element results to Rd.

Operations:

Rd.H[x]=Rs1.H[x]+Rs2.H[x];
forRV32:x=1..0,
forRV64:x=3..0

Exceptions: None

Privilege level: All

Note: This instruction can be used for either signed or unsigned addition.

Intrinsic functions:

  • Required:

    uintXLEN_t__rv__add16(uintXLEN_ta,uintXLEN_tb);
    
  • Optional (e.g., GCC vector extensions):

    RV32:
    uint16x2_t__rv__v_uadd16(uint16x2_ta,uint16x2_tb);
    int16x2_t__rv__v_sadd16(int16x2_ta,int16x2_tb);
    RV64:
    uint16x4_t__rv__v_uadd16(uint16x4_ta,uint16x4_tb);
    int16x4_t__rv__v_sadd16(int16x4_ta,int16x4_tb);
    

在上述的指令中,規定了add16的編碼規則,對于RV32來說,一個寄存器的位寬是16,那么可以將一個寄存器拆分成兩個單元,一個機器周期,同時執行兩條加法。同樣的指令,在RV64上,則可以拆分成四個單元,一個機器周期,可以執行四條加法。

通過對編譯出來的程序進行反匯編,可以得到對應的匯編代碼。

當然,如果要實現dsp指令的擴展,目前官方的編譯器還沒有完全支持riscv的dsp擴展。如果要完成帶有dsp指令的支持的gcc編譯器,需要對編譯器進行一定的定制。因為目前riscv的p擴展,并未完全定稿,如果完善后,應該會被合并到主線主線。

其中編程的方式采用gcc內部的內聯函數的方式進行,在《P-ext-proposal.adoc》中,規定了Intrinsic functions的形式,比如add16。

uintXLEN_t__rv__add16(uintXLEN_ta,uintXLEN_tb);

RV32:
uint16x2_t__rv__v_uadd16(uint16x2_ta,uint16x2_tb);
int16x2_t__rv__v_sadd16(int16x2_ta,int16x2_tb);
RV64:
uint16x4_t__rv__v_uadd16(uint16x4_ta,uint16x4_tb);
int16x4_t__rv__v_sadd16(int16x4_ta,int16x4_tb);

那么有上述函數可以供調用,不需要任何的庫文件的支持,因為在gcc編譯器中,內部自己可以根據這些內聯函數進行匯編實現。

使用時,只需要包含gcc自帶的dsp相關的頭文件即可。

#include

static__attribute__((noinline))
unsignedlongadd16(unsignedlongra,unsignedlongrb)
{
return__rv__add16(ra,rb);
}

使用技巧上并未特殊方法,但是目前,這基本上是比直接寫匯編更加高效的dsp編程方式了。

3.RISCV P擴展編程實踐(庫函數)

在很多情況下,底層的DSP指令雖然可以完成很多功能,不同的組合方式將能夠帶來不同效果,但是這些基礎庫的使用,在很多方面也需要編程人員有很強的數學基礎,并不能提供通用的math計算方法,這時使用庫函數將能夠在很大程度上解決這個問題。類似ARM的CMSIS-DSP。RISCV生態上也有一個NMSIS。

https://github.com/Nuclei-Software/NMSIS

可以將riscv的標準的dsp指令通過組合,形成更加通用的數學庫,比如sin或者cos,fft,matrix等等,一些常用的標準庫函數,都可以在里面找到。對于做嵌入式AI來說,已經十分完善。

使用方法上,首先需要添加NMSIS的的lib文件,然后包含頭文件

#include"riscv_math.h"

直接調用NMSIS庫中暴露出來的函數即可。

float32_txx=riscv_cos_f32(float32_tcos);

這種方式更加直接,也能減少編程人員對DSP函數的使用不熟悉,帶來的一些人為的錯誤,所以NMSIS可以說是DSP指令的上層軟件。使用該庫可以很容易的進行高效的數據運算。

4.總結

在riscv的芯片中,如果要使用DSP,首先需要該芯片的硬件設計實現了riscv的p擴展,硬件支持的情況下,再適配編譯器,編譯器也將DSP的支持添加進去。這樣可以直接使用DSP擴展的指令了。然而直接使用DSP提供的指令進行計算,工作量還是很大,同時優化也不一定非常的好,此時使用NMSIS庫提供的函數,直接利用優化好的數學函數進行數據計算,這樣才是高效最簡單的方式。

編輯:jq


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

    關注

    68

    文章

    19400

    瀏覽量

    230742
  • dsp
    dsp
    +關注

    關注

    554

    文章

    8059

    瀏覽量

    349831
  • 芯片
    +關注

    關注

    456

    文章

    51140

    瀏覽量

    426150
  • 函數
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62867

原文標題:教你在RISCV中使用DSP指令!

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

收藏 人收藏

    評論

    相關推薦

    何在Linux中使用htop命令

    本文介紹如何在 Linux 中使用 htop 命令。
    的頭像 發表于 12-04 14:45 ?2095次閱讀
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中使</b>用htop命令

    RISCV的主流指令集有哪些?

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

    何在RISC-V中使DSP指令

    何在RISC-V中使DSP指令
    發表于 02-16 07:43

    RISCV自定義指令編譯報錯怎么解決?

    各位老師好,本人在學習riscv指令時,在指令編譯過程中遇到如下問題,希望老師能夠不吝賜教,非常感謝!
    發表于 08-12 07:40

    riscv實現自定義指令并用qemu運行的過程

    1.說明 riscv支持指令集自定義擴展,這大大增加了riscv的可性,同時對于一些實際應用中,自己通過一條指令來實現特定的功能,效率非常高,當然,前提是硬件平臺需要對該
    發表于 08-16 07:27

    DSP匯編指令-典型指令

    輕松學會DSP——DSP匯編指令。很不錯的教程
    發表于 06-17 14:59 ?23次下載

    何在典型的DSP應用(框架)中使用IRTC接口的詳細資料概述

    本應用筆記從兩個角度描述了IRTC接口。生產者(算法開發者)透視處理算法中嵌入DSP/BIOS API和實現IRTC接口的方法。消費者(用戶)的角度討論了如何在典型的DSP應用(框架)中使
    發表于 05-03 11:10 ?3次下載
    如<b class='flag-5'>何在</b>典型的<b class='flag-5'>DSP</b>應用(框架)<b class='flag-5'>中使</b>用IRTC接口的詳細資料概述

    何在System Generator中使用多個時鐘域實現復雜的DSP系統

    了解如何在System Generator中使用多個時鐘域,從而可以實現復雜的DSP系統。
    的頭像 發表于 11-27 06:42 ?3792次閱讀

    riscv如何實現自定義指令并用qemu運行詳解

    本文主要利用qemu模擬硬件平臺,實現特定指令解析,同時寫裸機代碼來測試該指令的運行情況。當然,如果實現的很好,是需要修改riscv的gcc的,讓自己的擴展指令加入。這里不做修改,后面
    的頭像 發表于 05-02 10:24 ?7954次閱讀
    <b class='flag-5'>riscv</b>如何實現自定義<b class='flag-5'>指令</b>并用qemu運行詳解

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

    機制 6.RVV使用體驗 1.前言 RISCV V擴展即向量指令擴展(RVV),這部分作為研究AI加速計算領域有著非常關鍵的作用。既然的D1支持了rvv擴展(0.7.1,最新的版本已經0.10版本
    的頭像 發表于 06-18 16:28 ?9894次閱讀

    何在PHP代碼中使用HTTP代理IP

    何在PHP代碼中使用HTTP代理IP。
    的頭像 發表于 08-04 16:08 ?2480次閱讀

    何在Arduino中使用LDR

    電子發燒友網站提供《如何在Arduino中使用LDR.zip》資料免費下載
    發表于 10-31 09:50 ?0次下載
    如<b class='flag-5'>何在</b>Arduino<b class='flag-5'>中使</b>用LDR

    何在Arduino中使用Modbus

    電子發燒友網站提供《如何在Arduino中使用Modbus.zip》資料免費下載
    發表于 11-22 11:21 ?14次下載
    如<b class='flag-5'>何在</b>Arduino<b class='flag-5'>中使</b>用Modbus

    何在Arduino中使用微型伺服

    電子發燒友網站提供《如何在Arduino中使用微型伺服.zip》資料免費下載
    發表于 11-28 09:50 ?1次下載
    如<b class='flag-5'>何在</b>Arduino<b class='flag-5'>中使</b>用微型伺服

    何在測試中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大會 上分享了他如何在測試中使用 ChatGPT。
    的頭像 發表于 02-20 13:57 ?792次閱讀
    主站蜘蛛池模板: 国厂精品114福利电影| 国产午夜精品片一区二区三区| 最新高清无码专区在线视频| 成人毛片大全| 沦为公交两奶头春药高潮迭起| 色综合久久中文色婷婷| 4399亚洲AV无码V无码网站| 国产久爱青草视频在线观看| 年轻的搜子8中字在线观看| 野花4在线观看| 国产一卡2卡3卡4卡孕妇网站| 入禽太深免费观看| 冰山高冷受被c到哭np双性| 毛篇片在线观看| 97 sese| 精品午夜中文字幕熟女人妻在线| 亚州三级久久电影| 国产ts调教| 视频网站入口在线看| 高h浪荡文辣文神奇宝贝| 日日摸夜夜添夜夜爽出水| 成人在免费观看视频国产| 强开少妇嫩苞又嫩又紧九色| 别插我B嗯啊视频免费| 色精品极品国产在线视频| 第七色男人天堂| 无码人妻精品国产婷婷| 国产人妻人伦精品98| 亚洲精品久久久久AV无码林星阑 | 亚洲欧洲日韩视频在钱| 国内精品七七久久影院| 一个人高清在线观看日本免费| 久久国产精品久久国产精品 | 国内精品九九视频| 又黄又肉到湿的爽文| 美女被触手注入精子强制受孕漫画| 99热这里只有精品6| 小舞被爆操| 免费国产午夜理论不卡| 大稥焦伊人一本dao| 伊人久久大香线蕉资源|