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

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(使用前将#替换为@)

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

  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重
  • 找出 CPU 时钟频率(每个内核、每个处理器)

    像 CPUz 这样的程序非常擅长提供有关系统的深入信息 总线速度 内存时序等 但是 是否有一种编程方法可以计算每个核心 以及每个处理器 在每个 CPU 具有多个核心的多处理器系统中 频率 而无需处理 CPU 特定信息 我正在尝试开发一个反作
  • 清除通过在 IPython 中绘图分配的内存

    我正在 IPython QtConsole 和 Notebook 中绘制一些大图 这些占用了大量的内存 但是一旦它们被绘制出来 我就不再需要它们了 它们就可以走了 我怎样才能释放内存 None以下作品 close clf cla reset
  • 我要恢复我的记忆!我怎样才能真正处理一个控件?

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • 写入二维数组时出现分段错误

    我的程序中有一个小的内存访问问题 但我没有找到错误 也许有人可以帮助我 我创建了一个新类型来存储 RGB 颜色值 该类型看起来像 typedef struct pixel unsigned char r unsigned char g un
  • JMeter 负载服务器会影响我的结果吗?

    我正在使用亚马逊 EC2 实例 大型 作为使用 1 000 个线程的负载服务器来运行 JMeter 测试 负载服务器CPU利用率稳定在90 左右 内存利用率稳定在70 是否存在关于负载服务器在什么时候没有足够资源 内存或 CPU 而导致负载
  • 为什么要在堆而不是堆栈上分配内存? [复制]

    这个问题在这里已经有答案了 可能的重复 什么时候最好使用堆栈而不是堆 反之亦然 https stackoverflow com questions 102009 when is it best to use a stack instead
  • WPF 每次打开和关闭窗口时都会增加内存

    我已经做了非常简单的测试 只是为了了解 wpf 如何与内存一起工作 我用一个窗口创建一个项目 其中有一个Button 第二个窗口完全是空的 当我按下Button单击打开第二个窗口 窗口 1 后面的代码
  • VMA和ELF段之间的关系

    我需要确定 ELF 可执行文件的可加载段的 VMA VMA 可以从以下位置打印 proc pid maps VMA 之间的关系如下所示maps可加载段对我来说也很清楚 每个段由一个或多个 VMA 组成 内核使用什么方法从 ELF 段形成 V
  • Nodejs 异步函数是否使用所有 CPU 核心?

    如果我使用异步函数或带有回调的函数 例如本机 fs 模块 http 等 它们会默认在所有 cpu 核心上运行吗 或者整个系统只使用 1 个核心 Node js 中的一些异步操作 例如文件 I O fsmodule 将通过 libuv 中的线
  • SQLite 性能基准 - 为什么 :memory: 这么慢...只有磁盘速度的 1.5 倍?

    为什么 sqlite 中的 memory 这么慢 我一直在尝试查看使用内存中的 sqlite 与基于磁盘的 sqlite 是否可以获得任何性能改进 基本上我想用启动时间和内存来换取非常快速的查询not在应用程序过程中击中磁盘 然而 以下基准
  • VBA Excel 大数据操作需要很长时间

    我有两个Excel文件 第一个 Excel 文件包含 人员姓名 和 出席总天数 列 前任 PersonName TotalDays xyz abcd 另一个 Excel 文件包含人员姓名 日期和状态 出席 缺席 PersonName Dat
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到
  • 删除指向对象的 C++ 指针

    我认为删除命令会释放我分配的内存 有人可以解释为什么删除后我似乎仍然有内存在使用吗 class Test public int time int main Test e e new Test e gt time 1 cout lt lt e
  • 为什么 CUDA 内存复制速度会这样,有一些恒定的驱动程序开销?

    在我的旧 GeForce 8800GT 上使用 CUDA 内存时 我总是会遇到奇怪的 0 04 毫秒开销 我需要将 1 2K 传输到设备的常量内存中 处理其中的数据并从设备中仅获取一个浮点值 我有一个使用 GPU 计算的典型代码 alloc
  • 汇编PC相对寻址模式

    我正在研究数据路径 并一直在尝试理解分支指令 这就是我的理解 在 MIPS 中 每条指令都是 32 位 这是 4 个字节 所以下一条指令将是四个字节之外 举个例子 我说PC地址是128 我的第一个问题是理解这个128意味着什么 我目前的信念
  • Valgrind 输出中的错误摘要?

    我看过一些关于 valgrind 的帖子 但没有一篇帖子帮助我理解 valgrind 输出的解释 我用 valgrind 运行了两个程序 都有内存泄漏 测试 1 的示例输出 20422 LEAK SUMMARY 20422 definite
  • 3 操作数 imul 指令在 ia-32 汇编中到底起什么作用?

    我正在阅读说明 imul 0xffffffd4 ebp ebx 4 eax 我对它到底在做什么感到困惑 我明白那个imul乘法 但我无法弄清楚语法 我知道并且更喜欢 Intel MASM 语法 所以我将使用它 请注意 操作数的顺序在 AT

随机推荐

  • 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