代码之家  ›  专栏  ›  技术社区  ›  RTC222

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

  •  0
  • RTC222  · 技术社区  · 4 年前

    可以通过使用非时态写指令MOVNTI、MOVNTQ、MOVNTDQ、MOVNTPD、MOVNTPS来避免 . 当写入一个不太可能被缓存的内存位置时,应该使用这些指令,并且在收回可能的缓存线之前,不太可能再次从中读取。根据经验,建议仅在写入大于最大级别缓存大小一半的内存块时才使用非时态写入。”

    在“英特尔64和IA-32体系结构软件开发人员手册合并卷2019年10月”中,这些SSE和SSE2非时态存储指令将被访问的内存视为写合并(WC)类型,从而将缓存污染降至最低。如果一个程序用这些指令之一指定一个非时态存储 处理器将执行以下操作……”

    我认为写组合内存只存在于图形卡中,而不存在于通用堆内存中——扩展一下,上面列出的指令只在这种情况下才有用。如果这是真的,为什么阿格纳雾建议这些指示?英特尔的手册似乎建议它只对WB、WT或WC内存有用,但后来他们说要访问的内存

    如果这些指令真的可以用在普通的写堆内存中,有什么限制吗?如何分配写组合内存?

    0 回复  |  直到 4 年前
        1
  •  3
  •   Peter Cordes Steve Bohrer    4 年前

    你可以使用NT商店,比如 movntps 在正常的WB内存(即堆)上。 Enhanced REP MOVSB for memcpy 有关NT商店与普通商店的更多信息。

    尽管MTRR和/或PAT已将其设置为正常WB,但对于这些NT存储而言,作为WC。

    英特尔文档告诉你NT在WB、WT和WC内存上存储“work” . (但不是强有序的UC不可缓存内存,当然也不是WP写保护内存)。


    您只能在WC内存上使用sse4nt加载(否则当前的cpu会忽略NT提示),但是加载的一些缓存污染对于硬件预取和缓存工作来说是一个很小的代价。你可以用NT 从WB内存到

    IIRC公司, 像这样的商店 mov 在WC内存上,您可以从NT存储获得存储合并行为。但是你不需要使用WC内存让NT商店工作。