CPU什么时候可以忽略LOCK前缀并使用缓存一致性?

2023-12-22

我原本以为MESI等缓存一致性协议可以提供伪原子性but仅跨个人内存加载/存储指示。如果我执行获取、修改、写入指令组合,仅使用 MESI 将无法在第一条指令到最后一条指令之间强制执行原子性。

然而,英特尔参考手册第 3a 卷第 8 节说:

8.1.4 LOCK 操作对内部处理器缓存的影响

对于 P6 和更新的处理器系列,如果内存区域 在 LOCK 操作期间被锁定的信息被缓存在处理器中 正在执行 LOCK 操作作为回写存储器并且是 完全包含在高速缓存行中,处理器可能不会断言 总线上的 LOCK# 信号。相反,它会修改内存位置 内部并允许其缓存一致性机制来确保 操作以原子方式执行。这个操作称为“缓存 锁定。”缓存一致性机制自动防止两个或 更多处理器缓存了相同的内存区域 同时修改该区域的数据。

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf

这似乎与我的理解相矛盾,暗示不需要使用 LOCK 指令,因为可以使用缓存一致性?


锁定作为一个概念与实际的总线 #lock 信号之间存在差异 - 后者是实现第一个锁定的方法之一。缓存锁定是另一种更简单、更高效的方法。

MESI 协议保证,如果一条线路由某个核心(无论是否修改)独占,则没有其他人拥有它。在这种情况下,您可以通过在缓存中添加简单的标志来自动执行多个操作,该标志会阻止外部窥探,直到操作完成。这将具有与锁概念所规定的相同的效果,因为没有其他人可以改变甚至观察中间值。

在更复杂的情况下,该行不是由单个高速缓存保存(例如,它可能在多个高速缓存之间共享,或者访问可能会在两个高速缓存行之间分割,并且只有一个高速缓存在您的高速缓存中 - 场景列表通常是实现具体且可能没有由 CPU 制造商披露) - 在这种情况下,您可能不得不求助于“较重”的大炮,例如总线锁,这通常可以保证no one can do anything在共享巴士上。显然,这对性能有巨大影响,因此可能仅在您别无选择时才使用。在大多数情况下,一个简单的缓存级锁就足够了。请注意,像 Intel TSX 这样的新方案似乎以类似的方式工作,当您在缓存中工作时提供优化。

顺便说一句 - 您关于单个指令的伪原子性的假设也是错误的 - 如果您提到单个内存操作(加载或存储),那么它是正确的,因为一条指令可能包含多个指令(inc [addr]例如没有锁就不是原子的)。您的引用中也出现的另一个限制是访问需要包含在缓存行中 - 即使在单个加载或存储中,分割行也不能保证原子性(因为它们通常实现为稍后合并的 2 个内存操作) )。

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

CPU什么时候可以忽略LOCK前缀并使用缓存一致性? 的相关文章

  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 线程池,C++

    我正在使用 C 开发一个网络程序 我想实现一个 pthread 池 每当我从接收套接字接收到一个事件时 我都会将数据放入线程池中的队列中 我正在考虑创建 5 个独立的线程 并将持续检查队列以查看是否有任何传入数据需要完成 这是一个非常简单的
  • 单线程程序中可以有竞争条件吗?

    您可以在here https en wikipedia org wiki Race condition Software关于什么是竞争条件的一个很好的解释 我最近看到很多人对竞争条件和线程做出了令人困惑的陈述 我了解到竞争条件只能发生在线程
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何在程序中将自己缝合到自己的尾部,无限循环地封装 64KB 代码段?

    如果指令的顺序执行经过偏移量 65535 则8086将从同一代码段中的偏移量 0 处获取下一个指令字节 接下来的 COM 程序利用这一事实 不断将其整个代码 总共 32 个字节 缝合到自己的尾部 环绕在 64KB 代码段中 你可以称之为二元
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • Java 8:并行 FOR 循环

    我听说 Java 8 提供了很多关于并发计算的实用程序 因此我想知道并行给定 for 循环的最简单方法是什么 public static void main String args Set
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 终结器线程的范围是什么 - 每个应用程序域或每个进程?

    根据我的所有阅读 应该有一个 GC 线程来调用所有终结器 现在的问题是这个 一个 线程的范围是什么 每个进程或每个应用程序域 因为域的整体目的是在一个进程空间中分离并创建 独立 的不同应用程序 I read here http dn cod
  • 在 Python 中打印守护线程异常

    Python 不会打印守护线程中引发的异常的回溯消息 例如 以下代码创建一个守护线程并在新线程中引发异常 def error raiser raise Exception import threading thread threading
  • docker build --no-cache 是否构建不同的层?

    几个月前 我决定使用以下命令设置我的项目构建 docker 镜像的 CIno cacheflag 我认为最好不要冒险让 docker 使用旧的缓存层 我现在才意识到 我的图像各层的 sha 总是不同的 即使新构建的图像应该生成与之前构建的相
  • 调试 Java InterruptedException,即查找原因

    在调试Android应用程序时 有时中断异常发生并使应用程序崩溃 我已经能够在默认异常处理程序上设置断点 但调用堆栈不提供信息 at java util concurrent locks AbstractQueuedSynchronizer
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • java中使用多线程调用同一类的不同方法

    我有一个类 如下所示 具有三种方法 public class MyRunnable implements Runnable Override public void run what code need to write here to c
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码

