linux perf 是否准确测量多线程 C 程序的高速缓存未命中?

Is linux perf accurate for measuring cache misses for multithread C program?

linux perf 可以测量多线程程序的缓存未命中数,还是只能报告主线程的结果?我在使用 pthread 的 C 程序上使用它,似乎缓存未命中数低于预期数。

是的,perf stat 是所有线程的准确总数。 (除非您的 CPU 有一个勘误表,其中某个 PMU 事件计数过多或不足。这些确实会发生,比实际架构状态的正确性错误更常见,因此请检查勘误表 sheet,又名“规范更新" 对于英特尔 CPUs。)

确保您准确理解每个缓存事件的计数,例如L1d-misses 在像 Skylake 这样的现代 Intel 上计数 l1d.replacement,因此同一行上的多个 misses 只是一个替代品。 ().

另请注意,如果内存跟得上,硬件预取可以避免很多顺序访问的未命中。也相关:L2 instruction fetch misses much higher than L1 instruction fetch misses


也相关: 详细介绍了这些特定事件的确切计数。