我希望评估在运行Linux的x86-64(Intel Nehalem)机器上,由于TLB缺失而导致的性能开销。我希望通过使用一些性能计数器来获得这个估计值。请问有哪些指针可以指导我如何最好地进行这个估计呢?谢谢 Arka
如果您可以访问基于“Westmere”的系统,则代码的性能特征应该与“Nehalem”上的相似,但是您将可以访问一个新的硬件性能计数器事件,该事件几乎可以精确地测量您想要的性能。在Westmere上,性能损失最大的估计值可能来自于硬件性能计数器事件08H,掩码04H“DTLB_LOAD_MISSES.WALK_CYCLES”,该事件被描述为计数“页面缺失处理程序由于第二级TLB中的加载缺失而忙于执行页面漫游的周期数”。这在“Intel® 64和IA-32体系结构软件开发者手册卷3B:系统编程指南,第2部分”(文档编号:253669)中有描述,可在http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.html上线获取。之所以需要这个事件,是因为TLB缺失处理时间主要由读取包含页表项的缓存行所需的时间支配。如果该缓存行在L2缓存中,则TLB缺失的开销非常小(大约为10个周期的数量级)。如果该行在L3缓存中,则可能需要25个周期。如果该行在内存中,则需要约200个周期。如果上层页转换缓存也出现缺失,则需要多次访问内存才能找到和检索所需的页表项(例如https://dev59.com/YHE85IYBdhLWcg3wOw_s#9674980)。在某些处理器上,L2缓存计数器可以告诉您L2中有多少表走失和命中,但在Nehalem上不行。(在这种情况下,这并没有太大帮助,因为在L3中命中的TLB walks也相当快,而您真正想要的是必须去内存的TLB walks。)