假设没有非时间指令,“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”? 的相关文章

  • 易失性变量的读-修改-写操作如何保证线程安全

    我正在阅读 JCIP 但无法理解 3 3 1 中的以下声明 只要您可以确保仅从单个线程写入易失性变量 对共享易失性变量执行读取 修改 写入操作就是安全的 在这种情况下 您将修改限制在单个线程中以防止竞争条件 并且易失性变量的可见性保证可确保
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列
  • 在使用 stop_token 等待条件变量_any 时是否需要拥有锁来请求停止?

    在等待条件变量时 更改谓词状态的线程必须拥有锁 因此在唤醒期间不会错过更新 根据文档 这是必要的 即使在使用原子变量时也是如此 不过我不确定是否request stop 已经正确处理了 那么问题是 这两个选项中哪一个是正确且符合标准的呢 j
  • Python:threading.timer不尊重间隔

    这是后续另一个问题 https stackoverflow com questions 32286049 python accept input while waiting 我现在有了一个解决方案 但由于不相关的原因 实现似乎没有正常运行
  • 无法从 run 方法中访问对象的属性(方法)! Java多线程

    我在 ServerConnectionManager 中有以下代码 public class ServerConnectionManager implements Runnable private DatagramPacket receiv
  • 使 [IsOneWay=true] WCF 服务异步和使用客户端上的任务调用同步方法之间有显着差异吗?

    如果我有这样定义的服务 ServiceContract SessionMode SessionMode NotAllowed public interface IMyService OperationContract IsOneWay tr
  • 类和互斥体

    假设我有一个类代表一些名为 foo 的数据结构 class foo public foo attr01 0 void f attr01 5 private int attr01 class fooSingleThreadUserClass
  • 尝试理解 printf() 的 gcc 汇编输出

    我正在尝试学习如何理解汇编代码 因此我一直在研究 GCC 的汇编输出以获取一些愚蠢的程序 其中之一只不过是int i 0 我现在或多或少完全理解了其中的代码 最大的困难是理解散布的 GAS 指令 无论如何 我向前迈了一步并添加了printf
  • 具有阻塞功能的 Twisted LoopingCall

    我有一个应用程序需要轮询数据库以了解可能的配置更改 该应用程序是一个使用 Twisted 的简单 xmlrpc 服务器 我尝试过使用Twisted的LoopingCall来执行轮询 但是由于LoopingCall在主线程上运行 所以对db的
  • Android SurfaceView 使用线程绘制画布

    我正在尝试使用线程在画布上绘图来创建一个简单的游戏引擎 但我遇到了一些无法解释的奇怪问题 这个 游戏 的目的是每秒在画布上画一个圆圈 这是可行的 但不是我想要的工作方式 似乎应用程序正在两个画布之间切换 并向每个画布添加一个圆圈 这样您就可
  • Java中的process_reaper线程是什么?

    随着时间的推移 我的应用程序中逐渐积累了数百个 process reaper 线程 有人知道这些可能是什么吗 它们似乎在我使用 Runtime exec 中 但是我在 finally 语句中破坏了我的进程 但它们仍然出现 截屏 http w
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • _addcarry_u64 和 _addcarryx_u64 与 MSVC 和 ICC

    MSVC 和 ICC 都支持内在函数 addcarry u64 and addcarryx u64 根据英特尔的内在指南 https software intel com sites landingpage IntrinsicsGuide
  • __stack_chk_fail_local 和 -fno-stack-protector - 如何让它工作?

    Update 我刚刚发现问题出在我的项目 libxml2 中包含的预构建库上 它是在启用堆栈保护的情况下构建的 因此依赖于 stack chk fail local方法 我现在已经重建了该库 fno stack protector也是 一切
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 为什么绿色线程不能在多核上工作

    在维基百科上 绿色线程 http en wikipedia org wiki Green threads被描述为通常无法在多核上运行 而没有解释原因 在多核处理器上 本机线程实现可以 自动将工作分配给多个处理器 而绿色线程 实现通常不能 我
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 在汇编中,指令指定数据类型吗?

    我是汇编语言编程 x86 的初学者 以下说法是否正确 在汇编中 BYTE WORD DWORD 等数据类型分别表示 8 位 16 位和 32 位模式 而不仅仅是整数 它们本身没有意义 它们只是位模式 使用它们的指令赋予了它们意义 汇编 代码
  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到

随机推荐

  • 如何使用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 但似乎都没有清楚明确地说明等价或