为什么负载不能绕过同一核心上的另一个线程从写入缓冲区写入的值?

2024-01-04

如果CPU核心使用写缓冲区,则负载可以从写缓冲区绕过最近的存储到引用的位置,而无需等到它出现在缓存中。但是,正如它所写的记忆一致性和连贯性入门 https://lagunita.stanford.edu/c4x/Engineering/CS316/asset/A_Primer_on_Memory_Consistency_and_Coherence.pdf,如果 CPU 遵循 TSO 内存模型,则

...多线程为 TSO 引入了一个微妙的写入缓冲区问题。输电系统组织 写缓冲区在逻辑上是每个线程上下文私有的(虚拟 核)。因此,在多线程核心上,一个线程上下文不应该 从另一个线程上下文的写入缓冲区绕过。这个逻辑 可以通过每线程上下文写入缓冲区来实现分离 或者,更常见的是,通过使用带有标记条目的共享写入缓冲区 通过线程上下文标识符,仅当标记时才允许绕过 匹配。

我无法理解这种限制的必要性。您能否举个例子,说明允许某个线程绕过同一核心上另一个线程写入的写入缓冲区条目会导致违反 TSO 内存模型?


TSO 与顺序一致性 (SC) 不同的经典示例是:

(这是示例 2.4 -http://www.cs.cmu.edu/~410-f10/doc/Intel_Reordering_318147.pdf http://www.cs.cmu.edu/~410-f10/doc/Intel_Reordering_318147.pdf)

  thread 0     |     thread 1
---------------------------------
write 1-->[x]  |   write 1-->[y]    
a = read [x]   |   b = read  [y]    
c = read [y]   |   d = read  [x]    

两个地址最初都存储 0。问题是:c=d=0 是一个有效的结果吗?我们知道 a 和 b 必须转发它们之前的存储,因为它们与本地存储的地址匹配,并且可能会从本地线程存储缓冲区转发。但是,c 和 d 可能不会跨上下文转发,因此它们可能仍显示旧值。

这里有趣的问题是,由于每个线程观察两个存储,并转发本地存储,并且 a=1,c=0 的结果意味着 t0 首先看到到 [x] 的存储。 b=1,d=0 的结果意味着 t1 看到对 [y] 的存储首先发生。事实上,这是由于存储缓冲区转发而可能产生的结果,这会破坏顺序一致性,因为它要求所有上下文都同意相同的全局存储顺序。相反,x86 采用了允许这种情况的较弱的 TSO 模型。

全局转发存储实际上是不可能的,因为缓冲存储不一定被提交,这意味着它们甚至可能处于分支错误预测的错误路径中。本地转发很好,因为刷新也会消除从它们转发的所有负载,但在多个上下文中,您没有这样的负载。 我还看到了尝试在核心之外全局缓冲存储的工作,但由于延迟和带宽,这不太实用。为了进一步阅读,这里有一篇可能相关的最新论文 -http://ieeexplore.ieee.org/abstract/document/7783736/ http://ieeexplore.ieee.org/abstract/document/7783736/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么负载不能绕过同一核心上的另一个线程从写入缓冲区写入的值? 的相关文章

  • Python 中海量 numpy 数组的内存高效排序

    我需要使用 numpy 对非常大的基因组数据集进行排序 我有一个 26 亿个浮点数的数组 维度 868940742 3 加载后 它会占用我机器上大约 20GB 的内存 我有一台 2015 年初的 13 英寸 MacBook Pro 配备 1
  • 如何确定 Windows 10 上可执行二进制文件的体系结构

    给定一些Random exe在 Windows 上 我如何确定 它的CPU架构 例如Intel ARM 以及 它的位数 例如 32 或 64 我可以使用文件资源管理器 其他工具或编程方法中的属性吗 Cygwin https www cygw
  • 为什么必须对存储在堆中的函数的局部变量调用delete?

    假设您有以下函数 void doSomething int data new int 100 为什么这会产生内存泄漏呢 由于我无法在函数外部访问此变量 为什么编译器不在每次调用此函数结束时自行调用delete 为什么这会产生内存泄漏呢 因为
  • 我是否想访问地址零?

    常量 0 在 C 和 C 中用作空指针 但正如问题中 指向特定固定地址的指针 https stackoverflow com questions 2389251 pointer to a specific fixed address分配固定
  • 哪些简单的改变对您的 Delphi 程序产生了最大的改进 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个 Delphi 2009 程序 需要处理大量数据 并且需要尽可能快且不使用太多内存 What 小简单您是否对 Delphi 代
  • 如何根据CPU能力实现渲染器

    我想知道在 JavaScript 中实现渲染器的最佳方法是什么 这里真正重要的并不是渲染的内容部分 我更想知道何时以及如何有效地运行渲染器代码 目前 我有window setInterval renderFunc 1000 20 每 50
  • C++20 内存模型中释放序列定义的更改有何影响?

    考虑这个程序 Initially std atomic
  • Linux 内核线程没有地址空间

    为什么Linux内核线程没有地址空间 对于任何要执行的任务 它都应该有一个内存区域 对吗 内核线程的文本和数据去了哪里 内核线程确实有一个地址空间 只是他们都有同一个 这并不妨碍它们各自拥有不同的堆栈 文本和数据放置在内核地址空间 由所有线
  • Biopython 成对比对导致循环运行时分段错误

    我正在尝试运行成对全局对齐方法biopython循环大约 10000 对字符串 每个字符串平均长度为 20 个字符 对一对序列运行该方法效果很好 但在循环中运行此操作 低至 4 对 会导致分段错误 如何解决这个问题 from Bio imp
  • C++ 中的向量存储

    我希望存储一个大的 d 维点向量 d 固定且小 如果我定义一个Point as vector
  • 哪种架构称为非均匀内存访问(NUMA)?

    根据wiki http en wikipedia org wiki Non uniform memory access 非均匀内存访问 NUMA 是一种用于多处理的计算机内存设计 其中内存访问时间取决于相对于处理器的内存位置 但尚不清楚它是
  • 设置最大 CUDA 资源

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • 除了内存管理之外,QObject 的父对象还用于什么?

    我知道 当一个QObject http doc qt io qt 5 qobject html被摧毁了 它也摧毁了它所有的孩子 但是 在我最近的所有 Qt 代码中 我总是声明任何类的成员 例如 QMainWindow https doc q
  • 大师系统要求

    我们将使用 Virtuoso 来存储 RDF 三重计数一开始将为 1 亿 我需要知道典型的 RAM CPU 磁盘等应该是什么 查询将使用 SPARQL 并且查询会有点复杂 请提供您的意见 Virtuoso 版本 6 x 三元组 四元组 的平
  • 运行时之前初始化的数据段值将存储在哪里?

    通常数据段在C code位于RAM易失性存储器 由初始化数据段组成 未初始化数据段 BSS 堆栈内存和堆 堆栈内存仅在运行时调用例程和在push and pull的价值观 堆用于动态内存分配调用malloc calloc and reall
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • 使用 parse.com 并遇到分配内存问题

    我是编程新手 过去 3 个月我一直在制作应用程序 并学到了一些东西 但我还没有遇到如何解决这个问题 我一直使用 Parse com 作为我的服务器 发送图片 保存用户数据等 有了所有这些数据 如果我多次打开某些活动 特别是带有图片的活动 应
  • 1 MB 或更多的 Java 字节数组占用 RAM 的两倍

    在 Windows 10 OpenJDK 11 0 4 x64 上运行以下代码会生成输出used 197 and expected usage 200 这意味着包含 100 万个元素的 200 个字节数组大约占用 200 个字节 200MB
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚

随机推荐

  • Spring Data:注入的存储库为空

    不久前 我让 Spring Data 的存储库在 Controller 中工作 将数据访问移至 Service 后 它停止工作 对我来说一切看起来都很好 为什么这个 DI 失败了 这是我的弹簧配置
  • iOS:在视频中裁剪视频左侧和底部的奇怪绿线

    如何删除视频上的绿线 当裁剪视频 2 或 3 次时 视频中的左侧或底部或左侧和底部均显示绿色或混合绿红闪烁线 视频裁剪方法 void cropButton CGRect cropFrame self cropView croppedImag
  • 如何修复使用 pdfbox java 链接的可访问性标记注释失败/错误?

    使用 adobe 找到了解决方案 https answers acrobatusers com How I fix Tagged Annotations fail error accessibility links q228128 aspx
  • C# 4 和 CLR 兼容性

    C 版本 4 的所有新增内容 动态 代码契约等 是否预计将在当前的 NET CLR 上运行 或者是否也有计划的 NET 升级 C 4 将需要 NET 4 0 CLR
  • 为什么当我使用命令行进行屏幕录制时,屏幕录制会出现错误[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试通过以下方式对我的 Android 设备进行屏幕录制this http developer android com about v
  • Rails:已完成 401 未经授权

    我收到此错误 但我不知道为什么 我特别排除了 CSRF 检查 这 webhook即使在生产中 该方法也有效 其他类似的问题是关于 Devise 的 但我没有在此控制器中使用 Devise stripes controller rb clas
  • 从 Node.js 将 Json 存储到 MySQL 数据库

    我知道这个问题已经被问过很多次了 但是经过激烈的搜索 我似乎找不到我正在寻找的答案 我有一个 js 格式的脚本 它创建一个 json 数据数组 然后将其存储在一个 json 文件中 阵列设置为 var sessionState curren
  • 如何将光标移动到文档末尾?

    我想将光标移动到脚本开头的文档末尾 我怎么做 我已经知道如何将光标移动到文档的开头 如下所述here https stackoverflow com questions 26945026 how can i move the cursor
  • 如何通过 https 启动 java servlet?

    我正在尝试在 eclipse 中的 tomcat 上运行 servlet 当我在服务器上运行时 servlet 会运行并为我提供如下链接 http localhost 8443 AuthServer 服务器 我已将 Tomcat 服务器配置
  • google app engine webapp 中 jinja2 自动转义的问题

    我决定安装 jinja2 与我的 webapp 应用程序一起使用 以支持自动转义功能 因此 我将 jinja2 安装到 python 2 5 中 并在项目中创建了一个符号链接来指向该目录 大部分情况下工作正常 除了 当我实际尝试使用 aut
  • 如何更改 Visual Studio 2012 Express 项目模板?

    例如 我不希望我的类和接口符合 StyleCop 在非 Express 版本中 我们可以在以下位置找到并更改类模板 C Program Files x86 Microsoft Visual Studio 11 0 Common7 IDE I
  • 更改 SFSafariViewController 的色调颜色?

    正如标题所说 如何更改 iOS 9 中新的 SFSafariViewController 的整体色调颜色 iOS 10 的一些消息 现在我们有两个属性来控制整体外观SFSafariViewController source link htt
  • Java Runtime.getRuntime().exec() 带引号

    我正在尝试通过 linux 上的 exec 调用运行 ffmpeg 但是我必须在命令中使用引号 ffmpeg 需要它 我一直在查看 processbuilder 和 exec 的 java 文档以及 stackoverflow 上的问题 但
  • 对服务与工厂感到困惑

    据我了解 当在工厂内部时 我返回一个被注入控制器的对象 当在服务内部时 我正在使用以下方法处理对象this并且不返回任何东西 我假设服务是始终是单身人士 并且一个新工厂对象被注入到每个控制器中 然而 事实证明 工厂对象也是单例对象吗 演示示
  • JSF MVC设计问题

    我有一个 JSF 支持 bean 设计问题 现在 我的支持 bean 保存 UI 显示信息和业务模式数据 人们建议模型和视图应该分开 那么创建不同的 bean 来保存 UI 显示数据并让支持 bean 引用它是个好主意吗 那么创建不同的 b
  • 我可以只选择 MYSQL 中的一列而不是全部,以使其更快吗?

    我想做这样的事情 query mysql query SELECT userid FROM users WHERE username username the user id 因为我想要的只是与用户名对应的用户ID 通常的方法是 query
  • 如何格式化 SQLCMD 输出

    我正在使用下面的命令行使用 SQLCMD 运行 SQL 查询 sqlcmd S Server Q select top 100 From people d people t 10 该表有 20 列 当我查看输出命令行窗口时 文本会换行并使其
  • 客户端 MVC 与服务器 MVC

    我希望从其他用户那里获得一些关于服务器端 MVC 优势的意见 拥有许多 javascript 库的强大功能 服务器端 MVC 服务器还有什么用处呢 您可以轻松地使用带有模板和 REST API 的客户端 MVC 来创建响应速度更快的应用程序
  • subprocess.Popen,从子进程(子进程)获取变量[重复]

    这个问题在这里已经有答案了 我想知道如何处理它 我从子进程到父进程获取变量 值 我正在将子进程作为脚本运行 父级看起来像 import subprocess p subprocess Popen abaqus python getData
  • 为什么负载不能绕过同一核心上的另一个线程从写入缓冲区写入的值?

    如果CPU核心使用写缓冲区 则负载可以从写缓冲区绕过最近的存储到引用的位置 而无需等到它出现在缓存中 但是 正如它所写的记忆一致性和连贯性入门 https lagunita stanford edu c4x Engineering CS31