ocperf.py
是perf
uarch 特定事件的符号名称的包装器,例如load_hit_pre.sw_pf
(当调度到加载端口的需求加载到达为软件预取分配的 L1D 填充缓冲区 (FB) 时计数)。 ocperf.py list
有描述和名称。
这可能是一个有用的东西,但我自己并没有使用它,所以 IDK 如果它真的完全符合你的需要。一定要查看事件列表 ( ocperf.py list | less
)。
您还应该查看 L1D 未命中率;通过成功预取并设法保持领先于需求加载,实际加载指令应该在 L1D 中命中。(plainperf
可以用 . 来跟踪它L1-dcache-load-misses
。)
对于预取但在使用前被驱逐的测量线,有l2_lines_out.useless_hwpf
. “计算已被硬件预取但未使用且现在被 L2 缓存逐出的行数”。 l2_lines_out.useless_pref
是那个的别名;看起来没有包含 SW 预取的类似事件。
您可能只需要查看 L1D 未命中率;这应该告诉你预取距离的最佳范围在哪里。如果load_hit_pre.sw_pf
按我希望的那样工作,那么 L1D 未命中数低load_hit_pre.sw_pf
意味着您的预取距离太高。(或者由于其他原因,SW预取请求被丢弃,但我认为只有在需求负载利用率很高时才会丢弃硬件预取请求)。
存储的性能计数器硬件事件比加载更有限,因此如果您尝试为只写流预取,它将更难测量。L1D 中的硬件预取器甚至可能根本不预取存储,因此只写流的不同访问模式可能会受到很大影响。另请参阅@BeeonRope 对此答案的评论:如果商店在 L2 而不是 L1D 中命中,则商店的 SW 预取会有所帮助。 prefetchw
是理想的,但平原prefetcht0
仍然有用。(prefetchw
在 Haswell 和之前作为 NOP 运行。)
另请参阅x86标签 wiki中的其他链接