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

    文章

    18024

    浏览量

    221539
  • dsp
    dsp
    +关注

    关注

    544

    文章

    7661

    浏览量

    343895
  • 芯片
    +关注

    关注

    445

    文章

    47476

    浏览量

    407882
  • 函数
    +关注

    关注

    3

    文章

    3845

    浏览量

    61223

原文标题:教你在RISCV中使用DSP指令!

文章出处:【微信号:Embeded_IoT,微信公众号:嵌入式IoT】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何在bash中使用条件语句

    今天我们介绍一下如何在 bash 中使用条件语句。
    的头像 发表于 12-09 17:27 1823次阅读
    如<b class='flag-5'>何在</b>bash<b class='flag-5'>中使</b>用条件语句

    何在Linux中使用htop命令

    本文介绍如何在 Linux 中使用 htop 命令。
    的头像 发表于 12-04 14:45 467次阅读
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中使</b>用htop命令

    何在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

    何在在protel下进行阴阳板拼板

    何在在protel下进行阴阳板拼图 一、背景知识  阴阳 板就是我们通常所见的在一个拼板中的同一面既有TOP面又有BOTTOM面的PCB板。而阴阳板拼板其实就是将两块同
    发表于 07-02 10:14 3478次阅读
    如<b class='flag-5'>何在在</b>protel下进行阴阳板拼板

    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 3453次阅读

    riscv如何实现自定义指令并用qemu运行详解

    本文主要利用qemu模拟硬件平台,实现特定指令解析,同时写裸机代码来测试该指令的运行情况。当然,如果实现的很好,是需要修改riscv的gcc的,让自己的扩展指令加入。这里不做修改,后面
    的头像 发表于 05-02 10:24 6808次阅读
    <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 7873次阅读

    何在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 11次下载
    如<b class='flag-5'>何在</b>Arduino<b class='flag-5'>中使</b>用Modbus

    何在测试中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大会 上分享了他如何在测试中使用 ChatGPT。
    的头像 发表于 02-20 13:57 309次阅读

    何在PLC中使用左移指令和右移指令

     PLC(可编程逻辑控制器)中的左移指令和右移指令是数据处理中常用的指令,用于将数据中的位向左或向右移动指定的位数。
    的头像 发表于 03-07 17:11 457次阅读
    如<b class='flag-5'>何在</b>PLC<b class='flag-5'>中使</b>用左移<b class='flag-5'>指令</b>和右移<b class='flag-5'>指令</b>呢