# LoongArch 内存模型与栅障

news2024/11/22 20:48:37

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.coloradmin.cn/o/47764.html

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

相关文章

没睡醒就来上班的程序员解决BUG

仅以此篇纪念我在低级错误面前烦躁又蒙B的3分钟。 今早,我在公司系统上点了一下我负责模块里的一个查询。我靠,这个查询条件竟然没生效。 看代码,原来xml文件里的SQL没写这个查询条件,这太简单了,加上。)…

vue - vue使用echarts实现中国地图和点击省份进行查看

文章目录1,实现的效果和功能2,安装ECharts3,main.js里面引入echarts4,实现如下5,遇到的问题6,用到的模拟数据1,实现的效果和功能 vue使用echarts实现中国地图和点击省份进行查看; 下…

嵌入式开发--Altium技巧:原理图设置

Altium的默认设置,有一些是很不合理的选项,强烈建议大家修改。 在工程上点右键,并在弹出的菜单上选择最后一项:Project Options,即项目设置 弹出如下界面,如果操作不当,设置错了,可…

STM32 bit-band位带操作

在51单片机中,我们可以通过sbit命令来操作存储器中的位,在STM32中,我们同样可以操作存储器中特定的位。 1、为何使用位带操作? 总结来说,一个是因为访问速度快,另一个是因为安全。 如果在裸机开发中&…

【学习笔记69】函数的柯里化

一、认识函数的柯里化 将一个接受多个参数的函数,更改为需要调用多次, 每次只传一个参数的函数利用了闭包, 延长了 外部函数的参数使用时间(一)基础版 function sum (a, b) {console.log(a b)}sum(10, 20);sum(10, 30);sum(10, 40); &#x…

2022卡塔尔世界杯小组赛出线形势分析指南——德国队会被西班牙做掉吗?

早点关注我,精彩不错过!(德国队出现形势分析在文末,可直接跳转。)北京时间今天晚上11点整,如火如荼的卡塔尔世界杯就将展开小组赛第三轮比赛的争夺,8个小组轮番同时进行最后一轮较量&#xff0c…

2022年全网最全AI绘画产品整理(一共23款,免费的绘画次数用到你手软)

1、飞链云版图 【免费】 扫码或搜索微信小程序:飞链云版图 注册即赠送100次AI绘画次数,每天分享可以免费获取到110次AI绘画次数; 完全够普通人到日常绘画需求;如果你有大量的绘画需求(月绘画次数过万)&am…

Win10升级Win11必备的5款免费软件

目前win7渐渐退出视野,大部分人都开始使用win10了,甚至win11都开始渐渐进入视野了。 1.文件预览工具——Seer 以前我们在预览文件的时候,需要通过双击打开才能查看内容,如果文件过多,一个个点开就太麻烦了。Seer以前…

Flutter 应用程序更新

Flutter 应用程序更新 原文 https://medium.com/flutter-community/in-app-update-the-flutter-way-2f25e4a02c02 前言 当您推出应用程序的新版本时,您希望您的用户了解它。无论是因为您修复了一个关键的 bug,添加了一个新特性,还是仅仅因为应…

Python基础(八):循环深入讲解

文章目录 循环深入讲解 一、循环简介 1、循环的作用 2、循环的分类 二、while的语法 1、快速体验 三、while的应用 1、应用一:计算1-100累加和 2、应用二:计算1-100偶数累加和 四、break和continue 1、理解 五、while循环嵌套 1、应用场景 …

YOLO V3 详解

YOLO V3 论文链接:YOLOv3: An Incremental Improvement 主要改进 Anchor: 9个大小的anchor,每个尺度分配3个anchor。Backbone改为Darknet-53, 引入了残差模块。引入了FPN,可以进行多个尺度的训练,同时对于小目标的检测有了一定…

【微服务】RestClient操作文档

为了与索引库操作分离,我们再增加一个测试类,做两件事情: 初始化RestHighLevelClient我们的酒店数据在数据库,需要利用IHotelService去查询,所以注入这个接口 package cn.itcast.hotel;import cn.itcast.hotel.pojo.…

【车载开发系列】UDS诊断---电控单元复位 ($0x11)

【车载开发系列】UDS诊断—电控单元复位($0x11) UDS诊断---电控单元复位($0x11)【车载开发系列】UDS诊断---电控单元复位($0x11)一.概念定义二.应用场景三.报文格式1)请求2)肯定响应…

js文字提示层案例分析

前言 💖js文字提示层在项目中比较常见,今天初次学习记录一下 功能介绍 在一段文本中鼠标触及红色字体,下方显示一个文字提示信息,鼠标离开红色字体区域,文字提示层消失。 知识点 onmouseover:鼠标指针移…

平衡搜索树——B-树小记

文章目录B- 树系列定义插入规则代码B-树结点定义查找key在结点哪个子树插入分裂B- 树系列 定义 B-树是一棵多叉 平衡 搜索树(不是二叉树,B-树中每个结点中可以有多个key,也有多个孩子) B-树中每个结点在实现时人为规定一个key的上限(KEY_LIMIT 4) B-…

Mysql语法五:idea连接数据库和jdbc

目录 1.连接数据库 1.1.下载驱动包 1.2:连接数据库 2.jdbc编程 2.1:何为jdbc 2.2:jdbc的使用。 2.2.1:直接插入操作 2.2.2:利用?进行插入 2.2.3:修改操作 2.2.4:删除操作 …

算法基础:动态规划

目录 动态规划之禅 多种纬度解决Fibonacci 数列 什么是Fibonacci数列 朴素递归方案 朴素递归的问题 Fib自上而下、备忘录方案 Fib自下而上法 动态规划之禅 动态规划是算法基础部分中最有趣的一个了,我想了很多天,怎么用很短的一些话把动态规划像之…

onnx删除无用属性

这里写自定义目录标题在推理onnx模型时,报了一个错,如下:InvalidGraph: [ONNXRuntimeError] : 10 : INVALID_GRAPH : This is an invalid model. In Node, ("Conv_0", Conv, "", -1) : ("x": tensor(float),&q…

DPVS时间轮移植

DPDK自带的定时器采用跳表实现,时间复杂度是O(logn),当有大量事件要定时触发时,比如会话session老化,效率并不高。因此DPVS采用了O(1)复杂度的时间轮。0. 概述 a. 添加定时器事件的核心是 static int __dpvs_timer_sched(struct…

为何 SPARK 在应用 GPU 后表现更出色

什么是 APACHE SPARK? 伴随数据的巨量增长,Apache Spark 已成为分布式横向扩展数据处理的热门框架之一,可以在本地和云端数以百万计的服务器上运行。 Apache Spark 是应用于大型数据处理的快速通用分析引擎,可在 YARN、Apache Mes…