PREFETCHNTA
指令基本上用于通过预取器将数据从主存储器带到缓存,但是已知带有NT
后缀的指令会跳过缓存并避免缓存污染。
那么PREFETCHNTA
与PREFETCH
指令有什么不同?
答案 0 :(得分:3)
prefetchNTA无法绕过缓存,只能减少(不能避免)污染。它不能破坏高速缓存一致性,也不能违反WB(回写)存储区域的存储顺序语义。 (与NT存储区不同,NT存储区完全绕过缓存并且即使在普通的WB内存上也具有弱顺序。)
在纸上,x86 ISA没有指定如何实现NT提示。 http://felixcloutier.com/x86/PREFETCHh.html说:“ NTA(关于所有缓存级别的非临时数据)—将数据预取到非临时缓存结构中以及处理器附近的位置,从而最大程度地减少了缓存污染。 “任何特定的CPU微体系结构如何选择实施完全取决于架构师。
prefetchNTA
通常填充L1d,从而允许以后的负载正常加载L1d(只要预取距离足够大以至于预取完成,并且足够小,以至于在需求负载之前不会再被逐出)。正确的预取距离取决于系统和其他因素,并且可能非常脆弱。
它在Intel CPU上的作用是跳过非包含外部缓存。因此在Skylake-AVX512之前的Intel上,它绕过L2并填充L1d + L3。但是在SKX上,它更小且不包含L3缓存,因此完全跳过了L3缓存。看到 Do current x86 architectures support non-temporal loads (from "normal" memory)?
在具有内置L3高速缓存(无法绕过)的Intel CPU上,它被限制为预取到关联的内置L3高速缓存的一种“方式”,从而减少了L3污染。 (通常这类似于16路关联,因此prefetchnta
可以污染的总容量仅为L3总大小的约1/16)。
@HadiBrais在此回答中评论了有关AMD CPU的信息。
AMD并没有通过仅取入一种缓存方式来限制污染,显然AMD会分配使用NT预取功能并带有“快速逐出”标记的行。可能这意味着分配在LRU位置而不是最近使用的位置。因此,该缓存集合中的下一个分配将逐出该行。
脚注1:我认为是从WC存储器中prefetchNTA
预取到LFB,从而允许SSE4.1 movntdqa
加载达到已经填充的LFB。但是请注意,WB存储器中的movntdqa
没用。