TITLE: Bad Speculation
This category reflects pipeline slots wasted due to incorrect speculations, which include slots used to allocate uops that do not eventually get retired and slots for which allocation was blocked due to recovery from earlier incorrect speculation. For example, uops allocated in the shadow of a miss-predicted branch or machine Nukes, or cycles used to recover the speculative machine state would be counted in this category.
Having the Bad Speculation category at the top level breakdown is crucial to the Top Down methodology, as it determines the rate and impact of incorrect execution paths. The accuracy of observations listed in the other categories are impacted by the Bad Speculation percentage since the majority of performance counters account for both correct and incorrect execution paths indiscriminately. Hence, a high value in Bad Speculation would be interpreted by the user as a “red flag” that would need to be investigated first before looking at other categories.
To calculate this, we use allocated & retired uops counters plus a cycle-counter for recovery periods:
Bad Speculation = (UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4* INT_MISC.RECOVERY_CYCLES) / (4*CPU_CLK_UNHALTED.THREAD)
This metric can be used to determine at a high level if you are bound due to bad speculation.
For instance, if you had branch mispredicts or nukes (e.g. memory order nukes from unsucessful memory disambiguation), you would see a high bad speculation percentage.
Drill down into the lower level bad speculation metrics (e.g. branch and nuke events) to find the specific performance issue.
EQUATION: UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + INT_MISC.RECOVERY_CYCLES / (4*CPU_CLK_UNHALTED.THREAD)