是否由精确地址流或缓存行流触发预取?

时间:2017-12-09 19:42:57

标签: performance x86 cpu-architecture

在现代x86 CPU上,硬件prefetching是一种重要的技术,可以在用户代码明确请求之前将缓存行放入缓存层次结构的各个级别。

基本思想是,当处理器检测到对顺序或跨步顺序 1 位置的一系列访问时,即使在执行指令之前,它也会继续并获取序列中的其他内存位置(可能)实际访问这些位置。

我的问题是,检测预取序列是基于完整地址(用户代码请求的实际地址)还是缓存行地址除了底部6位 2 之外的地址被剥离了很多。

例如,在具有64位缓存行的系统上,访问完整地址1, 2, 3, 65, 150将访问缓存行0, 0, 0, 1, 2

当高速缓存行寻址中的一系列访问比完全寻址更常规时,差异可能是相关的。例如,一系列完整地址,如:

32, 24, 8, 0, 64 + 32, 64 + 24, 64 + 8, 64 + 0, ..., N*64 + 32, N*64 + 24, N*64 + 8, N*64 + 0

在完整地址级别可能看起来不像一个跨步序列(实际上它可能会错误地触发向后预取器,因为4个访问的每个子序列看起来像一个8字节跨步反向序列),但在高速缓存行级别它看起来像它一次转发一个缓存行(就像简单的序列0, 8, 16, 24, ...)。

现代硬件上有哪个系统?

注意:也可以想象答案不会基于每次访问,而只能访问在某个级别的缓存中遗漏的内容预取器正在观察,但是同样的问题仍然适用于过滤的"未命中访问流#34;

1 Strided-sequential意味着访问它们之间具有相同的 stride (delta),即使该delta不是1.例如,对位置100, 200, 300, ...的一系列访问可以被检测为步幅为100的跨步访问,原则上CPU将根据此模式进行提取(这意味着某些高速缓存行可能被"跳过&# 34;在预取模式中)。

2 这里假设一个64位高速缓存行。

1 个答案:

答案 0 :(得分:2)

高速缓存行偏移量可能很有用,但也可能会误导您的示例。我将基于我在Haswell上的实验,讨论行偏移如何影响现代Intel处理器上的数据预取器。

我遵循的方法很简单。首先,我禁用所有要测试的数据预取器。其次,我设计了一系列具有特定兴趣模式的访问。目标预取器将看到此序列并从中学习。然后,我接着访问特定的行,以通过准确地测量等待时间来确定预取器是否已预取该行。该循环不包含任何其他负载。它包含一个用于将延迟测量值存储在某个缓冲区中的存储。

有4个硬件数据预取器。 DCU预取器和L2相邻行预取器的行为不受行偏移模式的影响,而仅受64字节对齐地址的模式的影响。

我的实验没有显示L2流式预取器甚至接收到缓存行偏移量的任何证据。似乎它只获取行对齐的地址。例如,通过多次访问同一行,偏移模式本身似乎不会对预取器的行为产生影响。

DCU IP预取器显示了有趣的行为。我已经测试了两种情况:

  • 如果负载的偏移量减小,则预取器将在前进和后退方向上预取一条或多条线。
  • 如果负载的偏移量增加,则预取器将预取一条或多条线,但仅在向前方向上。