performance - 有没有工具可以测量 C 程序中的所有缓存级别?

标签 performance caching cpu valgrind

我想研究二级缓存未命中对CPU功耗的影响。为了衡量这一点,我必须创建一个逐渐增加工作集大小的基准,以便核心事件(每个周期执行的微操作)和 L2 事件(每个周期的 L2 请求)保持不变,但 L2 未命中与 L2 请求的比率增加。

为了测量缓存命中/未命中,我尝试使用 valgrind,但该工具在使用 cachegrind 时仅假设 2 级缓存,而我的笔记本电脑有 3 级缓存。

有什么工具可以测量 C 程序中的所有缓存级别

最佳答案

现代 CPU 有一个 PMU(性能监控单元),可用于累积 L1/2/3/4 缓存命中/未命中/请求等。有几个很好的库可以实现 PMU 的东西。

我熟悉 PAPI , perfIntel's PMU 。我更喜欢 Intel 的实现,因为它在 QPI 和其他“非核心”东西上实现了性能计数器。我认为大多数人使用 PAPI 是因为它经常针对新硬件进行更新,并且具有高级和低级接口(interface)。

实现这个东西并不是太简单,但是有很多关于它的信息。通常,您只需在代码中指定分析区域,然后指定要使用的计数器。请注意,您只能使用一定数量的硬件计数器,具体取决于芯片中的 PMU 以及操作系统所使用的计数器。

此外,我不相信 valgrind 缓存分析使用 PMU 指令来获取数据,而是在软件中进行。

关于performance - 有没有工具可以测量 C 程序中的所有缓存级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37818463/

相关文章:

c - 最小化冗余内存负载的高效二维均值滤波器实现?

c - 在 C 数组中进行按位运算的最有效方法是什么

json - Postgres - 大型 jsonb 列的性能

performance - gatling 注入(inject)用户 vs jmeter 线程组

java - 缓存不适用于 map

jquery - 如何说服浏览器从缓存中加载图像而不是从服务器获取

performance - "Call by name"会减慢 Haskell 的速度吗?

caching - docker build --no-cache=true 仍然使用缓存构建?

ubuntu - caffe/include/caffe/util/device_alternate.hpp :35:23: fatal error: cublas_v2. h:没有这样的文件或目录

mysql - 0 io 密集型应用程序上的 iowait。我的cpu用了什么时间?