x86 - LFENCE 是否在 AMD 处理器上进行序列化?
问题描述
在最近的英特尔 ISA 文档中,lfence
指令被定义为对指令流进行序列化(防止无序执行)。特别是,指令的描述包括这一行:
具体来说,LFENCE 直到所有先前的指令都在本地完成后才执行,并且在 LFENCE 完成之前没有后面的指令开始执行。
请注意,这适用于所有指令,而不仅仅是内存加载指令,lfence
不仅仅是内存排序围栏。
尽管这现在出现在 ISA 文档中,但尚不清楚它是“架构的”,即所有 x86 实现都必须遵守,还是英特尔特定的。特别是,AMD 处理器是否也将lfence
指令流视为序列化?
解决方案
有一个 MSR 可以配置该行为:
说明:在处理器中设置一个MSR,使LFENCE成为一个dispatch序列化指令,然后在码流中使用LFENCE序列化dispatch(LFENCE比RDTSCP快,RDTSCP也是dispatch序列化)。这种 LFENCE 模式可以通过设置 MSR C001_1029[1]=1 来启用。
效果:当 MSR 位设置时遇到 LFENCE,调度将停止,直到 LFENCE 指令成为机器中最旧的指令。
适用性:所有 AMD 系列 10h/12h/14h/15h/16h/17h 处理器都支持此 MSR。LFENCE 支持由 CPUID 函数 1 EDX 位 26,SSE2 指示。AMD 系列 0Fh/11h 处理器始终支持 LFENCE 序列化,但不支持此 MSR。AMD 计划支持此 MSR 并为所有未来的处理器访问此位。
(来源)
推荐阅读
- multithreading - 原子性 vs 内存模型 vs 乱序执行
- gradle - 跳过 gradle 中的 comileJava 和 processResources 任务以进行 Kotlin 部署
- python - IndentationError: unindent does not match any external indentation level error 在 PyCharm IDE 中编写 Python 程序
- ios - 为什么新的 .swift 文件中无法识别 WatchKit 类?
- uwp - 在 UWP 应用中生成缩放文件时保留主徽标文件
- list - 如何将同一位置的元素加在一起 CLIPS
- kotlin - 复制 enqueue() 方法
- ios - iOS Bonjour:didFindService 但无法在公共 Wi-Fi 网络中解析
- apache-spark - Spark 在执行器中解压缩并将 CSV 写入镶木地板
- unity3d - 在 Unity 2019 中将 RenderTexture 转换为 Texture2D