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

2024-08-23 19:20

本文主要是介绍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,那这些概念对应的分别是如图所示:

   

这篇关于RISC-V vector(1) --- vector的引入与register说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100274

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

MySQL之复合查询使用及说明

《MySQL之复合查询使用及说明》文章讲解了SQL复合查询中emp、dept、salgrade三张表的使用,涵盖多表连接、自连接、子查询(单行/多行/多列)及合并查询(UNION/UNIONALL)等... 目录复合查询基本查询回顾多表查询笛卡尔积自连接子查询单行子查询多行子查询多列子查询在from子句中使

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注