Zifencei扩展
fence 指令对外部可见的访存请求,如设备 I / O 访问,内存访问等进行串行化。外部可见是指对处理器的其他核心、线程,外部设备或协处理器可见。
fence.i 指令同步指令和数据流。在执行 fence.i 指令之前,对于同一个硬件线程(hart), RISC-V 不保证用存储指令写到指令存储区的数据可以被取指指令取到。
Zifencei扩展目前仅包括FENCE.I指令。该指令提供了同一个hart中写指令内存空间和读指令内存空间之间的显式同步, 就是说读取的指令的总是最新写入的指令。该指令目前是确保指令内存存储和读取都对hart可见的唯一标准机制。
fence.i指令可以有各种实现方法,一种简单的实现就是在执行fence.i指令的时候,冲刷(flush)指令缓存(Icache, instruction cache)和指令管线(instruction pipeline)。冲刷icache和管线的作用是确保指令缓存中的内容和指令内存空间中的数据一致,以及所有写指令缓存的动作完成(icache通常是只读的,但自修改指令可能会需要写的动作)。这样确保后续的指令读取操作正确。
更复杂的实现可能会在每个数据(指令)高速缓存未命中时窥探指令(数据)高速缓存,或者使用统一专用L2高速缓存,L2缓存是全局缓存,所有的riscv核都接在上面,当然riscv核本身有icache和dcache,也就是L1 cache, 如果L2 cache足够大,对指令数据并没有一致性问题。对L2的store指令,就去回看L1对应的cacheline是否有效,如果数据有效,就invalidate它。如果指令和数据高速缓存以这种方式保持一致,或者如果存储器系统仅由未缓存的RAM组成,那么只需要在FENCE.I处冲刷管线。
FENCE.I指令以前是基本指令集RV32I/RV64I的一部分。现在把它移到扩展指令集Zifencei, 这样做主要有两个原因:
首先,在某些系统上,实现FENCE.I代价将是昂贵的,RiscV基金会存储器模型工作组中正在讨论替代机制。特别是,对于具有不一致指令高速缓存和不一致数据高速缓存的设计,或者指令高速缓存不能监视(snoop)数据高速缓存一致性的时候,当遇到FENCE.I指令时,两个高速缓存必须完全冲刷管线。当在主存和riscv系统全局统一cache的上层(更接近core),有多级的icache和dcache时候,这个问题会更加严重。
其次,该指令的功能不足以在类Unix操作系统环境中的用户级别使用。 FENCE.I仅同步本地hart,操作系统可以在FENCE.I之后将用户hart重新分配到不同的物理hart。这将要求操作系统执行额外的FENCE.I来进行每个上下文切换。出于这个原因,标准Linux ABI已经从用户级删除了FENCE.I,现在需要系统调用来维持指令一致性,这允许操作系统最小化在当前系统上执行FENCE.I的数量,对于将来改进的读取指令一致性机制,也可以保持向前兼容。一些新的取指令一致性机制仍在讨论中,将来会提供fence.i更多的版本。 比如在rs1中指定地址,仅fence指定的rs1地址的访问。
fence.i 指令同步指令和数据流。在执行 fence.i 指令之前,对于同一个硬件线程(hart), RISC-V 不保证用存储指令写到内存指令区的数据可以被取指令取到。使用fence.i指令后,对同一hart,可以确保指令读取是最近写到内存指令区域的数据。但是,fence.i将不保证别的riscv hart的指令读取也能够满足读写一致性。如果要使写指令内存空间对所有的hart都满足一致性要求,需要执行fence指令。
fence.i
fence.i //Fence(Store, Fetch)
同步指令流(Fence Instruction Stream). I-type, RV32I and RV64I.
使对内存指令区域的读写,对后续取指令可见。
| imm[11:0] | rs1 | func3 | rd | opcode | |||||||||||||||||||||||||||||
| name | type | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| fence.i | I | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
例子:
0: 0ff0000f fence iorw,iorw
4: 0000100f fence.i
fence.i指令用于同步指令和数据流。如果程序中添加一个fence.i,则该指令能够保证fence.i之前所有指令的访存结果能被fence.i之后的所有指令访问到。通常说来,处理器的微架构硬件实现时,一旦遇到一条fence.i指令,便会先等到之前的所有访存指令执行完,然后冲刷流水线,包括Icache,使其后的所有指令,能够重新取指,从而得到最新的值。
注意:fence.i只能保证同一个hart(硬件线程)执行的指令流和数据流顺序,不能保证多个hart之间的指令流和数据流访问。
Zifencei扩展的更多相关文章
- Asp.net Boilerplate之AbpSession扩展
当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...
- 恢复SQL Server被误删除的数据(再扩展)
恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- Dapper扩展之~~~Dapper.Contrib
平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...
- ExtJS 4.2 Date组件扩展:添加清除按钮
ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- Hawk 6. 编译和扩展开发
Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...
随机推荐
- LOJ 3184: 「CEOI2018」斐波那契表示法
题目传送门:LOJ #3184. 题意简述: 题目说得很清楚了. 题解: 首先需要了解「斐波那契数系」为何物. 按照题目中定义的斐波那契数列 \(F_n\),可以证明,每个非负整数 \(n\) 都能够 ...
- c# 第11节 运算符大全
本节内容: 1:数学运算符 2:赋值运算符 3:关系运算符 4:布尔运算符 5:位运算符 6:其他运算符 1:数学运算符 2:赋值运算符 3:关系运算符 4:布尔运算符 5:位运算符 & 运算 ...
- JAVA并发-Executor
结构 类继承图: 上面的各个接口/类的关系和作用: Executor 执行器接口,也是最顶层的抽象核心接口, 分离了任务和任务的执行. ExecutorService 在Executor的基础上提供了 ...
- 【oracle】ORA-12638 : 身份证明检索失败
sqlnet.ora 1.删了 2.#注释了 背后缘由:待写
- MyEclipse10破解 运行run.bat闪退 亲自试验
找到MyEclipse安装的自带的jdk(方法是打开MyEclipse,依次window->Preferences->Java->Installed JRES找到默认路径,我的是:自 ...
- ESP8266 LUA脚本语言开发: 准备工作-LUA开发说明
前言 开发Lua需要使用这个软件 注:该软件需要按照JDK 即 JAVA虚拟机,如果没有安装过JDK,请先看JDK安装教程安装JDK USB线连接开发板接入电脑 选择自己的串口号 波特率115200 ...
- CF1136E Nastya Hasn't Written a Legend(线段树)
还能说什么呢,简直太妙了. $$a_{i+1}<a_i+k_i$$ $$a_{i+1}-k_i-k_{i-1}-\cdots-k_1<a_i+k_i-k_i-k_{i-1}-\cdots- ...
- [BJOI2019]勘破神机(第一类斯特林数,斐波那契数列)
真的是好题,只不过强行多合一有点过分了…… 题目大意: $T$ 组数据.每个测试点中 $m$ 相同. 对于每组数据,给定 $l,r,k$,请求出 $\dfrac{1}{r-l+1}\sum\limit ...
- (六)golang--变量
什么是变量? 变量相当于内存空间中一个数据存储空间的表示,可以理解为一个门的房牌号:该区域有自己的名称(变量名)和类型(数据类型) 变量的使用步骤:申明--赋值--使用 package main im ...
- 用友U8删除采购转固卡片后,再次转固找不到采购订单,且其他订单转固报错
问题描述 1.用户反馈删除两张之前通过采购转固定资产的卡片后,想要再次生成卡片时候,却找不到这两张卡片. 2.用户尝试对其他未转固定资产的订单进行转固,在保存卡片时提示“本次结转将放弃全部已完成的业务 ...