我们可以在堆内存上使用非时间mov指令吗?

问题描述 投票:1回答:1

[在Agner Fog的“以汇编语言优化子例程-第11.8节,缓存控制指令中,”他说:“当写回缓存中发生缓存未命中时,内存写比读取要昂贵。必须从中读取整个缓存行在发生高速缓存未命中的情况下进行存储,修改和写回。可以通过使用非临时性写指令MOVNTI,MOVNTQ,MOVNTDQ,MOVNTPD,MOVNTPS来避免。写入存储器时应使用这些指令根据经验,建议仅在写入的内存块大于时,才使用非时间性写操作。最大缓存的一半大小。”

摘自《 Intel 64和IA-32体系结构软件开发人员手册组合卷,2019年10月》-“这些SSE和SSE2非临时存储指令通过将访问的存储器视为写合并(WC)类型,从而最大程度地减少了缓存污染。程序使用以下指令之一指定非临时存储并且目标区域的存储类型为回写(WB),直写(WT)或写组合​​(WC),处理器将执行以下操作:正在关注...。“”>

我认为写合并内存仅在图形卡中找到,而在通用堆内存中则没有,并且作为扩展,上面列出的指令仅在这种情况下有用。如果是这样,为什么Agner Fog会推荐这些说明?英特尔手册似乎建议它仅对WB,WT或WC内存有用,但随后他们说正在访问的内存将被视为WC。

如果这些指令实际上可以用在对堆内存的普通写入中,是否有任何限制?如何分配写合并内存?

在Agner Fog的“使用汇编语言优化子例程-11.8高速缓存控制指令中,”他说:“当在回写中发生高速缓存未命中时,内存写比读取要昂贵。] >>

[您可以在普通WB内存(即堆)上使用类似movntps的NT存储。

另请参阅Enhanced REP MOVSB for memcpy,以了解有关NT存储与普通存储的更多信息。

尽管为那些NT存储目的,它还是[处理

为WC,尽管MTRR和/或PAT都将其设置为正常WB。

Intel文档告诉您NT将“工作”存储在WB,WT和WC内存中

。 (但不是强排序的UC不可缓存内存,当然也不在WP写保护的内存上)。

您是正确的,通常只有视频RAM(或可能的其他类似设备内存区域)被映射为WC。而且,不可以,在像Linux这样的普通操作系统下,您无法在用户空间进程中轻松分配WC内存,但通常不希望这样做。

您只能在WC内存上使用SSE4 NT负载(否则当前的CPU会忽略NT提示),但是负载的某些缓存污染是为硬件预取和缓存工作付出的代价很小。您可以使用WB内存中的NT

prefetch

在某些级别的缓存中降低污染,例如绕过L2。但这很难调整。IIRC,normal存储,如WC存储器上的mov,具有您从NT存储获得的存储合并行为。但是,您无需使用WC内存即可使NT存储工作。
caching memory-management x86-64 sse cpu-cache
1个回答
3
投票

[您可以在普通WB内存(即堆)上使用类似movntps的NT存储。

© www.soinside.com 2019 - 2024. All rights reserved.