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

  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博客

6 配置和设置指令(vsetvli/vsetivli/vsetvl)

处理大量元素的一种常见方法是“stripmining”,在这种方法中,每次循环迭代都会处理一定数量的元素,迭代会一直持续到所有元素都被处理完毕。RISC-V向量规范为这种方法提供了直接、可移植的支持。应用程序将待处理的元素总数(应用程序向量长度或AVL)指定为vl的候选值,硬件则通过一个通用寄存器响应,根据微架构实现和vtype设置,提供每次迭代中硬件将处理的(通常更小的)元素数量(存储在vl中)。一个简单的循环结构,如stripmining示例和SEW的更改所示,描绘了代码如何轻松地跟踪剩余的元素数量和硬件每次迭代处理的数量。

提供了一组指令,以便根据应用程序需要快速配置vl和vtype中的值。vset{i}vl{i}指令根据其参数设置vtype和vl CSR,并将vl的新值写入rd。

vsetvli rd, rs1, vtypei	#	rd	=	new	vl,	rs1 = AVL, vtypei = new vtype setting
vsetivli rd, uimm, vtypei	#	rd	=	new	vl,	uimm = AVL,	vtypei =	new vtype setting
vsetvl  rd, rs1, rs2	#	rd	=	new	vl,	rs1 = AVL,	rs2 = new	vtype value

Formats for Vector Coniguration Instructions under OP-V major opcode

6.1 vtype 编码

Table 7. vtype register layout

Bits

Name

Description

XLEN-1

vill

Illegal value if set

XLEN-2:8

0

Reserved if non-zero

7

vma

Vector mask agnostic

6

vta

Vector tail agnostic

5:3

vsew[2:0]

Selected element width (SEW) setting

2:0

vlmul[2:0]

Vector register group multiplier (LMUL) setting

新的vtype设置被编码在vsetvli和vsetivli的立即字段中,以及vsetvl的rs2寄存器中。

Suggested assembler names used for vset{i}vli vtypei immediate
e8    # SEW=8b
e16   # SEW=16b
e32   # SEW=32b
e64   # SEW=64b
mf8  # LMUL=1/8
mf4  # LMUL=1/4
mf2  # LMUL=1/2
m1   # LMUL=1, assumed if m setting absent
m2   # LMUL=2
m4   # LMUL=4
m8   # LMUL=8
Examples:
vsetvli t0, a0, e8          # SEW= 8, LMUL=1
vsetvli t0, a0, e8, m2      # SEW= 8, LMUL=2
vsetvli t0, a0, e32, mf2    # SEW=32, LMUL=1/2

vsetvl变体的工作方式与vsetvli类似,只不过它从rs2中获取vtype值,并可用于上下文恢复。

如果实现不支持vtype设置,则在vtype中设置vill位,vtype中的其余位设置为零,vl寄存器也设置为零。

早期的草案要求在设置vtype为非法值时产生陷阱。但是,这会在ISA的CSR写入上增加第一个数据相关的陷阱。实现可以选择在将非法值写入vtype时设置陷阱,而不是设置vill,以允许仿真支持新的配置以实现向前兼容性。当前方案支持通过检查给定设置是否清除了vill,对支持的向量单元配置进行轻量级运行时查询。

6.2 AVL 编码

新的向量长度设置基于AVL,对于vsetvli和vsetvl,AVL在rs1和rd字段中的编码如下:

Table 8. AVL used in vsetvli and vsetvl instructions

rd

rs1

AVL value

Effect on vl

-

!x0

Value in x[rs1]

Normal stripmining

!x0

x0

~0

Set vl to VLMAX

x0

x0

Value in vl register

Keep existing vl (of course, vtype may change)

当rs1不是x0时,AVL是存储在由rs1指定的x寄存器中的无符号整数,新的vl值也将写入由rd指定的x寄存器。

当rs1=x0但rd!=x0时,使用最大的无符号整数值(~0)作为AVL,并将结果VLMAX写入vl以及由rd指定的x寄存器。

当rs1=x0且rd=x0时,指令的操作就像是将vl中的当前向量长度用作AVL,并将结果值写入vl,但不写入目标寄存器。这种形式只能在VLMAX(因此vl)实际上没有因新的SEW/LMUL比率而改变时使用。如果使用新的SEW/LMUL比率会导致VLMAX发生变化,则保留该指令的使用。在这种情况下,实现可能会设置vill。

这种指令的最后一种形式允许在保持当前vl的同时更改vtype寄存器,前提是VLMAX没有减少。这种设计是为了确保vl始终为当前的vtype设置持有合法值。当前的vl值可以从vl CSR中读取。如果新的SEW/LMUL比率导致VLMAX缩小,则此指令可能会减少vl值,因此这种情况已被保留,因为这并不清楚这是一个普遍有用的操作,而且实现可以假设此指令不会更改vl以优化其微架构。

对于vsetiv li指令,AVL在rs1字段中编码为5位零扩展立即数(0-31)。

