RISC-V vector(1) --- vector的引入与register说明

Vector相较于SIMD的优势

     这两种实现方案,都是为了实现数据级并行性(存在大量的数据可供程序同时计算);

SIMD(Single Instruction Multiple Data)

     SIMD是将数据宽度和操作类型,都放在了指令中;

        

  • SIMD技术最初通过将64位寄存器的数据拆分成多个8位、16位、32位的形式来实现byte、half word、word类型数据的并行计算;
  • 在后续,为了进一步增加计算的并行度,SIMD技术开始通过增加寄存器位宽来满足应用对算力的需求;
  • 因此,扩展SIMD的寄存器,意味着要同时扩展SIMD的指令集;
  • 而这种改变SIMD寄存器的宽度和SIMD指令数量的翻倍,都让ISA走上了复杂的道路;
  • 这一后果由处理器设计者、编译器编写者和汇编语言程序员共同承担;

VECTOR

RISC-V Vector 拥有其他架构矢量指令没有的两大优点:硬件维护方便与指令长度可变

  • 向量寄存器的大小由实现决定,而不是像SIMD中那样嵌入操作码中;
  • 它将向量的长度和每个时钟周期可以进行的最大操作数分离,是向量体系结构的关键所在:
    • 向量微架构可以灵活地设计数据并行硬件而不会影响到程序员,程序员可以不用重写代码就享受到长向量带来的好处。
  • 对于某一个矢量操作,即使硬件中的寄存器长度变化,代码也不需要作更改;
  • 相反的,在同一硬件中,即使指令长度作相应改变,代码也不需要更改。
  • 这意味着任何 RISC-V 兼容处理器编写的代码在其余 RISC-V 处理器上依然适用,这对于用户来说,简易性直线上升。
  • 上述的优点也就意味着,向量架构比SIMD 架构拥有更少的指令数量;

Vector register

register

  • v0~v31, 32个vector寄存器,每个寄存器的宽度都是由VLEN决定的;
  • Vector Context Status in mstatus/sstatus
    • 放在mstatus[10:9], 用来指示相关状态;
    • 当VS==off时,执行任何的vector指令,或者访问vector的CSR,都会产生illegal-inst excp;
    • 当VS set to initial or clean时,只要执行vector指令,或者访问vector CSR, 会将VS状态改为dirty; 当然,具体的实现可以随意更改该状态,而不必等到有vector访问;
    • 如果VS是dirty的,则mstatus.SD要设置成1; 
  • Vector Context Status in vsstatus    
    • When the hypervisor extension is present;
  • Vector type register, vtype
    • read-only XLEN-wide vector type CSR;
    • can only be updated by vset{i}vl{i} instructions.
    • vlmul(vector length multipler), vector register grouping, 指的是多个vector的寄存器,可以被分成多个group, 这样一个vector instr, 就可以在多个vector寄存器上处理;
      • LMUL is set by the signed vlmul field in vtype (i.e., LMUL = 2**vlmul[2:0]),表示需要多少个寄存器参与运算;
      • the requirement is to support LMUL ≥ SEW_MIN/ELEN
        • SEW, selected element width, 参考下一节的描述;
        • ELEN, 最大的SEW;
        • 所以,从上面的公式来看,LMUL可以是整数,也可以是分数;
        • 当LMUL< SEW_MIN/ELEN时,需要设置vill,表示指令异常;
    • vsew,就是对应的element宽度;
      • 例如,假如一个寄存器是128bits, 那么:
      • 默认情况下,一个vector的寄存器,会被认为分成了VLEN/SEW elements
    • vta & vma;
      • vta, vector tail agnostic;
      • vma, vector mask agnostic;
      • 这两个bit用来控制vector instruction的tail element和inactive element的行为;
      • undisturbed: 不受干扰; agnostic: 不可预知;
      • 当一个element被标记成undisturbed时,则vector register group中响应的element将会保留原来的值不变;
      • 当一个element被标记成agnostic时,destination element既可以保留原来的值,也可以overwrite by 1;
      • 为什么需要agnostic?
        • 在有些处理器中,会采用寄存器重命名的技术,比如超标量流水线处理器,在undisturbed策略下,必须从旧的物理目标向量寄存器中读取元素值,才能复制到新的物理目标寄存器中;也可以说,在新的物理寄存器进行重命名时,需要根据重命名映射表,查到原有的映射关系,然后把其中的元素值读出来,写到重命名后的对应元素。这对于不需要这些非活跃元素和尾部元素值的之后的运算既降低了性能也增加了功耗。因此undisturbed策略就显得很不可观,此时按照agnostic策略进行运算比较好。

    • vill;

      • 此bit用来当vset指令想要往vtype中写入不支持的值时,vill字段置1;

      • 当vill bit置位时,任何想要用vtype来做vector operation的指令,都会产生一个illegal-instruction excption;

      • 当vill有效时,vtype其他字段全部清零;

  • vector length register

    • 向量长度寄存器,只读,规定了一条向量指令需要操作的元素个数,为无符号数。

    • 该寄存器只被vsetvli、vsetvl指令和fault-only-first向量加载(load)指令变量更改。

    • 当vl=0或者vstart≥vl时,目的寄存器的所有元素都不被更改,也可以说指令不执行。

    • vl的宽度由最小元素宽度(SEW)和最大向量长度决定,其中SEW规定了指令执行元素的宽度,最小为8,最大向量长度为组成的最长的向量寄存器组,由VLMUL决定,最大为8。所以最多元素个数为

  • vlenb, vector byte length;

    • vlenb为只读,恒为VLEN/8,表示以字节为单位的向量寄存器长度;
    • 当有些指令需要以字节为单位使用向量寄存器时,用于减少额外的计算过程。
  • vstart, vector start index;
    • RW, 用来指定vector指令中的第一个元素的index;
    • 通常,vstart只通过在vector指令执行过程中产生的trap中被写入,记录synchronous exception或者asynchronous interrupt时,当前已经执行到的element index, 恢复的时候可以正常恢复;
    • 所有vector instruction保证目的寄存器vstart之前的元素不被更改,指令执行结束,vstart寄存器置零。
  • vxrm, Vector Fixed-Point Rounding Mode Register;
    • RW, 向量定点舍入模式;
    • vxrm共有四种模式:
      a)round-to-nearest-up(rnu):就近舍入,当为中间值时,向上舍入(四舍五入)。
      b)round-to-nearest-even(rne):就近舍入,当为中间值时,向偶数舍入。
      c)round-down(rdn):向下舍入,直接取移位后的值。
      d)round-to-odd(rod):向奇数舍入。

    • 设源操作数为vs1,有d位要被截位,则舍入后的值为(vs1>>d)+r,其中r为不同舍入模式下的差值:

  • vxsat, Vector Fixed-Point Saturation Flag;

    • 该bit指示是否有定点指令必须将输出值饱和以适应目标格式。位vxsat[XLEN-1:1]应写为零。vxsat位在vcsr中有镜像。

  • vcsr, Vector Control and Status Register

    • The vxrm and vxsat separate CSRs can also be accessed via elds in the vector control and status CSR, vcsr.

