Total Store Orderand(TSO) the x86 MemoryModel

一种广泛实现的内存一致性模型是总store顺序 (total store order, TSO)。

  • TSO 最早由 SPARC 引入,更重要的是,它似乎与广泛使用的 x86 架构的内存一致性模型相匹配。
  • RISC-V 还支持 TSO 扩展 RVTSO,部分是为了帮助移植最初为 x86 或 SPARC 架构编写的代码。 

为什么需要TSO

        处理器核心长期以来一直使用 write buffer (或 store buffer,写入缓冲区) 来保存已提交(retired)的store,直到内存系统的其余部分可以处理这些store。

        当store commit时,store进入写入store buffe,当要写入的块处于读写 coherence 状态的高速缓存中时,store退出写入缓冲区。

  • Significantly, a store can enter the write buffer before the cache has obtained read-write coherence permissions for the block to be written;
  • the write buffer thus hides the latency of servicing a store miss;

        对于单核处理器,可以通过确保对地址 A 的load将最近store的值返回给 A,即使对 A 的一个或多个store在write buffer中,也可以使write buffer在架构上不可见。

  • This is typically done by either bypassing the value of the most recent store to A to the load from A,其中“最近”由程序顺序确定,或者如果到 A 的store在write buffer中,则停止load A 。

        在构建多核处理器时,使用多个核心似乎很自然,每个核心都有自己的旁路写入缓冲区(bypass write buffer),并假设写入缓冲区在架构上仍然是不可见的。

        但是,这个假设是错误的!  

        考虑如上的代码,假设multicore processor with in-order cores,其中每个核心都有一个单入口写入缓冲区并按以下顺序执行代码;

  • 1. 核心 C1 执行store S1,但在其write buffer中缓冲新store的 NEW 值。
  • 2. 同样,核心 C2 执行store S2 并将新store的 NEW 值保存在其write buffer中。
  • 3. 接下来,两个核心执行各自的load L1 和 L2,并获得旧值 0。
  • 4. 最后,两个核心的write buffer使用新store的值 NEW 更新内存。

        最终结果是 (r1, r2) = (0, 0)。正如我们在上一章中看到的,这是 SC 禁止的执行结果。

  • 没有write buffer,硬件就是 SC,但有了write buffer,它就不是了,这使得write buffer在多核处理器中在架构上是可见的 

如何解决这个问题?

  • 对可见的写入缓冲区的一种响应是关闭它们,但由于潜在的性能影响,供应商一直不愿这样做。另一种选择是使用激进的、推测性的 SC 实现,使写入缓冲区再次不可见,但这样做会增加复杂性,并且会浪费电力来检测违规和处理错误推测。
  • SPARC 和后来的 x86 选择的选项是放弃 SC,转而支持memory consistency model,允许在每个核心上直接使用先进先出 (FIFO)  write buffer。这个被称为 TSO 的新模型允许结果“(r1, r2) = (0, 0)”。这个模型让一些人感到惊讶,但事实证明,对于大多数编程习惯来说,它的行为就像 SC 一样,并且在所有情况下都得到了明确的定义。

TSO/X86 的基本思想

随着执行的进行,SC 要求每个核心为连续操作的所有四种组合保留其load和store的程序顺序:

  • * Load -> Load
  • * Load -> Store
  • * Store -> Store (意味着写入缓冲区必须是 FIFO(而不是,例如,合并)以保持 store-store 顺序。)
  • * Store -> Load (Included for SC but omitted for TSO) 

TSO 包括前三个约束,但不包括第四个;

同样考虑上面的那个例子:

怎么阻止(d)这种场景的发生?

  • 插入fence指令;
  • 使用 TSO 的程序员很少使用 FENCE(又名内存屏障),因为 TSO 对大多数程序“做正确的事”。

write buffer的bypassing

TSO 确实允许一些非直观的执行结果。表 4.3 是表 4.1 中程序的修改版本,其中:

  • 核心 C1 和 C2 分别制作 x 和 y 的本地副本。
  • 许多程序员可能假设如果 r2 和 r4 都等于 0,那么 r1 和 r3 也应该为 0,因为store S1 和 S2 必须在load L2 和 L4 之后插入到内存顺序中。

然而,图 4.3 展示了一个执行,显示 r1 和 r3 绕过每个核心写入缓冲区中的值 NEW。

