“是什么意思?”;“非暂时性”;x86中的内存访问

“是什么意思?”;“非暂时性”;x86中的内存访问,x86,sse,assembly,X86,Sse,Assembly,这是一个有点低级的问题。在x86汇编中,有两条SSE指令: MOVDQA-xmmi,m128 及 MOVNTDQA xmmi,m128 IA-32软件开发人员手册说,MOVNTDQA中的NT代表非时态,否则它与MOVDQA相同 我的问题是,非时间意味着什么 非时态SSE指令(MOVTI、MOVTQ等)不遵循正常的缓存一致性规则。因此,非时态存储必须紧跟SFENCE指令,以便其他处理器能够及时看到它们的结果 当产生数据而不再(立即)消耗数据时,内存存储操作首先读取完整的缓存线,然后修改缓存数据的事

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

MOVDQA-xmmi,m128

MOVNTDQA xmmi,m128

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


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

非时态SSE指令(MOVTI、MOVTQ等)不遵循正常的缓存一致性规则。因此,非时态存储必须紧跟SFENCE指令,以便其他处理器能够及时看到它们的结果

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

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


资料来源:

Espo与目标相当接近。只想加上我的两分钱:

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


我对使用缓存控制指令的手工编码程序集有点怀疑。根据我的经验,这些东西比任何有效的性能提升都会导致更严重的错误。

根据《英特尔64和IA-32体系结构软件开发人员手册》第1卷:基本体系结构, “使用英特尔数据流单指令多数据扩展指令集(英特尔SSE)编程”章节:

缓存时态与非时态数据

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

非临时加载和存储指令的说明。 来源:《英特尔64和IA-32体系结构软件开发人员手册》第2卷:指令集参考

加载(MOVTDQA加载双四字非时态对齐提示)

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

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

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

存储(MOVNTDQ使用非时态提示存储压缩整数)

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

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

使用中定义的术语,可以将它们视为写操作(无写分配,无写未命中时获取)


最后,回顾一下可能会很有趣。

回答不错,我只想指出,在使用NT指令的处理器上,即使使用非时态指令(即普通指令),缓存线也不会“读取然后修改”。对于写入不在缓存中的行的普通指令,缓存中保留一行,掩码指示该行的哪些部分是最新的。此网页称之为“商店无摊位”:。我找不到更精确的参考资料,我只是从那些负责实现处理器模拟器的人那里听说的。实际上,这是一个关于周期精确处理器模拟器的网站,与那些告诉我“商店里没有失速”的人做的事情完全一样。我最好也提到他们,以防他们看到这样的评论:从这里的答案和评论来看,似乎不需要回答。至少在同一条线上。你也可以看看吗?@SergeRogatch这取决于你所说的场景,但是是的,有些场景下NT商店需要
sfence
,而不仅仅是普通商店。没有
sfence
的情况下,NT存储不会相对于其他存储(NT或非NT)排序,正如其他线程所看到的那样。对于执行存储的同一线程的读取,