请注意,vsetiv li的AVL编码与常规CSR立即数值的编码相同。

当向量寄存器内部向量的维度较小且已知时,vsetiv li指令可以提供更紧凑的代码,在这种情况下,没有stripmining开销。

6.3 设置vl的约束

The vset{i}vl{i} instructions irst set VLMAX according to their vtype argument, then set vl obeying the following constraints:

1. vl = AVL if AVL ≤  VLMAX
2. ceil(AVL / 2) ≤  vl ≤  VLMAX if AVL < (2 * VLMAX)
3. vl = VLMAX if AVL ≥   (2 * VLMAX)
4. Deterministic on any given implementation for same input AVL and VLMAX values
5. These speciic properties follow from the prior rules:
a. vl = 0 if AVL = 0
b. vl > 0 if AVL > 0
c. vl ≤  VLMAX
d. vl ≤  AVL
e. a value read from vl when used as the AVL argument to vset{i}vl{i} results in the same value in vl, provided the resultant VLMAX equals the value of VLMAX at the time that vl was read

vl的设置规则被设计为足够严格,以保持vl在寄存器溢出和上下文交换时的行为(当AVL = VLMAX时),同时又足够灵活,使实现能够提高向量通道利用率(当AVL > VLMAX时)。

例如,这允许实现在VLMAX < AVL < 2 * VLMAX时设置vl = ceil(AVL / 2),以便在stripmine循环的最后两次迭代中均匀分配工作。要求2确保即使在AVL < 2 * VLMAX的情况下,归约循环的第一次stripmine迭代也使用所有迭代中的最大向量长度。这使得软件无需显式计算在stripmined循环期间观察到的向量长度的运行最大值。要求2还允许实现在VLMAX < AVL < 2 * VLMAX时将vl设置为VLMAX。

6.4 举例

SEW和LMUL设置可以动态更改,以在单个循环中的混合宽度操作上提供高吞吐量。

# Example: Load 16-bit values, widen multiply to 32b,shift 32b result
# right by 3, store 32b values.
# On entry:
#  a0 holds the total number of elements to process
#  a1 holds the address of the source array
#  a2 holds the address of the destination array
loop:
vsetvli a3, a0, e16, m4, ta, ma  # vtype = 16-bit integer vectors;# also update a3 with vl (# of elements this iteration)vle16.v v4, (a1)        # Get 16b vector
slli t1, a3, 1          # Multiply # elements this iteration by 2 bytes/source element
add a1, a1, t1          # Bump pointer
vwmul.vx v8, v4, x10    # Widening multiply into 32b in <v8--v15>
vsetvli x0, x0, e32, m8, ta, ma  # Operate on 32b values
vs rl.vi v8, v8, 3
vse32.v v8, (a2)	# Store vector of 32b elements
slli t1, a3, 2	# Multiply # elements this iteration by 4 bytes/destination element
add a2, a2, t1	# Bump pointer
sub a0, a0, a3	# Dec rement count by vl
bnez a0, loop	# Any more?

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

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

相关文章

C语言—每日选择题—Day65

前言 我们的刷题专栏又又又开始了&#xff0c;本专栏总结了作者做题过程中的好题和易错题。每道题都会有相应解析和配图&#xff0c;一方面可以使作者加深理解&#xff0c;一方面可以给大家提供思路&#xff0c;希望大家多多支持哦&#xff5e; 第一题 1、如下代码输出的是什么…

HarmonyOS4-学习入门知识总结

简单的组件学习&#xff1a; /*** weip 自定义控件* 自定义构建函数也是需要充电的地方&#xff0c;分全局和局部的* 全局&#xff1a;需要添加function关键字 局部&#xff1a;不加function关键字* Styles function 自定义公共样式 分全局和局部* Extends(Text) 继承模式 只…

wangEditor 测试环境对,但是生产环境无法显示

