[根据Intel 64-ia-32-架构优化手册(2019年9月)中的“将数据预取到L1数据缓存”,如果“加载来自回写存储器类型”,则PREFETCHNTA指令有效。
我的问题是“写回内存类型”是否适用于普通堆内存?
[根据Do current x86 architectures support non-temporal loads (from "normal" memory)?的第一个答案(由BeeOnRope撰写),“是的,最近的主流英特尔CPU支持在正常内存上进行非临时性加载-但只能通过非临时性预取指令“间接”进行,而不是直接使用非临时性预取指令。诸如movntdqa之类的临时加载指令。与非临时存储相反,在非临时存储中,您可以直接使用相应的非临时存储指令。”
[我在Can we use non-temporal mov instructions on heap memory?处问了类似的问题,答案是(Peter Cordes),“您可以在普通的WB存储器(即堆)上使用NT存储器,如movntps”。这个问题是关于PREFETCHNTA的非临时性负载(不是存储)。
根据我的阅读,看来PREFETCHNTA可与普通堆存储器一起使用,但我想知道为什么它总是被“必须是回写存储器类型”限定。
在主流操作系统下的用户空间处理中,您的所有内存都可以被WB(回写)缓存。
除非您使用特殊的系统调用来执行类似将视频RAM映射到虚拟地址空间的操作。如果您不这样做,那么您肯定具有回写内存。
在其他答案中对其他内存类型的所有讨论只是为了完整性/避免说出并非在所有情况下都是正确的事情。或解释一下SSE4.1movntdqa
NT加载的实际用途。在WB内存上(在当前硬件上),它是无用的。
(NT prefetch与NT加载有很大不同。)