我正在尝试测量内存引用错过任何CPU缓存并需要从内存中获取缓存行的次数。我有一个非常简单的程序,可以将1亿个4字节整数加载到数组中,然后对其进行扫描或随机探测。我测量时间,然后使用性能报告各种与缓存有关的事件: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)的数字通常要少。但是通过阅读文档并查看数字,我真的不理解各种事件代表什么。
性能计数是对事件计数还是对事件进行采样?如果这是一个真实的数字,那么我真的无法理解我看到的数字。 (例如,LLC-load-misses事件的数量与应该需要的高速缓存行传输的数量不匹配。)