RISC-V Reader 笔记(六)RV32V

news2024/11/15 5:01:17

RV32V

image-20230708224313312

早期并行数据计算:采用 SIMD 单指令多数据,把一个64位宽寄存器拆成若干个32 16 8 位长度部分并行计算。这种方法前期看起来十分简单诱人。但是后来如果要扩展 SIMD 寄存器宽度,也要复杂化指令集,复杂开销越来越大。
向量操作:把数据取出来放入长长的向量寄存器中,流水线并行运算后从向量寄存器中分别取回到内存。
并且,时钟周期内能进行的最大操作数和向量长度是分离的,不像 SIMD 程序员要考虑怎么分分几位,设计并行硬件的时候不用顾及程序员,程序员也不用重写代码。
向量操作在 ISA 中相比 SIMD 少见多了。

向量计算

基本每一个整数或者浮点运算都有向量版本。.vv 表示操作数都是向量,.vs 表示一个向量一个标量,即一个操作数来自x/f寄存器,一个来自v寄存器。比如 Y=aX+b。.sv 是给非对称运算比如减法 除法用的,表示操作数1是标量 如 Y=a-X。融合的乘法加法则有三个寄存器种类的指示变体。

向量寄存器

向量寄存器不固定大小,这样也减少了生成代码难度和程序员负担,也可以禁用未使用的向量寄存器。比如我们现在只有两个64位浮点类型向量寄存器,处理器有1024字节向量寄存器空间,则分给他俩每个512字节,512/8=64个元素,所以最大向量长度 mvl 为64.

源寄存器和目标寄存器都是有类型的(比如16位浮点 F16,32位浮点,64位浮点……)两者之间长度不兼容处理器会自动进行转换也就是隐式转换。可以通过 vsetdcfg 指令设定向量寄存器的类型。

Load Store

通常用来处理数组。

vld:按地址顺序填充向量寄存器。向量寄存器数据类型确定了元素大小,要取的元素数量存放在长度寄存器 vl 中。

vst:逆操作。

比如 vld v0,0(a0) v0是 x32 向量寄存器,那么 vld 就会从 a0 中的起始地址(假设是1024)开始,依次取1024 1028 1032 1036……(每次4字节)地址中的值直到到达 vl 的限制长度。

有一些结构比如以行优先序存储的二维数组,我们想对列进行顺序访问,就需要有一定的步长设定,而不是单纯的按顺序访问所有元素。可以使用 vlds 和 vsts 因为他们会通过一个寄存器来设定步长。

比如 vlds v0,a0,a1 ,a0 起始地址1024,a1行长64,那么取的位置就依次是1024,1024+64,1024+64*2……直到到达 vl 的限制长度。

第三对操作是针对稀疏数组进行操作的。

vldx v0,a0,v1 a0 起始地址还是1024,v1 中有这些字节索引:16 48 80 160,那么取的位置就是 1024+16 1024+48 1024+80 1024+160.

向量操作期间的并行性

他的并行性和早期的 SIMD 很像,首先取决于处理器每个时钟周期能操作几个多少位数。比如每个时钟周期内能操作4个64位数,那么也可以操作8个32位数,16个16位数,32个8位数。

不过 SIMD 的并行性是 ISA 架构师在设计过程中定好了的,因此寄存器数量增加指令也增加,而且编译器还要修改,相比之下 RVV 就不用改变程序,而且不管硬件结构就都能跑。

条件执行

RVV 的条件执行是每个向量里所有元素分别进行的,结果也是分别赋值给向量中对应的元素的。

RVV 有8个向量谓词寄存器 vpi。他们可以存储向量寄存的结果,也可以进行 vpand vpor vpxor 等运算。

如:vplt.vs vp0,v3,x0 就是判断 v3 中哪些元素是小于0的负数?把 vp0 中对应的这些元素都置1.

然后可以进行一些对部分元素单独进行的操作,比如 add.vv,vp0 v0,v1,v2 就是把前面 vp0 为1的部分替换令v0=v1+v2.

这种操作类似网络里的掩码,vp0 vp1 被规定用作控制向量操作的掩码。(比如我们要操作一个向量中的所有元素,那我们就得用一个全为1的掩码)。

RVV 里有 vpswap 指令可以快速把其他 vpi 的值交换到 vp0 或 vp1. 也可以选择谓词寄存器是否启用,可以通过禁用的方式来清零。

其他向量指令

setvl:把 vl 设置为源操作数和 mvl 中的最小值。如果 mvl 更大,则循环处理 mvl 长度;反之说明源操作数尾部的剩余部分长度小于最大向量长度,处理这一部分即可。

