我想研究二级缓存未命中对CPU功耗的影响。为了衡量这一点,我必须创建一个逐渐增加工作集大小的基准,以便核心事件(每个周期执行的微操作)和 L2 事件(每个周期的 L2 请求)保持不变,但 L2 未命中与 L2 请求的比率增加。
为了测量缓存命中/未命中,我尝试使用 valgrind,但该工具在使用 cachegrind 时仅假设 2 级缓存,而我的笔记本电脑有 3 级缓存。
有什么工具可以测量 C 程序中的所有缓存级别?
最佳答案
现代 CPU 有一个 PMU(性能监控单元),可用于累积 L1/2/3/4 缓存命中/未命中/请求等。有几个很好的库可以实现 PMU 的东西。
我熟悉 PAPI , perf和 Intel's PMU 。我更喜欢 Intel 的实现,因为它在 QPI 和其他“非核心”东西上实现了性能计数器。我认为大多数人使用 PAPI 是因为它经常针对新硬件进行更新,并且具有高级和低级接口(interface)。
实现这个东西并不是太简单,但是有很多关于它的信息。通常,您只需在代码中指定分析区域,然后指定要使用的计数器。请注意,您只能使用一定数量的硬件计数器,具体取决于芯片中的 PMU 以及操作系统所使用的计数器。
此外,我不相信 valgrind 缓存分析使用 PMU 指令来获取数据,而是在软件中进行。
关于performance - 有没有工具可以测量 C 程序中的所有缓存级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37818463/