假设没有非时间指令,“xchg”是否包含“mfence”?

2024-04-13

我已经看过了这个答案 https://stackoverflow.com/a/50279772/391161 and 这个答案 https://stackoverflow.com/a/19099164/391161,但似乎都没有清楚明确地说明等价或不等价mfence and xchg假设没有非临时指令。

英特尔指令参考 https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm-vol-2abcd.pdf for xchg提到该指令对于实现信号量或类似的数据结构以进行进程同步非常有用,并进一步参考第 8 章第3A卷 https://software.intel.com/sites/default/files/managed/a4/60/325384-sdm-vol-3abcd.pdf。该参考文献陈述如下。

对于 P6 系列处理器,锁定操作会序列化所有 未完成的加载和存储操作(即,等待它们 完全的)。此规则也适用于 Pentium 4 和 Intel Xeon 处理器,但有一个例外。加载弱引用的操作 有序内存类型(例如 WC 内存类型)可能不 连载了。

The mfence文档声明如下。

对所有从内存加载的内容执行序列化操作 在 MFENCE 之前发出的存储到内存的指令 操作说明。这种串行化操作保证了每个负载和 存储程序中 MFENCE 指令之前的指令 在任何加载或存储指令之前,顺序变得全局可见 遵循 MFENCE 指令。 1 MFENCE 指令是 根据所有加载和存储指令排序,其他 MFENCE 指令、任何 LFENCE 和 SFENCE 指令以及任何序列化 指令(例如CPUID指令)。 MFENCE 不 序列化指令流。

如果我们忽略弱有序的内存类型,xchg 是否执行(这意味着lock)包含 mfence 关于内存排序的所有保证?


假设您没有编写设备驱动程序(所以所有的内存都是Write-Back,而不是弱序Write-Combining),那么yes xchg一样强mfence.

NT店还不错。

我确信当前硬件上就是这种情况,并且相当确信所有未来 x86 CPU 的手册中的措辞都保证了这一点。xchg是一个非常强大的完整内存屏障。

嗯,我还没有看过预取指令重新排序。这可能与性能有关,甚至可能与奇怪的设备驱动程序情况下的正确性有关(在这种情况下,您可能不应该使用可缓存内存)。


从你的报价来看:

(P4/Xeon) 引用弱排序内存类型(例如 WC 内存类型)的加载操作可能无法序列化。

这就是让xchg [mem]那么弱mfence(在 Pentium4 上?可能也在 Sandybridge 系列上)。

