如何在哈斯韦尔微体系结构上测量晚期预取的预取



我正在使用 Intel Xeon 2660 V3 ,并发出大量软件预取以利用MLP并减少失速时间。现在,我想介绍该应用程序,以获取由于软件预取的总体增益。

在论文" 使用自适应执行>"中提高软件预取的有效性",作者讨论了与软件预取相关的硬件中的性能计数器支持。

我将文字从论文中列出,作者谈论了性能计数器。

此外,这是唯一需要的硬件支持 最佳自适应方案是一对计数器:一个测量 晚期预取(Preatefertes)的数量(处理器后到达 已经要求数据),另一个测量了 由于缓存冲突而丧生的预取。

我想将 haswell Microarchitecture 的应用程序介绍,但在 perf Papi 中找不到任何此类性能计数器。因此,还有其他性能计数器可以获取此类事件吗?对于代码的一小部分而不是为完整应用程序执行的最佳方法是什么?

纸链接

ocperf.pyperf的包装器,具有符合特定事件的符号名称(例如load_hit_pre.sw_pf)(计数时计数时,需要分配到负载端口时,命令分配的L1D填充缓冲区(FB)用于软件预取)。ocperf.py list具有描述和名称。

这可能是一个有用的观察,但是我自己没有使用它,所以如果确实做到这一点,那么它确实是您所需要的。绝对浏览事件列表(ocperf.py list | less)。

您还应该查看L1D错率;通过成功的预取,设法保持领先于需求负荷,实际的负载说明应在L1D中击中。(并且普通perf可以使用L1-dcache-load-misses跟踪。)


用于测量预取的线路但在使用前被驱逐的线,有l2_lines_out.useless_hwpf"计算已经硬件预取但未使用的行数,现在由L2缓存驱逐"。 l2_lines_out.useless_pref是一个别名;看起来没有类似的事件,其中包括SW预取。

您可能只需要查看L1D错率即可;这应该告诉您预取距离的甜蜜范围在哪里。如果load_hit_pre.sw_pf正如我希望的那样,那么 load_hit_pre.sw_pf的L1D错过了低计数,这意味着您的预取距离太高。(或出于某些其他原因,正在删除SW预取请求,但是我认为只有在大量需求加载使用时才删除HW预取请求)。


商店的perf-counter硬件事件比负载要限制得多,因此,如果您要预取仅写入流,它将很难测量。L1D中的HW预摘要甚至根本没有预购,因此,仅写作流的不同访问模式可能会受到很多影响。另请参阅 @beeonrope对此答案的评论:SW预购商店可以在L2中击中而不是L1D。prefetchw是理想的,但是普通的prefetcht0仍然有用。(prefetchw在Haswell和Ealier上以NOP的形式运行。)


另请参见x86标签Wiki中的其他链接

相关内容

  • 没有找到相关文章

最新更新