在x86 / x64上,非临时存储指令(如MOVNTI
和MOVNTPS
)使得内存排序保证比“常规”存储更弱。我理解,当共享将在线程之外非临时写入的内存时,必须使用围栏(例如SFENCE
)。但是,线程本地存储器需要栅栏指令吗?如果我通过MOVNTPS
写入某个位置,是否保证写入对同一线程中的后续指令可见而没有任何fence指令?
答案 0 :(得分:4)
是的,它们将在没有围栏的情况下可见。请参阅英特尔®64和IA-32架构软件开发人员手册第3A卷:系统编程指南,第1部分中的 8.2.2 P6中的内存排序和更多近期处理器系列其中说:
对于定义为回写可缓存的内存区域,[...] 可以使用较旧的写入对不同位置的读取进行重新排序,但是 而不是旧写入同一位置。
和
写入内存不会与其他写入重新排序 以下例外: - 使用非时间移动指令执行的流存储(写入) (MOVNTI,MOVNTQ,MOVNTDQ,MOVNTPS和MOVNTPD);