# LoongArch 内存模型与栅障

news/2024/2/28 0:12:30

1.内存模型

1.1 访存类型

龙芯架构下支持三种存储访问类型,分别是:一致可缓存(Coherent Cached,简称CC)、强序非缓存(Strongly-ordered UnCached,简称SUC)和弱序非缓存(Weakly-ordered UnCached,简称WUC)。存储访问类型与访存虚拟地址绑定,通过页表项中的MAT(Memory Access Type)域决定。MAT域的值域存储访问类型的对应关系是:0–强序非缓存,1–一致可缓存,2–弱序非缓存,3–一保留。存储访问类型的设置过程对于应用软件是透明的。

采用一致可缓存访问类型访问时,所访问的对象既可以是最终存储对象也可以是处理器中维护有缓存一致性的缓存。通常采用这种访问类型访问内存以获得高性能。
采用强序非缓存或弱序非缓存类型访问时,只能直接访问最终存储对象。两者的区别在于:强序非缓存访问满足顺序一致性,即所有访问严格按照程序中的次序执行且当前访存操作彻底完成前不能开始执行下一个访存操作;而弱序非缓存的读访问允许推测执行,弱序非缓存的写数据可以在处理器核内部合并至更大的规模(如一个Cache行)后以突发(Burst)方式写出,合并过程中后面的写数据可以覆盖前面写数据。

龙芯架构下只要求强序非缓存类型的访存指令不能有副作用(Side Effect),即此类指令不可推测的执行。软件可以利用这一特性通过强序非缓存类型的访存指令来访问系统中的I/O设备。但是,龙芯架构允许强序非缓存类型的取指操作具有副作用。这是指,访问类型是强序非缓存类型的取指操作,即使它源自转移预测的结果,也允许执行。为避免此类推测执行所产生的核外访存操作误入非法的物理地址空间,需要在片上网络中过滤掉存在风险的访问。

弱序非缓存类型的访问通常用于加速非缓存的内存数据的访问,如显存数据。

1.1.1 指令Cache 的缓存一致性维护

某个处理器核的指令Cache与其它处理器核内的Cache或缓存一致输入输出主设备(Cache Coherent I/O Master)之间的缓存一致性必须由硬件维护
处理器核内部指令Cache与数据Cache之间的缓存一致性维护可以实现为硬件维护。这意味着对于自修改代码,软件不需要通过Cache维护指令来保证同一个核内部指令Cache与数据Cache之间的缓存一致性。不过,由于流水线结构和推测取指行为的存在,软件仍需要使用IBAR指令来确保取指一定能够看到store指令的执行效果。

1.2 非对齐存储访问

所有取指操作的访存地址必须4字节边界对齐,否则将触发取指地址错例外(ADEF)。
除了原子访存指令、整数边界检查访存指令和浮点数边界检查访存指令外,其余的load/store访存指令可以实现为允许访存地址不对齐。不过,在一个允许访存地址不对齐的实现中,系统态软件可以通过配置CSR.MISC中的ALCLOALCL3控制位,在PLVOPLV3特权等级下,对这些load/store访存指令也进行也址对齐检查。对于需要进行地址对齐检查的访存指令,如果其访问的地址不是自然对齐的,将触发地址非对齐例外(ALE)。

1.3 存储一致性模型

龙芯架构的存储一致性模型采用弱一致性(Weakly Consistency,简称WC)模型。本小节仅对架构所采用的弱一致性模型做一个简要描述。
在弱一致性模型中,同步操作和普通访存需要区分开来,程序员必须用架构所定义的同步操作把对于写共享单元的访问保护起来,以保证多个处理器核对于写共享单元的访问是互斥的。对访存事件发生次序做如下限制:
1.同步操作的执行满足顺序一致性条件。即同步操作在所有处理器核中都严格按照其在程序中出现的次序执行,且在当前同步操作彻底完成之前不能开始执行下一个同步操作。
2.在任一普通访存操作允许被执行之前,所有在同一处理器核中先于这一访存操作的同步操作都已经完成;
3.在任一同步操作允许被执行之前,所有在同一处理机中先于这一同步操作的普通访存操作都已完成。

龙芯架构中能够产生同步操作的指令有DBARIBAR、带有DBAR功能的AM原子访存指令以及LL-SC指令对。

