linux - 如何使用 linux perf 并解释其输出以了解 CPU 缓存未命中?
问题描述
我正在尝试测量内存引用错过任何 CPU 缓存并需要从内存中获取缓存行的次数。我有一个非常简单的程序,它将 1 亿个 4 字节整数加载到一个数组中,然后随机扫描或探测它。我测量时间,然后使用 perf 报告各种与缓存相关的事件:LLC-load、LLC-load-misses、LLC-store、LLC-store-misses。我正在使用 Pop OS 18.10(Ubuntu 18.10 的变体)。
我以三种方式运行程序:
1)只需加载数组(100m 个整数)。
2) 加载阵列并按物理顺序扫描。
3) 加载数组并读取 100m 随机数组位置。
#3 比 #2 慢 40 倍,这并不奇怪。
我在知道要检查哪些性能事件以及如何解释结果方面都遇到了一些麻烦:
我通过谷歌搜索发现了 LLC-* 事件,但“性能列表”没有提到它们。
我从加载和扫描运行(#2、#3)中减去仅加载运行(#1)的事件计数。与随机访问 (#3) 相比,物理扫描 (#2) 的数字通常较低。但是通过阅读文档和查看数字,我并不真正了解各种事件代表什么。
perf 对事件进行计数还是对其进行采样?如果这是一个真实的计数,那么我真的无法理解我看到的数字。(例如,LLC-load-misses 事件的数量与应该需要的缓存线传输数量不匹配。)
解决方案
推荐阅读
- python - import numpy 导致 Python 在 NumPy 版本 1.16.0 及更高版本中崩溃
- swift - Swift 协议中默认参数的替代方案
- deployment - 如何配置所有 Pod 立即开始接受请求连接?
- printing - 在 Ubuntu 服务器中安装 CUPS 时如何访问连接到本地计算机的打印机
- php - PHP file_get_contents 按国家名称获取所有城市名称
- c# - 尝试在 AWS Cognito 中对用户进行身份验证时出现 OperationCanceledException
- mysql - 使用嵌套查询进行自联接
- python - 在分类列上训练 xgboost 时遇到问题
- c# - 删除断点后打印机不打印数据 n 调试模式
- mongodb - 如何使用 mongodump 命令创建一个具有唯一文件夹的数据库的 gzip 文件?