为什么 PREFETCHNTA 符合 "must be writeback memory type"?

Why is PREFETCHNTA qualified by "must be writeback memory type"?

根据 Intel 64-ia-32-architectures-optimization-manual(2019 年 9 月)中的 "Data Prefetch to L1 Data Cache",如果 "Load is from writeback memory type."

,则 PREFETCHNTA 指令有效

我的问题是"writeback memory type"是否适用于普通堆内存?

根据 Do current x86 architectures support non-temporal loads (from "normal" memory)?(来自 BeeOnRope)的第一个答案,"Yes, recent mainstream Intel CPUs support non-temporal loads on normal memory - but only "通过非时间预取指令间接地“,而不是直接使用像 movntdqa 这样的非时间加载指令。这是在与非临时存储相比,您可以直接使用相应的非临时存储指令。”

我在 上问了一个类似的问题,答案(来自 Peter Cordes)是,"You can use NT stores like movntps on normal WB memory (i.e. the heap)." 这个问题是关于使用 PREFETCHNTA 的非时间加载(不是存储)。

据我所知,PREFETCHNTA 似乎适用于普通堆内存,但我想知道为什么它总是符合 "must be writeback memory type."

在主流OS下的user-space进程中,你所有的内存都可以WB(Write Back)缓存。

除非你使用特殊的系统调用来做一些事情,比如将视频 RAM 映射到你的虚拟地址 space。如果你不这样做,你肯定有回写记忆。

其他答案中对其他内存类型的所有讨论只是为了完整性/避免说出并非在所有情况下都是正确的事情。或者解释像 SSE4.1 movntdqa NT load 这样的东西实际上是为了什么。它在 WB 内存上(在当前硬件上)没用。

(NT prefetch 与 NT 加载有很大不同。)