【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(九)- 向量定点算术指令

 1. 引言

以下是《riscv-v-spec-1.0.pdf》文档的关键内容:
这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量算术指令格式、向量整数和浮点算术指令、向量归约操作、向量掩码指令、向量置换指令、异常处理以及标准向量扩展等。
首先,文档定义了向量元素和向量寄存器状态之间的映射关系,并阐述了向量指令的格式。在此基础上,提出了配置设置指令,如vsetvl、ivsetiv和vlsetvl,用于设定向量长度(VL)和向量对齐长度(AVL)。
接着,文档详细说明了向量加载和存储操作,以及向量内存对齐和一致性模型。这些模型确保了向量操作的高效性和准确性。
然后,文档介绍了向量算术指令格式,包括向量整数、固定点和浮点算术指令。这些指令支持广泛的数学运算,为高性能计算提供了强大的支持。
此外,文档还涉及向量归约操作、掩码指令和置换指令,这些指令增强了向量操作的灵活性和功能性。
最后,文档讨论了异常处理机制,并列举了标准向量扩展指令列表。这些扩展指令为向量处理器提供了丰富的功能集,使其能够适应不同的应用场景和性能需求。
综上所述,这份文档为向量指令集的设计和实现提供了全面的指导和参考,有助于开发者更好地理解和利用向量处理器的能力。

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(二)-向量元素到向量寄存器状态的映射-CSDN博客【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(三)-向量指令格式-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(四)- 配置和设置指令(vsetvli/vsetivli/vsetvl)-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 向量加载和存储-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(六)- 向量内存一致性模型-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(七)- 向量算术指令格式-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令-CSDN博客

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(九)- 向量整数算术指令-CSDN博客

12 向量定点算术指令

前面的一系列整数算术指令被扩展以支持定点算术。

定点数是一个二进制补码有符号或无符号整数,被解释为具有隐含分母的分数中的分子。定点指令旨在应用于分子;软件负责管理分母。一个N位元素可以容纳范围在-2^(N-1)…+2^(N-1)-1内的二进制补码有符号整数,以及范围在0…+2^(N-1)内的无符号整数。定点指令通过支持缩放和舍入,有助于在狭窄的操作数中保持精度,并且可以通过将结果饱和到目标格式范围内来处理溢出。

注意:上述扩展整数操作也可以用来避免溢出。

12.1 向量饱和形式的整数加法和减法

为有符号和无符号整数提供了饱和形式的整数加法和减法。如果结果会溢出目标,则将结果替换为最接近的可表示值,并设置vxsat位。

# Saturating adds of unsigned integers.
vsaddu.vv vd, vs2, vs1, vm   # Vector-vector
vsaddu.vx vd, vs2, rs1, vm   # vector-scalar
vsaddu.vi vd, vs2, imm, vm   # vector-immediate
# Saturating adds of signed integers.
vsadd.vv vd, vs2, vs1, vm   # Vector-vector
vsadd.vx vd, vs2, rs1, vm   # vector-scalar
vsadd.vi vd, vs2, imm, vm   # vector-immediate
# Saturating subtract of unsigned integers.
vssubu.vv vd, vs2, vs1, vm   # Vector-vector
vssubu.vx vd, vs2, rs1, vm   # vector-scalar
# Saturating subtract of signed integers.
vssub.vv vd, vs2, vs1, vm   # Vector-vector
vssub.vx vd, vs2, rs1, vm   # vector-scalar

12.2 向量平均加法和减法指令

平均加法和减法指令将结果右移一位,并根据vx rm中的设置对结果进行四舍五入。提供了无符号和有符号两种版本。对于vaaddu和vaadd,结果中不可能发生溢出。对于vasub和vasubu,会忽略溢出,结果会环绕。

注意:对于vasub,只有在rne或rnu舍入下从最大数中减去最小数时才会发生溢出。

