RISC-V MCU中文社区

【分享】 利用e203中NICE协处理器加速滤波运算

发表于 开源蜂鸟E203 2023-05-31 15:53:47
0
1318
1

显示对象的心电信号时,需要对采集到的心电信号做滤波运算,相当于一维卷积。由于权重数据以及采集到的特征数据均是浮点数,而使用e203做浮点数运算会占用很多个周期,所以使用在NICE中放置多个浮点乘法器和加法器的方法来加速滤波运算。
使用NICE协处理器加速的程序为一个长循环,计算较长(100到1000量级)的两个浮点数组乘累加的结果,分别命名为ifm (Input Feature Map)、weight,输出为ifm与weight卷积的结果,即乘累加的结果。
考虑在NICE中放置浮点乘法器和浮点加法器,先加载ifm与weight数据到NICE中,当数据存储完毕时启动计算。由于NICE的存储资源有限,不能将所有的数据都加载到NICE中,本实现中在NICE放置八组32位寄存器,分别存储四组ifm与四组weight数据。考虑到有效数据当且仅当循环结束时才返回一个结果数据,所以需要用到额外的32位寄存器来存储乘累加的中间结果以便与下次计算结果相加以及一条额外的输出指令在循环结束时输出结果到rd中。NICE中主要的计算部件如下所示。
滤波运算NICE中额外的运算部件
为完成计算任务,需要设计NICE指令。本实现采用四条指令,LBUF、WBUF、ROWSUM以及CLR指令。指令格式释义如下表所示。
| | |
|指令名称| 指令释义 |
|LBUF | 将ifm从存储(data_ptr指示)搬运到NICE中 |
|WBUF | 将weight(weight_ptr指示)搬运到NICE中 |
|ROWSUM | NICE运算部件开始运算并将结果存储到本地寄存器中 |
|CLR | 输出结果到指定寄存器,清空本地寄存器以备下一次循环 |
NICE内部状态有五个,分别是IDLE(空闲状态)、LBUF、WBUF、ROWSUM、CLR。状态转换如下所示。只有空闲的时候才能够接受新的指令从而进入其他的状态。本次指令执行结束之后会进入空闲状态以表示ready。NICE的各个状态的转换如下所示。
NICE状态转换图
最终在心电检测的系统上,也取得了可观的加速比。

喜欢1
用户评论
tywin

tywin 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板