Intel 的系统编程指南,第 8.3 节,关于 MFENCE/SFENCE/LFENCE 的说明:
“以下指令是内存排序指令,而不是序列化指令。它们会耗尽数据内存子系统。它们不会序列化指令执行流。”
我试图弄清楚为什么这很重要。在多线程代码中,对内存的写入/读取正是需要以明确定义的顺序发生的。当然,I/O 发生的顺序可能很重要,但无论如何 I/O 指令都是“序列化指令”。 CPU 应该可以重新排序指令,这些指令(例如)在寄存器中按照它喜欢的方式进行算术运算;我认为您没有任何理由想要“序列化”此类操作。
是否真的需要完全序列化指令,而MFENCE仅加载和存储的序列化“不够”?
最佳答案
基准测试和代码分析。
如果您正在尝试测量代码序列的性能,尤其是当它非常短时,确保基准操作的部分不会在定时序列之外执行可能很重要。例如,如果您的代码类似于以下伪代码:
start = RDTSC()
do some stuff
end = RDTSC()
cycles = end - start
确保中间的任何代码都不会在第一个
RDTSC
之前或第二个之后执行,这一点很重要。令人高兴的是,有一个完美的指令可用于此:
CPUID
是完全序列化的。关于assembly - MFENCE/SFENCE/etc "serialize memory but not instruction execution"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26683097/