11#define TSC_OVERHEAD_N 100000
13static inline void _sync_tsc(
void)
15 asm volatile(
"cpuid" : : :
"%rax",
"%rbx",
"%rcx",
"%rdx");
18static inline uint64_t _rdtsc(
void)
21 asm volatile(
"rdtsc" :
"=a" (a),
"=d" (d) : :
"%rbx",
"%rcx");
22 return ((uint64_t) a) | (((uint64_t) d) << 32);
25static inline uint64_t _rdtscp(
void)
28 asm volatile(
"rdtscp" :
"=a" (a),
"=d" (d) : :
"%rbx",
"%rcx");
29 return ((uint64_t) a) | (((uint64_t) d) << 32);
32static inline uint64_t bench_start(
void)
49static inline uint64_t bench_end(
void)
62 uint64_t t = _rdtscp();
67static uint64_t measure_tsc_overhead(
void)
69 uint64_t t0, t1, overhead = ~0;
72 for (i = 0; i < TSC_OVERHEAD_N; i++) {
76 if (t1 - t0 < overhead)
104#define TSC_FREQ_MHZ 3500
106static inline uint64_t cycles_to_ns(uint64_t cycles)
110 return cycles * 1000 / TSC_FREQ_MHZ;