当前位置: 首页 > 知识库问答 >
问题:

现代Intel x86 CPU如何实现门店总订单

仲孙才捷
2023-03-14

由于它的TSO内存模型,x86保证了所有存储的总订单。我的问题是是否有人知道这是如何实际实现的。

我对这四道围墙的实施情况印象很好,因此我可以解释当地秩序是如何得以维持的。但这四道栅栏只会给程序下达命令;它不会给你TSO(我知道TSO允许旧的商店跳转到新的货物前面,所以隐式地只需要4个Geofence中的3个)。

单个地址上所有内存操作的总顺序是一致性的责任。但我想知道Intel(特别是Skylake)是如何在多个地址上实现存储的总订单的。

共有1个答案

子车轶
2023-03-14

x86 TSO内存模型基本上相当于程序顺序加上带有存储转发的存储缓冲区。(486硬件就是这么简单;后来的CPU没有引入新的重新排序。)

从理论上讲,大多数由此产生的保证对于硬件来说相当容易实现,只要有一个存储缓冲区和一致的共享内存;存储缓冲区将OoO exec与顺序提交要求(和缓存未命中存储)隔离开来,并允许推测性地执行存储,以及(通过存储-

>

如果使存储对任何其他核心可见的唯一方法是同时对所有核心可见,则会自动发生这种情况。i、 e.通过promise一致的L1d。这使得IRIW无法重新排序。(MESI确保存储区不能提交到L1d,除非它是此core独家拥有的:没有其他core具有有效副本。)(观察自己存储的核心需要一个完整的屏障,否则它将通过存储转发观察自己的存储,而不是全局总订单。典型的IRIW litmus测试考虑总共4个线程,因此不会本地重新加载。)

事实上,很少有硬件没有这个属性;一些POWER CPU可以在同一物理核心上的SMT线程之间进行前向存储,这使得两个读卡器可能对两个写卡器的存储顺序产生分歧(IRIW重新排序)。尽管x86 CPU通常也有SMT(例如Intel的超线程),但内存模型要求它们不在逻辑核之间进行前向存储。那很好;无论如何,它们都会对存储缓冲区进行静态分区。使用HT在一个内核上执行的线程之间的数据交换将使用什么?。还有,生产者消费者在超级同级与非超级同级之间共享内存位置的延迟和吞吐量成本是多少?用于实验测试。

唯一发生的重新排序是在每个CPU核心内,在访问全局一致共享状态之间的本地。(这就是为什么让这个核心等待事情发生的本地内存障碍,例如存储缓冲区耗尽,可以在x86 TSO之上恢复顺序一致性。顺便说一句,这甚至适用于较弱的内存模型:只是在MESI一致性之上的本地重排序。)

其余的保证分别适用于每个(逻辑)CPU核心。(Q)

>

加载不会随以后的存储重新排序:很简单:要求加载完全完成(已从L1d缓存获取数据),然后才能注销。由于退出是正常的,并且存储在退出L1d之前无法提交给L1d(成为非推测性的),因此我们可以免费订购LoadStore。

加载按程序顺序从一致缓存(内存)中获取数据。这是一个困难的问题:当它们执行时加载访问全局状态(缓存),而存储缓冲区可以吸收OoO exec和顺序提交之间的不匹配。实际上,使每个加载依赖于以前的加载将防止未命中,并消除涉及内存的代码无序执行的许多好处。

实际上,Intel CPU积极推测,如果架构允许加载发生(在执行早期加载之后),现在存在的缓存线仍将存在。如果不是这样的话,就炸掉管道(内存顺序错误推测)。这有一个性能计数器事件。

在实践中,为了追求更多的性能,或者为了投机性的早期负载,一切都可能变得更加复杂。

(在C语言中,这至少与acq\U rel一样强大,但也涵盖了C语言中可能存在的行为。例如,一个加载将最近的存储部分重叠到另一个线程可能正在读取或写入的位置,从而允许此内核加载一个从未出现或将出现在内存中的值,以便其他线程加载。全局不可见的加载指令)

相关Q

  • 生产者消费者在超级同级与非超级同级之间共享内存位置的延迟和吞吐量成本是多少?导致机器清除。内存\u排序
  • C如何仅使用MOV在x86上实现发布和获取MESI缓存一致性是所有这一切的关键部分
  • 如何在微体系结构上实现屏障/Geofence和获取、释放语义
  • C如何仅使用MOV在x86上实现发布和获取
  • 全局不可见加载html" target="_blank">指令
  • 为什么要刷新由其他逻辑处理器导致的内存顺序冲突的管道
  • 内存重新排序如何帮助处理器和编译器
  • 内存屏障是否确保缓存一致性已完成这甚至不是正确的心智模式

脚注1:
一些OoO exec弱有序CPU可以执行LoadStore重排序,大概是通过让加载从ROB中退出,只要加载检查权限并请求缓存行(未命中),即使数据实际上还没有到达。需要对寄存器未准备好进行一些单独的跟踪,而不是通常的指令调度程序

LoadStore重排序实际上在有序管道上更容易理解,我们知道需要对缓存未命中负载进行特殊处理才能获得可接受的性能。如何加载-

 类似资料:
  • 说明 此接口用于上传营业订单数据 支持单条上传和批量上传 对于非点菜消费数据(如会员卡充值)的上传: 此类无消费的数据也可以通过此接口上传,此类数据中只需要有pay项目的内容,而item项目为空。 并且为了区分此单据类型,增加type属性来区分,目前有两种:do:点菜单据,mc:会员充值单据 针对非正常点菜信息的识别(如退单、赠送): 系统规则是当数量qty为负数则识别为退单, 当金额amt为零则

  • 作为促销方式的一种,满减优惠让利小,效果好,既能让商家赚更多钱,又能让消费者更满意。而且,相较于打折,不会让品牌产生廉价感。现在,你可以用金数据全新推出的「订单满减」应用设置满减优惠,可灵活设置「阶梯满减规则」,刺激买家「主动凑单」,拍下商品「自动改价」,有效提高客单价。 如何配置订单满减 你需要先准备好相关表单,并且配置好微信支付。接下来,从应用中心进入「订单满减」,你就可以为这个表单设置满减活

  • 如何使用 Graphql SPQR 库实现 GraphQL 的订阅功能?

  • 创建门店 用 POI 接口新建门店时所使用的图片 url 必须为微信自己域名的 url,因此需要先用上传图片接 口上传图片并获取 url,再创建门店。上传的图片限制文件大小限制 1MB,支持 JPG 格式,图片接口请参考:临时素材 $app->poi->create($baseInfo); $baseInfo 为门店的基本信息数组 示例: <?php $info = array(

  • 本文向大家介绍SpringBoot+MongoDB实现物流订单系统的代码,包括了SpringBoot+MongoDB实现物流订单系统的代码的使用技巧和注意事项,需要的朋友参考一下 课程导学 我们都知道MongoDB是一款非常出色的非关系型文档数据库,你肯定会想问MongoDB这么强,我们该怎么用或者有啥运用场景呢? MongoDB的应用场景非常多,无论是数据存储还是日志存储越来越多的公司在使用Mo

  • 本文向大家介绍PHP如何实现订单的延时处理详解,包括了PHP如何实现订单的延时处理详解的使用技巧和注意事项,需要的朋友参考一下 业务需求 订单是我们在日常开发中经常会遇到的一个功能,最近在做业务的时候需要实现客户下单之后订单超时未支付自动取消的功能,刚开始确认了几种方法: 客户端到时间请求取消 服务端定时查询有没有需要取消的订单,然后批量处理 下单后创建定时器,延时处理 使用redis或者memc