事实上,为了保持single-thread sequential semantics,每个核心都必须按照程序顺序看到自己store的效果,即使store还没有被其他核心观察到。因此,在所有 TSO 执行下,本地副本 r1 和 r3 将始终设置为 NEW 值。

TSO与SC的差异

1. 所有核心都将它们的load和store插入到内存顺序 `<m` 中,考虑到它们的程序顺序,无论它们是相同还是不同的地址(即 a==b 或 a!=b)。有四种情况:

* If `L(a) <p L(b)` => `L(a) <m L(b)` /* Load -> Load */
* If `L(a) <p S(b)` => `L(a) <m S(b)` /* Load -> Store */
* If `S(a) <p S(b)` => `S(a) <m S(b)` /* Store -> Store */
* 删除:If `S(a) <p L(b)` => `S(a) <m L(b)` /* Store -> Load */ => 修改1:Enable FIFO Write Buffer

2. 每个load从它之前的最后一个store中获取它的值到相同的地址:

* 删除:Value of `L(a)` = Value of `MAX <m {S(a) | S(a) <m L(a)}` => 修改2:Need Bypassing
* Value of `L(a)` = Value of `MAX <m {S(a) | S(a) <m L(a) or S(a) <p L(a)}`

最后一个令人费解的等式表明,load的值是最后store到同一地址的值,该地址要么是(a)按内存顺序在它之前,要么(b)按程序顺序在它之前(但可能在它之后)内存顺序,选项(b)优先(即,write buffer绕过覆盖内存系统的其余部分)。

3. 第 (1) 部分必须扩充以定义 FENCE:/* 修改3: FENCEs Order Everything */

* If `L(a) <p FENCE` => `L(a) <m FENCE`   /* Load -> FENCE */
* If `S(a) <p FENCE` => `S(a) <m FENCE`   /* Store -> FENCE */
* If `FENCE <p FENCE` => `FENCE <m FENCE` /* FENCE -> FENCE */
* If `FENCE <p L(a)` => `FENCE <m L(a)`   /* FENCE -> Load */
* If `FENCE <p S(a)` => `FENCE <m S(a)`   /* FENCE -> Store */

因为 TSO 已经需要除 Store -> Load 之外的所有顺序,也可以将 TSO FENCE 定义为仅排序:

* If `S(a) <p FENCE` => `S(a) <m FENCE` /* Store -> FENCE */
* If `FENCE <p L(a)` => `FENCE <m L(a)` /* FENCE -> Load */

TSO的实现

TSO/x86 的实现问题与 SC 类似,只是增加了每个核心中的 FIFO writer buffer。

  • Load 和 store 按照po的顺序,离开该core;

  • Load 要么 bypass write buffer 中的值,要么像以前一样等待切换。

  • 如果 buffer 未满,则 store 进入 FIFO write buffer 的尾部;如果 buffer 已满,则 store stall 核心。

  • 当 switch 选择核心 Ci 时,它要么执行下一次 load,要么执行 write buffer 头部的 store。

        最后,多线程为 TSO 引入了一个微妙的写入缓冲区问题。 TSO write buffer在逻辑上对每个线程上下文(虚拟内核)都是私有的。因此,在多线程内核上,一个线程上下文不应该bypassing另一个线程上下文的write buffer。这种逻辑分离可以通过每个线程上下文的写入缓冲区来实现,或者更常见的是,by using a shared write buffer with entries tagged by thread-context identifiers that permit bypassing only when tags match.

如何定义好的memory consistency model?

一个良好的内存一致性模型应当具备 Sarita Adve 提出的三个P,以及我们的第四个P:

  • *可编程性*:一个良好的模型应该使编写多线程程序变得(相对)容易。这个模型应该对大多数用户来说是直观的,即使是那些没有阅读详细细节的用户也是如此。它应该是精确的,以便专家可以拓展所允许的范围。
  • *性能*:一个良好的模型应该在合理的功耗、成本等条件下促进高性能的实现。它应该给予实现者广泛的选项余地。
  • *可移植性*:一个良好的模型应该被广泛采用,或者至少提供向后兼容性或在不同模型之间进行转换的能力。
  • *精确性*:一个良好的模型应该被精确定义,通常通过数学方式。自然语言过于模糊不清,不能让专家拓展所允许的范围。

