x86中"非临时"内存访问的含义是什么

时间:2020-03-05 18:45:44  来源:igfitidea点击:

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

MOVDQA xmmi, m128

MOVNTDQA xmmi, m128

IA-32软件开发人员手册说MOVNTDQA中的NT代表非临时性,否则与MOVDQA相同。

我的问题是,非临时性是什么意思?

解决方案

回答

非临时性SSE指令(MOVNTI,MOVNTQ等)不遵循常规的缓存一致性规则。因此,非临时存储区后面必须带有SFENCE指令,以便其他处理器及时查看它们的结果。

当产生数据且不再(立即)再次使用数据时,内存存储操作会先读取一条完整的缓存行,然后再修改缓存的数据,这一事实不利于性能。此操作将数据从高速缓存中推出,这可能会再次需要,以支持即将不再使用的数据。这对于大型数据结构(例如矩阵)尤其如此,这些数据结构先被填充然后在以后使用。在填充矩阵的最后一个元素之前,绝对大小会逐出第一个元素,从而使写入的缓存无效。

对于这种情况和类似情况,处理器为非临时写操作提供支持。在这种情况下,非时间意味着数据将不会很快被重用,因此没有理由对其进行缓存。这些非临时写操作不会先读取高速缓存行,然后再对其进行修改。而是将新内容直接写入内存。

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

回答

Espo几乎可以达到目标。只是想加我两分钱:

"非时间"短语意味着缺少时间局部性。缓存利用空间和时间上的两种局部性,并且通过使用非时间性指令,我们向处理器发出信号,表示我们不希望在不久的将来使用该数据项。

我对使用缓存控制指令的手工编码程序集表示怀疑。以我的经验,这些错误导致的臭虫多于任何有效的性能提高。