我试图使用顶部向下微架构分析方法(TMAM)来分析在Intel Haswell CPU(Intel® Core™ i7-4900MQ)上的执行,该方法在Intel® 64 and IA-32 Architectures Optimization Reference Manual的B.1和B.4章节中有描述(如果需要,我会根据B.4中描述的Sandy Bridge公式调整到Haswell微架构)。因此,我使用Perf进行性能计数器事件测量。但是有一些结果我不理解:
1.
2.
1.
CPU_CLK_UNHALTED.THREAD_P
< CYCLE_ACTIVITY.CYCLES_LDM_PENDING
。这仅适用于一些测量数据,但仍然很奇怪。PMU是否计算了CYCLE_ACTIVITY.CYCLES_LDM_PENDING
的停止周期?2.
CYCLE_ACTIVITY.CYCLES_L2_PENDING
> CYCLE_ACTIVITY.CYCLES_L1D_PENDING
并且CYCLE_ACTIVITY.STALLS_L2_PENDING
> CYCLE_ACTIVITY.STALLS_L1D_PENDING
。这适用于所有测量数据。当L1D缓存未命中时,负载将传输到L2缓存,对吧?那么之前未命中L2的负载也未命中L1。这里没有计算L1指令缓存,但是*_L2_PENDING
比*_L1D_PENDING
大100倍甚至1000倍,可能不是那样。难道停顿/周期正在分别测量吗?但是有一个公式:%L2_Bound = (CYCLE_ACTIVITY.STALLS_L1D_PENDING - CYCLE_ACTIVITY.STALLS_L2_PENDING) / CLOCKS
。因此假设CYCLE_ACTIVITY.STALLS_L2_PENDING
< CYCLE_ACTIVITY.STALLS_L1D_PENDING
(公式的结果必须为正)。 (使用该公式的另一件事是它应该是CYCLES
而不是STALLS
。但是这不能解决上述问题。)那么这怎么解释呢?