/* bench3 - re-measure with min-of-many-short-windows (immune to interrupts) */ #include #include #define UNROLL 128 extern long k_add(long, long, long), k_mullw(long, long, long), k_mullw2(long, long, long); extern long k_chase(long, long); extern unsigned long long k_tb(void); /* min ticks per kernel instruction over `reps` calls of f(n, a, b) */ static double minwin(long (*f)(long, long, long), long n, long a, long b, int reps) { unsigned long long t0, t, best = ~0ULL; int r; for (r = 0; r < reps; r++) { t0 = k_tb(); f(n, a, b); t = k_tb() - t0; if (t < best) best = t; } return (double)best / (n * (double)UNROLL); } int main(void) { double ref; int i; ref = minwin(k_add, 40, 1, 1, 5000); printf("ref add %.5f ticks -> core/TB %.3f\n", ref, 1 / ref); for (i = 0; i < 3; i++) { printf("k_mullw x1 %5.2f | k_mullw2 x1 %5.2f | x0x7fff %5.2f | x0x12345 %5.2f | x-1 %5.2f\n", minwin(k_mullw, 40, 3, 1, 3000) / ref, minwin(k_mullw2, 40, 3, 1, 3000) / ref, minwin(k_mullw2, 40, 3, 0x7fff, 3000) / ref, minwin(k_mullw2, 40, 3, 0x12345, 3000) / ref, minwin(k_mullw2, 40, 3, -1, 3000) / ref); } printf("k_mullw2 x1 with r4=0x12345: %5.2f r4=-1: %5.2f\n", minwin(k_mullw2, 40, 0x12345, 1, 3000) / ref, minwin(k_mullw2, 40, -1, 1, 3000) / ref); return 0; }