我想测量我的代码的缓存未命中率。我们可以使用 perf list 来显示支持的事件。我的台式机有一个 Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz 处理器,性能列表包含缓存引用和缓存未命中,如下所示:
cpu-cycles OR cycles [Hardware event]
stalled-cycles-frontend OR idle-cycles-frontend [Hardware event]
stalled-cycles-backend OR idle-cycles-backend [Hardware event]
instructions [Hardware event]
cache-references [Hardware event]
cache-misses [Hardware event]
Run Code Online (Sandbox Code Playgroud)
我认为缓存未命中根据英特尔架构软件开发人员手册映射到硬件事件 LLC 未命中(我通过比较perf stat -e r412e和perf stat -e cache-misses 来确认这一点,它们给出了几乎相同的结果)。但是缓存引用是如何计算的呢?我没有找到使用现有硬件事件获取总缓存引用的事件或方法。所以我想知道这个缓存引用在我的电脑上是否准确?
我正在阅读这个CPU规范:http://ark.intel.com/products/67356/Intel-Core-i7-3612QM-Processor-6M-Cache-up-to-3_10-GHz-rPGA
它说CPU有2个通道.所以我认为里面有2个内存控制器.如果支持的DDR3 RAM为1600MHz,则最大内存带宽应为1.6GHz*64bits*2*2 = 51.2 GB/s.但该规范称其最大内存带宽为25.6 GB/s.我在这里乘以两个2,一个用于双倍数据速率,另一个用于存储器通道.
这是规范的问题吗?或者我有一些想念?