据我所知,很多现代 CPU 都具有内存缓存未命中/命中计数器。
是否有可以查询此问题的 API/程序?是否有办法重置计数器?
我对任何通用或特定 CPU 的程序都感兴趣。
注意:我知道 cachegrind,但那是一个模拟,而不是实际的 CPU 计数器。
答案1
好吧,我又获取了一些资源,看起来对于 CPU 缓存命中/未命中计数器,我们必须进行基于单个进程或 pid 或 tid 的跟踪。换句话说,就是 perf 和 oprofile。
例如 perf stat 给出了这个。
Performance counter stats for 'ls':
3.905621 task-clock # 0.831 CPUs utilized
1 context-switches # 0.000 M/sec
0 CPU-migrations # 0.000 M/sec
267 page-faults # 0.068 M/sec
379,003 cycles # 0.097 GHz [24.55%]
1,332,419 stalled-cycles-frontend # 351.56% frontend cycles idle [36.65%]
<not counted> stalled-cycles-backend
833,177 instructions # 2.20 insns per cycle
# 1.60 stalled cycles per insn
580,745 branches # 148.695 M/sec [95.65%]
37,799 branch-misses # 6.51% of all branches [71.09%]
0.004697863 seconds time elapsed
Oprofile 给出了类似的输出,但在我看来,perf 非常棒。
另一件事是,对于存储库,numastat 为您提供了另一个级别的细节。
$ numastat
node0
numa_hit 74263001
numa_miss 0
numa_foreign 0
interleave_hit 15459
local_node 74263001
other_node 0
是的,这个系统是一个单节点系统。
答案2
在此问题/答案他们讨论了用于分析缓存未命中的Linux工具:
性能:
$ perf stat ./yourapp
$ perf stat -B dd if=/dev/zero of=/dev/null count=1000000
瓦尔格林:
$ valgrind ./yourapp
而且time
从理论上来说,这也计算了页面错误:
$ time -v YourProgram.exe
在我的系统上它不接受-v
标志,我必须检查为什么