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

x86 sse assembly

25370 观看

3回复

这是一个有点低级别的问题。在x86程序集中有两个SSE指令:

MOVDQA <i><em>xmmi, m128</em></i>

MOVNTDQA <i><em>xmmi, m128</em></i>

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

我的问题是,非时间意味着什么?

作者: Nathan Fellman 的来源 发布者: 2019 年 6 月 6 日

回应 (3)


115

决定

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

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

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

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

作者: Espo 发布者: 31.08.2008 08:50

32

Espo对目标非常感兴趣。只是想加我的两分钱:

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

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

作者: Pramod 发布者: 01.09.2008 04:03

0

根据英特尔®64和IA-32架构软件开发人员手册第1卷:基本架构,“使用英特尔流式SIMD扩展(英特尔SSE)编程”一章:

缓存时间与非时间数据

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

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

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

使用非时间提示[...]从源操作数(第二个操作数)向目标操作数(第一个操作数)加载双四字[...]

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

存储(使用非时间提示的MOVNTDQ存储打包整数)

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

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

使用高速缓存写入策略和性能中定义的术语,可以将它们视为无处理(无写入分配,无写入时取消)。

最后,回顾John McAlpin关于非临时商店的说明可能会很有趣。

作者: chus 发布者: 07.11.2018 11:59
32x32