【发布时间】:2020-07-05 04:58:06
【问题描述】:
在 Agner Fog 的“优化汇编语言中的子例程 - 第 11.8 节缓存控制指令”中,他说:“当回写缓存中发生缓存未命中时,内存写入比读取更昂贵。必须读取整个缓存行在缓存未命中的情况下从内存中进行修改和写回。可以通过使用非临时写指令 MOVNTI、MOVNTQ、MOVNTDQ、MOVNTPD、MOVNTPS来避免。这些指令应该在以下情况下使用写入一个不太可能被缓存的内存位置,并且在可能的缓存行被驱逐之前不太可能再次被读取。根据经验,建议仅在写入内存块时使用非临时写入这比最大级缓存大小的一半还大。”
来自“英特尔 64 和 IA-32 架构软件开发人员手册组合卷 2019 年 10 月”-“这些 SSE 和 SSE2 非临时存储指令通过将正在访问的内存视为写入组合 (WC) 类型来最大限度地减少缓存污染。如果程序使用这些指令之一指定非临时存储并且目标区域的内存类型是回写 (WB)、直写 (WT) 或写入组合 (WC),则处理器将执行以下操作……”
我认为写组合内存只存在于显卡中,而不存在于通用堆内存中——并且通过扩展,上面列出的指令只会在这种情况下有用。如果这是真的,为什么 Agner Fog 会推荐这些说明?英特尔手册似乎暗示它仅对 WB、WT 或 WC 内存有用,但随后他们说正在访问的内存将被视为 WC。
如果这些指令实际上可以用于普通的堆内存写入,有什么限制吗?如何分配写组合内存?
【问题讨论】:
标签: caching memory-management x86-64 sse cpu-cache