SC和TSO模型的优劣如何?
运用这四个P来分析:

  •  *可编程性*:SC 模型是最直观的。TSO 模型也接近,因为对于常见的编程惯例,它的行为类似于 SC 模型。然而,隐含的非 SC 执行可能会对程序员和工具作者产生影响。
  •  *性能*:对于简单的核心,TSO 模型可以比 SC 模型提供更好的性能,但通过推测可以减小二者之间的差距。
  • *可移植性*:SC 模型被广泛理解,而 TSO 模型得到了广泛采用。
  • *精确性*:SC 模型和 TSO 模型都有明确的形式定义。

总的来说,SC 模型和 TSO 模型非常接近,尤其是与下一章讨论的更复杂和更宽松的 memory consistency 模型相比较。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/606567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1-3ARM_GD32点亮LED灯

简介&#xff1a; 最多可支持 112 个通用 I/O 引脚(GPIO)&#xff0c;分别为 PA0 ~ PA15&#xff0c;PB0 ~ PB15&#xff0c;PC0 ~ PC15&#xff0c;PD0 ~ PD15&#xff0c;PE0 ~ PE15&#xff0c;PF0 ~ PF15 和 PG0 ~ PG15&#xff0c;各片上设备用其来实现逻辑输入/输出功能。…

使用DBeaver连接postgreSql提示缺少驱动

重新安装电脑之后用dbeaver链接数据库的时候&#xff0c;链接PG库一直提示缺少驱动&#xff0c;当选择下载驱动的时候又非常非常慢经常失败&#xff0c;尝试了一下更改源然后下载库驱动就非常快了&#xff0c;当然也包括dbeaver的自动更新。 方法&#xff1a;点击菜单栏【窗口…

霸榜!近期不容错过的3个AI开源项目,来了

在人工智能领域的迅速发展下&#xff0c;各种AI开源项目如雨后春笋般涌现&#xff0c;今天就来为大家介绍近期三个热门的AI开源项目&#xff0c;它们不仅技术前沿&#xff0c;而且非常实用&#xff0c;对于技术爱好者和业界专家来说&#xff0c;绝对不容错过。 一键创作漫画和视…

基于无监督学习算法的滑坡易发性评价的实施(k聚类、谱聚类、Hier聚类)

基于无监督学习算法的滑坡易发性评价的实施 1. k均值聚类2. 谱聚类3. Hier聚类4. 基于上述聚类方法的易发性实施本研究中的数据集和代码可从以下链接下载: 数据集实施代码1. k均值聚类 K-Means 聚类是一种矢量量化方法,最初来自信号处理,旨在将 N 个观测值划分为 K 个聚类,…

生信分析进阶2 - 利用GC含量的Loess回归矫正reads数量

在NGS数据比对后&#xff0c;需要矫正GC偏好引起的reads数量误差可用loess回归算法&#xff0c;使用R语言对封装的loess算法实现。 在NIPT中&#xff0c;GC矫正对检测结果准确性非常重要&#xff0c;具体研究参考以下文章。 Noninvasive Prenatal Diagnosis of Fetal Trisomy…

向量数据库:PGVector

一、PGVector 介绍 PGVector 是一个基于 PostgreSQL 的扩展插件&#xff0c;为用户提供了一套强大的向量存储和查询的功能&#xff1a; 精确和近似最近邻搜索单精度&#xff08;Single-precision&#xff09;、半精度&#xff08;Half-precision&#xff09;、二进制&#xff…

【代码随想录——栈与队列】

1.栈和队列理论基础 栈和队列的原理大家应该很熟悉了&#xff0c;队列是先进先出&#xff0c;栈是先进后出。 2.用栈实现队列 type MyQueue struct {head []intheadSize intstore []intstoreSize int }func Constructor() MyQueue {return MyQueue{head : make([]int,100),h…

AI智剪新风尚:一键操作,批量视频剪辑轻松入门

随着科技的飞速进步&#xff0c;人工智能(AI)已逐渐渗透到我们生活的各个领域&#xff0c;其中&#xff0c;AI视频剪辑技术的出现&#xff0c;为视频制作带来了革命性的变革。如今&#xff0c;一键操作、批量处理的AI智剪正成为视频剪辑的新风尚&#xff0c;让剪辑工作变得前所…

品牌舆情监测工作要怎么做?

一个负面舆论的传播&#xff0c;可能在短时间内对企业品牌形象造成巨大损害&#xff0c;甚至引发舆情危机。因此&#xff0c;如何有效地进行品牌舆情监测&#xff0c;成为企业不可忽视的问题。伯乐网络传媒多年网络公关、舆情监测经验&#xff0c;今天就来给大家分享一下。 一、…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-网络安全

