【问题标题】:Access behavior of MM_PREFETCH intrinsic - IntelMM_PREFETCH 内在的访问行为 - 英特尔
【发布时间】:2022-01-01 06:08:38
【问题描述】:

here 提供的文档提到,指定地址处的可用数据从内存带到缓存行(作为提示提供的缓存级别)。

但是,我很困惑是否也访问了 LLC(假设提示指定 L1D 或 L2)或者是否总是访问内存的情况 - 无论数据是否在 LLC 中可用。

我问这个问题的原因是,在我的某些实验中,我发现使用 _mm_prefetch 内在函数增加了我的 LLC 负载计数(性能事件),即使我获得了整体性能受益。

【问题讨论】:

  • 任何与处理器实现行为相关的问题都需要清楚地标识出正在讨论的哪个处理器。 (即使是看似简单的问题也对应于任何特定实现的大量特殊情况——将这种复杂性乘以未指定的实现,很难给出明确的回答。)

标签: x86 intel cpu-architecture perf prefetch


【解决方案1】:

预取可以在 LLC 中命中;如果在 L2 或 L3 中已经很热,如果它们需要额外的 DRAM 流量来将数据输入 L1d,那将是一个非常糟糕的设计。

另外,L3 中的副本可能是脏的,所以它肯定必须检查 L3 的正确性。

唯一真正的设计选择是如果数据不存在,是否添加到 L3。在 Nehalem 之后的 Intel CPU 上,在 Skylake-X 之前,L3 is an Inclusive cache,所以别无选择。 (Difference between PREFETCH and PREFETCHNTA instructions)

在 SKX 及更高版本上,通过内核和较小的非包含 L3 之间的网状互连,prefetchnta 可以避免替换 L3 中的行(如果它还不是热的),但其他预取仍会选择在外部填充数据像需求负载一样的缓存级别。 (除非在预取提示中指定的任何缓存级别停止)。

【讨论】:

  • 还有一个疑问.. 我找不到任何关于预取地址跨越页面边界时会发生什么的参考资料。对此有何想法?
  • @HarshKumar:这在设计上是不可能的:预取需要一个m8 内存操作数(felixcloutier.com/x86/prefetchh),并且单个字节不能跨越页面边界。
  • Corder 不,我在问预取地址是否对应于另一个页面 - 除了当前处理的数据可用的页面之外。因此,如果我的计算正在访问 A[15],但我正在预取 A[1500],那么 A[1500] 将在另一个页面中..
  • @HarshKumar:旧 CPU 过去常常忽略 TLB 未命中的软件预取提示,但多年来一直没有这种情况。 SW 预取距离是一件很难调整的事情(太远了,缓存污染可能会在你到达之前再次驱逐数据,特别是对于 PREFETCHNTA,并且带宽取决于整个系统而不仅仅是当前进程。)但是 SW 预取,如果它是对于顺序访问模式完全有用,可能应该比你读/写的地方早 1 到 4kiB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 2016-07-13
相关资源
最近更新 更多