在最近的Intel ISA文档中,lfence
指令已定义为序列化指令流(防止整个指令流无序执行)。特别是,指令的description包含以下行:
具体而言,直到所有先前的指令在本地完成后才执行LFENCE,并且直到LFENCE完成才开始执行以后的指令。
请注意,这不仅适用于所有指令,而且不仅适用于内存加载指令,因此lfence
不仅适用于内存排序系统。
尽管这现在出现在ISA文档中,但尚不清楚它是否是“体系结构的”,即是否所有x86实现都遵循它,或者它是否特定于Intel。特别是,AMD处理器是否也将lfence
视为序列化指令流?
最佳答案
有一个MSR可以配置该行为:
说明:在处理器中设置一个MSR,以便LFENCE是一个调度序列化指令,然后
在代码流中使用LFENCE来序列化调度(LFENCE比RDTSCP更快,后者也可以调度
序列化)。可以通过设置MSR C001_1029 [1] = 1来启用这种LFENCE模式。
效果:当MSR位置1时遇到LFENCE,分派将停止直到LFENCE
指令成为机器中最早的指令。
适用范围:所有AMD系列10h / 12h / 14h / 15h / 16h / 17h处理器均支持此MSR。 LFENCE支持是
由CPUID function1 EDX位26 SSE2指示。 AMD系列0Fh / 11h处理器支持LFENCE序列化
始终但不支持此MSR。 AMD计划支持此MSR,并在将来使用此位
处理器。
(source)