vselect:按第二个源操作数的索引位置,从第一个源操作数中取出一个新的向量。

vselect vedst, vsrc, vindices

比如 vindices 值是 8 0 4 2,则依次取出 vsrc 中第8 0 4 2索引处的元素值替换 vedst 的第0 1 2 3索引处的值。

vmerge:类似 vselect,有两个源操作数,vpo 指代替换的元素来自第一个 vsrc 还是第二个。

vmerge,vpo vdest, vsrc1, vsrc2

比如 vsrc1:1 2 3 4

vsrc2:10 20 30 40

vpo:1 0 0 1

vpo 指代取的数据是:v2的0位,v1的1位,v1的2位,v2的3位。

也就是最终赋值给 vdest 的值是 10 2 3 40。

vextract:从一个向量的中间位置开始取数,放到目标向量的起始位置。

如:vextract vdest, vsrc, start 如果向量长度64,start=32,那么就是从 vsrc 的中间取后32位数放到 vdest 开头32位。

我们可以利用 vextract 来做递归二分操作,比如循环求和所有向量寄存器元素,就可以做6次 vextract。

image-20230829184730094

上例是利用 RV3V 写 DAXPY 程序(y=ax+y,一个函数处理)。

  1. 启用向量寄存器:我们只需要启用两个,给 x y 两个数组用。
  2. 每次循环开始,设定向量长度,y=a*x+y。
  3. 继续遍历或跳出。

简简单单10条左右的指令,一轮循环下来访存3*64次,浮点运算2*64次。每条指令平均有 19 次访存和 13 次运算。

与其他 ISA 向量运算的比较

都拿上例 DAXPY 的例子来进行分析。

MIPS:MSA 寄存器128位宽,每次可以处理2个双精度浮点数。但没有向量长度的寄存器,因此需要单独判断n是否为奇数,奇数最后要多做一次运算。平均每个指令大约有 1 个访存和 0.5 个运算操作。

x86:部分支持 256 位宽,n可以=4. 加载数据时先创建副本并在进入主循环之前进行测试。但是和 MIPS 有相似的问题,需要结尾判断 %4!=0 的部分。每条指令平均有约 2 次访存和 1 次运算。

结语

可以看出向量的一些优势。

如果不用向量,我们就要反复把代码写上好几遍,编程难度大一些。不过新指令程序员记起来也是比较复杂。

RISC-V 的向量运算不受一些向量长度等的影响,比如我把长度修改了,他仍然会自动判断 mvl 并执行,封装的比较好,程序员编码时以及编译器不用考虑这一点的影响。

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

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

相关文章

【微服务】六. Nacos配置管理

6.1 Nacos实现配置管理 配置更改热更新 在nacos左侧新建配置管理 Data ID:就是配置文件名称 一般命名规则:服务名称-环境名称.yaml 配置内容填写:需要热更新需求的配置 配置文件的id:[服务名称]-[profile].[后缀名] 分组&#…

启用新的精细服务权限来更好地控制账单、成本管理和账户服务的访问权限