&#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件设计师考点暴击 ⭐&#x1f170;️进入狂砍分⭐ ⭐软件设计师高频考点文档&#xff0c; ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ &#x1f3b6;&#xff08;A) 考点1&#xff0c;网络攻击 理解记忆 &#…

Kubernetes——基础认识

目录 一、简介 1.Kubernetes是什么 2.Kubernetes特性 2.1自我修复 2.2弹性伸缩 2.3自动部署和回滚 2.4服务发现和负载均衡 2.5机密和配置管理 2.6存储编排 2.7批量处理 二、Kubernetes架构与组件 1.Master 1.1Kube-ApiServer 1.2Kube-Scheduler调度器 1.3Kube-C…

机器学习(二) ----------K近邻算法(KNN)+特征预处理+交叉验证网格搜索

目录 1 核心思想 1.1样本相似性 1.2欧氏距离&#xff08;Euclidean Distance&#xff09; 1.3其他距离 1.3.1 曼哈顿距离&#xff08;Manhattan Distance&#xff09; 1.3.2 切比雪夫距离&#xff08;Chebyshev distance&#xff09; 1.3.3 闵式距离&#xff08;也称为闵…

OpenHarmony 4.0 实战开发——分布式任务调度浅析

1 概述 OpenHarmony 分布式任务调度是一种基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性的任务调度方式。它通过构建一种统一的分布式服务管理机制&#xff0c;包括服务发现、同步、注册和调用等环节&#xff0c;实现了对跨设备的应用进行远程启动、远程调用、…

ChatPPT开启高效办公新时代,AI赋能PPT创作

目录 一、前言二、ChatPPT的几种用法1、通过在线生成2、通过插件生成演讲者模式最终成品遇到问题改进建议 三、ChatPPT其他功能 一、前言 想想以前啊&#xff0c;为了做个PPT&#xff0c;我得去网上找各种模板&#xff0c;有时候还得在某宝上花钱买。结果一做PPT&#xff0c;经…

拼多多投产比怎么逐步调高

提高拼多多的投产比&#xff08;ROI&#xff09;需要综合考虑多个因素&#xff0c;包括点击量、转化率、客单价以及点击花费。以下是一些有效的方法&#xff1a; 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自…

Aigtek安泰电子邀您莅临2024中国微米纳米技术学会柔性电子技术与应用创新论坛

2024年5月18日-20日&#xff0c;中国微米纳米技术学会柔性电子技术与应用创新论坛将于深圳登席路国际酒店举办&#xff0c;届时Aigtek安泰电子将携一众明星产品及专业测试解决方案亮相本次论坛&#xff0c;我们诚邀您莅临No.A39展位参观、洽谈与观摩&#xff01; - 时间&#x…

8-3 html中的表单标签 select和textarea

跟学b站黑马程序员pink老师&#xff0c;之前发过长篇&#xff0c;太长不好阅读&#xff0c;拆分成短篇 8.4.3 select下拉表单元素 如果在页面中有多个选项让用户选择&#xff0c;并且想要节约页面空间&#xff0c;我们可以用<select>标签来定义下拉列表 1.<select&g…

HawkEye—高效、细粒度的大页管理算法

文章目录 HawkEye—高效、细粒度的大页管理算法1.作者简介2.文章简介与摘要3.简介(1).当时的SOTA系统概述LinuxFreeBSDIngens (2).HawkEye 4.动机(1).地址翻译开销与内存膨胀(2).缺页中断延迟与缺页中断次数(3).多处理器大页面分配(4).如何测算地址翻译开销&#xff1f; 5.设计…

搜维尔科技:OptiTrack是基于LED墙虚拟制作舞台的最佳选择

OptiTrack因其绝对精度、易用性、可靠性以及与现场工具的完美集成而被选中&#xff0c;仍然是全球首屈一指的基于 LED 墙的虚拟制作舞台的选择。 当今虚拟制作阶段的低延迟、超精确摄像机跟踪标准 /- 0.2 毫米 位置精度1 < 10 毫秒 系统延迟 /- 0.1 度 旋转精度2 电影…

Spring Boot集成Ldap快速入门Demo

1.Ldap介绍 LDAP&#xff0c;Lightweight Directory Access Protocol&#xff0c;轻量级目录访问协议. LDAP是一种特殊的服务器&#xff0c;可以存储数据数据的存储是目录形式的&#xff0c;或者可以理解为树状结构&#xff08;一层套一层&#xff09;一般存储关于用户、用户…