My only assessment can be that your measurement is flawed and probably includes some (more or less) static overhead that your calculations are not accounting for. Consider this super simplified attempt to solve this:
| Cycles |
Flawed IPC number |
Instruction count |
Static overhead |
“Actual” IPC |
| 1 |
1 |
1 |
0.111 |
0.889 |
| 2 |
0.95 |
1.9 |
0.111 |
0.8945 |
| 3 |
0.92 |
2.76 |
0.111 |
0.883 |
…wherein “Actual IPC” is (Instruction count - Static overhead) / Cycles
That looks much more likely, doesn’t it? All this is further complicated by the fact that, unless you are performing these tests on bare metal, there’s not just your test process. This creates further complication due to not all instructions being created equal. Some require more cycles to execute and some fewer.
Maybe your method to capture the cycle counter is what introduces this static overhead.