【发布时间】:2016-06-14 07:08:21
【问题描述】:
在 x86/x64 上,非临时存储指令(例如 MOVNTI 和 MOVNTPS)提供的内存排序保证比“常规”存储要弱。我知道在共享将跨线程非临时写入的内存时,围栏(例如SFENCE)是必要的。但是,线程本地内存是否需要围栏指令?如果我通过MOVNTPS 写入某个位置,是否保证写入对同一线程中的后续指令可见,而无需任何栅栏指令?
【问题讨论】:
-
单个线程总是按照程序顺序观察其自己的动作。乱序 CPU 的基本规则是它们总是表现得好像您的代码按程序顺序运行一样。 (唯一的例外是当架构有其他规则时:例如 IA-64 是显式并行性的实验,其中每个 VLIW 指令块并行执行。因此您可以在同一指令块中与
{ a=b, b=a }进行交换或一些东西。我猜一些 RISC 架构中的分支延迟槽是另一个例子。) -
可能不存在单线程代码需要隔离任何东西的 ISA。核心可以很容易地窥探自己的存储缓冲区。
标签: performance assembly x86 memory-barriers