12 月 11 日,亚马逊云科技将在服务前缀 aws-portal 下停用账单、成本管理和账户控制台(https://docs.amazonaws.cn/en_us/service-authorization/latest/reference/list_awsbillingconsole.html)的 Amazon Identity and Access Management&am…

LeetCode-热题100-笔记-day29

199. 二叉树的右视图https://leetcode.cn/problems/binary-tree-right-side-view/ 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1…

音乐网站设计与实现

目 录 摘要 Abstract 1、引言 1.1 课题的目的和意义 1.2 国内现状分析 2、可行性研究与需求分析 2.1 可行性研究 2.1.1 经济可行性 2.1.2 技术可行性 2.1.3 运行可行性 2.1.4 时间可行性 2.1.5 法律可行性 2.2 需求分析 2.2.1 系统需求 2.2.2 …

如何让两台手机相互远程控制?

你的两台手机是什么系统的?如果你的两台手机都是安卓系统,而且都是安卓7.0及以上版本的系统,那么恭喜你,这两台手机可以相互远程控制! 你可以利用两个软件实现将两台手机相互远程控制的想法。为了避免混淆&#xff0c…

中小企业建设数字化工厂,选择集成还是重构

随着科技的飞速发展和市场竞争的日益激烈,数字化工厂管理系统已成为中小企业未来发展的必经之路。然而,对于许多中小企业来说,建设数字化工厂并非易事。在建设数字化工厂的过程中,企业需要面对许多问题,其中最关键的问…

Git:Git的一些基本操作

文章目录 基本认识使用方法创建本地仓库配置本地仓库 工作区、暂存区、版本库的概念添加文件版本回退撤销修改删除操作 基本认识 首先要对Git有一个基本的认知: Git本质上是一个版本控制器,可以对一个信息的多个版本进行一些控制,而能对版本…

牛客: BM6 判断链表中是否有环

牛客: BM6 判断链表中是否有环 文章目录 牛客: BM6 判断链表中是否有环题目描述题解思路题解代码 题目描述 题解思路 一个慢指针,每次跳一次,一个快指针,每次跳两次,如果快指针遍历到链表终点,则链表无环,若慢指针和快指针相遇,则链表有环 题解代码 package main import . &…

MySQL基础运维知识点大全

一. MySQL基本知识 1. 目录的功能 通用 Unix/Linux 二进制包的 MySQL 安装下目录的相关功能 目录目录目录binMySQLd服务器,客户端和实用程序docs信息格式的 MySQL 手册manUnix 手册页include包括(头)文件lib图书馆share用于数据库安装的错…

第二章 进程与线程 四、进程通信

目录 一、共享存储 1、基于数据结构的共享 2、基于存储区的共享 二、消息传递 1、直接通信方式(消息发送进程要指明接收进程的ID) 2、间接通信方式(通过“信箱”间接地通信。因此又称“信箱通信方式”) 三、管道通信 注意&…

postgresql-视图

postgresql-视图 视图概述使用视图的好处 创建视图修改视图删除视图递归视图可更新视图WITH CHECK OPTION 视图概述 视图(View)本质上是一个存储在数据库中的查询语句。视图本身不包含数据,也被称为 虚拟表。我们在创建视图时给它指定了一个…

MySQL的sql_mode合理设置

MySQL的sql_mode合理设置 1、sql_mode设置介绍说明 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环…

Linux系统——远程连接Linux系统(图形化、命令行、使用命令行学习Linux系统、FinalShell)

目录 图形化、命令行 使用命令行学习Linux系统 FinalShell 安装 连接 图形化、命令行 对于操作系统的使用,有2种使用形式: 图形化页面使用操作系统以命令的形式使用操作系统 不论是Windows还是Linux亦或是MacOS系统,都是支持这两种使…

前端综合练手小项目

导读 本篇文章主要以小项目的方式展开,其中给出的代码中均包含详细地注释,大家可以参照理解。下面4个小项目中均包含有 HTML、CSS、JavaScript 等相关知识,可以拿来练手,系统提升一下自己的前端开发能力。 废话少说,…

#循循渐进学51单片机#点亮你的LED#not.2

1、深刻理解电容的意义,并且在今后的电路学习过程中要多多注意参考别人电路中去耦电路的处理方法,积累经验。 1)电容缓冲电压,抗电磁干扰; 2)低频率电容,一般用的最多的是钽电容,电…

【C++11保姆级教程】列表初始化(Literal types)和委派构造函数(delegating))

文章目录 前言一、列表初始化 (List Initialization)1.1数组初始化1.2结构体初始化1.3容器初始化1.4列表初始化的优势 二、委派构造函数 (Delegating Constructors)2.1委派构造函数是什么?2.2委派构造函数示例代码2.3调用顺序2.3委派构造函数优势 总结 前言 C11引入…

flutter产物以aar形式嵌入android原生工程

以前做的项目中,flutter都是作为module嵌入原生工程中,新公司项目却是以aar形式嵌入android工程,这种优点是原生工程不必配置flutter环境也能跑了,这里记录一下简单步骤。 创建一个flutter module 通过android studio创建一个fl…

verdi dump状态机的波形时直接显示状态名

前段时间看到别人用verdi看状态机的波形时,可以显示定义的状态参数,觉得很有意思,特地学习了一下 通常拉出状态机信号的波形是下面这样的 这种信号,我们要想知道每个数值代表的状态,还需要跟定义的parameter比对 像这…

LeetCode(力扣)763. 划分字母区间Python

LeetCode763. 划分字母区间 题目链接代码 题目链接 https://leetcode.cn/problems/partition-labels/description/ 代码 class Solution:def partitionLabels(self, s: str) -> List[int]:last_occ {}for i, ch in enumerate(s):last_occ[ch] iresult []start 0end …

PolyAI:对话式AI代替传统客服

【产品介绍】 名称 PolyAI 具体描述 PolyAI 是一家总部位于伦敦的人工智能初创公司,致力于开发对话式人工智能的机器学**台, 在 B 轮融资中筹集了 4000 万美元,用于部署对话式人工智能代理并颠覆传统的客户…