#include #include #include #include #include static uint64_t rdtsc(void) { uint32_t lo, hi; asm volatile("lfence; rdtsc" : "=a" (lo), "=d" (hi)); return ((uint64_t) hi << 32) | lo; } int main(int argc, char **argv) { int s, khz; uint64_t tsc1, tsc2, delta; double tsc_s, error; if (argc < 3) { printf("Usage: %s \n", argv[0]); exit(1); } s = atoi(argv[1]); khz = atoi(argv[2]); if (khz == 0) { printf("cpu khz must be larger than 0\n"); exit(1); } tsc1 = rdtsc(); sleep(s); tsc2 = rdtsc(); delta = tsc2 - tsc1; tsc_s = delta / khz / 1000.0; error = (tsc_s - s) * 100.0 / s; printf("tsc1 = %" PRIu64 ", " "tsc2 = %" PRIu64 ", " "delta = %lf s, error = %lf\n", tsc1, tsc2, tsc_s, error); exit(0); }