# Averaging add
# Averaging adds of unsigned integers.
vaaddu.vv vd, vs2, vs1, vm    # roundoff_unsigned(vs2[i] + vs1[i], 1)
vaaddu.vx vd, vs2, rs1, vm    # roundoff_unsigned(vs2[i] + x[rs1], 1)	# Averaging adds of signed integers.
vaadd.vv vd, vs2, vs1, vm    # roundoff_signed(vs2[i] + vs1[i], 1)
vaadd.vx vd, vs2, rs1, vm    # roundoff_signed(vs2[i] + x[rs1], 1)
# Averaging subtract	# Averaging subtract of unsigned integers.
vasubu.vv vd, vs2, vs1, vm   # roundoff_unsigned(vs2[i] - vs1[i], 1)
vasubu.vx vd, vs2, rs1, vm   # roundoff_unsigned(vs2[i] - x[rs1], 1)
# Averaging subtract of signed integers.
vasub.vv vd, vs2, vs1, vm   # roundoff_signed(vs2[i] - vs1[i], 1)
vasub.vx vd, vs2, rs1, vm   # roundoff_signed(vs2[i] - x[rs1], 1)

12.3 向量小数乘法指令

有符号小数乘法指令将两个SEW输入的乘积扩大到2*SEW,然后将结果右移SEW-1位,根据vx rm对这些位进行四舍五入,然后将结果饱和到SEW位。如果结果导致饱和,则设置vxsat位。

# Signed saturating and rounding fractional multiply
# See vx rm  description for rounding calculation
vsmul.vv vd, vs2, vs1, vm  # vd[i] = clip(roundoff_signed(vs2[i]*vs1[i], SEW-1))
vsmul.vx vd, vs2, rs1, vm  # vd[i] = clip(roundoff_signed(vs2[i]*x[rs1], SEW-1))

注意

当将两个N位有符号数相乘时,最大的幅度值是通过-2^(N-1) * -2^(N-1)获得的,产生结果为+2^(2N-2),当以2N位存储时,它只有一个(零)符号位。所有其他乘积在2N位中有两个符号位。为了在N个结果位中保持更高的精度,乘积会向右移动比N少一位的位数,使最大幅度值饱和,但对于所有其他乘积,结果精度会提高一位。

我们没有提供等效的小数乘法,其中一个输入是无符号的,因为这些会保留所有上部的SEW位,并且不需要饱和。当舍入仅仅是截断(rdn)时,此操作部分由vmulhu和vmulhsu指令覆盖。

12.4 向量移位指令

这些指令将输入值向右移动,并根据vx rm对移出的位进行四舍五入。比例右移既有零扩展形式(vssrl),也有符号扩展形式(vssra)。要移动的数据位于由vs2指定的向量寄存器组中,而移位量值可以来自向量寄存器组vs1、标量整数寄存器rs1或零扩展的5位立即数。只有移位量值的低lg2(SEW)位用于控制移位量。

# Scaling shift right logical		
vss rl.vv vd, vs2, vs1, vm   # vd[i]	=	roundoff_unsigned(vs2[i], vs1[i])
vss rl.vx vd, vs2, rs1, vm   # vd[i]	=	roundoff_unsigned(vs2[i], x[rs1])
vss rl.vi vd, vs2, uimm, vm  # vd[i]	=	roundoff_unsigned(vs2[i], uimm)
# Scaling shift right arithmetic		
vssra.vv vd, vs2, vs1, vm   # vd[i]	=	roundoff_signed(vs2[i],vs1[i])
vssra.vx vd, vs2, rs1, vm   # vd[i]	=	roundoff_signed(vs2[i], x[rs1])
vssra.vi vd, vs2, uimm, vm  # vd[i]	=	roundoff_signed(vs2[i], uimm)

12.5 向量缩小定点裁剪

vnclip指令用于将定点值打包到更窄的目标中。这些指令支持舍入、缩放和饱和到最终的目标格式。源数据位于由vs2指定的向量寄存器组中。缩放移位量值可以来自向量寄存器组vs1、标量整数寄存器rs1或零扩展的5位立即数。向量或标量移位量值的低lg2(2*SEW)位(例如,对于从SEW=64位到SEW=32位的缩小操作,使用低6位)用于控制右移量,从而提供缩放。

