When using ChampSim, it is very common to ask "why is this workload behaving this way?" CPI Stacks are the common tool used in academia and industry to answer this question. CPI Stacks aren't perfectly accurate (see this paper), but they give an indication where the performance bottlenecks are. I've implemented CPI stacks using event listeners for my research, and I'd like to share them.
How do CPI Stacks work?
CPI stacks are placed at a given stage, and monitor the state of the stage. Each cycle the stage is stalled or idle, they blame a particular bottleneck. At the end of the program, the number of cycles blamed on each bottleneck is divided by the total number of instructions retired, giving the portion of the total CPI that is attributable to the bottleneck.
I've implemented CPI stacks in the dispatch, issue, and retire stages, although I need to update them to use the new version of event listeners (that was just merged into develop).
When using ChampSim, it is very common to ask "why is this workload behaving this way?" CPI Stacks are the common tool used in academia and industry to answer this question. CPI Stacks aren't perfectly accurate (see this paper), but they give an indication where the performance bottlenecks are. I've implemented CPI stacks using event listeners for my research, and I'd like to share them.
How do CPI Stacks work?
CPI stacks are placed at a given stage, and monitor the state of the stage. Each cycle the stage is stalled or idle, they blame a particular bottleneck. At the end of the program, the number of cycles blamed on each bottleneck is divided by the total number of instructions retired, giving the portion of the total CPI that is attributable to the bottleneck.
I've implemented CPI stacks in the dispatch, issue, and retire stages, although I need to update them to use the new version of event listeners (that was just merged into develop).