x86非时态指令:线程本地数据是否需要防护?

时间:2016-03-01 18:04:11

标签: performance assembly x86 memory-barriers

在x86 / x64上,非临时存储指令(如MOVNTIMOVNTPS)使得内存排序保证比“常规”存储更弱。我理解,当共享将在线程之外非临时写入的内存时,必须使用围栏(例如SFENCE)。但是,线程本地存储器需要栅栏指令吗?如果我通过MOVNTPS写入某个位置,是否保证写入对同一线程中的后续指令可见而没有任何fence指令?

1 个答案:

答案 0 :(得分:4)

是的,它们将在没有围栏的情况下可见。请参阅英特尔®64和IA-32架构软件开发人员手册第3A卷:系统编程指南,第1部分中的 8.2.2 P6中的内存排序和更多近期处理器系列其中说:

  

对于定义为回写可缓存的内存区域,[...]   可以使用较旧的写入对不同位置的读取进行重新排序,但是   而不是旧写入同一位置。

  

写入内存不会与其他写入重新排序   以下例外:    - 使用非时间移动指令执行的流存储(写入)       (MOVNTI,MOVNTQ,MOVNTDQ,MOVNTPS和MOVNTPD);