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

MOVDQA xmmi,m128

MOVNTDQA xmmi,m128

IA-32 软件开发人员手册指出 新台币 MOVNTDQA 中代表 非时间性, ,否则与 MOVDQA 相同。

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

有帮助吗?

解决方案

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

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

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

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

其他提示

Espo 几乎正中目标。只是想补充我的两分钱:

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

我对使用缓存控制指令的手工编码程序集有点怀疑。根据我的经验,这些事情导致的邪恶错误比任何有效的性能提升还要多。

根据英特尔® 64 和 IA-32 架构软件开发人员手册,第 1 卷:基本体系结构,“带有Intel流的编程SIMD扩展(Intel SSE)”章节:

时间缓存与时间缓存非时态数据

程序引用的数据可以是临时的(数据将被再次使用)或非临时的(数据将被引用一次,并且不会在不久的将来重新使用)。例如,程序代码通常是时间性的,而多媒体数据(例如 3D 图形应用程序中的显示列表)通常是非时间性的。为了有效利用处理器的缓存,通常需要缓存时态数据而不是缓存非时态数据。使用非临时数据使处理器的缓存过载有时被称为“污染缓存”。SSE 和 SSE2 高速缓存能力控制指令使程序能够以最小化高速缓存污染的方式将非临时数据写入内存。

非临时加载和存储指令的描述。来源:Intel 64 和 IA-32 架构软件开发人员手册,第 2 卷:指令集参考

LOAD(MOVNTDQA—加载双四字非时间对齐提示)

如果内存源是 WC(写组合)内存类型,则使用非临时提示将双四字从源操作数(第二个操作数)加载到目标操作数(第一个操作数) [...]

[...]处理器不会将数据读入高速缓存层次结构,也不会将相应的高速缓存行从内存提取到高速缓存层次结构中。

请注意,正如 Peter Cordes 评论的那样,它在当前处理器上的正常 WB(回写)内存上没有用,因为 NT 提示被忽略(可能是因为没有 NT 感知的硬件预取器)并且应用完整的强有序加载语义。 prefetchnta 可用作 WB 存储器的污染减少负载

STORE(MOVNTDQ - 使用非临时提示存储打包整数)

使用非临时提示将源操作数(第二个操作数)中的压缩整数移动到目标操作数(第一个操作数),以防止在写入内存期间缓存数据。

[...]处理器不会将数据写入缓存层次结构,也不会将相应的缓存行从内存提取到缓存层次结构中。

使用中定义的术语 缓存写入策略和性能, ,它们可以被视为 write-around(无写分配、无写未命中取指)。

最后,回顾一下可能会很有趣 John McAlpin 关于非临时存储的注释.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top