package.json 文件版本 "wangeditor": "4.3.0"开发环境 new Editor(#${this.id});出来的数据 正式环境 new Editor(#${this.id});出来的数据 原因&#xff1a; vue.config 文件 打包策略的时候 const assetsCDN {css: [https://lf6-cdn-tos.bytecd…

【千帆平台】百度智能云千帆AppBuilder应用探索益智游戏之猜物小游戏

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景AppBuilder控制台创建应用设置应用自动配置随机生成AI生成应…

20.安全性测试与评估

每年都会涉及&#xff1b;可能会考大题&#xff1b;多记&#xff01;&#xff01;&#xff01; 典型考点&#xff1a;sql注入、xss&#xff1b; 从2个方面记&#xff1a; 1、测试对象的功能、性能&#xff1b; 2、相关设备的工作原理&#xff1b; 如防火墙&#xff0c;要了解防…

产业链上下游持续利好 冷缩管(冷缩套管)应用需求不断增长

产业链上下游持续利好 冷缩管&#xff08;冷缩套管&#xff09;应用需求不断增长 冷缩管又称冷缩套管、冷收缩式电缆附件&#xff0c;指利用预扩张技术制成的弹性体部件。冷缩管具有抗冲击、耐热、耐腐蚀、防水、抗老化、电绝缘性能好等优势&#xff0c;在通信系统、电力系统等…

「实战应用」如何用图表控件LightningChart创建JS堆叠条形图?

LightningChartJS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航空…

Netty学习——高级篇2 Netty解码技术 备份

接上篇&#xff1a;Netty学习——高级篇1 拆包 、粘包与编解码技术&#xff0c;本章继续介绍Netty的其他解码器 1 DelimiterBasedFrameDecoder分隔符解码器 DelimiterBasedFrameDecoder 分隔符解码器是按照指定分隔符进行解码的解码器&#xff0c;通过分隔符可以将二进制流拆分…

K8s-Ingress Nginx-Day 08

1. 什么是Ingress 官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#what-is-ingress Ingress 是 kubernetes API 中的标准资源类型之一&#xff0c;主要是k8s官方在维护。 2. Ingress的作用 Ingress 提供从集群外部到集群内服务…

达梦的归档日志参数ARCH_RESERVE_TIME测试

达梦的参数ARCH_RESERVE_TIME测试 前面有提到和oracle相比&#xff0c;达梦的归档日志相关参数有个比较特别&#xff0c;可以通过设置它去规定归档日志的保留时间。 ARCH_RESERVE_TIME&#xff1a;归档日志保留时间&#xff0c;单位分钟&#xff0c;取值范围 0~2147483647。只…

github生成新的SSH密钥

首先是参考官方文档 生成新的 SSH 密钥并将其添加到 ssh-agent述 当你在创建SSH密钥时遇到提示&#xff1a; Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):这一步是让你选择保存生成的SSH密钥对的文件名和位置。如果你直接按回车键&#xff08;[Pr…

【项目实战经验】DataKit迁移MySQL到openGauss(下)

上一篇我们分享了安装、设置、链接、启动等步骤&#xff0c;本篇我们将继续分享迁移、启动~ 目录 9. 离线迁移 9.1. 迁移插件安装 中断安装&#xff0c;比如 kill 掉java进程&#xff08;安装失败也要等待300s&#xff09; 下载安装包准备上传 缺少mysqlclient lib包 mysq…

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量…

TypeScript常用知识点整理

介绍 TypeScript 是 JavaScript 的一个超集&#xff0c;添加了静态类型支持和更多现代编程特性&#xff0c;提高了代码的可靠性和可维护性。最终会被编译成标准的 JavaScript 代码运行。 使用npm install -g typescript进行全局安装 将编写好的ts代码进行运行&#xff0c;第…

Go语言工程师如何进阶为云原生高级开发工程师?

大家好&#xff0c;我是孔令飞&#xff0c;字节跳动云原生开发专家、前腾讯云原生技术专家&#xff1b;《企业级Go项目开发实战》作者&#xff0c;云原生实战营 知识星球星主。欢迎关注我的公众号【令飞编程】&#xff0c;干货不错过。 我们当前正处在云原生时代&#xff0c;有…

数据恢复软件能不能恢复已经删除的监控视频

随着安防意识的日益增强&#xff0c;监控视频已成为众多场所不可或缺的安全保障。然而&#xff0c;由于各种原因&#xff0c;我们可能会不小心删除了一些重要的监控视频。面对这种情况&#xff0c;许多人都会想到使用数据恢复软件来尝试找回这些丢失的视频。那么&#xff0c;数…

Linux入门攻坚——18、SELinux、Bash脚本编程续

SELinux——Secure Enhanced Linux&#xff08;安全加强的Linux&#xff09;&#xff0c;工作于Linux内核中。 SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源&#xff08;最小权限原则&#xff09;。采用委任式存取控制&#xff0c;是在进行程序、文件等细节权…

NAT转换是怎么工作的?

前言 对象: 服务器S&#xff0c;NAT设备&#xff0c;用户设备C1&#xff0c;用户设备C2 用户C1向服务器S发起一个HTTP请求&#xff0c;经过NAT转化&#xff0c;服务器收到并作出响应&#xff0c;用户C1收到响应。 问题来了&#xff0c;NAT是怎么知道这个响应是给用户C1而不是…

复现chatgpt_ros,需要openapi key

&#xff11;&#xff0e; 前置工作&#xff1a; 现在&#xff55;buntu系统是20.04ros1&#xff0c;现在用docker新建并安装ros2&#xff1a; 最简单的&#xff0c;用大佬的一键安装&#xff1a; wget http://fishros.com/install -O fishros && . fishros 其次自己装…

CentOS 7 升级 5.4 内核

MatrixOne 推荐部署使用的操作系统为 Debian 11、Ubuntu 20.04、CentOS 9 等 Kernel 内核版本高于 5.0 的操作系统。随着 CentOS 7 的支持周期接近尾声&#xff0c;社区不少小伙伴都在讨论用以替换的 Linux 操作系统&#xff0c;经过问卷调查&#xff0c;我们发现小伙伴们的操作…