www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 嵌入式IoT

教你在RISCV中使用DSP指令!


  • 1.概述

  • 2.RISCV P擴展編程實踐(內聯(lián)匯編)

    • ADD16 (SIMD 16-bit Addition)

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

  • 4.總結


1.概述

DSP有相關的專業(yè)芯片,能夠專門實現(xiàn)計算功能,相比于通用處理器,DSP芯片專門用于計算,可以在一個周期內執(zhí)行多條計算。隨著單片機對計算功能的需求越來越多,如果用傳統(tǒng)的通用處理器去執(zhí)行大數(shù)據的計算,將會消耗許多的機器周期,導致系統(tǒng)的實時性變低。于是,一些通用芯片上也開始集成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里面的函數(shù)功能,比如求正余弦函數(shù)。

arm_cos_f32(radians);

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

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

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

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

首先其特點如下:

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

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

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

2.RISCV P擴展編程實踐(內聯(lián)匯編)

riscv-p-spec規(guī)定了P擴展的一些常用的函數(shù)功能。

ADD16 (SIMD 16-bit Addition)

Type: SIMD

Format:

31 25 24 20 19 15 14 12 11 7 6 0
ADD16 0100000 Rs2 Rs1 000 Rd OP-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]; for RV32: x=1..0, for RV64: 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_t a, uintXLEN_t b);
    
  • Optional (e.g., GCC vector extensions):

    RV32:
     uint16x2_t __rv__v_uadd16(uint16x2_t a, uint16x2_t b);
     int16x2_t __rv__v_sadd16(int16x2_t a, int16x2_t b);
    RV64:
     uint16x4_t __rv__v_uadd16(uint16x4_t a, uint16x4_t b);
     int16x4_t __rv__v_sadd16(int16x4_t a, int16x4_t b);
    

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


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


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

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

uintXLEN_t __rv__add16(uintXLEN_t a, uintXLEN_t b);

RV32:
 uint16x2_t __rv__v_uadd16(uint16x2_t a, uint16x2_t b);
 int16x2_t __rv__v_sadd16(int16x2_t a, int16x2_t b);
RV64:
 uint16x4_t __rv__v_uadd16(uint16x4_t a, uint16x4_t b);
 int16x4_t __rv__v_sadd16(int16x4_t a, int16x4_t b);

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

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

#include  static __attribute__ ((noinline))
unsigned long add16 (unsigned long ra, unsigned long rb)
{ return __rv__add16 (ra, rb);
}

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

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

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

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

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

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

#include "riscv_math.h" 

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

float32_t xx = riscv_cos_f32(float32_t cos);

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

4.總結

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


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