Intel 硬件预取器 Intel 网站显示有四种硬件预取器。位 3 控制的预取器是 L1 步长预取器。我正在运行一个测试代码来测试步幅预取器的触发条件是什么。我使用以下步骤运行代码(将 MSR0x1a4 设置为 0x7,这意味着仅启用基于 L1 IP 的 strider 预取器):
repeat following for 10000 times:
flush
training phase: access line 0 3 6 9
sleep for near 1000 cycles
measure phase: measure line 12
我希望看到第 12 行被预取到缓存中。但是我只能看到缓存中的第 0 3 6 9 行被命中。即使在我更改步幅或访问模式的长度后,也无法观察到步幅预取活动。所以我想知道是否有人在英特尔处理器中看到过预取活动,或者有一些我没有注意到的特殊触发条件?
对此案例感兴趣的朋友可以试一下测试代码,运行即可sudo ./run.sh
。我机器上的结果显示第 12 行的访问时间大多大于 180 个周期。我认为时间测量代码没有问题,因为如果我将测量的行从缓存行 12 更改为缓存行 6(只需在 test.c,第 103 行更改它),那么访问时间主要是 25 个周期。