我在32-nm Intel Westmere处理器上运行Linux。我对性能计数器中DTLB未命中数字看似矛盾的数据表示担忧。我用随机内存访问测试程序(单线程)进行了两次实验,如下所示:
实验(1):我使用以下性能计数器计算了DTLB未命中
DTLB_MISSES.WALK_COMPLETED ((Event 49H, Umask 02H)
实验(2):我通过总结以下两个计数器值来计算DTLB未命中
MEM_LOAD_RETIRED.DTLB_MISS (Event CBH, Umask 80H)
MEM_STORE_RETIRED.DTLB_MISS (Event 0CH, Umask 01H)
我预计这些实验的输出是相似的。然而,我发现实验(1)中报告的数字几乎是实验(2)中的两倍。我不知道为什么会这样。
有人可以帮助解释这种明显的差异吗?
答案 0 :(得分:4)
这是预期的,因为第一个事件计算由于所有可能的原因(加载,存储,预取)导致的所有TLB级别的未命中数,包括推测性地执行的内存访问,而其他两个事件计数仅退休(是非推测性的加载和存储操作,只有那些不会导致任何错误的操作。
请参阅英特尔®64和IA-32架构软件开发人员手册第3卷第19.6章。
谢谢,
斯塔斯