mfence does保证这一点,这就是为什么 Skylake 必须加强它来修复错误。 (加载和存储是唯一需要重新排序的指令吗? https://stackoverflow.com/questions/50494658/are-loads-and-stores-the-only-instructions-that-gets-reordered/50496379#50496379,以及您链接的答案lock xchg 与 mfence 具有相同的行为吗? https://stackoverflow.com/questions/40409297/does-lock-xchg-have-the-same-behavior-as-mfence/50279772#50279772)

NT 商店按以下方式序列化xchg / lock,只有弱排序的负载可能无法序列化。您无法从 WB 内存执行弱排序加载. movntdqa xmm, [mem]在 WB 内存上仍然是强有序的(并且在当前实现上,也忽略 NT 提示而不是采取任何措施来减少缓存污染)。


看起来像xchgseq-cst 存储的性能优于mov+mfence在当前的 CPU 上,因此您应该在正常代码中使用它。 (您不能意外映射 WC 内存;普通操作系统始终会为您提供 WB 内存以进行正常分配。WC 仅用于视频 RAM 或其他设备内存。)


这些保证是根据英特尔微架构的特定系列指定的。如果我们可以为未来的 Intel 和 AMD CPU 假设一些共同的“基准 x86”保证,那就太好了。

我假设但还没有检查xchg vs. mfenceAMD 的情况也是一样。我确信使用没有正确性问题xchg作为 seq-cst 存储,因为这就是 gcc 之外的编译器实际上所做的事情。

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

假设没有非时间指令,“xchg”是否包含“mfence”? 的相关文章

  • 通知另一个线程数据可用的最快方法是什么?有什么替代旋转的方法吗?

    我的一个线程将数据写入循环缓冲区 另一个线程需要尽快处理该数据 我本来想写这么简单的spin 伪代码 while true while a i do nothing just keep checking over and over proc
  • 使用多线程的套接字服务器或文件服务器实现:概念不清楚

    请帮我理清这个概念 假设我们有一个使用线程实现的套接字端口服务器 套接字服务器侦听套接字端口 并在消息到达时创建一个线程来服务该请求 客户端代码向服务器发送给定数量的消息 该客户端代码也可以由多个用户在不同的计算机上运行 我知道客户端代码作
  • C# 中的监视器与互斥体[重复]

    这个问题在这里已经有答案了 可能的重复 C 中各种线程同步选项之间有什么区别 https stackoverflow com questions 301160 what are the differences between various
  • Control.Invoke 在隐藏的 ShowDialog 中“卡住”

    我有解决这个问题的方法 但这不是我第一次被咬 所以我试图确切地了解发生了什么 从我的申请中 我ShowDialog表单 表单上有一个按钮 单击该按钮时会调用另一个 非 GUI 线程上的代码 非 GUI 线程发回状态 Pushed then
  • 在 NodeJS 中处理长时间运行的进程?

    我看过一些较旧的帖子涉及这个主题 但我想知道当前的现代方法是什么 用例是 1 假设您想要在视频文件上执行长时间运行的任务 例如 60 秒长 例如jspm install这最多可能需要 60 秒 2 不能对任务进行细分 其他要求包括 需要知道
  • 多线程:只有在执行完其他方法后才调用执行方法

    我正在尝试根据要求异步处理方法 一旦第一个方法完成 只有第二个方法应该开始执行 问题是第一个方法本身具有在后台线程上运行的代码 我尝试了dispatch semaphore wait 但这也不起作用 dispatch queue t que
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 跨线程操作无效 VB.NET

    我浏览了该网站 发现与该主题相关的问题是针对 C 的 我正在维护的应用程序是用 VB NET 编写的 因此 如果我忽略了一个问题 我深表歉意 这是我调用我的线程的地方 Private Sub saveBtn Click ByVal send
  • 从单个应用程序中的多个线程调用 dll 函数是否安全?

    我正在 Delphi 2009 中编写一个服务器应用程序 它实现了多种类型的身份验证 每种身份验证方法都存储在单独的 dll 中 第一次使用身份验证方法时 会加载适当的 dll 仅当应用程序关闭时 DLL 才会被释放 在服务器线程 连接 之
  • C# 是否可以中断 ThreadPool 内的特定线程?

    假设我已将一个工作项排入队列ThreadPool 但是如果没有要处理的数据 从BlockingQueue 如果队列为空并且队列中不再有工作 那么我必须调用Thread Interrupt方法 如果我想中断阻塞任务 但是如何用 a 做同样的事
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 在多个不同线程之间共享变量

    我想在多个线程之间共享一个变量 如下所示 boolean flag true T1 main new T1 T2 help new T2 main start help start 我想分享flag在主线程和帮助线程之间 这是我创建的两个不
  • 使用具有最大并发进程数的 multiprocessing.Process

    我有Python code from multiprocessing import Process def f name print hello name if name main for i in range 0 MAX PROCESSE
  • 是否值得清理 Filter 中的 ThreadLocals 来解决线程池相关问题?

    简而言之 tomcat 使用线程池 因此线程被重用 一些图书馆使用ThreadLocal变量 但不要清理它们 使用 remove 所以实际上它们将 脏 线程返回到池中 Tomcat 具有在关闭时检测这些事情并清理线程局部变量的新功能 但这意
  • 非法监控状态异常

    如何将轮询线程传递给另一个线程进行处理 程序执行在控制器类中 该类具有 main 方法和线程池 主类控制器 public static void main String args throws InterruptedException Ru
  • JMeter:tearDown Thread Group的目的是什么

    我想了解JMeter中tearDown Thread Group的实际用法 在什么场景下可以使用tearDown Thread Group 根据提供的帮助JMeter 拆解线程组 http jmeter apache org userman
  • 使用来自不同线程的实时数据更新 QTableView 的最佳策略

    我的应用程序现在启动几个线程 如 5 10 个 来从不同源收集数据 它们与主 GUI 线程分离 因此我在 GUI 中感觉不到任何缓慢 并且我可以在后台线程工作时继续工作 一切都很棒 但现在我希望能够在我的主 GUI 中的 QTableVie
  • C# 系统 CPU 使用情况并与 Windows 任务管理器同步

    这是一个由两部分组成的问题 我想将我的代码发布到堆栈上以帮助其他人完成相同的任务 问题一 我有一个代码子集 我相信它可以根据测量间隔正确测量 CPU 使用情况 根据检索的时间跨系统中的尽可能多的核心 我在线程调用中使用 1 秒 我必须从网上
  • Jupyter Notebook 中的多处理与线程

    我试图测试这个例子here https ipywidgets readthedocs io en stable examples Widget 20Asynchronous html将其从线程更改为多处理 在 jupyter Noteboo

随机推荐

  • 如何使用C读取文件夹中的所有文件

    我希望读取特定文件夹中的所有文本文件 这些文件的名称没有任何共同的模式 否则任务会更容易 read a file from the directory Perform a common operation write output to a
  • android:GIF动画循环完整监听器

    我有一张 GIF 图像 想要在启动屏幕中加载 我遇到过几个像这样的图书馆android gif 可绘制 https github com koral android gif drawable and Glide https github c
  • 如何在 MATLAB 循环中重命名变量?

    有人可以告诉我是否存在一种方法可以在 MATLAB 循环的每次迭代中重命名变量吗 实际上 我想在循环中使用不同的名称保存一个变量 并结合循环的索引 谢谢 根据您的评论 我建议使用单元阵列 http www mathworks nl help
  • AppBarLayout + NestedScrollView + RecyclerView不会滚动

    您好 我对 google support appbarLayout 有疑问 我的布局结构如下 问题是 一旦嵌套滚动视图滚动到顶部 我的回收器视图就不会滚动 我尝试了几乎所有解决方案 但似乎没有任何效果
  • 有没有办法限制 Bazel 使用的 CPU 核心数量?

    有没有办法告诉 Bazel 在构建时可以使用多少个 CPU 核心 TL DR 我在 VMware Workstation 上构建 TensorFlow 作为虚拟机 我可以调整虚拟机的处理器和内核数量 在构建 TensorFlow 的过程中
  • 等待 UIView 动画循环完成的最佳方法是什么?

    我正在尝试循环多个UIViews并对每个动画执行动画 但我想知道所有动画何时完成 动画循环完成后调用函数的最佳方法是什么 或者 有没有办法等到所有都完成 我尝试使用setAnimationDidStopSelector 但它不着火 在这种情
  • 你能在 Swift 中创建匿名内部类吗?

    我厌倦了宣布整个班级都有能力处理UIAlertView通过使它们延伸来点击UIAlertViewDelegate 当我有多种可能时 它开始感觉混乱和错误UIAlertViews 并且必须区分在处理程序中单击了哪个 我真正想要的是创建一个实现
  • 如何使用 Angular-CLI 重写反向代理中的路径?

    我已经使用 angular2 CLI 设置了反向代理 如下所示 api customer target http localhost 9010 secure false 我的问题是远程 API 在路径 customer 上公开服务 但反向代
  • 单节点图对forceCenter没有反应?

    我正在启动一个带有单个节点的图形项目 当我将它拖到某个地方时 我希望它能顺利回到 svg 的中心 但事实并非如此 它glitches回到中心 var simulation d3 forceSimulation force center d3
  • SBT停止运行而不退出

    如何在不退出的情况下终止 SBT 中的运行 我正在尝试 CTRL C 但它退出 SBT 有没有办法在保持 SBT 打开的情况下仅退出正在运行的应用程序 从 sbt 版本 0 13 5 开始 您可以添加到您的 build sbt cancel
  • 使用 Sikuli 进行拖放

    我在使用 Sikuli 拖放时遇到问题 我想在任何其他方向 上 下 左 右 拖动某些东西固定数量的像素 这看起来应该有效 t find 1325249963143 png dragDrop t t x 100 t y 100 Sikuli
  • 在 Eclipse 中导入动态 Web 项目?

    我使用 eclipse 3 6 2 Helios 和 tomcat 7 和 myfaces 1 2 10 当我想导入动态 Web 项目时遇到问题 我在工作区中导入项目并执行配置并设置 jar 文件 但是当我在 tomcat 中运行该项目时
  • 我希望我的字段只接​​受整数,并且我已将该字段保留在所需的验证中? [复制]

    这个问题在这里已经有答案了 我已经完成了我的完整项目 但它缺少这一要求 我自己无法在我的项目中解决这个问题 你会使用CodeIgniter吗表单验证 http ellislab com codeigniter user guide libr
  • 为什么 Service Worker 只能通过 HTTPS 工作?

    根据最初的提案 关于 更喜欢安全来源以获得强大的新功能 http www chromium org Home chromium security prefer secure origins for powerful new features
  • Android Studio 与 ndk 和 googletest

    我正在尝试设置我的 CI 服务器以与 Android Studio 一起使用 我希望通过新的 UI 运行 NDK 的单元测试 我正在使用 GoogleTest 当我从命令行构建时 gcov 可以完美地实现代码覆盖率 我遇到的问题是 UI 中
  • 当名称的开头保持相同而结尾不同时,将 CSS 样式应用于 ID 元素

    在 WordPress 中 博客文章的标题通常使用 ID 元素进行格式化 该 ID 元素由永远不会变化的前缀 例如 post 组成 后跟 WordPress 生成的可变数字后缀 对应于唯一的连续帖子编号 每个帖子 在 WordPress 主
  • 根据其中一个字段对元组进行排序

    我的问题与下面的问题相同 但答案很模糊 我不明白如何进行 将 List 从最高到最低排序 https stackoverflow com questions 4017728 sort a listtuple from highest to
  • 将 JSON 数据的 NSString 转换为 NSArray [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个N
  • 多线程和CPU缓存

    我正在使用多个线程在 C 中实现图像过滤操作 并使其尽可能优化 但我有一个问题 如果线程 0 访问内存 并且同时线程 1 访问同一内存 它会从缓存中获取它吗 这个问题源于这两个线程可能运行在 CPU 的两个不同内核中的可能性 因此 另一种说
  • 假设没有非时间指令,“xchg”是否包含“mfence”?

    我已经看过了这个答案 https stackoverflow com a 50279772 391161 and 这个答案 https stackoverflow com a 19099164 391161 但似乎都没有清楚明确地说明等价或