当前位置: 首页 > news >正文

简单讲讲RISC-V跳转指令基于具体场景的实现

背景

在 RISC-V指令集中,一共有 6 条有条件跳转指令,分别是 beq、bne、blt、bltu、bge、bgeu。如下是它们的定义与接口

=   BEQ rs1, rs2, imm

≠   BNE rs1, rs2, imm

<  BLT rs1, rs2, imm

≥  BGE rs1, rs2, imm

< unsigned   BLTU rs1, rs2, imm

≥ unsigned  BGEU rs1, rs2, imm

场景分析

        在现代计算密集型任务的芯片架构设计中,SIMD, SIMT体系非常常见,比如我们会先把某个计算任务拆解为一系列的芯片指令,然后分配给芯片的不同core,不同thread来执行这些指令,即同一套指令,多个不同线程执行。但是某些输入数据情况下或者某个指令中只需要其中某个core或thread执行,其它则跳转到另外的分支执行,这时候我们就需要增加跳转指令来实现这个操作。

        假设指令A和指令B中间差了offset条指令,我们想要core_id%4=0的core从指令A地方往下顺序执行到指令B,而core_id%4 !=0的core则从指令A直接跳到指令B处再顺序执行剩余指令。这时候我们应该怎么写跳转指令呢?需要考虑下面两个问题:

1)在哪里加跳转指令?

当然是在指令A结束后执行跳转指令,如果符合跳转条件,就跳过A,B之间的指令。

2)怎么加跳转指令?

跳转指令实际就是判断语句,因为这个场景需要不相等时候跳转,所以用到的是BNE指令。

然后我们需要考虑BNE的指令接口:rs1, rs2, imm。BNE的这3个参数是指如果rs1 != rs2, 则传进来一个imm立即数。imm在这里对应的就是指令A,B之间的偏移指令条数offset。

接下来,根据实际场景,rs1, rs2可以是寄存器的id号,一般芯片设计中会有两种寄存器:GPR(通用寄存器)、CSR(条件状态寄存器)。我们可以通过CSR获得当前运行状态下的core_id号,通过GPR寄存器放置判断的取模数字4。

最后,跳转指令就是这样实现:

(offset在生成指令集时候得到,然后作为立即数传递给BNE指令。实际生成代码时候,可以在指令B开始位置计算一下中间跳转的offset, 然后修改到前面生成的跳转指令参数里)

BNE  src1, src2, offset

CSR[src1] = core_id,   
GPR[src2] = 4,
inst_set[core_num, inst_len] 表示当前core_id执行到第几条指令, 假设idx指到指令A位置。
翻译如下:if  CSR[src1]  != GPR[src2]inst_set[core_id, idx] =  inst_set[core_id, idx] + offset

示意图如下:

http://www.lryc.cn/news/221771.html

相关文章:

  • 第13章 Java IO流处理(一) File类
  • 测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)
  • pytorch中的矩阵乘法
  • Java--Stream流详解
  • [PHP]ShopXO企业级B2C免费开源商城系统 v2.3.1
  • Python基础入门系列详解20篇
  • P02项目(学习)
  • pandas 笔记:get_dummies分类变量one-hot化
  • PTE作文练习(一)
  • 如何做到一套FPGA工程无缝兼容两款不同的板卡?
  • VSCode修改主题为Eclipse 绿色护眼模式
  • conan和cmake编译器版本不匹配问题解决
  • float单精度浮点数如何在计算机中存储
  • 机器视觉在虚拟现实与增强现实中的作用
  • 红黑数原理及存在原因
  • Ansible入门—安装部署及各个模块应用案例(超详细)
  • Spring Boot 3系列之-启动类详解
  • muduo源码剖析之Timer定时器
  • CocosCreator:背景滚动 、背景循环滚动
  • 中远麒麟堡垒机SQL注入漏洞复现
  • ActiveMq学习⑨__基于zookeeper和LevelDB搭建ActiveMQ集群
  • Ansible概述以及模块
  • Cannot run program “D:\c\IntelliJ IDEA 2021.1.3\jbr\bin\java.exe“
  • 案例-注册页面(css)
  • Ansible--playbook 剧本
  • Vue3.0路由拦截
  • EtherCAT转EtherNET/IP协议网关控制EtherCAT伺服驱动器的方法
  • 钉钉内嵌H5遇到的一些问题
  • LeetCode 热题100——链表专题(二)
  • 【Rust日报】2023-11-06 ESP上使用 Rust实现 SNTP协议