x86中“非暂时性”内存访问的含义是什么?

这是一个有点低级的问题。 在x86汇编中有两个SSE指令:

MOVDQA xmmi, m128

MOVNTDQA xmmi, m128

IA-32软件开发者手册说MOVNTDQA中的NT代表Non-Temporal ,否则它与MOVDQA相同。

我的问题是, Non-Temporal是什么意思?

非时间SSE指令(MOVNTI,MOVNTQ等)不遵循正常的caching一致性规则。 因此,非临时存储必须紧跟着一个SFENCE指令,以便其他处理器及时看到结果。

当产生数据而不是(立即)再次使用数据时,内存存储操作首先读取完整caching行,然后修改caching数据的事实对性能是有害的。 这个操作将数据从可能需要再次使用的caching中推出,而不是很快使用的数据。 对于大型数据结构尤其如此,例如matrix,这些matrix被填充并稍后使用。 在matrix的最后一个元素被填充之前,绝对大小会驱逐第一个元素,使写入的caching无效。

对于这个和类似的情况,处理器提供对非暂时写入操作的支持。 在这种情况下的非暂时性意味着数据不会很快被重用,所以没有理由caching它。 这些非暂时写入操作不读取caching行,然后修改它; 相反,新内容直接写入内存。

来源: http : //lwn.net/Articles/255364/

Espo在目标方面非常有效。 只是想补充我的两分钱:

“非时间”短语意味着缺乏时间地点。 caching利用两种局部性 – 空间和时间,并且通过使用非临时性指令,您正在向处理器发送信号,表示您不希望在不久的将来使用该数据项。

我对使用caching控制指令的手工编译程序集有点怀疑。 根据我的经验,这些事情导致比任何有效的性能增加更多的恶臭。