首页 > 解决方案 > LFENCE 是否在 AMD 处理器上进行序列化?

问题描述

在最近的英特尔 ISA 文档中,lfence指令被定义为对指令流进行序列化(防止无序执行)。特别是,指令的描述包括这一行:

具体来说,LFENCE 直到所有先前的指令都在本地完成后才执行,并且在 LFENCE 完成之前没有后面的指令开始执行。

请注意,这适用于所有指令,而不仅仅是内存加载指令,lfence 不仅仅是内存排序围栏。

尽管这现在出现在 ISA 文档中,但尚不清楚它是“架构的”,即所有 x86 实现都必须遵守,还是英特尔特定的。特别是,AMD 处理器是否也将lfence指令流视为序列化?

标签: x86intelcpu-architecturememory-barriersamd-processor

解决方案


有一个 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 并为所有未来的处理器访问此位。

来源


推荐阅读