2. 栅障指令

2.1 dbar

指令格式: dbar hint

hint 值默认为 0

用途:dbar 用于完成load/store 访存操作之间的栅障功能。其携带的立即数hint 用于指示该栅障的同步对象和同步程度。

只有等到之前所以load/store 访存操作彻底执行完毕后,dbar 0指令才开始执行;且只有dbar 0执行完成后,其后所有load/store访存操作才能开始执行。

代码应用示例(代码取自linux内核):

#define __sync()	__asm__ __volatile__("dbar 0" : : : "memory")#define fast_wmb()	__sync()
#define fast_rmb()	__sync()
#define fast_mb()	__sync()
#define fast_iob()	__sync()
#define wbflush()	__sync()#define wmb()		fast_wmb()
#define rmb()		fast_rmb()
#define mb()		fast_mb()
#define iob()		fast_iob()#define __smp_mb()	__asm__ __volatile__("dbar 0" : : : "memory")
#define __smp_rmb()	__asm__ __volatile__("dbar 0" : : : "memory")
#define __smp_wmb()	__asm__ __volatile__("dbar 0" : : : "memory")#ifdef CONFIG_SMP
#define __WEAK_LLSC_MB		"	dbar 0  \n"
#else
#define __WEAK_LLSC_MB		"		\n"
#endif

2.2 ibar

指令格式: ibar hint

hint 值默认为 0

用途:ibar 用于完成单个处理器核内部store 操作与取指操作之间的同步。其携带的立即数hint 用于指示该栅障的同步对象和同步程度。

它能够确保ibar 0指令之后的取指一定能够观察到ibar 0指令之前所以store操作的执行效果。

3. 参考资料

龙芯架构参考手册-卷一基础架构


http://www.ppmy.cn/news/256.html

相关文章

JS对树结构进行模糊搜索,支持多关键字多字段搜索以及排序

