首页 文章

预取是由精确地址流还是由缓存行流触发的?

提问于
浏览
7

在现代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, ... ) .

在现代硬件上采用哪种系统?


Note: 也可以想象答案不是基于每次访问,而只是基于预取器正在观察的某个级别的缓存中丢失的访问,但是同样的问题仍然适用于"miss accesses"的过滤流 .


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

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

1 回答

  • 2

    高速缓存行偏移可能很有用,但它们也可能会误导,如您的示例所示 . 我将根据我在Haswell上的实验讨论线路偏移如何影响现代英特尔处理器上的数据预取器 .

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

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

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

    DCU IP预取器显示出有趣的行为 . 我测试了两个案例:

    • 如果载荷具有减小的偏移量,则预取器将在向前和向后方向上预取一条或多条线 .

    • 如果负载具有增加的偏移量,则预取器将预取一条或多条线,但仅在正向方向上 .

相关问题