# Narrowing unsigned clip
# SEW 2*SEW SEW
vnclipu.wv vd, vs2, vs1, vm  # vd[i] = clip(roundoff_unsigned(vs2[i], vs1[i]))
vnclipu.wx vd, vs2, rs1, vm  # vd[i] = clip(roundoff_unsigned(vs2[i], x[rs1]))
vnclipu.wi vd, vs2, uimm, vm # vd[i] = clip(roundoff_unsigned(vs2[i], uimm))
# Narrowing signed clip
vnclip.wv vd, vs2, vs1, vm   # vd[i] = clip(roundoff_signed(vs2[i], vs1[i]))
vnclip.wx vd, vs2, rs1, vm   # vd[i] = clip(roundoff_signed(vs2[i], x[rs1]))
vnclip.wi vd, vs2, uimm, vm  # vd[i] = clip(roundoff_signed(vs2[i], uimm))

对于vnclipu/vnclip指令,舍入模式在vx rm CSR中指定。舍入发生在目标的最低位附近,并且在饱和之前进行。

对于vnclipu,经过移位和舍入的源值被视为无符号整数,如果结果会溢出被视为无符号整数的目标,则会发生饱和。

没有单独的指令可以将有符号值饱和到无符号目标。如果不需要为负数设置vxsat值,则可以使用一系列两个向量指令,首先使用vmax与0进行最大值操作以去除负数,然后使用vnclipu将结果的无符号值裁剪到目标中。这两个指令之间需要使用vsetvli来改变SEW。

对于vnclip,经过移位和舍入的源值被视为有符号整数,并且如果结果会溢出被视为有符号整数的目标,则会发生饱和。

如果任何目标元素饱和,则会在vxsat寄存器中设置vxsat位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态路由协议实验综合实验

需求: 1、除R5的换回地址已固定外,整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口,用于模拟连接PC的网段;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

打造你的专属云开发环境:支持任意 IDE,任意云服务 | 开源日报 No.215

loft-sh/devpod Stars: 6.9k License: MPL-2.0 devpod 是一个开源的、仅限客户端的、不受限制的工具,可以与任何集成开发环境(IDE)一起使用,并允许您在任何云端、Kubernetes 或本地 Docker 上进行开发。 使用 devcontainer.json…

python文件打包找不到文件路径

引用:【将Python代码打包成exe可执行文件】 https://www.bilibili.com/video/BV1P24y1o7FY/?p4&share_sourcecopy_web&vd_sourced5811f31a0635dfc69a182c7bf1adb8b 在代码中,我们想读取文件a,一般使用如下方法。 import osdir os…

【Ubuntu20.04.6】VMWare Station 17安装Ubuntu20.04.6虚拟机系统

步骤1:下载Ubuntu20.04.6镜像ISO文件 Ubuntu20.04.6镜像ISO文件下载: https://mirrors.ustc.edu.cn/ubuntu-releases/20.04/ 步骤2:下载安装VMWare Station 17 下载和安装教程: https://blog.csdn.net/u012621175/article/deta…

【Docker】搭建开源免费的书签管理系统 - OneNav

【Docker】搭建开源免费的书签管理系统 - OneNav 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建。 简介 OneNav是一个基于PHP的轻量级网址导航系统,旨在帮助用户整理和访问他们的常用网站。 OneNav的主要特点如下: 美观易用&#x…

分享一个基于Multi-SLAM+3DGS的新一代三维内容生产技术

基于智能空间计算,新一代超逼真三维内容生成技术。 可自动化生成超逼真的大场景三维模型,并在各类终端和空间计算设备中,实现前所未有的沉浸式体验。 更可接入专业三维软件和应用平台,进行深度的模型开发与场景落地。 支持超大复杂…

“进击的巨人”:服务器硬件基础知识解析

引言: 服务器是网络环境中负责处理数据、运行应用程序和服务多用户的高性能计算机系统。了解服务器的硬件构成有助于更好地管理和优化IT资源。 服务器和普通PC的差异: 服务器具有比个人电脑更高的处理能力、稳定性和可靠性,它们通常运行在没…

ElasticSearch 中分词与倒排索引的原理

首先是给检索用的。 英文:一个单词一个词,很简单。I am a student,词与词之间空格分隔。中文:我是学生,就不能一个字一个字地分,我-是-学生。这是好分的。还有歧义的,使用户放心,使…