需求 本地小数据量的搜索过滤,支持⬇️ 多关键字搜索按匹配度进行排序编号及名称都可搜索 需求描述 1.数据结构为常见的树结构 [{id: 1,name: 山东,children: [{id: 2,name: 济南,children: [{id: 3,name: 历下,},],},{id: 4,name: 青岛,},],},{id: 5,name: 浙…

计算机网络性能指标——时延,时延带宽积,RTT和利用率

时延 时延:数据(报文、分组、比特流)从网络的一端传送到另一端所需要的时间。也叫延迟或迟延,单位是s。 时延包括:发送时延(传输时延),传播时延,排队时延,处理时延。 高…

嵌入式 C语言/C++ 常见笔试、面试题 难疑点汇总(经典100道)

#pragma comment。将一个注释记录放置到对象文件或可执行文件中。 #pragma pack。用来改变编译器的字节对齐方式。 #pragma code_seg。它能够设置程序中的函数在obj文件中所在的代码段。如果未指定参数,函数将放置在默认代码段.text中 #pragma once。保证所在文件只…

国外Essay写作怎么让内容丰富起来?

在国外大学,写Essay是很多课程常用的考核方式,这种形式也非常考察同学们的综合能力。但对于本身英语就是第二语言的我们,有时候会觉得困难,有时候拖到最后匆忙交上去一篇,当然没有办法得到好分数。今天我们就来看一看如…

【Mysql】复合查询

文章目录**1.基本查询回顾****2.多表查询** (重要)多表查询步骤**3.自连接**4.子查询在from子句中使用子查询5.合并查询1.基本查询回顾 准备工作,创建一个雇员信息表:(来自oracle 9i的经典测试表) EMP员工表 DEPT部门表 SALGRADE工资等级表 案例1:查询…

麒麟信安携手河南IT联盟召开 《麒麟信安信创应用解决方案》线上分享会

在党政及金融、交通、能源等重要行业的信创应用步伐逐步加快的背景下,各行业均面临着不同程度的国产化落地难题。11月29日下午,麒麟信安与河南省信息协会IT产业分会(河南IT联盟)携手召开《麒麟信安信创应用解决方案》线上分享会&a…

第十四章《多线程》第4节:控制线程

从14.3小节所列举的各个例子可以很明显的看出:线程的执行有一定的随机性,如果不加以适当控制,会导致执行结果的不确定性。实际开发过程中,很多情况下都需要让线程按照程序员期望的结果运行,为了保证线程运行结果的确定性,必须用各种方式对线程加以控制。本小节将详细讲解…

YOLO X 改进详解

YOLO X 主要改进: Anchor-Free: FCOSDecoupled detection headAdvanced label assigning strategy Network structure improvement Decoupled detection head 对比于YOLO V5, YOLO X 在detection head上有了改进。YOLO V5中,检测头是通过卷积同时预…

Spark 3.0 - 8.ML Pipeline 之决策树原理与实战

目录 一.引言 二.决策树基础-信息熵 三.决策树的算法基础 - ID3 算法 四.ML 中决策树的构建 1.信息增益计算 2.连续属性划分 五.ML 决策树实战 1.Libsvm 数据与加载 2.StringIndexer 3.VectorIndexer 4.构建决策树与 Pipeline 5.测试与评估 6.获取决策树 六.总结…

awk命令应用

记录:353 场景:在CentOS 7.9操作系统上,使用awk文本处理工具处理文本;使用awk、cat和grep搭配使用处理文本;使用awk直接处理文本;使用shell脚本调用awk脚本处理文本。 版本: 操作系统&#x…

Android Studio实现一个点餐系统

写在前面 需要源码的可以联系我:lzlv58787 点餐系统写在前面作业要求效果登录注册欢迎页用户管理菜品种类管理菜品管理订单查询点餐后厨助手源码导读手把手编写注册、用户管理板块新建实体类User新建User服务新建注册活动用户管理作业要求 功能: 1&#…

双胶合透镜初始设计

双胶合透镜是光学系统中不可或缺的基本光学零件之一。对于一个新设计的光学系统,首先根据性能要求对其进行外形尺寸计算,然后就得开始对各光学零部件进行初级像差设计,求解每个零部件的 、C的分配值,最后根据对各个零部件的 、C要…

A*算法-Python实现

好久没有在CSDN上发文章了,快一年了吧。这两天重新登录了一下,不看不知道,一看吓一跳,没想到访问量快13万了。 之前写博客的时候,想着把一些有用的东西写下来,一方面是当做笔记了,免得以后忘记…

练习-编写函数对结构体类型数据进行排序

第1关:编写函数对结构体类型数据进行排序 任务描述 本关任务:定义学生结构体数据类型,从键盘输入一批学生的信息,编写函数将这批学生按姓名排序。 相关知识 结构体变量之间整体是不可以比较大小的,结构体变量之间只能比较某个成员的大小;比较两个结构体变量是否相等与比…

Spring、SpringMVC和SpringBoot

常用的java框架有: SSH组合 SpringMVCSpringHibernate SSM组合 SpringMVCSpringMybatis(流行组合) SpringBoot springCloud 权限管控框架 Shiro、SpringSecurity 一. 概念 1. Spring Spring是一个开源容器框架,可以接管web层&#xf…

【python】list 删除列表中某个元素的3种方法;附加删除numpy数组中的指定索引元素的方法

方法 python中关于删除list中的某个元素,一般有三种方法: remove、pop、del实例 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除 2.pop: 删除单个或多个元素,按位删除(根据索引删除) 3.del:它是根据索…

Golang基础 流程控制 循环控制

循环控制01 基础循环 for02 键值循环 for range参考资料循环控制通常用于程序中需要重复执行的逻辑模块,循环结构通常由循环变量、循环终止条件和循环体三个部分构成。 01 基础循环 for Golang 中所有的循环控制都使用 for 关键定义。基础 for 循环控制结构&#x…

【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文)

typora-root-url: ./ 【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图源代码仿真工程答辩PPT答辩论文) 文章目录typora-root-url: ./【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图源代码仿真工程答辩PP…

【Jmeter】前置处理器实战:「BeanShell 预处理程序」参数化身高、体重、BMI

目录 一、实战场景 二、HTTP 请求 三、BeanShell 预处理程序 (1)添加位置 (2)BeanShell 脚本

高防CDN和融合CDN的区别

所有网站比较关心的一个问题就是如何解决南北用户能够稳定的加速访问,为此网站运营商通常用的CDN来解决这个问题。那么CDN是什么呢?CDN是属于一种内容分发网络。通过在现有的网络中增加一层新的网络架构的模式,使用户能够就近获取数据&#x…
最新文章