这是一个有点低级的问题。在x86汇编中,有两个SSE指令:
MOVDQA xmmi, m128
和
MOVNTDQA xmmi, m128
IA-32软件开发人员手册指出 MOVNTDQA NT代表非临时性,否则与MOVDQA相同。
我的问题是 非临时性是什么意思?
这是一个有点低级的问题。在x86汇编中,有两个SSE指令:
MOVDQA xmmi, m128
和
MOVNTDQA xmmi, m128
IA-32软件开发人员手册指出 MOVNTDQA NT代表非临时性,否则与MOVDQA相同。
我的问题是 非临时性是什么意思?
Answers:
非临时性SSE指令(MOVNTI,MOVNTQ等)不遵循常规的缓存一致性规则。因此,非临时存储区后面必须要有SFENCE指令,以便其他处理器及时查看它们的结果。
当产生数据且不再(立即)再次使用数据时,内存存储操作会先读取一条完整的缓存行,然后再修改缓存的数据,这一事实不利于性能。此操作将数据从高速缓存中推出,这可能需要再次使用,以支持即将不再使用的数据。这对于大型数据结构(例如矩阵)尤其如此,这些数据结构先被填充然后在以后使用。在填充矩阵的最后一个元素之前,绝对大小会逐出第一个元素,从而使写入的缓存无效。
对于这种情况和类似情况,处理器为非临时写操作提供支持。在这种情况下,非时间意味着数据将不会很快被重用,因此没有理由对其进行缓存。这些非临时写操作不会先读取高速缓存行,然后再对其进行修改。而是将新内容直接写入内存。
资料来源:http : //lwn.net/Articles/255364/
SFENCE
不需要。至少在同一线程中。你还能看吗?
sfence
NT商店需要这样做,而对于普通商店则从来不需要。如其他线程所见,不带NT的存储区不相对于其他存储区(不带NT)进行排序sfence
。但是,对于从与存储相同的线程进行读取,则不需要sfence
:给定线程将始终按程序顺序查看其自己的存储,而不管它们是否为NT存储。
Espo几乎可以达到目标。只是想加我两分钱:
“非时间”短语意味着缺少时间局部性。缓存利用两种局部性-空间和时间性,通过使用非时间性指令,您正在向处理器发送信号,告知您您不希望在不久的将来使用该数据项。
我对使用缓存控制指令的手工编码程序集表示怀疑。以我的经验,这些错误导致的臭虫多于任何有效的性能提高。
根据《英特尔®64和IA-32架构软件开发人员手册》,第1卷:基本架构,“使用英特尔流SIMD扩展编程(英特尔SSE)”一章:
缓存时态与非时态数据
程序引用的数据可以是临时的(数据将再次使用)或非临时的(数据将被引用一次,并且在不久的将来不会重复使用)。例如,程序代码通常是临时的,而多媒体数据(例如3-D图形应用程序中的显示列表)通常不是临时的。为了有效利用处理器的高速缓存,通常希望高速缓存时间数据而不高速缓存非时间数据。用非临时数据重载处理器的高速缓存有时称为“污染高速缓存”。SSE和SSE2可缓存性控制指令使程序能够以最小化缓存污染的方式将非临时数据写入内存。
非临时加载和存储指令的描述。资料来源:英特尔64和IA-32架构软件开发人员手册,第2卷:指令集参考
加载(MOVNTDQA-加载双四字非时间对齐提示)
如果内存源是WC(写合并)内存类型,则使用非时间提示将双四字从源操作数(第二个操作数)加载到目标操作数(第一个操作数)[...]
处理器不会将数据读取到缓存层次结构中,也不会从内存中获取相应的缓存行到缓存层次结构中。
请注意,正如彼得·科德斯(Peter Cordes)所言,它在当前处理器上的普通WB(回写)内存中没有用,因为NT提示被忽略(可能是因为没有NT感知的硬件预取器),并且采用了完全强序加载语义。 prefetchnta
可用作WB存储器的减少污染的负载
存储(MOVNTDQ-使用非时间提示存储打包的整数)
使用非时间提示将源操作数(第二个操作数)中的打包整数移动到目标操作数(第一个操作数),以防止在写入内存时缓存数据。
处理器不会将数据写入缓存层次结构,也不会从内存中提取相应的缓存行到缓存层次结构中。
使用高速缓存写入策略和性能中定义的术语,可以将它们视为可写(无写分配,无写丢失获取)。
最后,回顾一下John McAlpin关于非临时性商店的注释可能会很有趣。
MOVNTDQA
仅在WC(不可缓存的Write-Combining)存储区域上执行任何特殊操作,例如视频RAM。在当前硬件的普通WB(回写)内存上,它根本没有用,NT提示将被忽略,并且将应用完整的强序加载语义。 prefetchnta
但是,作为减少 WB存储器污染的负载,它可能会很有用。 当前的x86体系结构是否支持非临时负载(来自“正常”内存)?。
MOVNTDQA xmmi, m128
是NT加载,而所有其他NT指令都存储,除了prefetchnta
。此处接受的答案似乎只是在谈论商店。 这就是我能够发现NT负载的原因。TL:DR:希望CPU对NT提示做一些有用的事情,以最大程度地减少缓存污染,但是它们不会覆盖“正常” WB内存的强序语义,因此它们必须使用缓存。