While reading The noploop CPU Benchmark I decided to do a small experiment to calculate the CPU Superscalar factor, this consists in measuring the number of instructions that the CPU completes by cycle. That can be accomplished measuring the number of CPU cycles it takes to perform a fixed amount of NOPs (NO Operation) instructions, as shown below:
start = cpucycles() perform 4096 * 100000000 NOPs end = cpucycles() Superscalar CPU factor = (4096 * 10000000) / (end - start)
To measure the superscalar factor, we can write a small self-contained program (sources here: noploop.c) based on the above pseudo-code, that calculates the CPU frequency and the CPU superscalar factor:
box $ ./noploop noploop: freq 14321678 KHz (time 2860 ms) 3325978 KHz (9512297394 cycles) noploop: CPU Superscalar factor: 4 instr/cycle box $ grep name /proc/cpuinfo model name : Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz
The above results shows that the CPU took 2860
milliseconds and 9512297394
CPU cycles
to perform the 4096 10^7
NOP instructions. This gives the following figures:
- a rate of
14321678
KHz instructions completed per second, obtained withrate = NOPs / time
- a frequency of
3325978
KHz CPU cycles per second, obtained withfreq = cycles / time
The difference between the rate of 14.32
GHz instructions completed per second
and the 3.30
GHz CPU cycles/second means that the CPU is completing 4
NOP instructions/cycle,
that is the CPU Superscalar factor.