随机推荐

  • 为什么没有 asio::ssl::iostream? (以及如何实施)

    我目前正在探索 Asio 库 并且拥有用于常规 TCP 连接的工作代码 我用了asio ip tcp iostream对象 因为我想要传输的东西已经可以序列化到 iostreams 从 iostreams 反序列化 所以这非常方便并且对我来
  • 如何创建具有多个使用相同参数类型的构造函数的类

    我正在尝试做这样的事情 public class Arquivo private File diretorio null public Arquivo File dir this diretorio dir public Arquivo S
  • 如何将参数从活动传递给服务?

    嘿 我正在从一项活动开始一项服务 我通过以下方式从活动中调用服务startService 但我希望我的活动中的一些变量在我在活动中调用的服务代码中使用 所以请告诉我该怎么做 有没有办法将参数从调用活动传递给服务 提前致谢 您可以添加一个Bu
  • LuaSocket socket/core.dll 需要的位置?

    当我使用 local socket require socket core 它工作正常 dll 位于 dir socket core dll 但是当我移动 dll 时说 dir folder core dll 并使用 local socke
  • Jquery 和 Ajax Post 问题

    我试图在通过 ajax 从服务器返回的元素上添加单击事件 显然 我必须在返回响应中附加我的 js 文件而不是我的主脚本 这是最佳实践吗 我是否必须创建单独的 js 文件才能在返回文本上添加事件 Example 我的 Jquery selec
  • 指定 http 请求/响应的区域设置

    我有一个 ReSTful Web 服务 需要解析请求中的区域设置敏感数据 该数据可以位于 XML 正文中 也可以是查询字符串的一部分 是否有任何可接受的方法来确定发送数据的区域设置 以及扩展应发送响应的区域设置 一种选择是简单地向客户端指定
  • Java 9 接口:为什么 default 修饰符转换为 public 修饰符

    我的问题是关于interface 我创建一个接口并定义四个方法 第一个方法是private方法 第二个是default方法 第三个是static方法 第四个是abstract method 编译此接口并检查其配置文件后 default方法被
  • 如何从 XSD 创建 pojo 类?

    我正在使用 Spring maven 插件 我想从特定文件夹中指定的 xml 模式创建 POJO 类 我尝试过xjc通过java代码命令 但它不生成该类 其次 我尝试过jaxb 但它处理的是xml文件不是xsd编组 解组时的架构 我认为这不
  • Node.js / Express / Mocha / Supertest Rest API - 空请求正文

    我已经尽我所能寻找解决方案 我唯一发现的是一个未回复的帖子 如果我忽略了某些事情 我深表歉意 问题是当我尝试获取POST中的值 createQuestionAPI 主体为空 未定义 我收到这样的错误Cannot read proprety
  • cookie“.AspNetCore.Identity.Application”已设置“SameSite=None”,并且还必须设置“Secure”

    我点击了这些链接 准备您的身份服务器 https www thinktecture com en identity samesite prepare your identityserver 如何删除 Samesies cookie http
  • 在 Rails 4 中使用图像作为单选按钮标签

    我正在尝试使用助手 collection radio buttons 将图像显示为标签 并希望将 image id 保存到模型中 以便我可以检索 url 到目前为止 我已经想出了一个显示单选按钮和 image url 的方法标签 我已经注意
  • mixLatest 中的可选 Observables

    正如 rx 中定义的 mixLatest 仅当所有值至少更改一次时才会发出 只要每个源 Observables 已发出至少一个 物品 我用它来操作我的 android 视图中的视图 例如 一旦所有可观察量发出有效值 我就会启用号召性用语按钮
  • 如何从依赖jar中删除签名?

    我有一个Maven项目 foo 这是一个网络启动 为了可以通过浏览器分发 内容需要进行 jarsigned 我使用的是maven jarsigner plugin
  • 释放 UIPageViewController 中未使用的页面

    我正在使用一个单独的 h m and xib每个文件UIViewController的基础页面UIPageViewController基于图画书 每个页面加载动画 音乐等 大约占用4MB内存 在 Instruments 中 每加载一页 可用
  • 如何知道我的商店 ID 是什么?

    如何知道我的商店视图 ID 是什么 修改数据库中的表时需要这样做 截图说明了 Jevgeni Smirnov 的回答 正如他所说 你应该去系统 gt 管理店铺然后在右栏中单击所需的商店名称
  • Package.json 中的新字段 false

    升级到后npm 5 我注意到了一个新字段package json这实在是晦涩难懂 What false means name test devDependencies dependencies What that means What s
  • 在 RSpec 自动化测试期间使 Sprockets 缓存失效

    在我的 Rails 应用程序中 我有一个 js erb 文件 其中有一个基于某些 Ruby 代码动态设置的变量 var myTimer 该应用程序工作正常 但我在一些自动化测试中遇到问题 该问题发生在使用此 JavaScript 的 RSp
  • xcodebuild 生成空的compile_commands.json

    我正在使用以下命令将 oclint 与 xcode 5 一起使用 步骤1 xcodebuild target OClintDemo configuration Debug scheme OClintDemo sdk iphonesimula
  • 即使定义了函数,我也必须在类中实现函数的错误[重复]

    这个问题在这里已经有答案了 我收到错误 Class QueryParameterComparer must implement Function Compare x As QueryParameter y As QueryParameter
  • CPU什么时候可以忽略LOCK前缀并使用缓存一致性?

    我原本以为MESI等缓存一致性协议可以提供伪原子性but仅跨个人内存加载 存储指示 如果我执行获取 修改 写入指令组合 仅使用 MESI 将无法在第一条指令到最后一条指令之间强制执行原子性 然而 英特尔参考手册第 3a 卷第 8 节说 8