Vector中element的几个概念

  • Prestart, Active, Inactive, Body, and Tail, 这几个都是针对element来说的;
  • 假设VLEN=32,LMUL=2,SEW=16,那么这条指令需要操作4个元素。如果vstart设置为1,vl设置为2,那这些概念对应的分别是如图所示:

   

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

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

相关文章

一道xss题目--intigriti-0422-XSS-Challenge-Write-up

目录 进入挑战 js代码 代码分析 构造payload ​编辑 结果 进入挑战 Intigriti April Challenge题目地址 打开题目后&#xff0c;找到对应页面的js代码&#xff0c;寻找一下我们用户可控的点 js代码 <!DOCTYPE html> <html lang"en"><head> …

[GKCTF 2021]excel 骚操作1

使用010editor打开发现zip头&#xff0c;改后缀名xlsx为zip&#xff0c;解压&#xff0c;在D:\python\flag (1)\xl\worksheets目录下有个sheet1.xml就是ecxel的sheet1的主要样式style 看到很多c r"B2" s"1&#xff0c;只是单元格数据不同而已 &#xff0c;还有的…

Awesome-LLMs-for-Video-Understanding - 基于大型语言模型的视频理解研究

Awesome-LLMs-for-Video-Understanding 是 基于大型语言模型的视频理解研究 github : https://github.com/yunlong10/Awesome-LLMs-for-Video-Understandingpaper&#xff1a;Video Understanding with Large Language Models: A Survey https://arxiv.org/pdf/2312.17432 视频…

C++20中的约束与概念

类模板、函数模板和非模板函数(通常是类模板的成员)可能与约束(constraint)相关联&#xff0c;该约束指定对模板参数的要求(requirements)&#xff0c;可用于选择最合适的函数重载和模板特化。约束是使用模板时需要通过模板参数满足的条件或要求。这些要求的命名集合称为概念(c…

Hadoop 分布式集群搭建

HDFS分布式集群搭建 一、部署规划1.1 进程规划1.2 软件规划1.3 用户规划1.4 目录规划 二、 搭建HDFS 分布式集群2.1 HDFS 集群配置2.1.1 下载安装 Hadoop2.1.2 修改 hadoop-env.sh 配置文件2.1.3 修改 core-site.xml 配置文件2.1.4 修改 hdfs-site.xml 配置文件2.1.5 修改 slav…

