Pet*_*des 10
prefetchNTA 不能绕过缓存,只能减少(不能避免)污染。它不能破坏缓存一致性或违反 WB(回写)内存区域的内存排序语义。(与 NT 存储不同,NT 存储完全绕过缓存并且即使在正常的 WB 内存上也是弱排序的。)
在纸面上,x86 ISA 没有指定它如何实现 NT 提示。 http://felixcloutier.com/x86/PREFETCHh.html说:“ NTA(关于所有缓存级别的非临时数据)——将数据预取到非临时缓存结构和靠近处理器的位置,最大限度地减少缓存污染. ” 任何特定的 CPU 微架构选择如何实现完全取决于架构师。
prefetchNTA
从英特尔 CPU 上的WB 内存1正常填充 L1d,允许以后的负载正常加载到 L1d(只要预取距离足够大以完成预取,并且足够小以至于在需求加载之前不会再次被逐出)。正确的预取距离取决于系统和其他因素,并且可能相当脆弱。
它在 Intel CPU 上所做的是跳过非包含外部缓存。因此,在 Skylake-AVX512 之前的 Intel 上,它绕过 L2 并填充 L1d + L3。但在 SKX 上,它也完全跳过 L3 缓存,因为它更小且不包含。请参阅 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?
在具有包容性 L3 缓存(它无法绕过)的 Intel CPU 上,它通过限制预取到关联包容性 L3 缓存的一种“方式”来减少 L3 污染。(这通常类似于 16 路关联,因此可以污染的总容量prefetchnta
仅为 L3 总大小的约 1/16)。
@HadiBrais 评论了这个答案,并提供了一些关于 AMD CPU 的信息。
显然 AMD 并没有通过仅获取缓存的一种方式来限制污染,而是使用“快速驱逐”标记分配使用 NT 预取获取的行。可能这意味着在 LRU 位置而不是最近使用的位置进行分配。因此,该缓存集中的下一个分配将驱逐该行。
脚注 1: prefetchNTA
我认为从 WC 内存预取到LFB(行填充缓冲区),允许 SSE4.1movntdqa
加载命中已经填充的 LFB。(根据英特尔的说法,movntdqa
从 WC 内存加载通过将数据拉入 LFB来工作。这就是movntdqa
同一“缓存线”上的多个加载可以避免多个实际 DRAM 读取或 PCIe 事务的方式)。另请参阅非临时加载和硬件预取器,它们是否协同工作?- 不,不是硬件预取。
但请注意,movntdqa
从 WB 内存是没有用的。它就像一个普通的负载(由于某种原因加上一个 ALU uop)。
归档时间: |
|
查看次数: |
764 次 |
最近记录: |