【算法】有序数组的两数之和

题目 在一个有序数组中找到两个数,两个数之和为给定的一个数,返回两个数在数组中的下标。 原理 二分法 以第一个数为基准数,采用二分法寻找数组中与之相加等于给定数的数字,找到则返回下标,否则以第二个数为基准数…

SystemC入门之测试平台编写完整示例:带同步输出的多路选择器

内容&#xff1a;SystemC入门书中的简单测试平台编写示例。 模块文件编写 带锁存输出的4选1多路器模型。输出在信号clock的正跳变沿时刻被锁存。 sync_mux41.h文件 #include <systemc.h>SC_MODULE(sync_mux41) {sc_in<bool> clock, reset;sc_in<sc_uint<…

opencv+python(通道的分离与合并)笔记

分割图像通道&#xff1a; 通过函数mvsplit(img)&#xff1b;mv返回的通道&#xff1b; RGB有3个通道&#xff1b;灰度图只有一个通道&#xff1b; b,g,r cv2.split(img)cv2.imshow("b",b)#通道bcv2.imshow("g",g)#通道gcv2.imshow("r",r)#通道…

c++:局部变量位置和全局变量位置的vector区别

区别&#xff1a;局部变量位置每次都会重置为空&#xff0c;全局不会。但int a[]不管在什么位置都不会重置&#xff08;不进行memset时&#xff09; 代码&#xff1a; 1.局部&#xff1a; #include<bits/stdc.h> using namespace std;int main() {for(int i 0; i <…

React原理

本文主要讲手写React中重要的几个部分&#xff0c;有助于建立对React源码的认知。 1. CreateElement 相信大家一定对jsx不陌生 <div title"box"><p>jsx</p><span>hhh</span> </div>React中的jsx其实就是一个语法糖&#xff0…

微信小程序的页面交互2

一、自定义属性 &#xff08;1&#xff09;定义&#xff1a; 微信小程序中的自定义属性实际上是由data-前缀加上一个自定义属性名组成。 &#xff08;2&#xff09;如何获取自定义属性的值&#xff1f; 用到target或currentTarget对象的dataset属性可以获取数据 &#xff…

基于双向长短期神经网络的碳排放量预测,基于bilstm的碳排放量预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络的碳排放量预测,基于bilstm的碳排放量预测 完整代码: Bilstm双向神经网络碳排放量预测.zip资源-CSDN文库 https://download.csdn.net/download/abc991835105/89087117 效果图 结果分析 展…

c# wpf LiveCharts 简单试验2

1.概要 1.1 说明 1.2 要点 1.2.1 添加命名控件 xmlns:lvc"clr-namespace:LiveCharts.Wpf;assemblyLiveCharts.Wpf" 1.2.2 图片控件 <lvc:CartesianChart Name"chart" LegendLocation"Right"/> 1.3 代码文件引用 using LiveCharts…

LeetCode刷题之31.下一个排列

文章目录 1. 题目2.分析3.解答3.1 先排序&#xff0c;后交换3.2 先交换&#xff0c;后排序 1. 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3…

贪心算法|45.跳跃游戏II

力扣题目链接 class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0;int curDistance 0; // 当前覆盖最远距离下标int ans 0; // 记录走的最大步数int nextDistance 0; // 下一步覆盖最远距离下标for (int i 0;…

go | gin 重定向路由重定向

web 重定向 重定向有一点要注意&#xff0c;重定向是在客户端那边执行的&#xff0c;一次服务器只能响应一次请求。但是要注意路由重定向 路由重定向是在服务器内部完成重定向资源请求 package mainimport ("github.com/gin-gonic/gin""fmt" )/* func main…

网络安全之命令注入

漏洞原理&#xff1a; 应用系统设计需要给用户提供指定的远程命令操作的接口&#xff0c;比如&#xff1a;路由器&#xff0c;防火墙&#xff0c;入侵检测等设备的web管理界面。一般会给用户提供一个ping操作的web界面 用户从web界面输入目标IP&#xff0c;提交后台会对改IP地…