程序员:全栈的痛你不知道

上周一个同事直接对我开喷&#xff0c;骂我无能&#xff0c;说&#xff1a;“你怎么一个人就搞不定所有系统呢&#xff1f;”&#xff0c;我半支烟纵横IT江湖14余年&#xff0c;还是第一次被人这么嫌弃。 事情缘由 某公司的业务线特别多&#xff0c;有个业务线前后端项目共计…

ComfyUI IPAdapter plus的模型应该怎么装-免费版-2024.8.25

&#x1f386;背景 ipadapter相关的节点大家应该都不陌生&#xff0c;具体是做什么的就不详细介绍了&#xff0c;但是还是有很多新入门的朋友不太了解这个节点相关的这一堆模型到底应该怎么安装。这里就借着官方节点的介绍来大概讲下这个话题。 涉及到的节点源地址&#xff1…

【Qt】Qt系统 | Qt事件| 鼠标事件

文章目录 鼠标事件鼠标点击事件鼠标释放事件鼠标双击事件鼠标移动事件 滚轮事件 在 Qt 中&#xff0c;鼠标事件是用 QMouseEvent 实现的。当在窗口中按下鼠标或者移动鼠标时&#xff0c;都会产生鼠标事件 鼠标事件 鼠标点击事件 鼠标按下时通过 虚函数 mousePressEvent() 来…

线程安全是什么问题?如何引起?死锁是啥?如何解决?

目录 一、什么是线程不安全&#xff1f; 二、如何引起的线程安全&#xff1f;怎么解决&#xff1f; 1&#xff09;CPU调度执行是随机的&#xff0c;抢占式执行&#xff08;根本原因&#xff0c;硬件层面咱们无法干预&#xff09; 2&#xff09;多个线程&#xff0c;对同一变…

【Hot100】LeetCode—105. 从前序与中序遍历序列构造二叉树

目录 1- 思路递归 2- 实现⭐105. 从前序与中序遍历序列构造二叉树——题解思路 3- ACM 实现 原题连接&#xff1a;105. 从前序与中序遍历序列构造二叉树 1- 思路 递归 前序&#xff1a;中左右中序&#xff1a;左中右 让前序的第一个元素作为中序的分割点 分割思路 1- 递归…

做个实验

做个实验 #include <bits/stdc.h> using namespace std; #define int long long #define ll __int128_t #define ar array<int, 2> #define arr array<int, 3> int n, m, k, inf 1LL << 61, mod 998244353;// 1e97; const int N 5e5 50;void sol…

使用gitee存储项目

gitee地址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台 创建gitee远程仓库 将远程仓库内容拉取到本地仓库 复制下面这个地址 通过小乌龟便捷推送拉取代码&#xff1a;https://blog.csdn.net/m0_65520060/article/details/140091437

基于51单片机的百叶窗proteus仿真

地址&#xff1a;https://pan.baidu.com/s/19M6jeTIHJcyDBGNx4H9nTA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

快手怎么免费的去掉视频水印?分享这三个工具给你

​ 我们经常会遇到想要保存的视频带有水印&#xff0c;这不仅影响美观&#xff0c;也不利于分享。为了解决这个问题&#xff0c;我将分享三个免费去除视频水印的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受无干扰的视频体验。 工具一&#xff1a;奈斯水印助手(小程序…

数码管进阶设计验证

前言 随着数字电路和嵌入式系统的广泛应用&#xff0c;数码管作为一种常见的显示设备&#xff0c;在各种电子产品中扮演着重要角色。数码管以其结构简单、显示清晰和成本低廉的特点&#xff0c;广泛应用于计数器、时钟、测量仪器等领域。然而&#xff0c;传统的数码管设计通常仅…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2,…

运维学习————nginx2-配置详解及负载均衡

目录 一、配置文件详解 1.1、结构 1.2、重要配置解释 1.3、详细配置 全局配置 Events HTTP 服务器配置 server虚拟主机配置 location URL匹配配置 1.4、完整配置 二、负载均衡 2.1、概念 2.2、集群规划及实现 2.3、具体实现 2.3.1、克隆 2.3.2、修改tomcat1配…

Python | Leetcode Python题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution:def superPow(self, a: int, b: List[int]) -> int:MOD 1337ans 1for e in b:ans pow(ans, 10, MOD) * pow(a, e, MOD) % MODreturn ans

go+gin+vue入门

后端框架 1、安装go、goland 2、创建空项目 3、下载要用的包&#xff1a;命令行输入go get -u github.com/xxxx 4、安装mysql数据库&#xff0c;使用navicat创建数据库。 5、按照项目框架搭建目录、文件、代码&#xff1a;如router、model… 6、运行测试&#xff0c;go run ma…