asm __volatile__ (
" mfence \n" // drain the store buffer
" lfence \n" // and wait for that instruction to retire, draining the ROB
::: "memory"); // block compile-time reordering.
Your code here
asm __volatile__ (
" mfence \n"
" lfence \n"
::: "memory" );
就内存和指令重新排序而言,这差不多是从cpuid中获得的序列化程度。但在英特尔的技术术语中,这两个指令都不是正式的序列化指令。 软件预取并不保证按fence指令排序,因此至少在理论上,较早的prefetcht0可能导致数据在lfence之后到达。(但是prefetcht0after 一个lfence在lfence完成之前不能执行,因为在lfence之后没有指令被发送到执行单元,直到所有较早的指令都已引退。 lfence阻塞指令重新排序是Intel CPU的一贯工作方式,但AMD仅使用MSR设置。执行Spectre缓解的操作系统会设置MSR:Is LFENCE serializing on AMD processors?
1条答案
按热度按时间z9smfwbn1#
如果目标是序列化一段代码,可以执行如下操作:
就内存和指令重新排序而言,这差不多是从
cpuid
中获得的序列化程度。但在英特尔的技术术语中,这两个指令都不是正式的序列化指令。软件预取并不保证按fence指令排序,因此至少在理论上,较早的
prefetcht0
可能导致数据在lfence
之后到达。(但是prefetcht0
after 一个lfence
在lfence
完成之前不能执行,因为在lfence
之后没有指令被发送到执行单元,直到所有较早的指令都已引退。lfence
阻塞指令重新排序是Intel CPU的一贯工作方式,但AMD仅使用MSR设置。执行Spectre缓解的操作系统会设置MSR:Is LFENCE serializing on AMD processors?